From 2f74efc3f937e8ba59f2fbfdaad721930ab14c5c Mon Sep 17 00:00:00 2001 From: Mitesh Ashar Date: Mon, 27 Jul 2026 19:30:03 +0530 Subject: [PATCH 01/21] feat(claude-code): sync settings and keybindings to Claude Code v2.1.220 (#6131) Co-authored-by: domdomegg --- .../removed-doctor-action.json | 10 + .../removed-doctor-context.json | 10 + .../invalid-enum-values.json | 15 + ...alid-inline-marketplace-plugin-source.json | 19 + .../invalid-inline-marketplace-source.json | 10 + .../invalid-tls-terminate-property.json | 10 + .../invalid-vim-insert-mode-remap.json | 5 + src/schemas/json/claude-code-keybindings.json | 7 +- src/schemas/json/claude-code-settings.json | 528 ++++++++++++++++-- .../claude-code-keybindings/all-contexts.json | 19 +- .../current-actions.json | 12 +- .../claude-code-settings/basic-config.json | 7 +- src/test/claude-code-settings/edge-cases.json | 13 + .../claude-code-settings/enum-coverage.json | 7 +- .../claude-code-settings/env-variables.json | 36 ++ .../claude-code-settings/hooks-complete.json | 11 + .../marketplace-host-pattern.json | 42 ++ .../modern-complete-config.json | 47 +- .../permissions-advanced.json | 7 +- .../permissions-basic.json | 2 +- 20 files changed, 745 insertions(+), 72 deletions(-) create mode 100644 src/negative_test/claude-code-keybindings/removed-doctor-action.json create mode 100644 src/negative_test/claude-code-keybindings/removed-doctor-context.json create mode 100644 src/negative_test/claude-code-settings/invalid-inline-marketplace-plugin-source.json create mode 100644 src/negative_test/claude-code-settings/invalid-inline-marketplace-source.json create mode 100644 src/negative_test/claude-code-settings/invalid-tls-terminate-property.json create mode 100644 src/negative_test/claude-code-settings/invalid-vim-insert-mode-remap.json diff --git a/src/negative_test/claude-code-keybindings/removed-doctor-action.json b/src/negative_test/claude-code-keybindings/removed-doctor-action.json new file mode 100644 index 00000000000..edefbb266fa --- /dev/null +++ b/src/negative_test/claude-code-keybindings/removed-doctor-action.json @@ -0,0 +1,10 @@ +{ + "bindings": [ + { + "bindings": { + "f": "doctor:fix" + }, + "context": "Chat" + } + ] +} diff --git a/src/negative_test/claude-code-keybindings/removed-doctor-context.json b/src/negative_test/claude-code-keybindings/removed-doctor-context.json new file mode 100644 index 00000000000..c4cf47cb915 --- /dev/null +++ b/src/negative_test/claude-code-keybindings/removed-doctor-context.json @@ -0,0 +1,10 @@ +{ + "bindings": [ + { + "bindings": { + "f": "app:redraw" + }, + "context": "Doctor" + } + ] +} diff --git a/src/negative_test/claude-code-settings/invalid-enum-values.json b/src/negative_test/claude-code-settings/invalid-enum-values.json index 676b3456fd5..0dbdbeb295d 100644 --- a/src/negative_test/claude-code-settings/invalid-enum-values.json +++ b/src/negative_test/claude-code-settings/invalid-enum-values.json @@ -1,6 +1,9 @@ { + "askUserQuestionTimeout": "30s", "autoUpdatesChannel": "beta", + "browserExternalPageTools": "enabled", "defaultShell": "zsh", + "diffTool": "ide", "disableAutoMode": "enabled", "disableDeepLinkRegistration": "enabled", "editorMode": "emacs", @@ -32,11 +35,14 @@ "CLAUDE_CODE_DISABLE_ATTACHMENTS": "off", "CLAUDE_CODE_DISABLE_AUTO_MEMORY": "yes", "CLAUDE_CODE_DISABLE_BACKGROUND_TASKS": "true", + "CLAUDE_CODE_DISABLE_BEDROCK_CONTENT_TYPE_GUARD": "yes", + "CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFF": "yes", "CLAUDE_CODE_DISABLE_BG_SHELL_PRESSURE_REAP": "yes", "CLAUDE_CODE_DISABLE_BUNDLED_SKILLS": "yes", "CLAUDE_CODE_DISABLE_CLAUDE_MDS": "2", "CLAUDE_CODE_DISABLE_CRON": "off", "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "true", + "CLAUDE_CODE_DISABLE_EXPLORE_PLAN_AGENTS": "no", "CLAUDE_CODE_DISABLE_FAST_MODE": "no", "CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY": "disabled", "CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING": "2", @@ -46,6 +52,7 @@ "CLAUDE_CODE_DISABLE_MOUSE_CLICKS": "yes", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "false", "CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK": "on", + "CLAUDE_CODE_DISABLE_NOTIFICATION_PRESENCE_CHECK": "no", "CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL": "yes", "CLAUDE_CODE_DISABLE_POLICY_SKILLS": "3", "CLAUDE_CODE_DISABLE_TERMINAL_TITLE": "true", @@ -53,6 +60,7 @@ "CLAUDE_CODE_DISABLE_VIRTUAL_SCROLL": "off", "CLAUDE_CODE_DISABLE_WORKFLOWS": "yes", "CLAUDE_CODE_EFFORT_LEVEL": "extreme", + "CLAUDE_CODE_ENABLE_APPEND_SUBAGENT_PROMPT": "true", "CLAUDE_CODE_ENABLE_AUTO_MODE": "yes", "CLAUDE_CODE_ENABLE_AWAY_SUMMARY": "yes", "CLAUDE_CODE_ENABLE_BACKGROUND_PLUGIN_REFRESH": "on", @@ -68,6 +76,7 @@ "CLAUDE_CODE_FORCE_STRIKETHROUGH": "yes", "CLAUDE_CODE_FORCE_SYNC_OUTPUT": "enabled", "CLAUDE_CODE_FORK_SUBAGENT": "true", + "CLAUDE_CODE_FORWARD_SUBAGENT_TEXT": "on", "CLAUDE_CODE_GLOB_HIDDEN": "1", "CLAUDE_CODE_GLOB_NO_IGNORE": "yes", "CLAUDE_CODE_HIDE_CWD": "yes", @@ -94,7 +103,10 @@ "CLAUDE_CODE_SIMPLE": "on", "CLAUDE_CODE_SIMPLE_SYSTEM_PROMPT": "enabled", "CLAUDE_CODE_SKIP_ANTHROPIC_AWS_AUTH": "yes", + "CLAUDE_CODE_SKIP_AWS_CRED_CACHE": "2", "CLAUDE_CODE_SKIP_BEDROCK_AUTH": "always", + "CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS": "enabled", + "CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK": "off", "CLAUDE_CODE_SKIP_FOUNDRY_AUTH": "skip", "CLAUDE_CODE_SKIP_MANTLE_AUTH": "true", "CLAUDE_CODE_SKIP_PROMPT_HISTORY": "disable", @@ -111,6 +123,7 @@ "CLAUDE_CODE_USE_NATIVE_FILE_SEARCH": "yes", "CLAUDE_CODE_USE_POWERSHELL_TOOL": "enabled", "CLAUDE_CODE_USE_VERTEX": "yes", + "CLAUDE_DISABLE_ADOPT": "no", "CLAUDE_EFFORT": "extreme", "CLAUDE_ENABLE_BYTE_WATCHDOG": "yes", "CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK": "yes", @@ -143,6 +156,7 @@ "ENABLE_PROMPT_CACHING_1H": "yes", "ENABLE_TOOL_SEARCH": "maybe", "FORCE_AUTOUPDATE_PLUGINS": "yes", + "FORCE_HYPERLINK": "always", "FORCE_PROMPT_CACHING_5M": "yes", "IS_DEMO": "yes", "MCP_CONNECTION_NONBLOCKING": "yes", @@ -200,6 +214,7 @@ "voice": { "mode": "shout" }, + "workflowSizeGuideline": "huge", "worktree": { "baseRef": "invalid-ref", "bgIsolation": "isolated" diff --git a/src/negative_test/claude-code-settings/invalid-inline-marketplace-plugin-source.json b/src/negative_test/claude-code-settings/invalid-inline-marketplace-plugin-source.json new file mode 100644 index 00000000000..1afbc22d324 --- /dev/null +++ b/src/negative_test/claude-code-settings/invalid-inline-marketplace-plugin-source.json @@ -0,0 +1,19 @@ +{ + "extraKnownMarketplaces": { + "team-tools": { + "source": { + "name": "team-tools", + "plugins": [ + { + "name": "code-formatter", + "source": { + "source": "git", + "url": "https://git.corp.example/fmt.git" + } + } + ], + "source": "settings" + } + } + } +} diff --git a/src/negative_test/claude-code-settings/invalid-inline-marketplace-source.json b/src/negative_test/claude-code-settings/invalid-inline-marketplace-source.json new file mode 100644 index 00000000000..1160cb3e128 --- /dev/null +++ b/src/negative_test/claude-code-settings/invalid-inline-marketplace-source.json @@ -0,0 +1,10 @@ +{ + "extraKnownMarketplaces": { + "team-tools": { + "source": { + "name": "team-tools", + "source": "settings" + } + } + } +} diff --git a/src/negative_test/claude-code-settings/invalid-tls-terminate-property.json b/src/negative_test/claude-code-settings/invalid-tls-terminate-property.json new file mode 100644 index 00000000000..6939bb83a89 --- /dev/null +++ b/src/negative_test/claude-code-settings/invalid-tls-terminate-property.json @@ -0,0 +1,10 @@ +{ + "sandbox": { + "network": { + "tlsTerminate": { + "caCertPath": "/etc/corp/ca.pem", + "caChainPath": "/etc/corp/chain.pem" + } + } + } +} diff --git a/src/negative_test/claude-code-settings/invalid-vim-insert-mode-remap.json b/src/negative_test/claude-code-settings/invalid-vim-insert-mode-remap.json new file mode 100644 index 00000000000..5e2f784e67c --- /dev/null +++ b/src/negative_test/claude-code-settings/invalid-vim-insert-mode-remap.json @@ -0,0 +1,5 @@ +{ + "vimInsertModeRemaps": { + "jjj": "" + } +} diff --git a/src/schemas/json/claude-code-keybindings.json b/src/schemas/json/claude-code-keybindings.json index 6ac5f1193f0..c061b5aa193 100644 --- a/src/schemas/json/claude-code-keybindings.json +++ b/src/schemas/json/claude-code-keybindings.json @@ -45,8 +45,7 @@ "ModelPicker", "Select", "Plugin", - "Scroll", - "Doctor" + "Scroll" ] }, "keystrokePattern": { @@ -79,6 +78,8 @@ "app:toggleTranscript", "app:toggleBrief", "app:openArtifact", + "app:diffFileListUp", + "app:diffFileListDown", "history:search", "history:previous", "history:next", @@ -134,6 +135,7 @@ "footer:openSelected", "footer:clearSelection", "footer:close", + "footer:dismiss", "messageSelector:up", "messageSelector:down", "messageSelector:top", @@ -166,7 +168,6 @@ "settings:periodDay", "settings:periodWeek", "settings:sortByTokens", - "doctor:fix", "voice:pushToTalk", "scroll:lineUp", "scroll:lineDown", diff --git a/src/schemas/json/claude-code-settings.json b/src/schemas/json/claude-code-settings.json index 8b42230f517..b2e376d239a 100644 --- a/src/schemas/json/claude-code-settings.json +++ b/src/schemas/json/claude-code-settings.json @@ -5,7 +5,7 @@ "permissionRule": { "type": "string", "description": "Tool permission rule.\nSee https://code.claude.com/docs/en/settings#permission-rule-syntax\nSee https://code.claude.com/docs/en/tools-reference for full list of tools available to Claude.", - "pattern": "^((Agent|Bash|Cd|Edit|ExitPlanMode|Glob|Grep|KillShell|LSP|Monitor|MultiEdit|NotebookEdit|PowerShell|Read|Skill|TaskCreate|TaskGet|TaskList|TaskOutput|TaskStop|TaskUpdate|TodoWrite|ToolSearch|WebFetch|WebSearch|Write)(\\([^)]+\\))?|mcp__.*)$", + "pattern": "^((Agent|Artifact|Bash|Cd|Edit|EnterWorktree|ExitPlanMode|Glob|Grep|KillShell|LSP|Monitor|MultiEdit|NotebookEdit|PowerShell|Read|ShareOnboardingGuide|Skill|TaskCreate|TaskGet|TaskList|TaskOutput|TaskStop|TaskUpdate|TodoWrite|ToolSearch|WebFetch|WebSearch|Workflow|Write)(\\([^)]+\\))?|mcp__.*)$", "examples": [ "Bash", "Bash(npm run build)", @@ -282,7 +282,7 @@ }, "autoMemoryEnabled": { "type": "boolean", - "description": "Enable automatic memory saves that capture useful context to .claude/memory/. Also configurable via CLAUDE_CODE_DISABLE_AUTO_MEMORY environment variable (set to 1 to disable, 0 to enable). See https://code.claude.com/docs/en/memory#auto-memory", + "description": "Enable automatic memory saves that capture useful context to ~/.claude/projects//memory/ (derived from the git repository, shared across worktrees). Also configurable via CLAUDE_CODE_DISABLE_AUTO_MEMORY environment variable (set to 1 to disable, 0 to enable). See https://code.claude.com/docs/en/memory#storage-location", "default": true }, "autoUpdatesChannel": { @@ -369,7 +369,7 @@ }, "ANTHROPIC_BEDROCK_SERVICE_TIER": { "type": "string", - "description": "Select Bedrock service tier; sent as X-Amzn-Bedrock-Service-Tier header. See https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#21122", + "description": "Select Bedrock service tier; sent as X-Amzn-Bedrock-Service-Tier header. See https://code.claude.com/docs/en/amazon-bedrock#service-tiers", "enum": ["default", "flex", "priority"] }, "ANTHROPIC_BETAS": { @@ -464,6 +464,10 @@ "type": "string", "description": "Microsoft Foundry authentication key" }, + "ANTHROPIC_FOUNDRY_AUTH_TOKEN": { + "type": "string", + "description": "Bearer token for Microsoft Foundry authentication, such as a Microsoft Entra access token. Claude Code sends it as the Authorization: Bearer header. Takes precedence over ANTHROPIC_FOUNDRY_API_KEY and over the Azure default credential chain. Requires Claude Code v2.1.203 or later. See https://code.claude.com/docs/en/microsoft-foundry" + }, "ANTHROPIC_FOUNDRY_BASE_URL": { "type": "string", "description": "Microsoft Foundry resource URL" @@ -486,11 +490,11 @@ }, "ANTHROPIC_VERTEX_BASE_URL": { "type": "string", - "description": "Override Google Vertex AI endpoint URL" + "description": "Override Google Cloud's Agent Platform (formerly Vertex AI) endpoint URL. Use for custom endpoints or when routing through an LLM gateway" }, "ANTHROPIC_VERTEX_PROJECT_ID": { "type": "string", - "description": "Google Vertex AI project ID" + "description": "GCP project ID for Google Cloud's Agent Platform (formerly Vertex AI) requests. Overridden by GCLOUD_PROJECT, GOOGLE_CLOUD_PROJECT, or the project in your GOOGLE_APPLICATION_CREDENTIALS credential file" }, "ANTHROPIC_WORKSPACE_ID": { "type": "string", @@ -502,7 +506,7 @@ }, "API_TIMEOUT_MS": { "type": "string", - "description": "API request timeout in milliseconds (default: 600000)" + "description": "Timeout for API requests in milliseconds (default: 600000, or 10 minutes; maximum: 2147483647). Increase this when requests time out on slow networks or when routing through a proxy. Values above the maximum overflow the underlying timer and cause requests to fail immediately." }, "AWS_BEARER_TOKEN_BEDROCK": { "type": "string", @@ -538,6 +542,14 @@ "description": "Set to 1 in subprocesses Claude Code spawns (Bash and PowerShell tools, tmux sessions, hook commands, status line commands, stdio MCP server subprocesses). IDE extensions also set this in their integrated terminals. To distinguish a direct tool/hook subprocess from a stdio MCP server subprocess, use CLAUDE_CODE_CHILD_SESSION instead. See https://code.claude.com/docs/en/env-vars", "enum": ["0", "1"] }, + "CLAUDE_AFK_COUNTDOWN_MS": { + "type": "string", + "description": "How many milliseconds before auto-continue the on-screen countdown appears on an unanswered AskUserQuestion dialog. Default 20000 (20 seconds). See CLAUDE_AFK_TIMEOUT_MS. Requires Claude Code v2.1.198 or later. See https://code.claude.com/docs/en/env-vars" + }, + "CLAUDE_AFK_TIMEOUT_MS": { + "type": "string", + "description": "How many milliseconds of idle time before an unanswered AskUserQuestion dialog auto-continues without you. Default 60000 (60 seconds). Requires Claude Code v2.1.198 or later. See https://code.claude.com/docs/en/env-vars" + }, "CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS": { "type": "string", "description": "Disable built-in subagent types in Agent SDK", @@ -618,6 +630,14 @@ "description": "Override automatic IDE connection behavior", "enum": ["true", "false"] }, + "CLAUDE_CODE_AWS_CHAIN_RESOLVE_TIMEOUT_MS": { + "type": "string", + "description": "Time in milliseconds Claude Code waits for the AWS default credential provider chain to produce credentials before the request fails with \"AWS default-chain credential resolve timed out\" (default: 60000). Raise it when a step in your chain legitimately needs longer, such as a browser-based SSO sign-in with MFA through a wrapper like aws-vault. Applies wherever Claude Code signs with the default chain. Requires Claude Code v2.1.207 or later. See https://code.claude.com/docs/en/amazon-bedrock#credential-caching-and-resolution-timeout" + }, + "CLAUDE_CODE_BRIDGE_SESSION_ID": { + "type": "string", + "description": "Set automatically in Bash tool and hook command subprocesses while the session has an active Remote Control connection, and removed when the connection ends. The value is the session's ID in session_ form, the same identifier that appears in the session's claude.ai/code URL, so a script can link back to the session that ran it. Requires Claude Code v2.1.199 or later. See https://code.claude.com/docs/en/remote-control" + }, "CLAUDE_CODE_CERT_STORE": { "type": "string", "description": "CA certificate sources (comma-separated: 'bundled', 'system')" @@ -641,7 +661,7 @@ }, "CLAUDE_CODE_DEBUG_LOGS_DIR": { "type": "string", - "description": "Directory path for debug log files" + "description": "Override the debug log file path. Despite the name, this is a file path, not a directory." }, "CLAUDE_CODE_DEBUG_LOG_LEVEL": { "type": "string", @@ -693,6 +713,16 @@ "description": "Disable all background task functionality", "enum": ["0", "1"] }, + "CLAUDE_CODE_DISABLE_BEDROCK_CONTENT_TYPE_GUARD": { + "type": "string", + "description": "Set to 1 to skip the check that an Amazon Bedrock streaming response carries the application/vnd.amazon.eventstream content-type. Without this variable, a response with a different content-type fails with an error naming that content-type, which means a gateway or proxy is transforming the response. Set it only when the gateway rewrites the Content-Type header but passes the binary event-stream body through unmodified; if the body itself was transformed, requests fail with \"Truncated event message received\" instead. Requires Claude Code v2.1.208 or later. See https://code.claude.com/docs/en/amazon-bedrock#streaming-errors-behind-a-gateway-or-proxy", + "enum": ["0", "1"] + }, + "CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFF": { + "type": "string", + "description": "Set to 1 to stop a background session's running background shell commands, dynamic workflows, and (as of v2.1.198) background subagents when the supervisor stops, restarts, or updates that session's process, instead of handing them off to the session's next process. Affects only that handoff; CLAUDE_DISABLE_ADOPT turns off both. Requires Claude Code v2.1.196 or later. See https://code.claude.com/docs/en/env-vars", + "enum": ["0", "1"] + }, "CLAUDE_CODE_DISABLE_BG_SHELL_PRESSURE_REAP": { "type": "string", "description": "UNDOCUMENTED. Disable automatic memory-pressure reaping of idle background shell commands (added v2.1.193).", @@ -718,6 +748,11 @@ "description": "Strip anthropic-beta headers from API requests. See https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#21123", "enum": ["0", "1"] }, + "CLAUDE_CODE_DISABLE_EXPLORE_PLAN_AGENTS": { + "type": "string", + "description": "Set to 1 to disable the built-in Explore and Plan subagents. Requires Claude Code v2.1.198 or later. See https://code.claude.com/docs/en/env-vars", + "enum": ["0", "1"] + }, "CLAUDE_CODE_DISABLE_FAST_MODE": { "type": "string", "description": "Disable fast mode toggle", @@ -745,12 +780,12 @@ }, "CLAUDE_CODE_DISABLE_MOUSE": { "type": "string", - "description": "Disable mouse tracking in fullscreen mode", + "description": "Disable mouse tracking in fullscreen mode. See https://code.claude.com/docs/en/fullscreen#keep-native-text-selection", "enum": ["0", "1"] }, "CLAUDE_CODE_DISABLE_MOUSE_CLICKS": { "type": "string", - "description": "UNDOCUMENTED. Disable mouse click/drag/hover in fullscreen mode while keeping wheel scroll (added v2.1.195).", + "description": "Disable mouse click/drag/hover in fullscreen mode while keeping wheel scroll (requires v2.1.195+). CLAUDE_CODE_DISABLE_MOUSE takes precedence when both variables are set. See https://code.claude.com/docs/en/fullscreen#keep-native-text-selection", "enum": ["0", "1"] }, "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": { @@ -763,14 +798,19 @@ "description": "Disable fallback to non-streaming API mode", "enum": ["0", "1"] }, + "CLAUDE_CODE_DISABLE_NOTIFICATION_PRESENCE_CHECK": { + "type": "string", + "description": "Set to 1 to send desktop notifications from the PushNotification tool even while focused on the terminal. Requires Claude Code v2.1.193 or later. See https://code.claude.com/docs/en/env-vars", + "enum": ["0", "1"] + }, "CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL": { "type": "string", - "description": "Skip automatic installation of official marketplace plugins", + "description": "Skip automatic installation of official marketplace plugins. See https://code.claude.com/docs/en/env-vars", "enum": ["0", "1"] }, "CLAUDE_CODE_DISABLE_POLICY_SKILLS": { "type": "string", - "description": "Skip loading system-wide policy skills", + "description": "Skip loading system-wide policy skills. See https://code.claude.com/docs/en/env-vars", "enum": ["0", "1"] }, "CLAUDE_CODE_DISABLE_TERMINAL_TITLE": { @@ -798,6 +838,11 @@ "description": "Reasoning effort level", "enum": ["low", "medium", "high", "xhigh", "max", "auto"] }, + "CLAUDE_CODE_ENABLE_APPEND_SUBAGENT_PROMPT": { + "type": "string", + "description": "Set to 1 to enable appending extra text to the end of every subagent's system prompt. The --append-subagent-system-prompt flag supplies the appended text and sets this variable automatically, so you do not need to set it yourself. Requires Claude Code v2.1.205 or later. See https://code.claude.com/docs/en/sub-agents", + "enum": ["0", "1"] + }, "CLAUDE_CODE_ENABLE_AUTO_MODE": { "type": "string", "description": "Set to 1 to make auto mode available on Amazon Bedrock, Google Cloud Vertex AI, and Microsoft Foundry (requires v2.1.158+; no effect on the Anthropic API where auto mode is available by default). See https://code.claude.com/docs/en/env-vars", @@ -810,7 +855,7 @@ }, "CLAUDE_CODE_ENABLE_BACKGROUND_PLUGIN_REFRESH": { "type": "string", - "description": "Refresh plugins at turn boundaries", + "description": "Refresh plugins at turn boundaries. See https://code.claude.com/docs/en/env-vars", "enum": ["0", "1"] }, "CLAUDE_CODE_ENABLE_FEEDBACK_SURVEY_FOR_OTEL": { @@ -833,6 +878,10 @@ "description": "Enable prompt suggestions", "enum": ["true", "false"] }, + "CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING": { + "type": "string", + "description": "Enable file checkpointing for a non-interactive CLI run, so `claude -p --resume --rewind-files ` can rewind files. The Agent SDK sets this internally when enable_file_checkpointing (Python) or enableFileCheckpointing (TypeScript) is enabled; the bare CLI never sets it. Without it, a non-interactive rewind fails with \"File rewinding is not enabled\". See https://code.claude.com/docs/en/agent-sdk/file-checkpointing" + }, "CLAUDE_CODE_ENABLE_TASKS": { "type": "string", "description": "Enable task tracking in non-interactive mode", @@ -885,6 +934,11 @@ "description": "Fork subagent processes in non-interactive sessions. See https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md#21120", "enum": ["0", "1"] }, + "CLAUDE_CODE_FORWARD_SUBAGENT_TEXT": { + "type": "string", + "description": "Set to 1 to emit subagent text and thinking blocks in claude -p --output-format stream-json output, the same behavior as the --forward-subagent-text flag. Use the variable when a harness invokes claude and cannot pass the flag itself. Unlike the flag, which exits with an error outside non-interactive mode with stream-json output, the variable is ignored there so that nested invocations keep working when it is set process-wide. Requires Claude Code v2.1.211 or later. See https://code.claude.com/docs/en/sub-agents", + "enum": ["0", "1"] + }, "CLAUDE_CODE_GIT_BASH_PATH": { "type": "string", "description": "Path to Git Bash executable (Windows only)" @@ -922,6 +976,10 @@ "description": "Skip IDE lockfile validation", "enum": ["0", "1"] }, + "CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS": { + "type": "string", + "description": "How many subagents can be running in one session before the Agent tool refuses to spawn another (default: 20). Accepts a positive whole number in plain digits; anything else is ignored, so the variable can adjust the cap but cannot disable it. Requires Claude Code v2.1.217 or later. See https://code.claude.com/docs/en/sub-agents#concurrent-subagent-limit" + }, "CLAUDE_CODE_MAX_CONTEXT_TOKENS": { "type": "string", "description": "Override context window size in tokens" @@ -934,6 +992,14 @@ "type": "string", "description": "Maximum API request retry attempts (default: 10)" }, + "CLAUDE_CODE_MAX_SUBAGENTS_PER_SESSION": { + "type": "string", + "description": "Cap on the number of subagents one session can spawn with the Agent tool (default: 200). When Claude reaches the cap, spawning another subagent fails with an error telling Claude to finish the remaining work directly. Accepts a positive whole number in plain digits with no upper bound; this variable does not take the scientific notation or digit-separator spellings. Anything else is ignored and the default applies, so the cap can be raised but not turned off. Requires Claude Code v2.1.212 or later. See https://code.claude.com/docs/en/sub-agents#session-subagent-limit" + }, + "CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH": { + "type": "string", + "description": "Number of subagent layers allowed below the main conversation (default: 1). At the default, subagents cannot spawn their own subagents; set 2 or higher to allow it. Accepts a positive whole number in plain digits; anything else is ignored, so the limit can be raised but not turned off. Requires Claude Code v2.1.217 or later. See https://code.claude.com/docs/en/sub-agents#let-subagents-spawn-their-own-subagents" + }, "CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY": { "type": "string", "description": "Maximum parallel tool executions (default: 10)" @@ -942,14 +1008,22 @@ "type": "string", "description": "Cap the number of agentic turns when no explicit limit is passed. Equivalent to --max-turns, which takes precedence. A non-positive integer is rejected at startup. See https://code.claude.com/docs/en/env-vars" }, + "CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION": { + "type": "string", + "description": "Cap on the total number of WebSearch calls one session can make (default: 200). When Claude reaches the cap, further WebSearch calls return a notice telling it to continue with the information it already gathered. Accepts a positive whole number with no upper bound. Anything else is ignored and the default applies, so the cap can be raised but not turned off. Requires Claude Code v2.1.212 or later. See https://code.claude.com/docs/en/tools-reference#websearch-tool-behavior" + }, "CLAUDE_CODE_MCP_ALLOWLIST_ENV": { "type": "string", "description": "Isolate MCP server environments to allowlisted variables", "enum": ["0", "1"] }, + "CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS": { + "type": "string", + "description": "Elapsed time in milliseconds before a still-running MCP tool call moves to a background task (default: 120000, or 2 minutes). Set to 0 to turn automatic backgrounding off. Requires Claude Code v2.1.212 or later. See https://code.claude.com/docs/en/mcp#automatic-backgrounding-of-long-tool-calls" + }, "CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT": { "type": "string", - "description": "Idle timeout in milliseconds for remote MCP tool calls (default: 300000, about 5 minutes). When an HTTP, SSE, WebSocket, or claude.ai connector MCP server sends no response and no progress notification for this long, the tool call aborts with an error instead of waiting for the overall MCP_TOOL_TIMEOUT. Set to 0 to disable the idle check. Values below 1000 are raised to one second, and the value is capped at the effective MCP_TOOL_TIMEOUT. Does not apply to stdio or IDE servers. Requires Claude Code v2.1.187 or later. See https://code.claude.com/docs/en/mcp" + "description": "Idle timeout in milliseconds for MCP tool calls. When a stdio, HTTP, SSE, WebSocket, or claude.ai connector MCP server sends no response and no progress notification for this long, the tool call aborts with an error instead of waiting for the overall MCP_TOOL_TIMEOUT. Overrides the per-transport defaults of 300000 (5 minutes) for network servers and 1800000 (30 minutes) for stdio servers. Set to 0 to disable the idle check. Values below 1000 are raised to one second, and the value is capped at the effective MCP_TOOL_TIMEOUT. A per-server timeout in .mcp.json of at least 1000 raises that server's idle window to at least the timeout value. Does not apply to IDE servers or SDK in-process servers. Requires Claude Code v2.1.187 or later. Before v2.1.203, stdio servers were exempt from the idle timeout. See https://code.claude.com/docs/en/mcp" }, "CLAUDE_CODE_NATIVE_CURSOR": { "type": "string", @@ -978,10 +1052,9 @@ "type": "string", "description": "OAuth access token" }, - "CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE": { + "CLAUDE_CODE_OTEL_CONTENT_MAX_LENGTH": { "type": "string", - "enum": ["0", "1"], - "description": "Set to 1 to pin fast mode to Claude Opus 4.6 instead of the default Opus 4.8 (the fast-mode default since v2.1.154). With this set, /fast runs on Opus 4.6. See https://code.claude.com/docs/en/fast-mode" + "description": "Maximum length of content-bearing OpenTelemetry attributes (model responses, tool content, system prompts, raw API bodies), truncation marker included, in UTF-16 code units (default: 61440, i.e. 60 KB). Raise it only if your telemetry backend accepts attribute values larger than 64 KB, or lower it to cut telemetry volume. Requires Claude Code v2.1.214 or later. See https://code.claude.com/docs/en/monitoring-usage#common-configuration-variables" }, "CLAUDE_CODE_OTEL_DIAG_STDERR": { "type": "string", @@ -1012,7 +1085,7 @@ }, "CLAUDE_CODE_PLUGIN_CACHE_DIR": { "type": "string", - "description": "Root directory for plugin cache" + "description": "Override the plugins root directory. Despite the name, this sets the parent directory, not the cache itself: marketplaces and the plugin cache live in subdirectories under this path. Defaults to ~/.claude/plugins. See https://code.claude.com/docs/en/env-vars" }, "CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS": { "type": "string", @@ -1030,7 +1103,7 @@ }, "CLAUDE_CODE_PLUGIN_SEED_DIR": { "type": "string", - "description": "Path(s) to pre-populated plugin directories" + "description": "Path(s) to pre-populated plugin directories. See https://code.claude.com/docs/en/plugin-marketplaces#pre-populate-plugins-for-containers" }, "CLAUDE_CODE_POWERSHELL_RESPECT_EXECUTION_POLICY": { "type": "string", @@ -1041,6 +1114,10 @@ "type": "string", "description": "Cap, in milliseconds, on how long `claude -p` waits for background subagents at exit (default 10 minutes; set to 0 to wait without limit, added v2.1.182). See https://code.claude.com/docs/en/headless#background-tasks-at-exit" }, + "CLAUDE_CODE_PROCESS_WRAPPER": { + "type": "string", + "description": "Launch the processes Claude Code starts from its own binary, such as the background service that hosts agent view sessions, through a corporate launcher given as an argv prefix like /opt/corp/launcher. Set it in the env block of user or managed settings, not as a shell export, so the detached background service inherits it; project and local settings cannot set it. Equivalent to the processWrapper setting, which requires Claude Code v2.1.210 or later; this variable takes precedence when both are set. The VS Code extension configures its own launcher separately through its claudeProcessWrapper setting. Ignored on Windows. Requires Claude Code v2.1.208 or later. See https://code.claude.com/docs/en/corporate-launcher" + }, "CLAUDE_CODE_PROPAGATE_TRACEPARENT": { "type": "string", "description": "Propagate the W3C traceparent header on API requests when using a custom ANTHROPIC_BASE_URL. See https://code.claude.com/docs/en/monitoring-usage#traces-beta", @@ -1070,6 +1147,10 @@ "description": "Automatically resume from a mid-turn interruption", "enum": ["0", "1"] }, + "CLAUDE_CODE_RESUME_INTERRUPTED_TURN_MAX_AGE_MS": { + "type": "string", + "description": "Maximum age in milliseconds of the last transcript message for a session that ended mid-turn to continue automatically on resume. When the last message is older than this bound, Claude Code skips both the CLAUDE_CODE_RESUME_INTERRUPTED_TURN automatic resume and the injected CLAUDE_CODE_RESUME_PROMPT continuation message, and the session starts idle so you continue explicitly. Unset or 0 means no bound; a negative or non-numeric value applies a one-hour bound. Spawn scripts for long-running agents can set this so a restart against an old transcript does not re-run a stale prompt. Claude Code sets a one-hour bound itself when it restarts a crashed agent view session that inherited its conversation from an interactive session. Requires Claude Code v2.1.211 or later. See https://code.claude.com/docs/en/env-vars" + }, "CLAUDE_CODE_RESUME_PROMPT": { "type": "string", "description": "Override the continuation message injected when resuming a session that ended mid-turn (default \"Continue from where you left off.\"). An empty string uses the default. See https://code.claude.com/docs/en/env-vars" @@ -1090,7 +1171,7 @@ }, "CLAUDE_CODE_SCROLL_SPEED": { "type": "string", - "description": "Mouse wheel scroll speed multiplier (1-20)" + "description": "Set the mouse wheel scroll multiplier in fullscreen rendering. Accepts any positive value up to 20, including fractional values below 1 such as 0.5 to slow accelerated trackpad and wheel scrolling in terminals that already amplify wheel events. Set to 3 to match vim if your terminal sends one wheel event per notch without amplification. See https://code.claude.com/docs/en/fullscreen#mouse-wheel-scrolling" }, "CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS": { "type": "string", @@ -1123,11 +1204,26 @@ "description": "Skip client-side SigV4 authentication for Claude Platform on AWS; use when a proxy or gateway adds authentication before forwarding. See https://code.claude.com/docs/en/claude-platform-on-aws#route-through-a-corporate-proxy", "enum": ["0", "1"] }, + "CLAUDE_CODE_SKIP_AWS_CRED_CACHE": { + "type": "string", + "description": "Set to 1 to turn off the in-process cache of credentials resolved from the AWS default credential provider chain, so Claude Code resolves the chain on every API request. With the cache off, an SSO-backed profile requests credentials from IAM Identity Center on every request. Requires Claude Code v2.1.207 or later. See https://code.claude.com/docs/en/amazon-bedrock#credential-caching-and-resolution-timeout", + "enum": ["0", "1"] + }, "CLAUDE_CODE_SKIP_BEDROCK_AUTH": { "type": "string", "description": "Skip AWS authentication for Bedrock", "enum": ["0", "1"] }, + "CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS": { + "type": "string", + "description": "Set to 1 to treat a failed fast mode availability check as available, for networks that block the check's direct request to api.anthropic.com. Claude Code still honors a \"disabled by your organization\" response. See https://code.claude.com/docs/en/fast-mode#use-fast-mode-behind-proxies-and-llm-gateways", + "enum": ["0", "1"] + }, + "CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK": { + "type": "string", + "description": "Set to 1 to skip the client-side fast mode availability check, for proxies that intercept the check's request rather than refuse it. The API still rejects fast mode requests when your organization has fast mode disabled. See https://code.claude.com/docs/en/fast-mode#use-fast-mode-behind-proxies-and-llm-gateways", + "enum": ["0", "1"] + }, "CLAUDE_CODE_SKIP_FOUNDRY_AUTH": { "type": "string", "description": "Skip Azure authentication for Foundry", @@ -1145,7 +1241,7 @@ }, "CLAUDE_CODE_SKIP_VERTEX_AUTH": { "type": "string", - "description": "Skip Google authentication for Vertex AI", + "description": "Skip Google authentication for Google Cloud's Agent Platform", "enum": ["0", "1"] }, "CLAUDE_CODE_STOP_HOOK_BLOCK_CAP": { @@ -1196,6 +1292,10 @@ "type": "string", "description": "Agent team membership name" }, + "CLAUDE_CODE_TEAM_TEARDOWN_PARK_TIMEOUT_MS": { + "type": "string", + "description": "Override, in milliseconds, how long a non-interactive session waits at exit for its agent team to finish tearing down. Accepts 1000 to 60000; an out-of-range value is ignored and the default of 10000 applies. Requires Claude Code v2.1.206 or later. See https://code.claude.com/docs/en/agent-teams" + }, "CLAUDE_CODE_TMPDIR": { "type": "string", "description": "Override temp directory path" @@ -1237,13 +1337,18 @@ }, "CLAUDE_CODE_USE_VERTEX": { "type": "string", - "description": "Enable Google Vertex AI as the API provider. See https://code.claude.com/docs/en/google-vertex-ai#4-configure-claude-code", + "description": "Enable Google Cloud's Agent Platform as the API provider. See https://code.claude.com/docs/en/google-vertex-ai#4-configure-claude-code", "enum": ["0", "1"] }, "CLAUDE_CONFIG_DIR": { "type": "string", "description": "Override the configuration directory (default ~/.claude) where settings, credentials, session history, and plugins are stored. Useful for running multiple accounts side by side. See https://code.claude.com/docs/en/env-vars" }, + "CLAUDE_DISABLE_ADOPT": { + "type": "string", + "description": "Set to 1 to stop in-flight background work instead of carrying it over when you background a session by pressing ← or with /background. Claude Code asks you to confirm before backgrounding, then stops the tasks that would otherwise carry over. Requires Claude Code v2.1.195 or later. See https://code.claude.com/docs/en/env-vars", + "enum": ["0", "1"] + }, "CLAUDE_EFFORT": { "type": "string", "enum": ["low", "medium", "high", "xhigh", "max"], @@ -1261,13 +1366,17 @@ }, "CLAUDE_ENABLE_STREAM_WATCHDOG": { "type": "string", - "description": "Set to 1 to force-enable, or 0 to force-disable, the event-level streaming idle watchdog. When unset, server-controlled on the direct Anthropic API and off on other providers. See https://code.claude.com/docs/en/env-vars", + "description": "Set to 1 to force-enable, or 0 to force-disable, the event-level streaming idle watchdog. When unset, the watchdog is on by default for all providers (as of v2.1.196; before that the unset default was server-controlled on the direct Anthropic API and off on other providers). See https://code.claude.com/docs/en/env-vars", "enum": ["0", "1"] }, "CLAUDE_ENV_FILE": { "type": "string", "description": "File path for persisting environment variables across Bash commands" }, + "CLAUDE_PID": { + "type": "string", + "description": "Claude Code sets this to its own process ID in the subprocesses it spawns: Bash and PowerShell tool commands and hook commands. On Linux, the Bash tool's shell integration uses it to refuse a pkill pattern that would match the Claude Code process itself. Read it from your own scripts to identify or signal the parent Claude Code process deliberately. Requires Claude Code v2.1.214 or later. See https://code.claude.com/docs/en/errors#pkill-pattern-matches-the-claude-code-process" + }, "CLAUDE_PROJECT_DIR": { "type": "string", "description": "Project root directory path (also provided to hooks)" @@ -1282,7 +1391,7 @@ }, "CLOUD_ML_REGION": { "type": "string", - "description": "Vertex AI region: global, a multi-region location (eu, us), or a specific region (e.g. us-east5). See https://code.claude.com/docs/en/google-vertex-ai#region-configuration" + "description": "Google Cloud's Agent Platform region: global, a multi-region location (eu, us), or a specific region (e.g. us-east5). See https://code.claude.com/docs/en/google-vertex-ai#region-configuration" }, "DEBUG": { "type": "string", @@ -1420,7 +1529,7 @@ }, "ENABLE_TOOL_SEARCH": { "type": "string", - "description": "Control MCP tool search: \"true\" always defers and sends the beta header (requests fail on Vertex AI models earlier than Sonnet 4.5/Opus 4.5 or on proxies that do not support tool_reference); \"auto\" loads tools upfront if they fit within 10% of context; \"auto:N\" sets a custom threshold percentage (e.g. auto:5); \"false\" loads all tools upfront. Also applies when ANTHROPIC_BASE_URL points to a non-first-party host. See https://code.claude.com/docs/en/google-vertex-ai#4-configure-claude-code" + "description": "Control MCP tool search: \"true\" always defers and sends the beta header (requests fail on Google Cloud's Agent Platform models earlier than Sonnet 4.5/Opus 4.5 or on proxies that do not support tool_reference); \"auto\" loads tools upfront if they fit within 10% of context; \"auto:N\" sets a custom threshold percentage (e.g. auto:5); \"false\" loads all tools upfront. Also applies when ANTHROPIC_BASE_URL points to a non-first-party host. See https://code.claude.com/docs/en/google-vertex-ai#4-configure-claude-code" }, "FALLBACK_FOR_ALL_PRIMARY_MODELS": { "type": "string", @@ -1431,6 +1540,11 @@ "description": "Keep plugin auto-updates enabled even when DISABLE_AUTOUPDATER=1 is set. See https://code.claude.com/docs/en/discover-plugins#configure-auto-updates", "enum": ["0", "1"] }, + "FORCE_HYPERLINK": { + "type": "string", + "description": "Set to 1 to enable clickable OSC 8 hyperlinks when your terminal supports them but is not auto-detected, or 0 to disable them", + "enum": ["0", "1"] + }, "FORCE_PROMPT_CACHING_5M": { "type": "string", "description": "Force a 5-minute cache TTL regardless of authentication method; overrides ENABLE_PROMPT_CACHING_1H or a managed-settings TTL. See https://code.claude.com/docs/en/prompt-caching#override-the-ttl", @@ -1438,7 +1552,7 @@ }, "GOOGLE_APPLICATION_CREDENTIALS": { "type": "string", - "description": "Path to a GCP credential configuration file (service account key or workload identity federation config) used for Vertex AI authentication. See https://code.claude.com/docs/en/google-vertex-ai#3-configure-gcp-credentials" + "description": "Path to a GCP credential configuration file (service account key or workload identity federation config) used for Google Cloud's Agent Platform authentication. See https://code.claude.com/docs/en/google-vertex-ai#3-configure-gcp-credentials" }, "HTTPS_PROXY": { "type": "string", @@ -1506,6 +1620,10 @@ "type": "string", "description": "Domains to bypass proxy (space or comma-separated, or '*' for all)" }, + "OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT": { + "type": "string", + "description": "Standard OpenTelemetry SDK limit on attribute value length. Claude Code caps content-bearing telemetry attributes at the smaller of this and CLAUDE_CODE_OTEL_CONTENT_MAX_LENGTH, so the truncation marker stays within the SDK limit. Claude Code reads the OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT and OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT variants the same way, and the smallest set value applies to all signals. Requires Claude Code v2.1.214 or later. See https://code.claude.com/docs/en/monitoring-usage#common-configuration-variables" + }, "OTEL_EXPORTER_OTLP_CERTIFICATE": { "type": "string", "description": "Path to the CA certificate for gRPC OTLP mTLS. See https://code.claude.com/docs/en/monitoring-usage#mtls-authentication" @@ -1526,6 +1644,14 @@ "type": "string", "description": "Headers sent with OTLP exporter requests (e.g. Authorization=Bearer token). See https://code.claude.com/docs/en/monitoring-usage#common-configuration-variables" }, + "OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE": { + "type": "string", + "description": "Path to the client certificate for gRPC OTLP mTLS, overriding OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE for logs only. See https://code.claude.com/docs/en/monitoring-usage#mtls-authentication" + }, + "OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY": { + "type": "string", + "description": "Path to the client private key for gRPC OTLP mTLS, overriding OTEL_EXPORTER_OTLP_CLIENT_KEY for logs only. See https://code.claude.com/docs/en/monitoring-usage#mtls-authentication" + }, "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT": { "type": "string", "description": "OTLP exporter endpoint override for logs. See https://code.claude.com/docs/en/monitoring-usage#common-configuration-variables" @@ -1535,6 +1661,14 @@ "description": "OTLP protocol override for logs: grpc, http/json, or http/protobuf. See https://code.claude.com/docs/en/monitoring-usage#common-configuration-variables", "enum": ["grpc", "http/json", "http/protobuf"] }, + "OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE": { + "type": "string", + "description": "Path to the client certificate for gRPC OTLP mTLS, overriding OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE for metrics only. See https://code.claude.com/docs/en/monitoring-usage#mtls-authentication" + }, + "OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY": { + "type": "string", + "description": "Path to the client private key for gRPC OTLP mTLS, overriding OTEL_EXPORTER_OTLP_CLIENT_KEY for metrics only. See https://code.claude.com/docs/en/monitoring-usage#mtls-authentication" + }, "OTEL_EXPORTER_OTLP_METRICS_ENDPOINT": { "type": "string", "description": "OTLP exporter endpoint override for metrics. See https://code.claude.com/docs/en/monitoring-usage#common-configuration-variables" @@ -1554,6 +1688,14 @@ "description": "OTLP exporter protocol for all signals: grpc, http/json, or http/protobuf. See https://code.claude.com/docs/en/monitoring-usage#common-configuration-variables", "enum": ["grpc", "http/json", "http/protobuf"] }, + "OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE": { + "type": "string", + "description": "Path to the client certificate for gRPC OTLP mTLS, overriding OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE for traces only. See https://code.claude.com/docs/en/monitoring-usage#mtls-authentication" + }, + "OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY": { + "type": "string", + "description": "Path to the client private key for gRPC OTLP mTLS, overriding OTEL_EXPORTER_OTLP_CLIENT_KEY for traces only. See https://code.claude.com/docs/en/monitoring-usage#mtls-authentication" + }, "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT": { "type": "string", "description": "OTLP exporter endpoint override for traces. See https://code.claude.com/docs/en/monitoring-usage#traces-beta" @@ -1701,6 +1843,14 @@ "type": "string", "description": "Override the Vertex AI region for Claude Opus 4.8 (used when CLOUD_ML_REGION=global). See https://code.claude.com/docs/en/env-vars" }, + "VERTEX_REGION_CLAUDE_5_OPUS": { + "type": "string", + "description": "Override region for Claude Opus 5 when using Google Cloud's Agent Platform (formerly Vertex AI). Added in v2.1.219. See https://code.claude.com/docs/en/google-vertex-ai" + }, + "VERTEX_REGION_CLAUDE_5_SONNET": { + "type": "string", + "description": "Override region for Claude Sonnet 5 when using Google Cloud's Agent Platform (formerly Vertex AI). Added in v2.1.197. See https://code.claude.com/docs/en/google-vertex-ai" + }, "VERTEX_REGION_CLAUDE_FABLE_5": { "type": "string", "description": "Override the Vertex AI region for Claude Fable 5 (used when CLOUD_ML_REGION=global). See https://code.claude.com/docs/en/env-vars" @@ -1730,6 +1880,11 @@ "pr": { "type": "string", "description": "Attribution for pull request descriptions. Empty string hides pull request attribution" + }, + "sessionUrl": { + "type": "boolean", + "description": "Whether to append the claude.ai session link as a Claude-Session trailer on commits and a link in pull request descriptions when running from a web or Remote Control session. Defaults to true; set to false to omit the link. See https://code.claude.com/docs/en/settings#attribution-settings", + "default": true } } }, @@ -1790,9 +1945,10 @@ "delegate", "dontAsk", "plan", - "auto" + "auto", + "manual" ], - "description": "Default permission mode.\n\"default\": prompts on first use.\n\"acceptEdits\": auto-accepts file edits.\n\"plan\": read-only, no modifications.\nUNDOCUMENTED. \"delegate\": coordination-only for agent team leads (agent teams are experimental; enable via CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS).\n\"dontAsk\": auto-denies unless pre-approved via permissions.\n\"bypassPermissions\": skips all prompts (use only in isolated environments).\n\"auto\": auto-approves tool calls with background safety checks that verify actions align with your request.\nSee https://code.claude.com/docs/en/permissions" + "description": "Default permission mode.\n\"default\": prompts on first use.\nUNDOCUMENTED. \"manual\": accepted alias for \"default\" (the CLI/VS Code/JetBrains UI now labels this mode \"Manual\" as of v2.1.200; permission-modes.md has not yet been updated to mention it).\n\"acceptEdits\": auto-accepts file edits.\n\"plan\": read-only, no modifications.\nUNDOCUMENTED. \"delegate\": coordination-only for agent team leads (agent teams are experimental; enable via CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS).\n\"dontAsk\": auto-denies unless pre-approved via permissions.\n\"bypassPermissions\": skips all prompts (use only in isolated environments).\n\"auto\": auto-approves tool calls with background safety checks that verify actions align with your request.\nSee https://code.claude.com/docs/en/permissions" }, "disableBypassPermissionsMode": { "type": "string", @@ -1862,7 +2018,7 @@ }, "fastMode": { "type": "boolean", - "description": "Enable fast mode, which uses Claude Opus 4.8 by default (since v2.1.154) for faster output at higher per-token cost without downgrading to a smaller model. Requires extra usage enabled. Toggle with the /fast command. Available on Opus 4.8 and Opus 4.7 (Opus 4.7 fast mode deprecated June 2026). See https://code.claude.com/docs/en/fast-mode", + "description": "Enable fast mode, which uses Claude Opus 5 by default (since v2.1.219) for faster output at higher per-token cost without downgrading to a smaller model. Requires extra usage enabled. Toggle with the /fast command. Supported on Opus 5 and Opus 4.8; fast mode for Opus 4.7 was deprecated on June 25, 2026 and removed on July 24, 2026. Before v2.1.219 fast mode defaulted to Opus 4.8 (v2.1.154 through v2.1.218) and to Opus 4.7 (v2.1.142 through v2.1.153). See https://code.claude.com/docs/en/fast-mode", "default": false }, "fastModePerSessionOptIn": { @@ -2229,6 +2385,13 @@ "items": { "$ref": "#/$defs/hookMatcher" } + }, + "DirectoryAdded": { + "type": "array", + "description": "UNDOCUMENTED. Hooks that run after /add-dir or the SDK register_repo_root control request registers a new working directory mid-session (added v2.1.219)", + "items": { + "$ref": "#/$defs/hookMatcher" + } } } }, @@ -2410,6 +2573,10 @@ "path": { "type": "string", "description": "Path to marketplace.json within repo (defaults to .claude-plugin/marketplace.json)" + }, + "skipLfs": { + "type": "boolean", + "description": "Skip Git LFS downloads when Claude Code clones or updates the marketplace repository. LFS pointer files remain as pointers instead of downloading their content. Use this when the repository contains large LFS objects unrelated to plugin content. Requires Claude Code v2.1.153 or later" } }, "required": ["source", "repo"], @@ -2435,6 +2602,10 @@ "path": { "type": "string", "description": "Path to marketplace.json within repo (defaults to .claude-plugin/marketplace.json)" + }, + "skipLfs": { + "type": "boolean", + "description": "Skip Git LFS downloads when Claude Code clones or updates the marketplace repository. LFS pointer files remain as pointers instead of downloading their content. Use this when the repository contains large LFS objects unrelated to plugin content. Requires Claude Code v2.1.153 or later" } }, "required": ["source", "url"], @@ -2487,6 +2658,142 @@ }, "required": ["source", "path"], "additionalProperties": false + }, + { + "type": "object", + "properties": { + "source": { + "type": "string", + "description": "Identifies the marketplace source type", + "const": "settings" + }, + "name": { + "type": "string", + "description": "Name of the inline marketplace" + }, + "plugins": { + "type": "array", + "description": "Plugins declared inline. Each must reference an external source such as GitHub or npm. You still need to enable each plugin separately in enabledPlugins", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Plugin name" + }, + "source": { + "description": "External source the plugin is fetched from. Inline plugins must reference external sources such as GitHub or npm, not relative paths", + "anyOf": [ + { + "type": "object", + "properties": { + "source": { + "type": "string", + "description": "Identifies the plugin source type", + "const": "github" + }, + "repo": { + "type": "string", + "description": "GitHub repository in owner/repo format" + }, + "ref": { + "type": "string", + "description": "Git branch or tag" + }, + "sha": { + "type": "string", + "description": "Exact commit SHA to pin the plugin to" + } + }, + "required": ["source", "repo"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "source": { + "type": "string", + "description": "Identifies the plugin source type", + "const": "url" + }, + "url": { + "type": "string", + "description": "Git URL source" + }, + "ref": { + "type": "string", + "description": "Git branch or tag" + }, + "sha": { + "type": "string", + "description": "Exact commit SHA to pin the plugin to" + } + }, + "required": ["source", "url"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "source": { + "type": "string", + "description": "Identifies the plugin source type", + "const": "git-subdir" + }, + "url": { + "type": "string", + "description": "Git repository URL" + }, + "path": { + "type": "string", + "description": "Subdirectory within the git repo. Clones sparsely to minimize bandwidth for monorepos" + }, + "ref": { + "type": "string", + "description": "Git branch or tag" + }, + "sha": { + "type": "string", + "description": "Exact commit SHA to pin the plugin to" + } + }, + "required": ["source", "url", "path"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "source": { + "type": "string", + "description": "Identifies the plugin source type", + "const": "npm" + }, + "package": { + "type": "string", + "description": "npm package name (supports scoped packages)" + }, + "version": { + "type": "string", + "description": "Package version" + }, + "registry": { + "type": "string", + "description": "npm registry URL" + } + }, + "required": ["source", "package"], + "additionalProperties": false + } + ] + } + }, + "required": ["name", "source"], + "additionalProperties": false + } + } + }, + "required": ["source", "name", "plugins"], + "additionalProperties": false } ], "description": "Where to fetch the marketplace from" @@ -2687,7 +2994,7 @@ "type": "string", "minLength": 1 }, - "description": "List of marketplace names the user has chosen not to install when prompted" + "description": "List of marketplace names the user has chosen not to install when prompted. See https://code.claude.com/docs/en/discover-plugins" }, "skippedPlugins": { "type": "array", @@ -2695,19 +3002,30 @@ "type": "string", "minLength": 1 }, - "description": "List of plugin IDs (plugin@marketplace format) the user has chosen not to install when prompted" + "description": "List of plugin IDs (plugin@marketplace format) the user has chosen not to install when prompted. See https://code.claude.com/docs/en/discover-plugins" }, "forceLoginMethod": { "type": "string", - "enum": ["claudeai", "console"], - "description": "Force a specific login method: \"claudeai\" for Claude Pro/Max, \"console\" for Console billing", + "enum": ["claudeai", "console", "gateway"], + "description": "Use \"claudeai\" to restrict login to Claude.ai accounts, \"console\" to restrict login to Claude Console accounts, or \"gateway\" to restrict login to a cloud gateway. On Claude Code v2.1.212 or later, every first-party login path enforces the restriction, including the VS Code extension, the Agent SDK, `claude setup-token`, and /install-github-app; before v2.1.212, only terminal logins enforced it. See https://code.claude.com/docs/en/authentication#restrict-login-to-your-organization", "examples": ["claudeai"] }, "forceLoginOrgUUID": { - "type": "string", - "description": "Organization UUID to use for OAuth login", - "examples": ["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"], - "minLength": 1 + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + } + ], + "description": "Organization UUID to use for OAuth login, or an array of UUIDs to allow several organizations. An empty array fails closed and blocks every login. See https://code.claude.com/docs/en/authentication#restrict-login-to-your-organization", + "examples": ["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"] }, "otelHeadersHelper": { "type": "string", @@ -2716,8 +3034,8 @@ }, "outputStyle": { "type": "string", - "description": "Controls the output style for assistant responses. Built-in styles: default, Explanatory, Learning. Custom styles can be added in ~/.claude/output-styles/ or .claude/output-styles/. See https://code.claude.com/docs/en/output-styles", - "examples": ["default", "Explanatory", "Learning"], + "description": "Controls the output style for assistant responses. Built-in styles: default, Proactive, Explanatory, Learning. Custom styles can be added in ~/.claude/output-styles/ or .claude/output-styles/. See https://code.claude.com/docs/en/output-styles", + "examples": ["default", "Proactive", "Explanatory", "Learning"], "minLength": 1 }, "skipWebFetchPreflight": { @@ -2787,6 +3105,25 @@ }, "description": "macOS only. Additional XPC/Mach service names the sandbox may look up. Supports a single trailing * for prefix matching. Needed for tools that communicate via XPC such as the iOS Simulator or Playwright. See https://code.claude.com/docs/en/sandboxing#network-isolation", "examples": [["com.apple.coresimulator.*"]] + }, + "tlsTerminate": { + "type": "object", + "description": "Experimental. Terminate TLS inside the sandbox proxy so it can read the contents of HTTPS requests. Required for mask credential substitution. Set {} to generate an ephemeral certificate authority for the session, or set caCertPath and caKeyPath to use your own. Only honored from user, managed, or CLI --settings settings, not from .claude/settings.json or .claude/settings.local.json. Requires Claude Code v2.1.199 or later. See https://code.claude.com/docs/en/sandboxing#protect-credentials", + "properties": { + "caCertPath": { + "type": "string", + "description": "Path to your own certificate authority certificate" + }, + "caKeyPath": { + "type": "string", + "description": "Path to your own certificate authority private key" + } + }, + "additionalProperties": false + }, + "strictAllowlist": { + "type": "boolean", + "description": "UNDOCUMENTED. Deny non-allowlisted hosts for sandboxed commands without prompting (added v2.1.219). See https://code.claude.com/docs/en/sandboxing#network-isolation" } }, "additionalProperties": false @@ -2816,7 +3153,7 @@ }, "enableWeakerNetworkIsolation": { "type": "boolean", - "description": "macOS only. Allow access to the system TLS trust service (com.apple.trustd.agent) in the sandbox. Required for Go-based tools like gh, gcloud, and terraform to verify TLS certificates when using httpProxyPort with a MITM proxy and custom CA. Reduces security by opening a potential data exfiltration path. Default: false. See https://code.claude.com/docs/en/settings#sandbox-settings", + "description": "macOS only. Allow access to the system TLS trust service (com.apple.trustd.agent) in the sandbox. Required for Go-based tools like gh, gcloud, and terraform to verify TLS certificates when using httpProxyPort with a MITM proxy and custom CA. Reduces security by opening a potential data exfiltration path. Default: false. See https://code.claude.com/docs/en/sandboxing", "default": false }, "enableWeakerNestedSandbox": { @@ -2870,6 +3207,11 @@ "allowManagedReadPathsOnly": { "type": "boolean", "description": "(Managed settings only) When true, only allowRead paths from managed settings are used; user, project, and local allowRead entries are ignored. denyRead still merges from all sources. See https://code.claude.com/docs/en/sandboxing#filesystem-isolation" + }, + "disabled": { + "type": "boolean", + "description": "Skip filesystem isolation while keeping network isolation: sandboxed commands get unrestricted read and write access to the host filesystem, and network egress stays confined to network.allowedDomains. Only honored from user, managed, or CLI --settings settings (default: false). Requires Claude Code v2.1.216 or later. See https://code.claude.com/docs/en/sandboxing#disable-filesystem-isolation", + "default": false } }, "additionalProperties": false @@ -2960,6 +3302,11 @@ }, "required": ["name", "mode"] } + }, + "allowPlaintextInject": { + "type": "boolean", + "description": "Allow mask substitution on plain HTTP requests as well as TLS-terminated HTTPS. On plain HTTP the upstream identity is unverified and the credential travels in cleartext, so leave this off outside trusted test networks. Only honored from user, managed, or CLI --settings settings, not from .claude/settings.json or .claude/settings.local.json (default: false). Requires Claude Code v2.1.199 or later. See https://code.claude.com/docs/en/sandboxing#protect-credentials", + "default": false } } }, @@ -3404,7 +3751,7 @@ "disableDeepLinkRegistration": { "type": "string", "enum": ["disable"], - "description": "Set to \"disable\" to prevent Claude Code from registering the `claude://` deep-link protocol handler on startup. Most useful in managed settings where users cannot override it. See https://code.claude.com/docs/en/settings#available-settings" + "description": "Set to \"disable\" to prevent Claude Code from registering the `claude-cli://` deep-link protocol handler on startup. Most useful in managed settings where users cannot override it. See https://code.claude.com/docs/en/settings#available-settings" }, "disableSkillShellExecution": { "type": "boolean", @@ -3540,7 +3887,7 @@ "additionalProperties": true } }, - "maxSkillDescriptionChars": { + "skillListingMaxDescChars": { "type": "integer", "exclusiveMinimum": 0, "description": "Per-skill character cap on the combined description and when_to_use text in the skill listing Claude sees each turn. Text longer than this is truncated. See https://code.claude.com/docs/en/skills#skill-descriptions-are-cut-short", @@ -3812,6 +4159,105 @@ "leftArrowOpensAgents": { "type": "boolean", "description": "Whether the Left arrow key at the start of an empty prompt opens the agents view. Turn it off in /config (the leftArrowOpensAgents setting). See https://code.claude.com/docs/en/agent-view" + }, + "askUserQuestionTimeout": { + "type": "string", + "description": "Idle time before an unanswered AskUserQuestion dialog auto-continues with whatever options you had already selected. Accepts \"60s\", \"5m\", \"10m\", or \"never\" (default: \"never\", which waits until you answer). Appears in /config as Question auto-continue timeout, which writes this key to user settings. Not read from project or local settings. Requires Claude Code v2.1.200 or later. See https://code.claude.com/docs/en/settings#available-settings", + "enum": ["60s", "5m", "10m", "never"], + "default": "never" + }, + "teammateDefaultModel": { + "type": ["string", "null"], + "description": "Default model for agent team teammates when the spawn prompt does not specify one. Set to a model alias such as \"sonnet\", or null to inherit the lead's current /model selection. Appears in /config as Default teammate model. See https://code.claude.com/docs/en/agent-teams", + "examples": ["sonnet"] + }, + "workflowSizeGuideline": { + "type": "string", + "description": "Sets the agent count Claude aims for in the dynamic workflows it writes. Claude Code sends the value to Claude as advice, not an enforced cap. Accepts \"unrestricted\" (default, which sends no guideline), \"small\", \"medium\", or \"large\". Appears in /config as Dynamic workflow size, and can be set with /config workflowSizeGuideline=small. Requires Claude Code v2.1.202 or later. On v2.1.203 or later the guideline's agent count also replaces the default threshold for the Large workflow warning. See https://code.claude.com/docs/en/workflows#set-a-size-guideline", + "enum": ["unrestricted", "small", "medium", "large"], + "default": "unrestricted" + }, + "enableArtifact": { + "type": "boolean", + "description": "Enable or disable the Artifact tool for this user. When unset, the default follows the feature's availability for your account. The Artifacts row in /config writes this key. A managed disableArtifact and your organization's admin setting take precedence, and the key is ignored in project and local settings (.claude/settings.json, .claude/settings.local.json), which a repository could otherwise commit. Requires Claude Code v2.1.196 or later. See https://code.claude.com/docs/en/artifacts" + }, + "permissionExplainerEnabled": { + "type": "boolean", + "description": "Show a model-generated explanation of the command when you press Ctrl+E on a Bash or PowerShell permission prompt (default: true). Set to false to turn the shortcut off. See https://code.claude.com/docs/en/permissions#permission-system", + "default": true + }, + "diffTool": { + "type": "string", + "description": "Where to display file diffs when an IDE is connected: \"auto\" (default) opens diffs in the IDE's diff viewer, \"terminal\" keeps them in the terminal. Appears in /config as Diff tool only when Claude Code is connected to a VS Code or JetBrains IDE. See https://code.claude.com/docs/en/settings#global-config-settings", + "enum": ["auto", "terminal"], + "default": "auto" + }, + "externalEditorContext": { + "type": "boolean", + "description": "Prepend Claude's previous response as #-commented context when you open the external editor with Ctrl+G (default: false). Appears in /config as Show last response in external editor. See https://code.claude.com/docs/en/settings#global-config-settings", + "default": false + }, + "autoConnectIde": { + "type": "boolean", + "description": "Automatically connect to a running IDE when Claude Code starts from an external terminal (default: false). Appears in /config as Auto-connect to IDE (external terminal) when running outside a VS Code or JetBrains terminal. Also configurable via the CLAUDE_CODE_AUTO_CONNECT_IDE environment variable, which overrides this when set. See https://code.claude.com/docs/en/settings#global-config-settings", + "default": false + }, + "autoInstallIdeExtension": { + "type": "boolean", + "description": "Automatically install the Claude Code IDE extension when running from a VS Code terminal (default: true). Appears in /config as Auto-install IDE extension when running inside a VS Code or JetBrains terminal. You can also set the CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL environment variable to 1. See https://code.claude.com/docs/en/settings#global-config-settings", + "default": true + }, + "emojiCompletionEnabled": { + "type": "boolean", + "description": "Show emoji suggestions when you type : plus a shortcode in the prompt input, and replace a completed shortcode such as :heart: with its emoji (default: true). Set to false to disable both. Requires Claude Code v2.1.217 or later. See https://code.claude.com/docs/en/interactive-mode#emoji-shortcodes", + "default": true + }, + "vimInsertModeRemaps": { + "type": "object", + "description": "Map two-key INSERT-mode sequences to Escape in vim editor mode. Each key is exactly two printable characters typed in sequence, and \"\" is the only supported target; other entries are ignored. Read from user, --settings flag, and managed settings only, so a repository's checked-in settings cannot remap your keystrokes. Has no effect unless editorMode is \"vim\". Requires Claude Code v2.1.208 or later. See https://code.claude.com/docs/en/interactive-mode#remap-insert-mode-key-sequences", + "propertyNames": { + "pattern": "^..$" + }, + "additionalProperties": { + "type": "string", + "description": "Remap target. \"\" is the only supported value; other values are ignored" + }, + "examples": [ + { + "jj": "" + } + ] + }, + "processWrapper": { + "type": "string", + "description": "Corporate launcher command placed in front of the background processes Claude Code starts. Honored from managed settings, a --settings file, and user settings only; the CLAUDE_CODE_PROCESS_WRAPPER environment variable takes precedence when both are set. Requires Claude Code v2.1.210 or later. See https://code.claude.com/docs/en/corporate-launcher", + "examples": ["/opt/corp/launcher --profile claude"] + }, + "forceLoginGatewayUrl": { + "type": "string", + "description": "Pre-fills and locks the gateway URL on the /login Cloud gateway screen. Either this key or forceLoginMethod: \"gateway\" surfaces that screen; set both so the URL is filled in. Honored only at the managed policy tier; ignored in user and project settings. See https://code.claude.com/docs/en/claude-apps-gateway#set-the-gateway-url", + "examples": ["https://claude-gateway.example.com"] + }, + "disableSideloadFlags": { + "type": "boolean", + "description": "(Managed settings only) Reject the --plugin-dir, --plugin-url, --agents, and --mcp-config CLI flags at startup, which users could otherwise pass to bypass strictKnownMarketplaces for a single run. Also rejects these flags from any surface that spawns the CLI with them internally, currently Cowork local sessions in the desktop app. A --mcp-config whose servers are all in-process type: \"sdk\" entries is still accepted, so the Agent SDK and VS Code extension keep working. Does not block claude mcp add, .mcp.json, or SDK setMcpServers(); pair with allowedMcpServers for per-server MCP control. Requires Claude Code v2.1.193 or later. See https://code.claude.com/docs/en/settings#available-settings" + }, + "browserExternalPageTools": { + "type": "string", + "description": "(Managed settings only) Set to \"disabled\" to prevent Claude from using tools to read or act on external pages in the desktop app's Browser pane. Users can still navigate to external sites themselves, and local dev server previews are unaffected. See https://code.claude.com/docs/en/desktop#browse-external-sites", + "enum": ["disabled"] + }, + "disableBrowserExternalNavigation": { + "type": "boolean", + "description": "(Managed settings only) Set to true to turn off external browsing in the desktop app's Browser pane. Neither users nor Claude can navigate to external sites, and localhost dev server previews are unaffected. The value must be the JSON boolean true; the string \"true\" is ignored. See https://code.claude.com/docs/en/desktop#browse-external-sites" + }, + "disableMobileSimulatorTools": { + "type": "boolean", + "description": "(Managed settings only) Set to true to block Claude's tools for the desktop app's iOS Simulator pane. Users keep manual use of the pane; only Claude's access is removed. The value must be the JSON boolean true; any other value is ignored, and a malformed value such as \"true\" or 1 logs a warning. See https://code.claude.com/docs/en/desktop-ios-simulator#turn-off-simulator-access" + }, + "requireCoworkFullVmSandbox": { + "type": "boolean", + "description": "(Managed settings only) Run Claude's tools inside an isolated virtual machine instead of on your Mac. Disables the desktop app's iOS Simulator pane and Claude's simulator tools entirely, so the pane cannot attach a device while it is set. See https://code.claude.com/docs/en/desktop-ios-simulator#turn-off-simulator-access" } }, "title": "Claude Code Settings" diff --git a/src/test/claude-code-keybindings/all-contexts.json b/src/test/claude-code-keybindings/all-contexts.json index 2e1db49ad26..845034724a6 100644 --- a/src/test/claude-code-keybindings/all-contexts.json +++ b/src/test/claude-code-keybindings/all-contexts.json @@ -58,6 +58,7 @@ }, { "bindings": { + "app:diffFileListUp": "app:diffFileListUp", "app:toggleBrief": "app:toggleBrief", "autocomplete:accept": "autocomplete:accept", "historySearch:execute": "historySearch:execute", @@ -69,6 +70,7 @@ }, { "bindings": { + "app:diffFileListDown": "app:diffFileListDown", "app:openArtifact": "app:openArtifact", "autocomplete:dismiss": "autocomplete:dismiss", "historySearch:cycleScope": "historySearch:cycleScope", @@ -136,8 +138,10 @@ { "bindings": { "attachments:previous": "attachments:previous", + "backspace": "footer:dismiss", "chat:clearScreen": "chat:clearScreen", "confirm:next": "confirm:next", + "delete": "footer:dismiss", "diff:previousFile": "diff:previousFile", "selection:extendLineStart": "selection:extendLineStart", "settings:periodWeek": "settings:periodWeek" @@ -160,7 +164,6 @@ "attachments:exit": "attachments:exit", "chat:cycleMode": "chat:cycleMode", "confirm:previousField": "confirm:previousField", - "doctor:fix": "doctor:fix", "modelPicker:decreaseEffort": "modelPicker:decreaseEffort" }, "context": "DiffDialog" @@ -199,21 +202,13 @@ "bindings": { "chat:workflowKeywordToggle": "chat:workflowKeywordToggle", "footer:down": "footer:down", + "footer:openSelected": "footer:openSelected", "scroll:pageUp": "scroll:pageUp", "select:previous": "select:previous", - "tabs:next": "tabs:next" - }, - "context": "Scroll" - }, - { - "bindings": { - "chat:submit": "chat:submit", - "footer:openSelected": "footer:openSelected", - "scroll:pageDown": "scroll:pageDown", - "select:accept": "select:accept", + "tabs:next": "tabs:next", "tabs:previous": "tabs:previous" }, - "context": "Doctor" + "context": "Scroll" } ] } diff --git a/src/test/claude-code-keybindings/current-actions.json b/src/test/claude-code-keybindings/current-actions.json index 17a54a3e7aa..44eb4211269 100644 --- a/src/test/claude-code-keybindings/current-actions.json +++ b/src/test/claude-code-keybindings/current-actions.json @@ -3,8 +3,10 @@ { "bindings": { "ctrl+]": "app:openArtifact", + "ctrl+down": "app:diffFileListDown", "ctrl+r": "app:redraw", - "ctrl+shift+b": "app:toggleBrief" + "ctrl+shift+b": "app:toggleBrief", + "ctrl+up": "app:diffFileListUp" }, "context": "Global" }, @@ -40,6 +42,8 @@ }, { "bindings": { + "backspace": "footer:dismiss", + "delete": "footer:dismiss", "down": "footer:down", "up": "footer:up", "x": "footer:close" @@ -76,12 +80,6 @@ }, "context": "Settings" }, - { - "bindings": { - "f": "doctor:fix" - }, - "context": "Doctor" - }, { "bindings": { "b": "scroll:fullPageUp", diff --git a/src/test/claude-code-settings/basic-config.json b/src/test/claude-code-settings/basic-config.json index 5cac2db17ed..c1312d6a608 100644 --- a/src/test/claude-code-settings/basic-config.json +++ b/src/test/claude-code-settings/basic-config.json @@ -1,4 +1,5 @@ { + "askUserQuestionTimeout": "never", "effortLevel": "high", "env": { "CCR_FORCE_BUNDLE": "1", @@ -70,7 +71,11 @@ "USE_BUILTIN_RIPGREP": "1" }, "model": "sonnet", + "permissions": { + "defaultMode": "default" + }, "preferredNotifChannel": "iterm2_with_bell", "teammateMode": "auto", - "verbose": false + "verbose": false, + "workflowSizeGuideline": "unrestricted" } diff --git a/src/test/claude-code-settings/edge-cases.json b/src/test/claude-code-settings/edge-cases.json index 8b933532c5b..a0ae2d330d0 100644 --- a/src/test/claude-code-settings/edge-cases.json +++ b/src/test/claude-code-settings/edge-cases.json @@ -1,4 +1,5 @@ { + "askUserQuestionTimeout": "60s", "autoCompactEnabled": false, "autoScrollEnabled": true, "autoUpdatesChannel": "stable", @@ -10,15 +11,26 @@ "CLAUDE_CODE_DEBUG_LOG_LEVEL": "info", "CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN": "0", "CLAUDE_CODE_DISABLE_ATTACHMENTS": "0", + "CLAUDE_CODE_DISABLE_BEDROCK_CONTENT_TYPE_GUARD": "0", + "CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFF": "0", "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "0", + "CLAUDE_CODE_DISABLE_EXPLORE_PLAN_AGENTS": "0", + "CLAUDE_CODE_DISABLE_NOTIFICATION_PRESENCE_CHECK": "0", "CLAUDE_CODE_EFFORT_LEVEL": "max", + "CLAUDE_CODE_ENABLE_APPEND_SUBAGENT_PROMPT": "0", "CLAUDE_CODE_ENABLE_FEEDBACK_SURVEY_FOR_OTEL": "0", "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "0", "CLAUDE_CODE_FORCE_SYNC_OUTPUT": "0", + "CLAUDE_CODE_FORWARD_SUBAGENT_TEXT": "0", "CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE": "0", "CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE": "0", "CLAUDE_CODE_PLUGIN_PREFER_HTTPS": "0", "CLAUDE_CODE_POWERSHELL_RESPECT_EXECUTION_POLICY": "0", + "CLAUDE_CODE_SKIP_AWS_CRED_CACHE": "0", + "CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS": "0", + "CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK": "1", + "CLAUDE_DISABLE_ADOPT": "0", + "FORCE_HYPERLINK": "0", "OTEL_EXPORTER_OTLP_LOGS_PROTOCOL": "http/protobuf", "OTEL_EXPORTER_OTLP_METRICS_PROTOCOL": "http/protobuf", "OTEL_EXPORTER_OTLP_PROTOCOL": "http/protobuf", @@ -49,6 +61,7 @@ "teammateMode": "in-process", "terminalProgressBarEnabled": true, "workflowKeywordTriggerEnabled": false, + "workflowSizeGuideline": "medium", "worktree": { "baseRef": "fresh", "bgIsolation": "worktree" diff --git a/src/test/claude-code-settings/enum-coverage.json b/src/test/claude-code-settings/enum-coverage.json index 1ba372bc7d9..80ea6f3be78 100644 --- a/src/test/claude-code-settings/enum-coverage.json +++ b/src/test/claude-code-settings/enum-coverage.json @@ -1,7 +1,10 @@ { "$schema": "https://www.schemastore.org/claude-code-settings.json", + "askUserQuestionTimeout": "10m", + "browserExternalPageTools": "disabled", "channelsEnabled": false, "defaultShell": "bash", + "diffTool": "auto", "editorMode": "normal", "effortLevel": "xhigh", "env": { @@ -160,6 +163,7 @@ "OTEL_METRICS_INCLUDE_VERSION": "false", "USE_BUILTIN_RIPGREP": "0" }, + "forceLoginMethod": "gateway", "hooks": { "PreToolUse": [ { @@ -187,5 +191,6 @@ "viewMode": "verbose", "voice": { "mode": "hold" - } + }, + "workflowSizeGuideline": "large" } diff --git a/src/test/claude-code-settings/env-variables.json b/src/test/claude-code-settings/env-variables.json index 31253218231..56f0338e47d 100644 --- a/src/test/claude-code-settings/env-variables.json +++ b/src/test/claude-code-settings/env-variables.json @@ -13,9 +13,12 @@ "ANTHROPIC_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES": "example", "ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION": "example", "ANTHROPIC_DEFAULT_OPUS_MODEL_NAME": "example", + "ANTHROPIC_FOUNDRY_AUTH_TOKEN": "eyJhbGciOiJIUzI1NiJ9.example", "BETA_TRACING_ENDPOINT": "https://otel.example/v1/traces", "CCR_FORCE_BUNDLE": "1", "CLAUDECODE": "1", + "CLAUDE_AFK_COUNTDOWN_MS": "20000", + "CLAUDE_AFK_TIMEOUT_MS": "60000", "CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS": "1", "CLAUDE_AGENT_SDK_MCP_NO_PREFIX": "1", "CLAUDE_AUTO_BACKGROUND_TASKS": "1", @@ -28,6 +31,8 @@ "CLAUDE_CODE_ARTIFACT_AUTO_OPEN": "1", "CLAUDE_CODE_ATTRIBUTION_HEADER": "1", "CLAUDE_CODE_AUTO_CONNECT_IDE": "true", + "CLAUDE_CODE_AWS_CHAIN_RESOLVE_TIMEOUT_MS": "60000", + "CLAUDE_CODE_BRIDGE_SESSION_ID": "session_abc123", "CLAUDE_CODE_CHILD_SESSION": "1", "CLAUDE_CODE_DISABLE_1M_CONTEXT": "1", "CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING": "0", @@ -38,11 +43,14 @@ "CLAUDE_CODE_DISABLE_ATTACHMENTS": "1", "CLAUDE_CODE_DISABLE_AUTO_MEMORY": "1", "CLAUDE_CODE_DISABLE_BACKGROUND_TASKS": "1", + "CLAUDE_CODE_DISABLE_BEDROCK_CONTENT_TYPE_GUARD": "1", + "CLAUDE_CODE_DISABLE_BG_EXIT_HANDOFF": "1", "CLAUDE_CODE_DISABLE_BG_SHELL_PRESSURE_REAP": "1", "CLAUDE_CODE_DISABLE_BUNDLED_SKILLS": "1", "CLAUDE_CODE_DISABLE_CLAUDE_MDS": "0", "CLAUDE_CODE_DISABLE_CRON": "1", "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1", + "CLAUDE_CODE_DISABLE_EXPLORE_PLAN_AGENTS": "1", "CLAUDE_CODE_DISABLE_FAST_MODE": "1", "CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY": "1", "CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING": "1", @@ -52,6 +60,7 @@ "CLAUDE_CODE_DISABLE_MOUSE_CLICKS": "1", "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1", "CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK": "1", + "CLAUDE_CODE_DISABLE_NOTIFICATION_PRESENCE_CHECK": "1", "CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL": "1", "CLAUDE_CODE_DISABLE_POLICY_SKILLS": "1", "CLAUDE_CODE_DISABLE_TERMINAL_TITLE": "1", @@ -59,6 +68,7 @@ "CLAUDE_CODE_DISABLE_VIRTUAL_SCROLL": "1", "CLAUDE_CODE_DISABLE_WORKFLOWS": "1", "CLAUDE_CODE_EFFORT_LEVEL": "high", + "CLAUDE_CODE_ENABLE_APPEND_SUBAGENT_PROMPT": "1", "CLAUDE_CODE_ENABLE_AUTO_MODE": "1", "CLAUDE_CODE_ENABLE_AWAY_SUMMARY": "1", "CLAUDE_CODE_ENABLE_BACKGROUND_PLUGIN_REFRESH": "1", @@ -66,6 +76,7 @@ "CLAUDE_CODE_ENABLE_FINE_GRAINED_TOOL_STREAMING": "1", "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1", "CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION": "true", + "CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING": "true", "CLAUDE_CODE_ENABLE_TASKS": "1", "CLAUDE_CODE_ENABLE_TELEMETRY": "1", "CLAUDE_CODE_ENHANCED_TELEMETRY_BETA": "1", @@ -74,33 +85,45 @@ "CLAUDE_CODE_FORCE_STRIKETHROUGH": "1", "CLAUDE_CODE_FORCE_SYNC_OUTPUT": "1", "CLAUDE_CODE_FORK_SUBAGENT": "1", + "CLAUDE_CODE_FORWARD_SUBAGENT_TEXT": "1", "CLAUDE_CODE_GLOB_HIDDEN": "true", "CLAUDE_CODE_GLOB_NO_IGNORE": "true", "CLAUDE_CODE_HIDE_CWD": "1", "CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL": "1", "CLAUDE_CODE_IDE_SKIP_VALID_CHECK": "1", + "CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS": "20", + "CLAUDE_CODE_MAX_SUBAGENTS_PER_SESSION": "200", + "CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH": "2", + "CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION": "200", "CLAUDE_CODE_MCP_ALLOWLIST_ENV": "1", + "CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS": "120000", "CLAUDE_CODE_NATIVE_CURSOR": "1", "CLAUDE_CODE_NEW_INIT": "1", "CLAUDE_CODE_NO_FLICKER": "1", "CLAUDE_CODE_OPUS_4_6_FAST_MODE_OVERRIDE": "1", + "CLAUDE_CODE_OTEL_CONTENT_MAX_LENGTH": "61440", "CLAUDE_CODE_OTEL_DIAG_STDERR": "1", "CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE": "1", "CLAUDE_CODE_PERFORCE_MODE": "1", "CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE": "1", "CLAUDE_CODE_PLUGIN_PREFER_HTTPS": "1", "CLAUDE_CODE_POWERSHELL_RESPECT_EXECUTION_POLICY": "1", + "CLAUDE_CODE_PROCESS_WRAPPER": "/opt/corp/launcher", "CLAUDE_CODE_PROPAGATE_TRACEPARENT": "1", "CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST": "1", "CLAUDE_CODE_PROXY_RESOLVES_HOSTS": "1", "CLAUDE_CODE_REMOTE": "true", "CLAUDE_CODE_RESUME_INTERRUPTED_TURN": "1", + "CLAUDE_CODE_RESUME_INTERRUPTED_TURN_MAX_AGE_MS": "3600000", "CLAUDE_CODE_RETRY_WATCHDOG": "1", "CLAUDE_CODE_SAFE_MODE": "1", "CLAUDE_CODE_SIMPLE": "1", "CLAUDE_CODE_SIMPLE_SYSTEM_PROMPT": "1", "CLAUDE_CODE_SKIP_ANTHROPIC_AWS_AUTH": "1", + "CLAUDE_CODE_SKIP_AWS_CRED_CACHE": "1", "CLAUDE_CODE_SKIP_BEDROCK_AUTH": "1", + "CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS": "1", + "CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK": "0", "CLAUDE_CODE_SKIP_FOUNDRY_AUTH": "1", "CLAUDE_CODE_SKIP_MANTLE_AUTH": "1", "CLAUDE_CODE_SKIP_PROMPT_HISTORY": "1", @@ -109,6 +132,7 @@ "CLAUDE_CODE_SYNC_PLUGIN_INSTALL": "1", "CLAUDE_CODE_SYNC_SKILLS": "1", "CLAUDE_CODE_SYNTAX_HIGHLIGHT": "true", + "CLAUDE_CODE_TEAM_TEARDOWN_PARK_TIMEOUT_MS": "10000", "CLAUDE_CODE_TMUX_TRUECOLOR": "1", "CLAUDE_CODE_USE_ANTHROPIC_AWS": "1", "CLAUDE_CODE_USE_BEDROCK": "1", @@ -117,10 +141,12 @@ "CLAUDE_CODE_USE_NATIVE_FILE_SEARCH": "1", "CLAUDE_CODE_USE_POWERSHELL_TOOL": "1", "CLAUDE_CODE_USE_VERTEX": "1", + "CLAUDE_DISABLE_ADOPT": "1", "CLAUDE_EFFORT": "low", "CLAUDE_ENABLE_BYTE_WATCHDOG": "1", "CLAUDE_ENABLE_BYTE_WATCHDOG_BEDROCK": "1", "CLAUDE_ENABLE_STREAM_WATCHDOG": "1", + "CLAUDE_PID": "12345", "DEBUG_LEVEL": "2", "DISABLE_AUTOUPDATER": "1", "DISABLE_AUTO_COMPACT": "1", @@ -151,14 +177,22 @@ "ENABLE_PROMPT_CACHING_1H": "1", "ENABLE_TOOL_SEARCH": "true", "FORCE_AUTOUPDATE_PLUGINS": "1", + "FORCE_HYPERLINK": "1", "FORCE_PROMPT_CACHING_5M": "1", "HOME_DIR": "/home/user", "IS_DEMO": "1", "MCP_CONNECTION_NONBLOCKING": "1", + "OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT": "65536", + "OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE": "/etc/otel/logs-client.crt", + "OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY": "/etc/otel/logs-client.key", "OTEL_EXPORTER_OTLP_LOGS_PROTOCOL": "grpc", + "OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE": "/etc/otel/metrics-client.crt", + "OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY": "/etc/otel/metrics-client.key", "OTEL_EXPORTER_OTLP_METRICS_PROTOCOL": "grpc", "OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE": "delta", "OTEL_EXPORTER_OTLP_PROTOCOL": "grpc", + "OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE": "/etc/otel/traces-client.crt", + "OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY": "/etc/otel/traces-client.key", "OTEL_EXPORTER_OTLP_TRACES_PROTOCOL": "grpc", "OTEL_LOG_ASSISTANT_RESPONSES": "1", "OTEL_LOG_TOOL_CONTENT": "1", @@ -171,6 +205,8 @@ "OTEL_METRICS_INCLUDE_VERSION": "true", "PATH": "/usr/local/bin:/usr/bin:/bin", "USE_BUILTIN_RIPGREP": "1", + "VERTEX_REGION_CLAUDE_5_OPUS": "us-east5", + "VERTEX_REGION_CLAUDE_5_SONNET": "us-east5", "VERTEX_REGION_CLAUDE_HAIKU_4_5": "us-east5" } } diff --git a/src/test/claude-code-settings/hooks-complete.json b/src/test/claude-code-settings/hooks-complete.json index 066c9f845d9..1b9fcf328e7 100644 --- a/src/test/claude-code-settings/hooks-complete.json +++ b/src/test/claude-code-settings/hooks-complete.json @@ -12,6 +12,17 @@ "matcher": "user_settings" } ], + "DirectoryAdded": [ + { + "hooks": [ + { + "command": "./scripts/on-dir-added.sh", + "timeout": 30, + "type": "command" + } + ] + } + ], "Elicitation": [ { "hooks": [ diff --git a/src/test/claude-code-settings/marketplace-host-pattern.json b/src/test/claude-code-settings/marketplace-host-pattern.json index a2dd0043fdf..57ad79b6ae0 100644 --- a/src/test/claude-code-settings/marketplace-host-pattern.json +++ b/src/test/claude-code-settings/marketplace-host-pattern.json @@ -2,6 +2,7 @@ "extraKnownMarketplaces": { "corp-git-repo": { "source": { + "skipLfs": true, "source": "git", "url": "https://git.corp.example/plugins/marketplace.git" } @@ -13,6 +14,47 @@ "hostPattern": "git.internal.example.com", "source": "hostPattern" } + }, + "lfs-heavy-gh": { + "source": { + "ref": "main", + "repo": "acme-corp/plugins", + "skipLfs": true, + "source": "github" + } + }, + "team-tools": { + "source": { + "name": "team-tools", + "plugins": [ + { + "name": "code-formatter", + "source": { + "repo": "acme-corp/code-formatter", + "sha": "0123456789abcdef0123456789abcdef01234567", + "source": "github" + } + }, + { + "name": "linter", + "source": { + "package": "@acme-corp/linter", + "source": "npm", + "version": "1.2.3" + } + }, + { + "name": "monorepo-tool", + "source": { + "path": "plugins/monorepo-tool", + "ref": "main", + "source": "git-subdir", + "url": "https://git.corp.example/tools.git" + } + } + ], + "source": "settings" + } } }, "strictKnownMarketplaces": [ diff --git a/src/test/claude-code-settings/modern-complete-config.json b/src/test/claude-code-settings/modern-complete-config.json index 8029857a814..f15eed73202 100644 --- a/src/test/claude-code-settings/modern-complete-config.json +++ b/src/test/claude-code-settings/modern-complete-config.json @@ -15,11 +15,15 @@ "allowedHttpHookUrls": ["https://hooks.example.com/*", "http://localhost:*"], "alwaysThinkingEnabled": false, "apiKeyHelper": "/usr/local/bin/claude-auth-helper", + "askUserQuestionTimeout": "5m", "attribution": { "commit": "Generated with AI\n\nCo-Authored-By: AI ", - "pr": "" + "pr": "", + "sessionUrl": false }, "autoCompactEnabled": true, + "autoConnectIde": true, + "autoInstallIdeExtension": false, "autoMemoryDirectory": "~/.claude/custom-memory", "autoMemoryEnabled": false, "autoMode": { @@ -42,6 +46,7 @@ "source": "pathPattern" } ], + "browserExternalPageTools": "disabled", "channelsEnabled": true, "claudeMd": "# Org policy\nFollow security guidelines.", "claudeMdExcludes": [ @@ -51,20 +56,26 @@ "cleanupPeriodDays": 60, "companyAnnouncements": ["Welcome to the team!"], "defaultShell": "powershell", + "diffTool": "terminal", "disableAgentView": false, "disableAllHooks": false, "disableArtifact": false, "disableAutoMode": "disable", + "disableBrowserExternalNavigation": true, "disableBundledSkills": true, "disableClaudeAiConnectors": false, "disableDeepLinkRegistration": "disable", + "disableMobileSimulatorTools": true, "disableRemoteControl": false, + "disableSideloadFlags": true, "disableSkillShellExecution": false, "disableWorkflows": false, "disabledMcpjsonServers": ["untrusted-server"], "editorMode": "vim", "effortLevel": "xhigh", + "emojiCompletionEnabled": false, "enableAllProjectMcpServers": true, + "enableArtifact": true, "enabledPlugins": { "formatter@anthropic-tools": true }, @@ -95,6 +106,7 @@ "OTEL_LOG_ASSISTANT_RESPONSES": "0", "PROJECT_ROOT": "/home/user/projects" }, + "externalEditorContext": true, "extraKnownMarketplaces": { "corp-git-host": { "source": { @@ -120,6 +132,7 @@ "url": "https://github.com/example/repo/issues/{num}" } ], + "forceLoginGatewayUrl": "https://claude-gateway.example.com", "forceLoginMethod": "console", "forceLoginOrgUUID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "forceRemoteSettingsRefresh": false, @@ -136,6 +149,16 @@ "matcher": "user_settings" } ], + "DirectoryAdded": [ + { + "hooks": [ + { + "command": "echo 'directory added'", + "type": "command" + } + ] + } + ], "InstructionsLoaded": [ { "hooks": [ @@ -326,7 +349,6 @@ "url": "https://mcp.corp.example/sse" } ], - "maxSkillDescriptionChars": 2048, "minimumVersion": "2.1.0", "model": "opus", "modelOverrides": { @@ -335,6 +357,7 @@ "otelHeadersHelper": "/usr/local/bin/otel-headers.sh", "outputStyle": "Explanatory", "parentSettingsBehavior": "merge", + "permissionExplainerEnabled": false, "permissions": { "additionalDirectories": ["~/Documents/reference", "~/.config/claude-code"], "allow": [ @@ -386,7 +409,9 @@ "prUrlTemplate": "https://reviews.example.com/{owner}/{repo}/pull/{number}", "preferredNotifChannel": "terminal_bell", "prefersReducedMotion": true, + "processWrapper": "/opt/corp/launcher --profile claude", "remoteControlAtStartup": false, + "requireCoworkFullVmSandbox": true, "requiredMaximumVersion": "3.0.0", "requiredMinimumVersion": "2.0.0", "respectGitignore": false, @@ -397,6 +422,7 @@ "autoAllowBashIfSandboxed": false, "bwrapPath": "/usr/bin/bwrap", "credentials": { + "allowPlaintextInject": true, "envVars": [ { "mode": "deny", @@ -420,7 +446,8 @@ "allowRead": ["~/.ssh/known_hosts"], "allowWrite": ["~/.kube", "//tmp/build"], "denyRead": ["~/.ssh/id_rsa"], - "denyWrite": ["//etc", "//usr"] + "denyWrite": ["//etc", "//usr"], + "disabled": true }, "network": { "allowAllUnixSockets": false, @@ -431,7 +458,12 @@ "allowedDomains": ["github.com", "*.npmjs.org", "registry.yarnpkg.com"], "deniedDomains": ["ads.example.com", "*.tracker.com"], "httpProxyPort": 8080, - "socksProxyPort": 8081 + "socksProxyPort": 8081, + "strictAllowlist": true, + "tlsTerminate": { + "caCertPath": "/etc/corp/ca.pem", + "caKeyPath": "/etc/corp/ca.key" + } }, "ripgrep": { "args": ["--hidden"], @@ -443,6 +475,7 @@ "showThinkingSummaries": true, "showTurnDuration": false, "skillListingBudgetFraction": 0.02, + "skillListingMaxDescChars": 2048, "skillOverrides": { "deploy": "off", "internal-tool": "user-invocable-only", @@ -485,6 +518,7 @@ "type": "command" }, "syntaxHighlightingDisabled": false, + "teammateDefaultModel": "sonnet", "teammateMode": "tmux", "terminalProgressBarEnabled": false, "theme": "dark-daltonized", @@ -492,6 +526,10 @@ "useAutoModeDuringPlan": true, "verbose": true, "viewMode": "focus", + "vimInsertModeRemaps": { + "jj": "", + "kj": "" + }, "voice": { "autoSubmit": false, "enabled": true, @@ -500,6 +538,7 @@ "voiceEnabled": true, "wheelScrollAccelerationEnabled": true, "workflowKeywordTriggerEnabled": true, + "workflowSizeGuideline": "small", "worktree": { "baseRef": "head", "bgIsolation": "none", diff --git a/src/test/claude-code-settings/permissions-advanced.json b/src/test/claude-code-settings/permissions-advanced.json index 9536d74e707..7299342bf5c 100644 --- a/src/test/claude-code-settings/permissions-advanced.json +++ b/src/test/claude-code-settings/permissions-advanced.json @@ -18,9 +18,12 @@ "WebFetch(domain:github.com)", "WebSearch", "mcp__ide__getDiagnostics", - "mcp__ide__executeCode" + "mcp__ide__executeCode", + "Artifact", + "EnterWorktree(*)", + "Workflow" ], - "ask": ["Write(~/projects/**)", "Bash(make:*)"], + "ask": ["Write(~/projects/**)", "Bash(make:*)", "ShareOnboardingGuide"], "defaultMode": "acceptEdits", "deny": ["Bash(rm:*)", "Write(/etc/**)", "WebFetch(domain:malicious.com)"], "disableBypassPermissionsMode": "disable" diff --git a/src/test/claude-code-settings/permissions-basic.json b/src/test/claude-code-settings/permissions-basic.json index 2db123a5f32..3490d25af5b 100644 --- a/src/test/claude-code-settings/permissions-basic.json +++ b/src/test/claude-code-settings/permissions-basic.json @@ -7,7 +7,7 @@ "permissions": { "allow": ["Read(~/.bashrc)", "Bash(pwd:*)"], "ask": ["Write(/tmp/**)"], - "defaultMode": "default", + "defaultMode": "manual", "deny": ["Bash(sudo:*)"] } } From 4440ce7a697b2e1b38e0880bc5c9615ecda1297e Mon Sep 17 00:00:00 2001 From: Typpi <20943337+Nick2bad4u@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:04:00 -0400 Subject: [PATCH 02/21] Add GitHub CLI configuration schemas (#6097) --- src/api/json/catalog.json | 12 ++ .../github-cli-config/invalid-alias.yml | 3 + .../invalid-git-protocol.yml | 2 + .../github-cli-config/invalid-telemetry.yml | 2 + .../github-cli-config/root-array.yml | 2 + .../github-cli-config/unsupported-version.yml | 2 + .../github-cli-hosts/invalid-git-protocol.yml | 3 + .../github-cli-hosts/invalid-host-spinner.yml | 3 + .../github-cli-hosts/invalid-host.yml | 2 + .../github-cli-hosts/invalid-token.yml | 4 + .../github-cli-hosts/invalid-user-prompt.yml | 5 + .../github-cli-hosts/invalid-user.yml | 4 + .../github-cli-hosts/invalid-users.yml | 4 + .../github-cli-hosts/root-array.yml | 2 + src/schemas/json/github-cli-config.json | 96 ++++++++++++++ src/schemas/json/github-cli-hosts.json | 122 ++++++++++++++++++ src/test/github-cli-config/complete.yml | 18 +++ .../github-cli-config/forward-compatible.yml | 6 + src/test/github-cli-hosts/empty.yml | 2 + src/test/github-cli-hosts/multiple-hosts.yml | 29 +++++ src/test/github-cli-hosts/secure-storage.yml | 6 + 21 files changed, 329 insertions(+) create mode 100644 src/negative_test/github-cli-config/invalid-alias.yml create mode 100644 src/negative_test/github-cli-config/invalid-git-protocol.yml create mode 100644 src/negative_test/github-cli-config/invalid-telemetry.yml create mode 100644 src/negative_test/github-cli-config/root-array.yml create mode 100644 src/negative_test/github-cli-config/unsupported-version.yml create mode 100644 src/negative_test/github-cli-hosts/invalid-git-protocol.yml create mode 100644 src/negative_test/github-cli-hosts/invalid-host-spinner.yml create mode 100644 src/negative_test/github-cli-hosts/invalid-host.yml create mode 100644 src/negative_test/github-cli-hosts/invalid-token.yml create mode 100644 src/negative_test/github-cli-hosts/invalid-user-prompt.yml create mode 100644 src/negative_test/github-cli-hosts/invalid-user.yml create mode 100644 src/negative_test/github-cli-hosts/invalid-users.yml create mode 100644 src/negative_test/github-cli-hosts/root-array.yml create mode 100644 src/schemas/json/github-cli-config.json create mode 100644 src/schemas/json/github-cli-hosts.json create mode 100644 src/test/github-cli-config/complete.yml create mode 100644 src/test/github-cli-config/forward-compatible.yml create mode 100644 src/test/github-cli-hosts/empty.yml create mode 100644 src/test/github-cli-hosts/multiple-hosts.yml create mode 100644 src/test/github-cli-hosts/secure-storage.yml diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index 05771485d2f..28bec6c0e75 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -3620,6 +3620,18 @@ "fileMatch": ["action.yml", "action.yaml"], "url": "https://www.schemastore.org/github-action.json" }, + { + "name": "GitHub CLI configuration", + "description": "Global configuration for the GitHub CLI", + "fileMatch": ["**/gh/config.yml", "**/GitHub CLI/config.yml"], + "url": "https://www.schemastore.org/github-cli-config.json" + }, + { + "name": "GitHub CLI hosts", + "description": "Authentication and per-host configuration for the GitHub CLI", + "fileMatch": ["**/gh/hosts.yml", "**/GitHub CLI/hosts.yml"], + "url": "https://www.schemastore.org/github-cli-hosts.json" + }, { "name": "GitHub Discussion", "description": "YAML GitHub Discussions", diff --git a/src/negative_test/github-cli-config/invalid-alias.yml b/src/negative_test/github-cli-config/invalid-alias.yml new file mode 100644 index 00000000000..99c17cfcee0 --- /dev/null +++ b/src/negative_test/github-cli-config/invalid-alias.yml @@ -0,0 +1,3 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-config.json +aliases: + issue: 123 diff --git a/src/negative_test/github-cli-config/invalid-git-protocol.yml b/src/negative_test/github-cli-config/invalid-git-protocol.yml new file mode 100644 index 00000000000..3981cb67cfc --- /dev/null +++ b/src/negative_test/github-cli-config/invalid-git-protocol.yml @@ -0,0 +1,2 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-config.json +git_protocol: git diff --git a/src/negative_test/github-cli-config/invalid-telemetry.yml b/src/negative_test/github-cli-config/invalid-telemetry.yml new file mode 100644 index 00000000000..a341ad61778 --- /dev/null +++ b/src/negative_test/github-cli-config/invalid-telemetry.yml @@ -0,0 +1,2 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-config.json +telemetry: verbose diff --git a/src/negative_test/github-cli-config/root-array.yml b/src/negative_test/github-cli-config/root-array.yml new file mode 100644 index 00000000000..58a68621499 --- /dev/null +++ b/src/negative_test/github-cli-config/root-array.yml @@ -0,0 +1,2 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-config.json +- version: 1 diff --git a/src/negative_test/github-cli-config/unsupported-version.yml b/src/negative_test/github-cli-config/unsupported-version.yml new file mode 100644 index 00000000000..0e5fd0ca728 --- /dev/null +++ b/src/negative_test/github-cli-config/unsupported-version.yml @@ -0,0 +1,2 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-config.json +version: 2 diff --git a/src/negative_test/github-cli-hosts/invalid-git-protocol.yml b/src/negative_test/github-cli-hosts/invalid-git-protocol.yml new file mode 100644 index 00000000000..1a27c87b98a --- /dev/null +++ b/src/negative_test/github-cli-hosts/invalid-git-protocol.yml @@ -0,0 +1,3 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +github.com: + git_protocol: git diff --git a/src/negative_test/github-cli-hosts/invalid-host-spinner.yml b/src/negative_test/github-cli-hosts/invalid-host-spinner.yml new file mode 100644 index 00000000000..95165a73353 --- /dev/null +++ b/src/negative_test/github-cli-hosts/invalid-host-spinner.yml @@ -0,0 +1,3 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +github.com: + spinner: maybe diff --git a/src/negative_test/github-cli-hosts/invalid-host.yml b/src/negative_test/github-cli-hosts/invalid-host.yml new file mode 100644 index 00000000000..8d001486233 --- /dev/null +++ b/src/negative_test/github-cli-hosts/invalid-host.yml @@ -0,0 +1,2 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +github.com: github-user diff --git a/src/negative_test/github-cli-hosts/invalid-token.yml b/src/negative_test/github-cli-hosts/invalid-token.yml new file mode 100644 index 00000000000..52ce518a10d --- /dev/null +++ b/src/negative_test/github-cli-hosts/invalid-token.yml @@ -0,0 +1,4 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +github.com: + oauth_token: + value: not-a-real-token diff --git a/src/negative_test/github-cli-hosts/invalid-user-prompt.yml b/src/negative_test/github-cli-hosts/invalid-user-prompt.yml new file mode 100644 index 00000000000..0d08c6bc3b3 --- /dev/null +++ b/src/negative_test/github-cli-hosts/invalid-user-prompt.yml @@ -0,0 +1,5 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +github.com: + users: + example-user: + prompt: maybe diff --git a/src/negative_test/github-cli-hosts/invalid-user.yml b/src/negative_test/github-cli-hosts/invalid-user.yml new file mode 100644 index 00000000000..4accb8d0748 --- /dev/null +++ b/src/negative_test/github-cli-hosts/invalid-user.yml @@ -0,0 +1,4 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +github.com: + users: + example-user: enabled diff --git a/src/negative_test/github-cli-hosts/invalid-users.yml b/src/negative_test/github-cli-hosts/invalid-users.yml new file mode 100644 index 00000000000..46ad2b58773 --- /dev/null +++ b/src/negative_test/github-cli-hosts/invalid-users.yml @@ -0,0 +1,4 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +github.com: + users: + - example-user diff --git a/src/negative_test/github-cli-hosts/root-array.yml b/src/negative_test/github-cli-hosts/root-array.yml new file mode 100644 index 00000000000..d45492290df --- /dev/null +++ b/src/negative_test/github-cli-hosts/root-array.yml @@ -0,0 +1,2 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +- github.com: {} diff --git a/src/schemas/json/github-cli-config.json b/src/schemas/json/github-cli-config.json new file mode 100644 index 00000000000..de0a335df01 --- /dev/null +++ b/src/schemas/json/github-cli-config.json @@ -0,0 +1,96 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/github-cli-config.json", + "title": "GitHub CLI configuration", + "description": "Global configuration for the GitHub CLI.\nhttps://cli.github.com/manual/gh_config", + "type": "object", + "additionalProperties": true, + "properties": { + "$schema": { + "description": "URI of the JSON Schema used to validate this configuration.\nhttps://json-schema.org/understanding-json-schema/reference/schema.html", + "type": "string", + "format": "uri" + }, + "version": { + "description": "Internal GitHub CLI configuration format version.\nhttps://github.com/cli/cli/blob/v2.96.0/internal/config/config.go", + "type": "integer", + "const": 1, + "default": 1 + }, + "git_protocol": { + "description": "Protocol to use for Git operations.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["https", "ssh"], + "default": "https" + }, + "editor": { + "description": "Text editor command used by GitHub CLI.\nhttps://cli.github.com/manual/gh_config", + "type": ["string", "null"], + "default": null + }, + "prompt": { + "description": "Whether interactive prompting is enabled.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"], + "default": "enabled" + }, + "prefer_editor_prompt": { + "description": "Whether GitHub CLI should prefer opening an editor instead of prompting in the terminal.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"], + "default": "disabled" + }, + "pager": { + "description": "Terminal pager command used by GitHub CLI.\nhttps://cli.github.com/manual/gh_config", + "type": ["string", "null"], + "default": null + }, + "aliases": { + "description": "GitHub CLI aliases, keyed by alias name with command expansions as values.\nhttps://cli.github.com/manual/gh_alias", + "type": ["object", "null"], + "additionalProperties": { + "type": "string" + } + }, + "http_unix_socket": { + "description": "Path to a Unix domain socket to use for HTTP connections.\nhttps://cli.github.com/manual/gh_config", + "type": ["string", "null"], + "default": null + }, + "browser": { + "description": "Web browser command used to open URLs.\nhttps://cli.github.com/manual/gh_config", + "type": ["string", "null"], + "default": null + }, + "color_labels": { + "description": "Whether label colors are displayed using their RGB values.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"], + "default": "disabled" + }, + "accessible_colors": { + "description": "Whether the accessible four-bit color palette is enabled.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"], + "default": "disabled" + }, + "accessible_prompter": { + "description": "Whether the accessible interactive prompter is enabled.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"], + "default": "disabled" + }, + "spinner": { + "description": "Whether terminal spinner animations are enabled.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"], + "default": "enabled" + }, + "telemetry": { + "description": "Telemetry mode. The log mode writes telemetry events to stderr instead of sending them.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled", "log"], + "default": "enabled" + } + } +} diff --git a/src/schemas/json/github-cli-hosts.json b/src/schemas/json/github-cli-hosts.json new file mode 100644 index 00000000000..96e77fccbac --- /dev/null +++ b/src/schemas/json/github-cli-hosts.json @@ -0,0 +1,122 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/github-cli-hosts.json", + "title": "GitHub CLI hosts configuration", + "description": "Authentication and per-host configuration for the GitHub CLI.\nhttps://cli.github.com/manual/gh_auth_status", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/host" + }, + "definitions": { + "configOptions": { + "description": "GitHub CLI options that may be overridden for a host or preserved for an account.\nhttps://github.com/cli/cli/blob/v2.96.0/internal/config/config.go", + "type": "object", + "additionalProperties": true, + "properties": { + "git_protocol": { + "description": "Protocol to use for Git operations with this host.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["https", "ssh"] + }, + "editor": { + "description": "Text editor command used for this host.\nhttps://cli.github.com/manual/gh_config", + "type": ["string", "null"] + }, + "prompt": { + "description": "Whether interactive prompting is enabled for this host.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"] + }, + "prefer_editor_prompt": { + "description": "Whether GitHub CLI should prefer opening an editor instead of prompting in the terminal for this host.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"] + }, + "pager": { + "description": "Terminal pager command used for this host.\nhttps://cli.github.com/manual/gh_config", + "type": ["string", "null"] + }, + "http_unix_socket": { + "description": "Path to a Unix domain socket used for HTTP connections to this host.\nhttps://cli.github.com/manual/gh_config", + "type": ["string", "null"] + }, + "browser": { + "description": "Web browser command used for this host.\nhttps://cli.github.com/manual/gh_config", + "type": ["string", "null"] + }, + "color_labels": { + "description": "Whether label colors are displayed using their RGB values for this host.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"] + }, + "accessible_colors": { + "description": "Whether the accessible four-bit color palette is enabled for this host.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"] + }, + "accessible_prompter": { + "description": "Whether the accessible interactive prompter is enabled for this host.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"] + }, + "spinner": { + "description": "Whether terminal spinner animations are enabled for this host.\nhttps://cli.github.com/manual/gh_config", + "type": "string", + "enum": ["enabled", "disabled"] + } + } + }, + "host": { + "description": "Configuration for a GitHub.com or GitHub Enterprise host.\nhttps://github.com/cli/cli/blob/v2.96.0/docs/multiple-accounts.md", + "allOf": [ + { + "$ref": "#/definitions/configOptions" + }, + { + "type": "object", + "properties": { + "user": { + "description": "Username of the active account for this host.\nhttps://cli.github.com/manual/gh_auth_switch", + "type": "string" + }, + "oauth_token": { + "description": "Sensitive plaintext authentication token used when secure credential storage is unavailable. Prefer storing credentials with gh auth login.\nhttps://cli.github.com/manual/gh_auth_login", + "type": "string" + }, + "users": { + "description": "Accounts known for this host. A null value indicates that the account token is stored in the operating system credential store.\nhttps://github.com/cli/cli/blob/v2.96.0/docs/multiple-accounts.md", + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/definitions/user" + } + ] + } + } + } + } + ] + }, + "user": { + "description": "Per-account configuration stored for a host.\nhttps://github.com/cli/cli/blob/v2.96.0/docs/multiple-accounts.md", + "allOf": [ + { + "$ref": "#/definitions/configOptions" + }, + { + "type": "object", + "properties": { + "oauth_token": { + "description": "Sensitive plaintext authentication token used when secure credential storage is unavailable. Prefer storing credentials with gh auth login.\nhttps://cli.github.com/manual/gh_auth_login", + "type": "string" + } + } + } + ] + } + } +} diff --git a/src/test/github-cli-config/complete.yml b/src/test/github-cli-config/complete.yml new file mode 100644 index 00000000000..f238b4b922b --- /dev/null +++ b/src/test/github-cli-config/complete.yml @@ -0,0 +1,18 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-config.json +version: 1 +git_protocol: ssh +editor: code --wait +prompt: enabled +prefer_editor_prompt: disabled +pager: less -FRX +aliases: + co: pr checkout + bugs: issue list --label bug + shell: "!printf 'hello\\n'" +http_unix_socket: +browser: firefox +color_labels: enabled +accessible_colors: enabled +accessible_prompter: disabled +spinner: enabled +telemetry: log diff --git a/src/test/github-cli-config/forward-compatible.yml b/src/test/github-cli-config/forward-compatible.yml new file mode 100644 index 00000000000..9a4f2864b91 --- /dev/null +++ b/src/test/github-cli-config/forward-compatible.yml @@ -0,0 +1,6 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-config.json +version: 1 +editor: +pager: +aliases: +future_option: future-value diff --git a/src/test/github-cli-hosts/empty.yml b/src/test/github-cli-hosts/empty.yml new file mode 100644 index 00000000000..c8f6e2e7030 --- /dev/null +++ b/src/test/github-cli-hosts/empty.yml @@ -0,0 +1,2 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +{} diff --git a/src/test/github-cli-hosts/multiple-hosts.yml b/src/test/github-cli-hosts/multiple-hosts.yml new file mode 100644 index 00000000000..02038828d14 --- /dev/null +++ b/src/test/github-cli-hosts/multiple-hosts.yml @@ -0,0 +1,29 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +github.com: + user: primary-user + git_protocol: ssh + editor: code --wait + prompt: enabled + prefer_editor_prompt: disabled + pager: less -FRX + http_unix_socket: + browser: firefox + color_labels: enabled + accessible_colors: enabled + accessible_prompter: disabled + spinner: enabled + oauth_token: not-a-real-token + users: + primary-user: + oauth_token: not-a-real-token + spinner: disabled + secure-user: + future-user: + future_option: future-value +github.example.com: + user: enterprise-user + git_protocol: https + users: + enterprise-user: +github.localhost: + custom_option: true diff --git a/src/test/github-cli-hosts/secure-storage.yml b/src/test/github-cli-hosts/secure-storage.yml new file mode 100644 index 00000000000..f85ca2f9804 --- /dev/null +++ b/src/test/github-cli-hosts/secure-storage.yml @@ -0,0 +1,6 @@ +# yaml-language-server: $schema=../../schemas/json/github-cli-hosts.json +github.com: + user: example-user + git_protocol: https + users: + example-user: From 7796db48167db34593b202c253c493f57787e54f Mon Sep 17 00:00:00 2001 From: Typpi <20943337+Nick2bad4u@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:04:24 -0400 Subject: [PATCH 03/21] Update Knip schema URLs to v6 (#6096) --- src/api/json/catalog.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index 28bec6c0e75..6c8df466c81 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -3431,9 +3431,15 @@ }, { "name": "Knip", - "description": "Knip configuration files", - "fileMatch": ["knip.json", ".knip.json", "knip.jsonc", ".knip.jsonc"], - "url": "https://unpkg.com/knip@5/schema.json" + "description": "Knip JSON configuration files", + "fileMatch": ["knip.json", ".knip.json"], + "url": "https://unpkg.com/knip@6/schema.json" + }, + { + "name": "Knip JSONC", + "description": "Knip JSONC configuration files", + "fileMatch": ["knip.jsonc", ".knip.jsonc"], + "url": "https://unpkg.com/knip@6/schema-jsonc.json" }, { "name": "KSail", From 969f179de492ae2588db77c1ee0d7192a90978d2 Mon Sep 17 00:00:00 2001 From: Typpi <20943337+Nick2bad4u@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:04:48 -0400 Subject: [PATCH 04/21] Add Dust configuration schema (#6099) --- src/api/json/catalog.json | 6 + src/negative_test/dust/invalid-boolean.toml | 3 + .../dust/invalid-collapse-item.toml | 3 + src/negative_test/dust/invalid-collapse.toml | 3 + .../dust/invalid-files-from.toml | 3 + .../dust/invalid-output-format.toml | 3 + src/negative_test/dust/negative-integer.toml | 3 + src/schemas/json/dust.json | 130 ++++++++++++++++++ src/test/dust/complete.toml | 27 ++++ src/test/dust/minimal.toml | 3 + 10 files changed, 184 insertions(+) create mode 100644 src/negative_test/dust/invalid-boolean.toml create mode 100644 src/negative_test/dust/invalid-collapse-item.toml create mode 100644 src/negative_test/dust/invalid-collapse.toml create mode 100644 src/negative_test/dust/invalid-files-from.toml create mode 100644 src/negative_test/dust/invalid-output-format.toml create mode 100644 src/negative_test/dust/negative-integer.toml create mode 100644 src/schemas/json/dust.json create mode 100644 src/test/dust/complete.toml create mode 100644 src/test/dust/minimal.toml diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index 6c8df466c81..e997b1464fc 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -2759,6 +2759,12 @@ "fileMatch": ["*.dstack.yml", "*.dstack.yaml"], "url": "https://dstack-runner-downloads.s3.eu-west-1.amazonaws.com/latest/schemas/configuration.json" }, + { + "name": "Dust configuration", + "description": "TOML configuration for Dust", + "fileMatch": [".dust.toml", "**/.config/dust/config.toml"], + "url": "https://www.schemastore.org/dust.json" + }, { "name": "dvc.yaml", "description": "dvc.yaml file", diff --git a/src/negative_test/dust/invalid-boolean.toml b/src/negative_test/dust/invalid-boolean.toml new file mode 100644 index 00000000000..9ffd1db7e8c --- /dev/null +++ b/src/negative_test/dust/invalid-boolean.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/dust.json + +reverse = "yes" diff --git a/src/negative_test/dust/invalid-collapse-item.toml b/src/negative_test/dust/invalid-collapse-item.toml new file mode 100644 index 00000000000..f1f508bcb20 --- /dev/null +++ b/src/negative_test/dust/invalid-collapse-item.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/dust.json + +collapse = ["target", 42] diff --git a/src/negative_test/dust/invalid-collapse.toml b/src/negative_test/dust/invalid-collapse.toml new file mode 100644 index 00000000000..02ffa76a768 --- /dev/null +++ b/src/negative_test/dust/invalid-collapse.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/dust.json + +collapse = "target" diff --git a/src/negative_test/dust/invalid-files-from.toml b/src/negative_test/dust/invalid-files-from.toml new file mode 100644 index 00000000000..3d472f2d892 --- /dev/null +++ b/src/negative_test/dust/invalid-files-from.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/dust.json + +files-from = ["paths.txt"] diff --git a/src/negative_test/dust/invalid-output-format.toml b/src/negative_test/dust/invalid-output-format.toml new file mode 100644 index 00000000000..161a6a751dd --- /dev/null +++ b/src/negative_test/dust/invalid-output-format.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/dust.json + +output-format = 1024 diff --git a/src/negative_test/dust/negative-integer.toml b/src/negative_test/dust/negative-integer.toml new file mode 100644 index 00000000000..55b4af13150 --- /dev/null +++ b/src/negative_test/dust/negative-integer.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/dust.json + +depth = -1 diff --git a/src/schemas/json/dust.json b/src/schemas/json/dust.json new file mode 100644 index 00000000000..93584ec62cc --- /dev/null +++ b/src/schemas/json/dust.json @@ -0,0 +1,130 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/dust.json", + "x-tombi-toml-version": "v1.0.0", + "title": "Dust configuration", + "description": "Configuration for Dust, a more intuitive version of du.\nhttps://github.com/bootandy/dust/tree/v1.2.4#config-file", + "type": "object", + "additionalProperties": true, + "properties": { + "display-full-paths": { + "description": "Display full paths instead of file and directory names.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "display-apparent-size": { + "description": "Use apparent file sizes instead of disk usage.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "reverse": { + "description": "Reverse the output order so the largest entries appear first.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "no-colors": { + "description": "Disable colored output.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "force-colors": { + "description": "Force colored output even when stdout is not a terminal.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "no-bars": { + "description": "Hide the percent bars and percentages.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "skip-total": { + "description": "Do not display the total row.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "screen-reader": { + "description": "Present output in a format suitable for screen readers.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "ignore-hidden": { + "description": "Ignore hidden files and directories.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "only-dir": { + "description": "Display directories but not files.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "only-file": { + "description": "Display files but not directories.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "disable-progress": { + "description": "Disable the progress indicator.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "bars-on-right": { + "description": "Place percent bars on the right side of the output.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "output-json": { + "description": "Emit JSON output.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "print-errors": { + "description": "Print filesystem access errors.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "boolean", + "default": false + }, + "output-format": { + "description": "Size output format. Common values include si, b, k, kib, m, mib, g, gib, t, tib, kb, mb, gb, and tb; Dust accepts other strings.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "string", + "examples": ["si", "kib", "gb"] + }, + "min-size": { + "description": "Minimum size threshold for displayed entries, such as 10M or 1G.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "string" + }, + "files0-from": { + "description": "Read NUL-terminated input paths from this file, or from standard input when set to '-'.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "string" + }, + "files-from": { + "description": "Read newline-delimited input paths from this file, or from standard input when set to '-'.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "string" + }, + "depth": { + "description": "Maximum directory depth to display. Omit for unlimited depth.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "integer", + "minimum": 0 + }, + "stack-size": { + "description": "Worker thread stack size in bytes.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "integer", + "minimum": 0 + }, + "threads": { + "description": "Number of worker threads.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "integer", + "minimum": 0 + }, + "number-of-lines": { + "description": "Maximum number of output lines.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "integer", + "minimum": 0 + }, + "collapse": { + "description": "Paths whose contents should be collapsed into a single entry.\nhttps://github.com/bootandy/dust/blob/v1.2.4/src/config.rs", + "type": "array", + "items": { + "type": "string" + } + } + } +} diff --git a/src/test/dust/complete.toml b/src/test/dust/complete.toml new file mode 100644 index 00000000000..73565cc9196 --- /dev/null +++ b/src/test/dust/complete.toml @@ -0,0 +1,27 @@ +#:schema ../../schemas/json/dust.json + +display-full-paths = true +display-apparent-size = true +reverse = true +no-colors = false +force-colors = true +no-bars = true +skip-total = true +screen-reader = false +ignore-hidden = true +only-dir = true +only-file = true +disable-progress = true +bars-on-right = true +output-json = true +print-errors = true +output-format = "gib" +min-size = "10M" +files0-from = "paths.bin" +files-from = "paths.txt" +depth = 4 +stack-size = 8388608 +threads = 8 +number-of-lines = 40 +collapse = ["target", "node_modules"] +future-option = "accepted by Dust" diff --git a/src/test/dust/minimal.toml b/src/test/dust/minimal.toml new file mode 100644 index 00000000000..8c6bdccf942 --- /dev/null +++ b/src/test/dust/minimal.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/dust.json + +reverse = true From 145c6ed10f63eae3ae90bfbb9bbebfc0ee468455 Mon Sep 17 00:00:00 2001 From: Typpi <20943337+Nick2bad4u@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:05:08 -0400 Subject: [PATCH 05/21] Add chezmoi configuration schema (#6101) --- src/api/json/catalog.json | 12 + .../chezmoi/entry-types-string.toml | 4 + .../chezmoi/env-and-script-env.toml | 7 + .../chezmoi/git-template-conflict.toml | 5 + .../chezmoi/hook-command-and-script.toml | 5 + .../chezmoi/invalid-add-secrets.toml | 4 + .../chezmoi/invalid-auto-bool.toml | 3 + .../chezmoi/invalid-encryption.toml | 3 + .../chezmoi/invalid-entry-type.toml | 4 + .../chezmoi/invalid-environment.toml | 4 + src/negative_test/chezmoi/invalid-format.toml | 3 + src/negative_test/chezmoi/invalid-mode.toml | 3 + .../chezmoi/invalid-onepassword-mode.toml | 4 + .../chezmoi/invalid-output-format-jsonc.toml | 3 + .../chezmoi/invalid-output-format-toml.toml | 3 + .../chezmoi/invalid-status-path-style.toml | 4 + .../chezmoi/invalid-textconv.toml | 3 + src/schemas/json/chezmoi.json | 1001 +++++++++++++++++ src/test/chezmoi/complete.toml | 213 ++++ src/test/chezmoi/dynamic.yaml | 19 + .../empty-mutual-exclusion-values.toml | 14 + .../chezmoi/forward-compatible-choices.toml | 19 + src/test/chezmoi/minimal.json | 4 + 23 files changed, 1344 insertions(+) create mode 100644 src/negative_test/chezmoi/entry-types-string.toml create mode 100644 src/negative_test/chezmoi/env-and-script-env.toml create mode 100644 src/negative_test/chezmoi/git-template-conflict.toml create mode 100644 src/negative_test/chezmoi/hook-command-and-script.toml create mode 100644 src/negative_test/chezmoi/invalid-add-secrets.toml create mode 100644 src/negative_test/chezmoi/invalid-auto-bool.toml create mode 100644 src/negative_test/chezmoi/invalid-encryption.toml create mode 100644 src/negative_test/chezmoi/invalid-entry-type.toml create mode 100644 src/negative_test/chezmoi/invalid-environment.toml create mode 100644 src/negative_test/chezmoi/invalid-format.toml create mode 100644 src/negative_test/chezmoi/invalid-mode.toml create mode 100644 src/negative_test/chezmoi/invalid-onepassword-mode.toml create mode 100644 src/negative_test/chezmoi/invalid-output-format-jsonc.toml create mode 100644 src/negative_test/chezmoi/invalid-output-format-toml.toml create mode 100644 src/negative_test/chezmoi/invalid-status-path-style.toml create mode 100644 src/negative_test/chezmoi/invalid-textconv.toml create mode 100644 src/schemas/json/chezmoi.json create mode 100644 src/test/chezmoi/complete.toml create mode 100644 src/test/chezmoi/dynamic.yaml create mode 100644 src/test/chezmoi/empty-mutual-exclusion-values.toml create mode 100644 src/test/chezmoi/forward-compatible-choices.toml create mode 100644 src/test/chezmoi/minimal.json diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index e997b1464fc..ebae4472950 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -1576,6 +1576,18 @@ "fileMatch": ["charmcraft.yaml"], "url": "https://raw.githubusercontent.com/canonical/charmcraft/main/schema/charmcraft.json" }, + { + "name": "chezmoi configuration", + "description": "JSON, JSONC, TOML, and YAML configuration for chezmoi", + "fileMatch": [ + "chezmoi.json", + "chezmoi.jsonc", + "chezmoi.toml", + "chezmoi.yaml", + "chezmoi.yml" + ], + "url": "https://www.schemastore.org/chezmoi.json" + }, { "name": "ChordPro Configuration", "description": "Configuration files for ChordPro", diff --git a/src/negative_test/chezmoi/entry-types-string.toml b/src/negative_test/chezmoi/entry-types-string.toml new file mode 100644 index 00000000000..ad4bce36e1c --- /dev/null +++ b/src/negative_test/chezmoi/entry-types-string.toml @@ -0,0 +1,4 @@ +#:schema ../../schemas/json/chezmoi.json + +[status] +exclude = "scripts,externals" diff --git a/src/negative_test/chezmoi/env-and-script-env.toml b/src/negative_test/chezmoi/env-and-script-env.toml new file mode 100644 index 00000000000..5f8b2b09f44 --- /dev/null +++ b/src/negative_test/chezmoi/env-and-script-env.toml @@ -0,0 +1,7 @@ +#:schema ../../schemas/json/chezmoi.json + +[env] +EDITOR = "code" + +[scriptEnv] +CI = "true" diff --git a/src/negative_test/chezmoi/git-template-conflict.toml b/src/negative_test/chezmoi/git-template-conflict.toml new file mode 100644 index 00000000000..c693701a3a1 --- /dev/null +++ b/src/negative_test/chezmoi/git-template-conflict.toml @@ -0,0 +1,5 @@ +#:schema ../../schemas/json/chezmoi.json + +[git] +commitMessageTemplate = "message" +commitMessageTemplateFile = "message.tmpl" diff --git a/src/negative_test/chezmoi/hook-command-and-script.toml b/src/negative_test/chezmoi/hook-command-and-script.toml new file mode 100644 index 00000000000..8e5a0698a2b --- /dev/null +++ b/src/negative_test/chezmoi/hook-command-and-script.toml @@ -0,0 +1,5 @@ +#:schema ../../schemas/json/chezmoi.json + +[hooks.apply.pre] +command = "echo" +script = "echo invalid" diff --git a/src/negative_test/chezmoi/invalid-add-secrets.toml b/src/negative_test/chezmoi/invalid-add-secrets.toml new file mode 100644 index 00000000000..46579214fa0 --- /dev/null +++ b/src/negative_test/chezmoi/invalid-add-secrets.toml @@ -0,0 +1,4 @@ +#:schema ../../schemas/json/chezmoi.json + +[add] +secrets = 1 diff --git a/src/negative_test/chezmoi/invalid-auto-bool.toml b/src/negative_test/chezmoi/invalid-auto-bool.toml new file mode 100644 index 00000000000..214ca5e192e --- /dev/null +++ b/src/negative_test/chezmoi/invalid-auto-bool.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/chezmoi.json + +color = 1 diff --git a/src/negative_test/chezmoi/invalid-encryption.toml b/src/negative_test/chezmoi/invalid-encryption.toml new file mode 100644 index 00000000000..e04049acda4 --- /dev/null +++ b/src/negative_test/chezmoi/invalid-encryption.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/chezmoi.json + +encryption = "sops" diff --git a/src/negative_test/chezmoi/invalid-entry-type.toml b/src/negative_test/chezmoi/invalid-entry-type.toml new file mode 100644 index 00000000000..869ffc77acd --- /dev/null +++ b/src/negative_test/chezmoi/invalid-entry-type.toml @@ -0,0 +1,4 @@ +#:schema ../../schemas/json/chezmoi.json + +[status] +exclude = ["unknown"] diff --git a/src/negative_test/chezmoi/invalid-environment.toml b/src/negative_test/chezmoi/invalid-environment.toml new file mode 100644 index 00000000000..5fff9ca2743 --- /dev/null +++ b/src/negative_test/chezmoi/invalid-environment.toml @@ -0,0 +1,4 @@ +#:schema ../../schemas/json/chezmoi.json + +[env] +RETRIES = 3 diff --git a/src/negative_test/chezmoi/invalid-format.toml b/src/negative_test/chezmoi/invalid-format.toml new file mode 100644 index 00000000000..714365f07f5 --- /dev/null +++ b/src/negative_test/chezmoi/invalid-format.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/chezmoi.json + +format = 1 diff --git a/src/negative_test/chezmoi/invalid-mode.toml b/src/negative_test/chezmoi/invalid-mode.toml new file mode 100644 index 00000000000..ea39ebd53a9 --- /dev/null +++ b/src/negative_test/chezmoi/invalid-mode.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/chezmoi.json + +mode = true diff --git a/src/negative_test/chezmoi/invalid-onepassword-mode.toml b/src/negative_test/chezmoi/invalid-onepassword-mode.toml new file mode 100644 index 00000000000..77775d89770 --- /dev/null +++ b/src/negative_test/chezmoi/invalid-onepassword-mode.toml @@ -0,0 +1,4 @@ +#:schema ../../schemas/json/chezmoi.json + +[onepassword] +mode = 1 diff --git a/src/negative_test/chezmoi/invalid-output-format-jsonc.toml b/src/negative_test/chezmoi/invalid-output-format-jsonc.toml new file mode 100644 index 00000000000..08a6781c1f8 --- /dev/null +++ b/src/negative_test/chezmoi/invalid-output-format-jsonc.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/chezmoi.json + +format = "jsonc" diff --git a/src/negative_test/chezmoi/invalid-output-format-toml.toml b/src/negative_test/chezmoi/invalid-output-format-toml.toml new file mode 100644 index 00000000000..c503dde2e4d --- /dev/null +++ b/src/negative_test/chezmoi/invalid-output-format-toml.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/chezmoi.json + +format = "toml" diff --git a/src/negative_test/chezmoi/invalid-status-path-style.toml b/src/negative_test/chezmoi/invalid-status-path-style.toml new file mode 100644 index 00000000000..a201161e2c1 --- /dev/null +++ b/src/negative_test/chezmoi/invalid-status-path-style.toml @@ -0,0 +1,4 @@ +#:schema ../../schemas/json/chezmoi.json + +[status] +pathStyle = true diff --git a/src/negative_test/chezmoi/invalid-textconv.toml b/src/negative_test/chezmoi/invalid-textconv.toml new file mode 100644 index 00000000000..2478d9b7aad --- /dev/null +++ b/src/negative_test/chezmoi/invalid-textconv.toml @@ -0,0 +1,3 @@ +#:schema ../../schemas/json/chezmoi.json + +textConv = ["cat"] diff --git a/src/schemas/json/chezmoi.json b/src/schemas/json/chezmoi.json new file mode 100644 index 00000000000..89945390d96 --- /dev/null +++ b/src/schemas/json/chezmoi.json @@ -0,0 +1,1001 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/chezmoi.json", + "x-tombi-toml-version": "v1.0.0", + "title": "chezmoi configuration", + "description": "Configuration for chezmoi, a dotfile manager across multiple machines.\nhttps://www.chezmoi.io/reference/configuration-file/", + "type": "object", + "additionalProperties": true, + "properties": { + "$schema": { + "description": "URI of the JSON Schema used to validate this configuration.\nhttps://json-schema.org/understanding-json-schema/reference/schema.html", + "type": "string", + "format": "uri" + }, + "cacheDir": { + "$ref": "#/definitions/path" + }, + "color": { + "$ref": "#/definitions/autoBool" + }, + "data": { + "description": "Arbitrary data made available to templates.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "object", + "additionalProperties": true + }, + "env": { + "$ref": "#/definitions/environment" + }, + "format": { + "description": "Default structured-data output format. TOML is supported as an input format but not as an output format.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "anyOf": [ + { + "enum": ["json", "yaml"] + }, + { + "type": "string" + } + ], + "not": { + "enum": ["jsonc", "toml"] + }, + "default": "json" + }, + "destDir": { + "$ref": "#/definitions/path" + }, + "gitHub": { + "$ref": "#/definitions/gitHub" + }, + "hooks": { + "description": "Commands to run before or after chezmoi events, keyed by event name.\nhttps://www.chezmoi.io/reference/configuration-file/hooks/", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/hook" + } + }, + "interactive": { + "description": "Whether chezmoi may prompt for input.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "boolean" + }, + "interpreters": { + "description": "Custom interpreters keyed by file extension without the leading period.\nhttps://www.chezmoi.io/reference/configuration-file/interpreters/", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/interpreter" + } + }, + "lessInteractive": { + "description": "UNDOCUMENTED. Whether chezmoi should reduce interactive behavior.\nhttps://github.com/twpayne/chezmoi/blob/v2.71.1/internal/cmd/config.go", + "type": "boolean" + }, + "mode": { + "description": "How the source state is represented.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "anyOf": [ + { + "enum": ["file", "symlink"] + }, + { + "type": "string" + } + ], + "default": "file" + }, + "pager": { + "description": "Pager command used for long output.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "string" + }, + "pagerArgs": { + "$ref": "#/definitions/stringList" + }, + "persistentState": { + "$ref": "#/definitions/path" + }, + "pinentry": { + "$ref": "#/definitions/pinentry" + }, + "progress": { + "$ref": "#/definitions/autoBool" + }, + "safe": { + "description": "UNDOCUMENTED. Whether potentially unsafe operations are disabled.\nhttps://github.com/twpayne/chezmoi/blob/v2.71.1/internal/cmd/config.go", + "type": "boolean", + "default": true + }, + "scriptEnv": { + "$ref": "#/definitions/environment" + }, + "scriptTempDir": { + "$ref": "#/definitions/path" + }, + "sourceDir": { + "$ref": "#/definitions/path" + }, + "tempDir": { + "$ref": "#/definitions/path" + }, + "template": { + "$ref": "#/definitions/template" + }, + "textConv": { + "description": "Text conversion commands used when computing diffs.\nhttps://www.chezmoi.io/reference/configuration-file/textconv/", + "type": "array", + "items": { + "$ref": "#/definitions/textConv" + } + }, + "umask": { + "description": "File creation mask. TOML supports octal literals such as 0o22; JSON and YAML use the equivalent decimal value.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "integer", + "minimum": 0 + }, + "useBuiltinAge": { + "$ref": "#/definitions/autoBool" + }, + "useBuiltinGit": { + "$ref": "#/definitions/autoBool" + }, + "verbose": { + "description": "Whether verbose output is enabled.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "boolean" + }, + "warnings": { + "$ref": "#/definitions/warnings" + }, + "workingTree": { + "$ref": "#/definitions/path" + }, + "awsSecretsManager": { + "$ref": "#/definitions/awsSecretsManager" + }, + "azureKeyVault": { + "$ref": "#/definitions/azureKeyVault" + }, + "bitwarden": { + "$ref": "#/definitions/bitwarden" + }, + "bitwardenSecrets": { + "$ref": "#/definitions/bitwardenSecrets" + }, + "dashlane": { + "$ref": "#/definitions/dashlane" + }, + "doppler": { + "$ref": "#/definitions/doppler" + }, + "ejson": { + "$ref": "#/definitions/ejson" + }, + "gopass": { + "$ref": "#/definitions/gopass" + }, + "keepassxc": { + "$ref": "#/definitions/keepassxc" + }, + "keeper": { + "$ref": "#/definitions/keeper" + }, + "lastpass": { + "$ref": "#/definitions/lastpass" + }, + "onepassword": { + "$ref": "#/definitions/onepassword" + }, + "pass": { + "$ref": "#/definitions/pass" + }, + "passhole": { + "$ref": "#/definitions/passhole" + }, + "protonPass": { + "$ref": "#/definitions/protonPass" + }, + "rbw": { + "$ref": "#/definitions/rbw" + }, + "secret": { + "$ref": "#/definitions/command" + }, + "vault": { + "$ref": "#/definitions/vault" + }, + "encryption": { + "description": "Encryption method. An empty value enables automatic detection from the age or GPG sections.\nhttps://www.chezmoi.io/reference/configuration-file/encryption/", + "type": "string", + "enum": ["", "age", "gpg", "transparent"] + }, + "age": { + "$ref": "#/definitions/age" + }, + "gpg": { + "$ref": "#/definitions/gpg" + }, + "add": { + "$ref": "#/definitions/add" + }, + "cd": { + "$ref": "#/definitions/command" + }, + "completion": { + "$ref": "#/definitions/completion" + }, + "docker": { + "$ref": "#/definitions/docker" + }, + "diff": { + "$ref": "#/definitions/diff" + }, + "edit": { + "$ref": "#/definitions/edit" + }, + "git": { + "$ref": "#/definitions/git" + }, + "merge": { + "$ref": "#/definitions/command" + }, + "status": { + "$ref": "#/definitions/status" + }, + "update": { + "$ref": "#/definitions/update" + }, + "verify": { + "$ref": "#/definitions/verify" + } + }, + "not": { + "properties": { + "env": { + "type": "object", + "minProperties": 1 + }, + "scriptEnv": { + "type": "object", + "minProperties": 1 + } + }, + "required": ["env", "scriptEnv"] + }, + "definitions": { + "path": { + "description": "Filesystem path. Relative paths are resolved according to chezmoi's configuration rules.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "string" + }, + "autoBool": { + "description": "Automatic boolean setting. Accepts a boolean, 'auto', or a string representation recognized by chezmoi.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + } + ] + }, + "stringList": { + "description": "List of strings. Chezmoi also accepts a comma-separated string through its configuration decoder.\nhttps://www.chezmoi.io/reference/configuration-file/", + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "duration": { + "description": "Go duration string such as '1s' or '1m'. Integer nanosecond values are also accepted.\nhttps://pkg.go.dev/time#ParseDuration", + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "environment": { + "description": "Environment variables keyed by name.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "command": { + "description": "External command configuration.\nhttps://www.chezmoi.io/reference/configuration-file/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string" + }, + "args": { + "$ref": "#/definitions/stringList" + } + } + }, + "hookCommand": { + "description": "Command or inline script executed by a hook.\nhttps://www.chezmoi.io/reference/configuration-file/hooks/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string" + }, + "script": { + "type": "string" + }, + "args": { + "$ref": "#/definitions/stringList" + } + }, + "not": { + "properties": { + "command": { + "type": "string", + "minLength": 1 + }, + "script": { + "type": "string", + "minLength": 1 + } + }, + "required": ["command", "script"] + } + }, + "hook": { + "description": "Commands run before and after a chezmoi event.\nhttps://www.chezmoi.io/reference/configuration-file/hooks/", + "type": "object", + "additionalProperties": true, + "properties": { + "pre": { + "$ref": "#/definitions/hookCommand" + }, + "post": { + "$ref": "#/definitions/hookCommand" + } + } + }, + "interpreter": { + "description": "Interpreter command for files with a specific extension.\nhttps://www.chezmoi.io/reference/configuration-file/interpreters/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string" + }, + "args": { + "$ref": "#/definitions/stringList" + } + } + }, + "entryTypes": { + "description": "Entry types to include or exclude.\nhttps://www.chezmoi.io/reference/command-line-flags/global/", + "type": "array", + "items": { + "type": "string", + "enum": [ + "all", + "always", + "dirs", + "encrypted", + "externals", + "files", + "noalways", + "nodirs", + "noencrypted", + "noexternals", + "nofiles", + "none", + "noremove", + "noscripts", + "nosymlinks", + "notemplates", + "remove", + "scripts", + "symlinks", + "templates" + ] + } + }, + "gitHub": { + "description": "GitHub API cache settings.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "object", + "additionalProperties": true, + "properties": { + "refreshPeriod": { + "$ref": "#/definitions/duration", + "default": "1m" + } + } + }, + "pinentry": { + "description": "Pinentry command used for passphrase prompts.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string" + }, + "args": { + "$ref": "#/definitions/stringList" + }, + "options": { + "$ref": "#/definitions/stringList", + "default": ["allow-external-password-cache"] + } + } + }, + "template": { + "description": "Go template engine options.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "object", + "additionalProperties": true, + "properties": { + "options": { + "$ref": "#/definitions/stringList", + "default": ["missingkey=error"] + } + } + }, + "textConv": { + "description": "Text conversion command selected by a path pattern.\nhttps://www.chezmoi.io/reference/configuration-file/textconv/", + "type": "object", + "additionalProperties": true, + "properties": { + "pattern": { + "type": "string" + }, + "command": { + "type": "string" + }, + "args": { + "$ref": "#/definitions/stringList" + } + } + }, + "warnings": { + "description": "Warning controls.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "object", + "additionalProperties": true, + "properties": { + "configFileTemplateHasChanged": { + "type": "boolean", + "default": true + } + } + }, + "awsSecretsManager": { + "description": "AWS Secrets Manager settings.\nhttps://www.chezmoi.io/reference/templates/aws-secrets-manager-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "region": { + "type": "string" + }, + "profile": { + "type": "string" + } + } + }, + "azureKeyVault": { + "description": "Azure Key Vault settings.\nhttps://www.chezmoi.io/reference/templates/azure-key-vault-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "defaultVault": { + "type": "string" + } + } + }, + "bitwarden": { + "description": "Bitwarden CLI settings.\nhttps://www.chezmoi.io/reference/templates/bitwarden-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "bw" + }, + "unlock": { + "$ref": "#/definitions/autoBool" + } + } + }, + "bitwardenSecrets": { + "description": "Bitwarden Secrets Manager CLI settings.\nhttps://www.chezmoi.io/reference/templates/bitwarden-secrets-manager-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "bws" + } + } + }, + "dashlane": { + "description": "Dashlane CLI settings.\nhttps://www.chezmoi.io/reference/templates/dashlane-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "dcli" + }, + "args": { + "$ref": "#/definitions/stringList" + } + } + }, + "doppler": { + "description": "Doppler CLI settings.\nhttps://www.chezmoi.io/reference/templates/doppler-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "doppler" + }, + "args": { + "$ref": "#/definitions/stringList" + }, + "project": { + "type": "string" + }, + "config": { + "type": "string" + } + } + }, + "ejson": { + "description": "EJSON settings.\nhttps://www.chezmoi.io/reference/templates/ejson-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "keyDir": { + "type": "string" + }, + "key": { + "type": "string" + } + } + }, + "gopass": { + "description": "gopass settings.\nhttps://www.chezmoi.io/reference/templates/gopass-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "gopass" + }, + "mode": { + "anyOf": [ + { + "enum": ["", "builtin"] + }, + { + "type": "string" + } + ] + } + } + }, + "keepassxc": { + "description": "KeePassXC CLI settings.\nhttps://www.chezmoi.io/reference/templates/keepassxc-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "keepassxc-cli" + }, + "database": { + "type": "string" + }, + "mode": { + "anyOf": [ + { + "enum": ["builtin", "cache-password", "open"] + }, + { + "type": "string" + } + ], + "default": "cache-password" + }, + "args": { + "$ref": "#/definitions/stringList" + }, + "prompt": { + "type": "boolean", + "default": true + } + } + }, + "keeper": { + "description": "Keeper Commander settings.\nhttps://www.chezmoi.io/reference/templates/keeper-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "keeper" + }, + "args": { + "$ref": "#/definitions/stringList" + } + } + }, + "lastpass": { + "description": "LastPass CLI settings.\nhttps://www.chezmoi.io/reference/templates/lastpass-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "lpass" + } + } + }, + "onepassword": { + "description": "1Password CLI settings.\nhttps://www.chezmoi.io/reference/templates/1password-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "op" + }, + "prompt": { + "type": "boolean", + "default": true + }, + "mode": { + "anyOf": [ + { + "enum": ["account", "connect", "service"] + }, + { + "type": "string" + } + ], + "default": "account" + } + } + }, + "pass": { + "description": "pass password-store settings.\nhttps://www.chezmoi.io/reference/templates/pass-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "pass" + } + } + }, + "passhole": { + "description": "passhole settings.\nhttps://www.chezmoi.io/reference/templates/passhole-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "ph" + }, + "args": { + "$ref": "#/definitions/stringList" + }, + "prompt": { + "type": "boolean", + "default": true + } + } + }, + "protonPass": { + "description": "Proton Pass CLI settings.\nhttps://www.chezmoi.io/reference/templates/proton-pass-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "pass-cli" + } + } + }, + "rbw": { + "description": "rbw Bitwarden CLI settings.\nhttps://www.chezmoi.io/reference/templates/rbw-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "rbw" + } + } + }, + "vault": { + "description": "HashiCorp Vault CLI settings.\nhttps://www.chezmoi.io/reference/templates/vault-functions/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "vault" + } + } + }, + "age": { + "description": "age encryption settings.\nhttps://www.chezmoi.io/reference/configuration-file/encryption/age/", + "type": "object", + "additionalProperties": true, + "properties": { + "useBuiltin": { + "description": "UNDOCUMENTED. Internal age implementation selection; prefer the top-level useBuiltinAge setting.\nhttps://github.com/twpayne/chezmoi/blob/v2.71.1/internal/chezmoi/ageencryption.go", + "type": "boolean" + }, + "command": { + "type": "string", + "default": "age" + }, + "args": { + "$ref": "#/definitions/stringList" + }, + "identity": { + "type": "string" + }, + "identities": { + "$ref": "#/definitions/stringList" + }, + "passphrase": { + "type": "boolean" + }, + "recipient": { + "type": "string" + }, + "recipients": { + "$ref": "#/definitions/stringList" + }, + "recipientsFile": { + "type": "string" + }, + "recipientsFiles": { + "$ref": "#/definitions/stringList" + }, + "suffix": { + "type": "string", + "default": ".age" + }, + "symmetric": { + "type": "boolean" + } + } + }, + "gpg": { + "description": "GnuPG encryption settings.\nhttps://www.chezmoi.io/reference/configuration-file/encryption/gpg/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "gpg" + }, + "args": { + "$ref": "#/definitions/stringList" + }, + "recipient": { + "type": "string" + }, + "recipients": { + "$ref": "#/definitions/stringList" + }, + "symmetric": { + "type": "boolean" + }, + "suffix": { + "type": "string", + "default": ".asc" + } + } + }, + "add": { + "description": "Defaults for the add command.\nhttps://www.chezmoi.io/reference/commands/add/", + "type": "object", + "additionalProperties": true, + "properties": { + "encrypt": { + "type": "boolean" + }, + "secrets": { + "anyOf": [ + { + "enum": ["ignore", "warning", "error"] + }, + { + "type": "string" + } + ], + "default": "warning" + }, + "templateSymlinks": { + "type": "boolean" + } + } + }, + "completion": { + "description": "Shell completion settings.\nhttps://www.chezmoi.io/reference/commands/completion/", + "type": "object", + "additionalProperties": true, + "properties": { + "custom": { + "type": "boolean" + } + } + }, + "docker": { + "description": "Docker command settings.\nhttps://www.chezmoi.io/reference/commands/docker/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "docker" + } + } + }, + "diff": { + "description": "Defaults for the diff command.\nhttps://www.chezmoi.io/reference/commands/diff/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string" + }, + "args": { + "$ref": "#/definitions/stringList" + }, + "exclude": { + "$ref": "#/definitions/entryTypes" + }, + "pager": { + "type": "string" + }, + "pagerArgs": { + "$ref": "#/definitions/stringList" + }, + "reverse": { + "type": "boolean" + }, + "scriptContents": { + "type": "boolean", + "default": true + } + } + }, + "edit": { + "description": "Defaults for the edit command.\nhttps://www.chezmoi.io/reference/commands/edit/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string" + }, + "args": { + "$ref": "#/definitions/stringList" + }, + "hardlink": { + "type": "boolean", + "default": true + }, + "minDuration": { + "$ref": "#/definitions/duration", + "default": "1s" + }, + "watch": { + "type": "boolean" + }, + "apply": { + "type": "boolean" + } + } + }, + "git": { + "description": "Git integration settings.\nhttps://www.chezmoi.io/reference/configuration-file/variables/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string", + "default": "git" + }, + "autoAdd": { + "type": "boolean" + }, + "autoCommit": { + "type": "boolean" + }, + "autoPush": { + "type": "boolean" + }, + "commitMessageTemplate": { + "type": "string" + }, + "commitMessageTemplateFile": { + "type": "string" + }, + "lfs": { + "type": "boolean" + } + }, + "not": { + "properties": { + "commitMessageTemplate": { + "type": "string", + "minLength": 1 + }, + "commitMessageTemplateFile": { + "type": "string", + "minLength": 1 + } + }, + "required": ["commitMessageTemplate", "commitMessageTemplateFile"] + } + }, + "status": { + "description": "Defaults for the status command.\nhttps://www.chezmoi.io/reference/commands/status/", + "type": "object", + "additionalProperties": true, + "properties": { + "exclude": { + "$ref": "#/definitions/entryTypes" + }, + "pathStyle": { + "anyOf": [ + { + "enum": ["absolute", "relative"] + }, + { + "type": "string" + } + ], + "default": "relative" + } + } + }, + "update": { + "description": "Defaults for the update command.\nhttps://www.chezmoi.io/reference/commands/update/", + "type": "object", + "additionalProperties": true, + "properties": { + "command": { + "type": "string" + }, + "args": { + "$ref": "#/definitions/stringList" + }, + "apply": { + "type": "boolean", + "default": true + }, + "recurseSubmodules": { + "type": "boolean", + "default": true + } + } + }, + "verify": { + "description": "Defaults for the verify command.\nhttps://www.chezmoi.io/reference/commands/verify/", + "type": "object", + "additionalProperties": true, + "properties": { + "exclude": { + "$ref": "#/definitions/entryTypes" + } + } + } + } +} diff --git a/src/test/chezmoi/complete.toml b/src/test/chezmoi/complete.toml new file mode 100644 index 00000000000..140ff646ed9 --- /dev/null +++ b/src/test/chezmoi/complete.toml @@ -0,0 +1,213 @@ +#:schema ../../schemas/json/chezmoi.json + +cacheDir = ".cache" +color = "auto" +format = "json" +destDir = "." +interactive = true +lessInteractive = false +mode = "file" +pager = "less" +pagerArgs = ["-FRX"] +persistentState = ".state" +progress = true +safe = true +scriptTempDir = ".tmp" +sourceDir = "." +tempDir = ".tmp" +umask = 0o22 +useBuiltinAge = "auto" +useBuiltinGit = false +verbose = true +workingTree = "." +encryption = "transparent" + +[data] +owner = "example" + +[env] +EDITOR = "code" + +[gitHub] +refreshPeriod = "1m" + +[hooks.apply.pre] +command = "echo" +args = ["before apply"] + +[hooks.apply.post] +script = "echo after apply" + +[interpreters.ps1] +command = "pwsh" +args = ["-NoProfile", "-File"] + +[pinentry] +command = "pinentry" +args = ["--ttyname", "console"] +options = ["allow-external-password-cache"] + +[template] +options = ["missingkey=error"] + +[[textConv]] +pattern = "*.txt" +command = "cat" +args = ["--"] + +[warnings] +configFileTemplateHasChanged = true + +[awsSecretsManager] +region = "us-east-1" +profile = "default" + +[azureKeyVault] +defaultVault = "example-vault" + +[bitwarden] +command = "bw" +unlock = "auto" + +[bitwardenSecrets] +command = "bws" + +[dashlane] +command = "dcli" +args = ["--no-color"] + +[doppler] +command = "doppler" +args = ["--silent"] +project = "example" +config = "dev" + +[ejson] +keyDir = ".keys" +key = "example" + +[gopass] +command = "gopass" +mode = "builtin" + +[keepassxc] +command = "keepassxc-cli" +database = "passwords.kdbx" +mode = "cache-password" +args = ["--quiet"] +prompt = true + +[keeper] +command = "keeper" +args = ["--batch-mode"] + +[lastpass] +command = "lpass" + +[onepassword] +command = "op" +prompt = true +mode = "account" + +[pass] +command = "pass" + +[passhole] +command = "ph" +args = ["--quiet"] +prompt = true + +[protonPass] +command = "pass-cli" + +[rbw] +command = "rbw" + +[secret] +command = "secret-helper" +args = ["get"] + +[vault] +command = "vault" + +[age] +useBuiltin = true +command = "age" +args = ["--armor"] +identity = "identity.txt" +identities = ["identity-2.txt"] +passphrase = false +recipient = "age1example" +recipients = ["age1example2"] +recipientsFile = "recipients.txt" +recipientsFiles = ["recipients-2.txt"] +suffix = ".age" +symmetric = false + +[gpg] +command = "gpg" +args = ["--batch"] +recipient = "example@example.com" +recipients = ["another@example.com"] +symmetric = false +suffix = ".asc" + +[add] +encrypt = false +secrets = "warning" +templateSymlinks = true + +[cd] +command = "pwsh" +args = ["-NoExit"] + +[completion] +custom = true + +[docker] +command = "docker" + +[diff] +command = "diff" +args = ["--unified"] +exclude = ["scripts", "externals"] +pager = "less" +pagerArgs = ["-FRX"] +reverse = false +scriptContents = true + +[edit] +command = "code" +args = ["--wait"] +hardlink = true +minDuration = "1s" +watch = true +apply = false + +[git] +command = "git" +autoAdd = true +autoCommit = true +autoPush = false +commitMessageTemplate = "Apply changes" +lfs = true + +[merge] +command = "vimdiff" +args = ["-f"] + +[status] +exclude = ["scripts", "externals"] +pathStyle = "relative" + +[update] +command = "git" +args = ["pull", "--ff-only"] +apply = true +recurseSubmodules = true + +[verify] +exclude = ["externals"] + +[futureSection] +futureOption = true diff --git a/src/test/chezmoi/dynamic.yaml b/src/test/chezmoi/dynamic.yaml new file mode 100644 index 00000000000..5816522d284 --- /dev/null +++ b/src/test/chezmoi/dynamic.yaml @@ -0,0 +1,19 @@ +# yaml-language-server: $schema=../../schemas/json/chezmoi.json +hooks: + read-source-state: + pre: + command: echo + args: [reading] +interpreters: + py: + command: python + args: [-B] +textConv: + - pattern: '*.md' + command: pandoc + args: ['--to', 'plain'] +data: + nested: + enabled: true +scriptEnv: + CI: 'true' diff --git a/src/test/chezmoi/empty-mutual-exclusion-values.toml b/src/test/chezmoi/empty-mutual-exclusion-values.toml new file mode 100644 index 00000000000..b35db2e2934 --- /dev/null +++ b/src/test/chezmoi/empty-mutual-exclusion-values.toml @@ -0,0 +1,14 @@ +#:schema ../../schemas/json/chezmoi.json + +[env] + +[scriptEnv] +CI = "true" + +[hooks.apply.pre] +command = "" +script = "apply.ps1" + +[git] +commitMessageTemplate = "" +commitMessageTemplateFile = "commit-message.tmpl" diff --git a/src/test/chezmoi/forward-compatible-choices.toml b/src/test/chezmoi/forward-compatible-choices.toml new file mode 100644 index 00000000000..2d7041565f5 --- /dev/null +++ b/src/test/chezmoi/forward-compatible-choices.toml @@ -0,0 +1,19 @@ +#:schema ../../schemas/json/chezmoi.json + +format = "future-format" +mode = "future-mode" + +[add] +secrets = "notice" + +[gopass] +mode = "future-mode" + +[keepassxc] +mode = "future-mode" + +[onepassword] +mode = "future-mode" + +[status] +pathStyle = "future-style" diff --git a/src/test/chezmoi/minimal.json b/src/test/chezmoi/minimal.json new file mode 100644 index 00000000000..63988081585 --- /dev/null +++ b/src/test/chezmoi/minimal.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://json.schemastore.org/chezmoi.json", + "mode": "file" +} From 3f9f70414f537bfaf57083251b31b19ed1050f64 Mon Sep 17 00:00:00 2001 From: "Ruben J. Jongejan" Date: Mon, 27 Jul 2026 18:10:16 +0200 Subject: [PATCH 06/21] feat(rumdl): update schema to v0.2.42 (#6109) Co-authored-by: github-actions[bot] --- src/schemas/json/rumdl.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/schemas/json/rumdl.json b/src/schemas/json/rumdl.json index 7351f1ad81b..498eafd9a66 100644 --- a/src/schemas/json/rumdl.json +++ b/src/schemas/json/rumdl.json @@ -177,7 +177,7 @@ "minimum": 0 }, "MarkdownFlavor": { - "description": "Markdown flavor/dialect. Accepts: standard, gfm, mkdocs, mdx, pandoc, quarto, obsidian, kramdown, azure_devops, myst. Aliases: commonmark/github map to standard, qmd/rmd/rmarkdown map to quarto, jekyll maps to kramdown, azure/ado map to azure_devops, mystmd maps to myst.", + "description": "Markdown flavor/dialect. Accepts: standard, gfm, mkdocs, mdx, pandoc, quarto, obsidian, kramdown, azure_devops, myst, hugo. Aliases: commonmark/github map to standard, qmd/rmd/rmarkdown map to quarto, jekyll maps to kramdown, azure/ado map to azure_devops, mystmd maps to myst, goldmark maps to hugo.", "type": "string", "enum": [ "standard", @@ -198,7 +198,9 @@ "azure", "ado", "myst", - "mystmd" + "mystmd", + "hugo", + "goldmark" ] }, "CodeBlockToolsConfig": { From 9022345bd3877b6c57270c237d0b0261d27cba8f Mon Sep 17 00:00:00 2001 From: David Peter Date: Mon, 27 Jul 2026 18:10:29 +0200 Subject: [PATCH 07/21] Update ty's JSON schema (#6110) This updates ty's JSON schema to [46f4915e67aad965b1b4e7478a75378e8e52ff6d](https://github.com/astral-sh/ty/commit/46f4915e67aad965b1b4e7478a75378e8e52ff6d) --- src/schemas/json/ty.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/schemas/json/ty.json b/src/schemas/json/ty.json index 33b699c4602..abf1078fdf1 100644 --- a/src/schemas/json/ty.json +++ b/src/schemas/json/ty.json @@ -91,8 +91,8 @@ "description": "Whether ty should respect `type: ignore` comments.\n\nWhen set to `false`, `type: ignore` comments are treated like any other normal\ncomment and can't be used to suppress ty errors (you have to use `ty: ignore` instead).\n\nSetting this option can be useful when using ty alongside other type checkers or when\nyou prefer using `ty: ignore` over `type: ignore`.\n\nDefaults to `true`.", "type": ["boolean", "null"] }, - "strict-literal-narrowing": { - "description": "Whether equality-based checks should preserve broad builtin types rather than narrow them to\nliteral types.\n\nBy default, ty narrows `value` from `str` to `Literal[\"a\"]` in the positive branch of\n`value == \"a\"`. When this option is enabled, `value` remains `str`. This also applies to\nmembership tests and literal match patterns, which use equality comparisons.\n\n```python\nfrom typing import Literal\n\ndef parse(value: str) -> Literal[\"a\"] | None:\n if value == \"a\":\n return value # Accepted by default; `value` remains `str` in strict mode.\n return None\n```\n\nBroad builtin types include subclasses, but literal types distinguish values by both their\nruntime type and value. This makes the narrowing unsound even for subclasses that inherit\nbuiltin equality. For example:\n\n```python\nclass StringSubclass(str): ...\n\nresult = parse(StringSubclass(\"a\"))\n# Statically `Literal[\"a\"] | None`, but `result` has runtime type `StringSubclass`.\n```\n\nThe standard library's `StrEnum` and `IntEnum` types are also subclasses of `str` and `int`,\nrespectively. This means enum members can encounter the same unsoundness:\n\n```python\nfrom enum import StrEnum\n\nclass Choice(StrEnum):\n A = \"a\"\n\nresult = parse(Choice.A)\n# Statically `Literal[\"a\"] | None`, but `result` has runtime type `Choice`.\n```\n\nA subclass can also override `__eq__` to compare equal to a literal with a different value:\n\n```python\nclass MisleadingStr(str):\n def __eq__(self, other: object) -> bool:\n return True\n\nresult = parse(MisleadingStr(\"b\"))\n# Statically `Literal[\"a\"] | None`, but `result` contains `\"b\"` at runtime.\n```\n\nEnable this option to preserve the broader builtin type instead.\n\nDefaults to `false`.", + "strict-equality-semantics": { + "description": "Configure ty's behavior regarding type inference and narrowing of equality\nchecks. Defaults to `false`.\n\nBy default, ty makes various assumptions about equality checks that match the\nintuitions of most Python programmers, but may not be fully sound in all situations.\nEnabling this option makes ty more conservative about these assumptions, making it\nless likely to infer `Literal[True]` or `Literal[False]` as the result of an\nequality check. This has various effects on type checking, including fewer type\nnarrowing opportunities and more conservative assumptions regarding control flow.\n\nOne way in which ty will by default make unsound assumptions is by narrowing an\nobject `x` of type `str` to `Literal[\"a\"]` after an `if x == \"a\"` check. This is\nunsound because a subclass of `str` with value `\"a\"` will (by default) compare equal\nto `\"a\"`, but will not be of type `Literal[\"a\"]`:\n\n```pycon\n>>> # `Literal[\"a\"]` can only be inhabited by instances of exactly `str`, not\n>>> # subclasses, but str subclasses compare equal by default:\n>>> class StringSubclass(str): ...\n...\n>>> StringSubclass(\"a\") == \"a\"\nTrue\n>>>\n>>> # This also applies to `StrEnum`s:\n>>> from enum import StrEnum\n>>> class MyEnum(StrEnum):\n... A = \"a\"\n...\n>>> MyEnum.A == \"a\"\nTrue\n```\n\nEnabling this option prevents the unsound narrowing of `x` to `Literal[\"a\"]`,\nand instead keeps it as `str`:\n\n```python\nfrom typing import Literal\n\ndef parse(value: str) -> Literal[\"a\"] | None:\n # with `strict-equality-semantics = true`, no narrowing will occur here,\n # and an error will be emitted on the `return` statement.\n if value == \"a\":\n return value\n return None\n```\n\nAnother assumption ty makes by default is that subclasses will never override `__eq__` or\n`__ne__`. This allows ty to narrow the following union based on an equality check, despite\nthe fact that an instance of a subclass of `Foo` could compare equal to `None`, and it's\nperfectly valid to pass an instance of a subclass into the `x` parameter of this function:\n\n```python\ndef narrow(x: Foo | None, other: Foo) -> None:\n if x == other:\n # with this option enabled, `x` will still have type `Foo | None` here,\n # since it is legal to subclass `Foo` and override its `__eq__` method.\n reveal_type(x)\n```\n\nMany operations in Python implicitly call `__eq__` under the hood; enabling this option\nwill also impact those operations. For example, this option will also impact narrowing from\n`in` checks, and narrowing in `match` statements that use value patterns:\n\n```python\ndef narrow_in(x: Foo | None, other: list[Foo]) -> None:\n if x in other:\n # with this option enabled, `x` will still have type `Foo | None` here,\n # since the `in` operator implicitly calls `__eq__` on each element of `other`.\n reveal_type(x)\n\n\ndef narrow_match(x: str) -> None:\n match x:\n case \"a\":\n # with this option enabled, `x` will still have type `str` here,\n # since this `case` branch will be taken by any object that compares\n # equal to `\"a\"`, including subclasses of `str`.\n reveal_type(x)\n```", "type": ["boolean", "null"] } }, @@ -980,16 +980,6 @@ } ] }, - "invalid-type-guard-call": { - "title": "detects type guard function calls that has no narrowing effect", - "description": "## What it does\n\nChecks for type guard function calls without a valid target.\n\n## Why is this bad?\n\nThe first non-keyword non-variadic argument to a type guard function\nis its target and must map to a symbol.\n\nStarred (`is_str(*a)`), literal (`is_str(42)`) and other non-symbol-like\nexpressions are invalid as narrowing targets.\n\n## Examples\n\n```toml\n[environment]\npython-version = \"3.13\"\n```\n\n```python\nfrom typing import TypeIs\n\n\ndef is_int(value: object = object()) -> TypeIs[int]:\n return isinstance(value, int)\n\n\n# no positional narrowing target\nis_int() # error\n\n# narrowing target passed by keyword\nis_int(value=1) # error\n```", - "default": "error", - "oneOf": [ - { - "$ref": "#/definitions/Level" - } - ] - }, "invalid-type-guard-definition": { "title": "detects malformed type guard functions", "description": "## What it does\n\nChecks for type guard functions without\na first non-self-like non-keyword-only non-variadic parameter.\n\n## Why is this bad?\n\nType narrowing functions must accept at least one positional argument\n(non-static methods must accept another in addition to `self`/`cls`).\n\nExtra parameters/arguments are allowed but do not affect narrowing.\n\n## Examples\n\n```toml\n[environment]\npython-version = \"3.13\"\n```\n\n```python\nfrom typing import TypeIs\n\n\n# no parameter\ndef f() -> TypeIs[int]: # error\n return True\n\n\n# no positional arguments allowed\ndef f(*, v: object) -> TypeIs[int]: # error\n return True\n\n\n# expected variadic arguments\ndef f(*args: object) -> TypeIs[int]: # error\n return True\n\n\nclass C:\n # only positional argument is `self`\n def f(self) -> TypeIs[int]: # error\n return True\n```", @@ -1270,6 +1260,16 @@ } ] }, + "pydantic-discarded-extra-argument": { + "title": "detects extra constructor arguments that Pydantic silently discards", + "description": "## What it does\n\nChecks for extra keyword arguments that Pydantic silently discards when a model uses\n`extra=\"ignore\"`, either implicitly or explicitly.\n\n## Why is this bad?\n\nA discarded argument has no effect on the constructed model, but it may indicate a misspelled field\nname or an incorrect assumption about the model's schema.\n\n## Example\n\n```python {data-mdtest=\"ignore\"}\nfrom pydantic import BaseModel\n\n\nclass User(BaseModel):\n name: str\n admin: bool = False\n\n\nuser = User(name=\"Alice\", admni=True) # error: [pydantic-discarded-extra-argument]\n```\n\nIf the field name has been misspelled, fix the typo. Otherwise, consider removing the extra argument,\nor explicitly configure the model with `extra=\"allow\"`.", + "default": "warn", + "oneOf": [ + { + "$ref": "#/definitions/Level" + } + ] + }, "raw-string-type-annotation": { "title": "detects raw strings in type annotation positions", "description": "## What it does\n\nChecks for raw-strings in type annotation positions.\n\n## Why is this bad?\n\nStatic analysis tools like ty can't analyze type annotations that use raw-string notation.\n\n## Examples\n\n```python\ndef test() -> r\"int\": # error\n return 1\n```\n\nUse instead:\n\n```python\ndef test() -> \"int\":\n return 1\n```", From e02051cf49a8284de9c2eec65436d9bb8d1f2d80 Mon Sep 17 00:00:00 2001 From: Solaris-star <67425364+Solaris-star@users.noreply.github.com> Date: Tue, 28 Jul 2026 00:10:44 +0800 Subject: [PATCH 08/21] fix(cargo-make): allow install_crate object with only crate_name (#6111) * fix(cargo-make): allow install_crate object with only crate_name cargo-make accepts install_crate objects that specify crate_name (and optionally version/min_version) without requiring binary and test_arg. The schema incorrectly required all three, rejecting valid Makefile.toml entries such as { crate_name, version } (#3684). Fixes #3684 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/schemas/json/cargo-make.json | 2 +- src/test/cargo-make/cargo-make.json | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/schemas/json/cargo-make.json b/src/schemas/json/cargo-make.json index c68e7ba63c5..d2d0ed9f922 100644 --- a/src/schemas/json/cargo-make.json +++ b/src/schemas/json/cargo-make.json @@ -808,7 +808,7 @@ "title": "Crate Install Options", "description": "Instructions on how to install a crate", "type": "object", - "required": ["crate_name", "binary", "test_arg"], + "required": ["crate_name"], "additionalProperties": false, "properties": { "crate_name": { diff --git a/src/test/cargo-make/cargo-make.json b/src/test/cargo-make/cargo-make.json index b895636b48f..97828c41af0 100644 --- a/src/test/cargo-make/cargo-make.json +++ b/src/test/cargo-make/cargo-make.json @@ -14,6 +14,12 @@ "files_exist": ["src/main.rs", "src/lib.rs"] }, "dependencies": ["format"] + }, + "test_task": { + "install_crate": { + "crate_name": "cargo-expand", + "version": "1.0.80" + } } } } From d4341c36226f7612872fc80eae7f5430dcddd8c8 Mon Sep 17 00:00:00 2001 From: Brent Westbrook <36778786+ntBre@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:11:02 -0400 Subject: [PATCH 09/21] Update ruff's JSON schema (#6112) This updates ruff's JSON schema to [52d5c6155394d2cdcdcd1a6747c8a1682c0f2dff](https://github.com/astral-sh/ruff/commit/52d5c6155394d2cdcdcd1a6747c8a1682c0f2dff) --- src/schemas/json/ruff.json | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/schemas/json/ruff.json b/src/schemas/json/ruff.json index a15434534b9..3cc07936d7b 100644 --- a/src/schemas/json/ruff.json +++ b/src/schemas/json/ruff.json @@ -107,7 +107,7 @@ } }, "extend-select": { - "description": "A list of rule codes or prefixes to enable, in addition to those\nspecified by [`select`](#lint_select).\n\nUnlike [`select`](#lint_select), which _replaces_ the default rule set\nwhen specified, `extend-select` _adds_ to whatever rules are already\nactive. This makes `extend-select` the preferred option when you want\nto enable additional rules on top of the defaults without having to\nenumerate them.\n\nFor example, to enable the defaults plus flake8-bugbear:\n\n```toml\n[tool.ruff.lint]\n# Adds flake8-bugbear on top of the default rules (E4, E7, E9, F).\nextend-select = [\"B\"]\n```\n\nUsing `select = [\"B\"]` instead would _replace_ the defaults, enabling\nonly flake8-bugbear.", + "description": "A list of rule codes or prefixes to enable, in addition to those\nspecified by [`select`](#lint_select).\n\nUnlike [`select`](#lint_select), which _replaces_ the default rule set\nwhen specified, `extend-select` _adds_ to whatever rules are already\nactive. This makes `extend-select` the preferred option when you want\nto enable additional rules on top of the defaults without having to\nenumerate them.\n\nFor example, to enable the defaults plus flake8-bugbear:\n\n```toml\n[tool.ruff.lint]\n# Adds flake8-bugbear on top of the default rules.\nextend-select = [\"B\"]\n```\n\nUsing `select = [\"B\"]` instead would _replace_ the defaults, enabling\nonly flake8-bugbear.", "type": ["array", "null"], "deprecated": true, "items": { @@ -975,14 +975,14 @@ "description": "Additional function names to consider as internationalization calls, in addition to those\nincluded in [`function-names`](#lint_flake8-gettext_function-names).", "type": ["array", "null"], "items": { - "type": "string" + "$ref": "#/definitions/Name" } }, "function-names": { "description": "The function names to consider as internationalization calls.", "type": ["array", "null"], "items": { - "type": "string" + "$ref": "#/definitions/Name" } } }, @@ -1163,14 +1163,14 @@ "description": "Additional names to ignore when considering `flake8-self` violations,\nin addition to those included in [`ignore-names`](#lint_flake8-self_ignore-names).", "type": ["array", "null"], "items": { - "type": "string" + "$ref": "#/definitions/Name" } }, "ignore-names": { "description": "A list of names to ignore when considering `flake8-self` violations.", "type": ["array", "null"], "items": { - "type": "string" + "$ref": "#/definitions/Name" } } }, @@ -1787,7 +1787,7 @@ } }, "extend-select": { - "description": "A list of rule codes or prefixes to enable, in addition to those\nspecified by [`select`](#lint_select).\n\nUnlike [`select`](#lint_select), which _replaces_ the default rule set\nwhen specified, `extend-select` _adds_ to whatever rules are already\nactive. This makes `extend-select` the preferred option when you want\nto enable additional rules on top of the defaults without having to\nenumerate them.\n\nFor example, to enable the defaults plus flake8-bugbear:\n\n```toml\n[tool.ruff.lint]\n# Adds flake8-bugbear on top of the default rules (E4, E7, E9, F).\nextend-select = [\"B\"]\n```\n\nUsing `select = [\"B\"]` instead would _replace_ the defaults, enabling\nonly flake8-bugbear.", + "description": "A list of rule codes or prefixes to enable, in addition to those\nspecified by [`select`](#lint_select).\n\nUnlike [`select`](#lint_select), which _replaces_ the default rule set\nwhen specified, `extend-select` _adds_ to whatever rules are already\nactive. This makes `extend-select` the preferred option when you want\nto enable additional rules on top of the defaults without having to\nenumerate them.\n\nFor example, to enable the defaults plus flake8-bugbear:\n\n```toml\n[tool.ruff.lint]\n# Adds flake8-bugbear on top of the default rules.\nextend-select = [\"B\"]\n```\n\nUsing `select = [\"B\"]` instead would _replace_ the defaults, enabling\nonly flake8-bugbear.", "type": ["array", "null"], "items": { "$ref": "#/definitions/RuleSelector" @@ -2204,6 +2204,10 @@ }, "additionalProperties": false }, + "Name": { + "description": "An immutable name.\n\n# Choosing a string representation\n\nOn 64-bit targets, [`CharStr`] occupies 16 bytes and stores up to 16 UTF-8 bytes inline. Longer\nvalues use an exactly-sized, reference-counted allocation, so cloning a heap-backed value\nreuses its allocation. [`compact_str::CompactString`] occupies 24 bytes, stores up to 24 bytes\ninline, and remains mutable; cloning a heap-backed value copies its contents into a new\nallocation.\n\nPrefer `CharStr` for immutable text that is retained densely or passed between owners, when\neither the smaller handle or structural sharing offsets the extra heap allocations for values\nbetween 17 and 24 bytes. Prefer `CompactString` for uniquely owned text, especially when it is\nbuilt incrementally, mutated, or commonly falls in that 17-to-24-byte range.\n\n`Name` uses `CharStr` because names appear throughout the AST and repeated heap-backed parser\nnames share an allocation. By contrast, [`crate::DebugText`] uses `CompactString` because it\nbuilds a uniquely owned buffer incrementally, and `ty_module_resolver::ModuleName` uses\n`CompactString` because module names can be extended in place.\n\nConverting a borrowed `&str` into `CharStr` creates a new value and does not preserve structural\nsharing. When an API retains text already held in a `CharStr` (including a `Name`), pass or clone\nthe owned value rather than converting it through `&str`. This is especially relevant at Salsa\ninterning boundaries.", + "type": "string" + }, "NameImports": { "type": "string" }, From 8f0aae700c7f46ee0a7ff383588076e61ec886a5 Mon Sep 17 00:00:00 2001 From: ColumbusLabs Date: Mon, 27 Jul 2026 12:11:19 -0400 Subject: [PATCH 10/21] test(ruff): cover human-readable rule selectors (#6113) Co-authored-by: ColumbusLabs <287001685+ColumbusLabs@users.noreply.github.com> --- src/test/ruff/human-readable-rule-selectors.toml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/test/ruff/human-readable-rule-selectors.toml diff --git a/src/test/ruff/human-readable-rule-selectors.toml b/src/test/ruff/human-readable-rule-selectors.toml new file mode 100644 index 00000000000..5c5b0f2134f --- /dev/null +++ b/src/test/ruff/human-readable-rule-selectors.toml @@ -0,0 +1,9 @@ +#:schema ../../schemas/json/ruff.json +preview = true + +[lint] +extend-select = ["print"] +ignore = ["unused-import"] + +[lint.per-file-ignores] +"tests/**" = ["assert"] From 9174b49f11dbb0fd220cf99e2e9d76c5d2ad9654 Mon Sep 17 00:00:00 2001 From: Lumirelle Date: Tue, 28 Jul 2026 00:11:34 +0800 Subject: [PATCH 11/21] feat: support `nub` as a pacakge manager in `package.json` schema (#6124) --- src/schemas/json/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schemas/json/package.json b/src/schemas/json/package.json index 04a7dfe8112..8ebdda53dbe 100644 --- a/src/schemas/json/package.json +++ b/src/schemas/json/package.json @@ -825,7 +825,7 @@ "type": "string", "oneOf": [ { - "pattern": "(npm|pnpm|yarn|bun|aube)@\\d+\\.\\d+\\.\\d+(-.+)?" + "pattern": "(npm|pnpm|yarn|bun|aube|nub)@\\d+\\.\\d+\\.\\d+(-.+)?" }, { "const": "bun" From 55d1bc21e112113c03c590256028daab747099b2 Mon Sep 17 00:00:00 2001 From: Michael Nordmeyer Date: Mon, 27 Jul 2026 18:11:50 +0200 Subject: [PATCH 12/21] Fix Hugo frontmatter dates (#6125) * Add published to dates, update default dates, and fix link to docs * Fix order of menus additional properties according to Hugo docs * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/schemas/json/hugo.json | 50 ++++++++++++++++++++++++------------ src/test/hugo/example-4.yaml | 3 +++ src/test/hugo/example-5.yaml | 3 +++ 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/schemas/json/hugo.json b/src/schemas/json/hugo.json index 59ad305b20e..b18531d2242 100644 --- a/src/schemas/json/hugo.json +++ b/src/schemas/json/hugo.json @@ -987,20 +987,35 @@ }, "frontmatter": { "title": "front matter options", - "description": "The front matter options\nhttps://gohugo.io/getting-started/configuration/#configure-front-matter", + "description": "The front matter options\nhttps://gohugo.io/configuration/front-matter/#dates", "type": "object", "default": { - "date": ["date", "publishdate", "lastmod"], - "expiryDate": ["expirydate", "expiryDate"], - "lastmod": [":git", "lastmod", "date", "publishdate"], - "publishDate": ["publishdate", "date"] + "date": [ + "date", + "publishdate", + "pubdate", + "published", + "lastmod", + "modified" + ], + "expiryDate": ["expirydate", "unpublishdate"], + "lastmod": [ + ":git", + "lastmod", + "modified", + "date", + "publishdate", + "pubdate", + "published" + ], + "publishDate": ["publishdate", "pubdate", "published", "date"] }, "properties": { "_merge": { "$ref": "#/definitions/mergeType" }, "date": { - "description": "\nhttps://gohugo.io/getting-started/configuration/#configure-dates", + "description": "\nhttps://gohugo.io/configuration/front-matter/#dates", "type": "array", "uniqueItems": true, "items": { @@ -1015,12 +1030,13 @@ "modified", "pubdate", "publishDate", - "publishdate" + "publishdate", + "published" ] } }, "expiryDate": { - "description": "\nhttps://gohugo.io/getting-started/configuration/#configure-dates", + "description": "\nhttps://gohugo.io/configuration/front-matter/#dates", "type": "array", "uniqueItems": true, "items": { @@ -1035,7 +1051,7 @@ } }, "lastmod": { - "description": "\nhttps://gohugo.io/getting-started/configuration/#configure-dates", + "description": "\nhttps://gohugo.io/configuration/front-matter/#dates", "type": "array", "uniqueItems": true, "items": { @@ -1050,12 +1066,13 @@ "modified", "pubdate", "publishDate", - "publishdate" + "publishdate", + "published" ] } }, "publishDate": { - "description": "\nhttps://gohugo.io/getting-started/configuration/#configure-dates", + "description": "\nhttps://gohugo.io/configuration/front-matter/#dates", "type": "array", "uniqueItems": true, "items": { @@ -1070,7 +1087,8 @@ "modified", "pubdate", "publishDate", - "publishdate" + "publishdate", + "published" ] } } @@ -2897,6 +2915,10 @@ "type": "string", "minLength": 1 }, + "params": { + "description": "User-defined properties for the menu entry.\nhttps://gohugo.io/content-management/menus/#properties-front-matter", + "type": "object" + }, "parent": { "description": "Required for child entries in a nested menu.\nhttps://gohugo.io/content-management/menus/#properties-front-matter", "type": "string" @@ -2924,10 +2946,6 @@ "url": { "description": "Required for external links.\nhttps://gohugo.io/content-management/menus/#properties-site-configuration", "type": "string" - }, - "params": { - "description": "User-defined properties for the menu entry.\nhttps://gohugo.io/content-management/menus/#properties-front-matter", - "type": "object" } }, "additionalProperties": false diff --git a/src/test/hugo/example-4.yaml b/src/test/hugo/example-4.yaml index 17f671f3840..9ce168f14d9 100644 --- a/src/test/hugo/example-4.yaml +++ b/src/test/hugo/example-4.yaml @@ -10,6 +10,7 @@ frontmatter: - 'modified' - 'pubdate' - 'publishDate' + - 'published' expiryDate: [':default', 'expiryDate', 'unpublishdate'] lastmod: [ @@ -22,6 +23,7 @@ frontmatter: 'modified', 'pubdate', 'publishDate', + 'published', ] publishDate: [ @@ -34,6 +36,7 @@ frontmatter: 'modified', 'pubdate', 'publishDate', + 'published', ] permalinks: diff --git a/src/test/hugo/example-5.yaml b/src/test/hugo/example-5.yaml index df2b93dc455..e82cfe90c79 100644 --- a/src/test/hugo/example-5.yaml +++ b/src/test/hugo/example-5.yaml @@ -10,6 +10,7 @@ frontmatter: - 'modified' - 'pubdate' - 'publishDate' + - 'published' expiryDate: [':default', 'expiryDate', 'unpublishdate'] lastmod: [ @@ -22,6 +23,7 @@ frontmatter: 'modified', 'pubdate', 'publishDate', + 'published', ] publishDate: [ @@ -34,6 +36,7 @@ frontmatter: 'modified', 'pubdate', 'publishDate', + 'published', ] permalinks: From e52aafa4ef661f189b0380bbc0610f7b9a3776f4 Mon Sep 17 00:00:00 2001 From: Zeeshan Ahmad Date: Mon, 27 Jul 2026 12:12:18 -0400 Subject: [PATCH 13/21] Expand Maestro Flow schema for full command autocomplete (#6129) * Expand Maestro Flow schema with full command and selector coverage Replace the minimal maestro-flow schema with a draft-07 schema that covers documented flow configuration, selectors, and commands for IDE autocomplete and validation. Use a single-key command object map to avoid yaml-language-server duplicate completions from large oneOf trees, keep additionalProperties open for forward compatibility, and add positive and negative tests from the Maestro docs. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix duplicate inputRandom* completions in yaml-language-server Align inputRandomText and inputRandomNumber with other random-input commands (oneOf null | options object) so the language server does not emit both a bare value and a property skeleton for the same label. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/api/json/catalog.json | 2 +- .../maestro-flow/invalid-launch-app-type.yaml | 2 + .../invalid-multi-key-command.yaml | 3 + .../maestro-flow/invalid-step-type.yaml | 2 + src/schema-validation.jsonc | 1 - src/schemas/json/maestro-flow.json | 1574 ++++++++++++++++- src/test/maestro-flow/flow-control.yaml | 56 + .../maestro-flow/flow-device-and-media.yaml | 40 + src/test/maestro-flow/flow-header.yaml | 3 + src/test/maestro-flow/flow-hooks.yaml | 7 + src/test/maestro-flow/flow-login-helper.yaml | 40 + src/test/maestro-flow/flow-selectors.yaml | 33 + src/test/maestro-flow/flow-web-header.yaml | 5 + 13 files changed, 1709 insertions(+), 59 deletions(-) create mode 100644 src/negative_test/maestro-flow/invalid-launch-app-type.yaml create mode 100644 src/negative_test/maestro-flow/invalid-multi-key-command.yaml create mode 100644 src/negative_test/maestro-flow/invalid-step-type.yaml create mode 100644 src/test/maestro-flow/flow-control.yaml create mode 100644 src/test/maestro-flow/flow-device-and-media.yaml create mode 100644 src/test/maestro-flow/flow-hooks.yaml create mode 100644 src/test/maestro-flow/flow-login-helper.yaml create mode 100644 src/test/maestro-flow/flow-selectors.yaml create mode 100644 src/test/maestro-flow/flow-web-header.yaml diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index ebae4472950..a1e6859972e 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -4826,7 +4826,7 @@ }, { "name": "Maestro Flow", - "description": "Maestro mobile and web UI test flow (YAML)", + "description": "Maestro mobile and web UI test flow (YAML) with full command definitions for IDE autocomplete (tapOn, extendedWaitUntil, runFlow, launchApp, and more)", "fileMatch": [ "**/.maestro/**/*.yaml", "**/.maestro/**/*.yml", diff --git a/src/negative_test/maestro-flow/invalid-launch-app-type.yaml b/src/negative_test/maestro-flow/invalid-launch-app-type.yaml new file mode 100644 index 00000000000..e10482e5d99 --- /dev/null +++ b/src/negative_test/maestro-flow/invalid-launch-app-type.yaml @@ -0,0 +1,2 @@ +# yaml-language-server: $schema=../../schemas/json/maestro-flow.json +- launchApp: 12345 diff --git a/src/negative_test/maestro-flow/invalid-multi-key-command.yaml b/src/negative_test/maestro-flow/invalid-multi-key-command.yaml new file mode 100644 index 00000000000..467224c69a6 --- /dev/null +++ b/src/negative_test/maestro-flow/invalid-multi-key-command.yaml @@ -0,0 +1,3 @@ +# yaml-language-server: $schema=../../schemas/json/maestro-flow.json +- tapOn: Login + inputText: hi diff --git a/src/negative_test/maestro-flow/invalid-step-type.yaml b/src/negative_test/maestro-flow/invalid-step-type.yaml new file mode 100644 index 00000000000..627f752527f --- /dev/null +++ b/src/negative_test/maestro-flow/invalid-step-type.yaml @@ -0,0 +1,2 @@ +# yaml-language-server: $schema=../../schemas/json/maestro-flow.json +- 42 diff --git a/src/schema-validation.jsonc b/src/schema-validation.jsonc index de4bb92d48f..c92465e742e 100644 --- a/src/schema-validation.jsonc +++ b/src/schema-validation.jsonc @@ -332,7 +332,6 @@ "jsone.json", "pgrls.json", "license-report-config.json", - "maestro-flow.json", "openweather.current.json", "openweather.roadrisk.json", "openhab-5.1.json", diff --git a/src/schemas/json/maestro-flow.json b/src/schemas/json/maestro-flow.json index 8277e87c008..f77094aa525 100644 --- a/src/schemas/json/maestro-flow.json +++ b/src/schemas/json/maestro-flow.json @@ -1,121 +1,1581 @@ { - "$schema": "https://json-schema.org/draft/2020-12/schema", + "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://json.schemastore.org/maestro-flow.json", "$defs": { + "selectorObject": { + "title": "selector object", + "description": "Element selector map. Combine properties with AND semantics.\nhttps://docs.maestro.dev/reference/selectors.md", + "type": "object", + "additionalProperties": true, + "properties": { + "text": { + "title": "text", + "type": "string", + "description": "Visible text or accessibility label (regex).\nhttps://docs.maestro.dev/reference/selectors/core-selectors.md" + }, + "id": { + "title": "id", + "type": "string", + "description": "Accessibility identifier / resource id (regex).\nhttps://docs.maestro.dev/reference/selectors/core-selectors.md" + }, + "index": { + "title": "index", + "description": "0-based index among matches. May be a number or a JavaScript expression string.\nhttps://docs.maestro.dev/reference/selectors/core-selectors.md", + "oneOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "string" + } + ] + }, + "point": { + "title": "point", + "type": "string", + "description": "Screen coordinate: relative (\"50%,50%\") or absolute (\"100,200\").\nhttps://docs.maestro.dev/reference/selectors/core-selectors.md" + }, + "css": { + "title": "css", + "type": "string", + "description": "Web-only CSS selector.\nhttps://docs.maestro.dev/reference/selectors/core-selectors.md" + }, + "enabled": { + "title": "enabled", + "type": "boolean", + "description": "Match enabled state.\nhttps://docs.maestro.dev/reference/selectors/state-selectors.md" + }, + "checked": { + "title": "checked", + "type": "boolean", + "description": "Match checked state.\nhttps://docs.maestro.dev/reference/selectors/state-selectors.md" + }, + "focused": { + "title": "focused", + "type": "boolean", + "description": "Match focused state.\nhttps://docs.maestro.dev/reference/selectors/state-selectors.md" + }, + "selected": { + "title": "selected", + "type": "boolean", + "description": "Match selected state.\nhttps://docs.maestro.dev/reference/selectors/state-selectors.md" + }, + "above": { + "$ref": "#/$defs/selector", + "title": "above", + "description": "Element is above this selector.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md" + }, + "below": { + "$ref": "#/$defs/selector", + "title": "below", + "description": "Element is below this selector.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md" + }, + "leftOf": { + "$ref": "#/$defs/selector", + "title": "leftOf", + "description": "Element is left of this selector.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md" + }, + "rightOf": { + "$ref": "#/$defs/selector", + "title": "rightOf", + "description": "Element is right of this selector.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md" + }, + "containsChild": { + "$ref": "#/$defs/selector", + "title": "containsChild", + "description": "Contains this direct child.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md" + }, + "childOf": { + "$ref": "#/$defs/selector", + "title": "childOf", + "description": "Direct child of this parent.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md" + }, + "containsDescendants": { + "title": "containsDescendants", + "description": "Contains all listed descendants.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md", + "oneOf": [ + { + "$ref": "#/$defs/selector" + }, + { + "type": "array", + "items": { + "$ref": "#/$defs/selector" + } + } + ] + }, + "traits": { + "title": "traits", + "type": "string", + "description": "Element trait filter.\nhttps://docs.maestro.dev/reference/selectors/element-traits.md", + "examples": ["text", "long-text", "square"] + }, + "width": { + "title": "width", + "type": "number", + "description": "Match element width.\nhttps://docs.maestro.dev/reference/selectors/dimension-matchers.md" + }, + "height": { + "title": "height", + "type": "number", + "description": "Match element height.\nhttps://docs.maestro.dev/reference/selectors/dimension-matchers.md" + }, + "tolerance": { + "title": "tolerance", + "type": "number", + "description": "Tolerance for width/height matching.\nhttps://docs.maestro.dev/reference/selectors/dimension-matchers.md" + }, + "optional": { + "title": "optional", + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "label": { + "title": "label", + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "repeat": { + "title": "repeat", + "type": "integer", + "minimum": 1, + "description": "Repeat the tap N times.\nhttps://docs.maestro.dev/reference/commands-available/tapon.md" + }, + "delay": { + "title": "delay", + "type": "integer", + "minimum": 0, + "description": "Delay in ms between repeated taps.\nhttps://docs.maestro.dev/reference/commands-available/tapon.md" + }, + "retryTapIfNoChange": { + "title": "retryTapIfNoChange", + "type": "boolean", + "description": "Retry the tap if the UI does not change.\nhttps://docs.maestro.dev/reference/commands-available/tapon.md" + } + } + }, + "selector": { + "title": "selector", + "description": "Element selector: shorthand string (text match) or selector object.\nhttps://docs.maestro.dev/reference/selectors.md", + "oneOf": [ + { + "type": "string", + "minLength": 1, + "description": "Shorthand text selector" + }, + { + "$ref": "#/$defs/selectorObject" + } + ] + }, + "condition": { + "title": "condition", + "description": "when condition for conditional commands (AND if multiple keys).\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/conditions.md", + "type": "object", + "additionalProperties": true, + "properties": { + "visible": { + "$ref": "#/$defs/selector", + "title": "visible", + "description": "Run when this element is visible" + }, + "notVisible": { + "$ref": "#/$defs/selector", + "title": "notVisible", + "description": "Run when this element is not visible" + }, + "platform": { + "title": "platform", + "type": "string", + "description": "Run on a specific platform (Android, iOS, or Web).\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/conditions.md", + "examples": ["Android", "iOS", "Web"] + }, + "true": { + "title": "true", + "type": "string", + "description": "JavaScript expression that must evaluate to true" + } + } + }, + "commandMeta": { + "title": "command meta", + "type": "object", + "properties": { + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "stringMap": { + "title": "string map", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "permissionValue": { + "title": "permission value", + "type": "string", + "description": "Permission grant state.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/permissions.md", + "examples": ["allow", "deny", "unset"] + }, + "permissionsMap": { + "title": "permissions map", + "type": "object", + "additionalProperties": { + "$ref": "#/$defs/permissionValue" + }, + "properties": { + "all": { + "$ref": "#/$defs/permissionValue" + } + } + }, + "swipeDirection": { + "title": "swipe direction", + "type": "string", + "description": "Swipe/scroll direction.", + "examples": ["LEFT", "RIGHT", "UP", "DOWN"] + }, + "commandList": { + "title": "command list", + "description": "Ordered list of Maestro commands.", + "type": "array", + "items": { + "$ref": "#/$defs/commandStep" + } + }, "flowConfiguration": { + "title": "flow configuration", + "description": "Flow header (YAML document above ---). Also accepts workspace config.yaml keys via additionalProperties.\nhttps://docs.maestro.dev/maestro-flows/readme.md", "type": "object", "additionalProperties": true, "properties": { "appId": { + "title": "appId", "type": "string", - "title": "Application ID", - "description": "Android package name or iOS bundle ID under test. May use ${ENV_VAR} interpolation.", + "description": "Android package name or iOS bundle ID under test. Supports ${ENV} interpolation.\nhttps://docs.maestro.dev/maestro-flows/readme.md", "examples": ["com.example.app", "${APP_ID}"] }, "url": { + "title": "url", "type": "string", - "title": "Web URL under test", - "description": "For web flows, the starting URL (see Maestro web testing docs).", - "format": "uri" + "description": "Starting URL for web flows.\nhttps://docs.maestro.dev/get-started/supported-platform/web-browser.md" }, "name": { + "title": "name", "type": "string", "description": "Human-readable flow name for reports." }, "tags": { + "title": "tags", "type": "array", - "items": { "type": "string" }, - "description": "Tags for filtering and organization." + "items": { + "type": "string" + }, + "description": "Tags for filtering which flows run.\nhttps://docs.maestro.dev/maestro-flows/workspace-management/test-discovery-and-tags.md" }, "env": { + "title": "env", + "description": "Default environment variables for this flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/parameters-and-constants.md", "type": "object", - "additionalProperties": { "type": "string" }, - "description": "Default environment variables for this flow (${VAR_NAME} in commands)." + "additionalProperties": true + }, + "jsEngine": { + "title": "jsEngine", + "type": "string", + "description": "JavaScript engine for scripts in this flow.", + "examples": ["rhino", "graaljs"] }, "onFlowStart": { "$ref": "#/$defs/commandList", - "description": "Commands run before the main flow body; failure fails the flow." + "title": "onFlowStart", + "description": "Commands run before the flow body.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/hooks.md" }, "onFlowComplete": { "$ref": "#/$defs/commandList", - "description": "Commands run after the main flow (e.g. teardown)." + "title": "onFlowComplete", + "description": "Commands run after the flow body (success or failure).\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/hooks.md" } } }, - "commandList": { + "elementCommandValue": { + "title": "element command value", + "description": "Shorthand string or selector/options object.", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "$ref": "#/$defs/selectorObject" + } + ] + }, + "launchAppValue": { + "title": "launchApp value", + "description": "Launch app arguments or bare app id.\nhttps://docs.maestro.dev/reference/commands-available/launchapp.md", + "oneOf": [ + { + "type": "string", + "minLength": 1, + "description": "App id to launch" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "appId": { + "type": "string", + "description": "Package name / bundle ID" + }, + "clearState": { + "type": "boolean", + "description": "Clear app data before launch" + }, + "clearKeychain": { + "type": "boolean", + "description": "Clear entire iOS keychain" + }, + "stopApp": { + "type": "boolean", + "description": "Stop the app before launching (default true)" + }, + "permissions": { + "$ref": "#/$defs/permissionsMap" + }, + "arguments": { + "type": "object", + "additionalProperties": true, + "description": "Launch arguments (string, boolean, number)" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "runFlowValue": { + "title": "runFlow value", + "description": "Run a subflow file or inline commands.\nhttps://docs.maestro.dev/reference/commands-available/runflow.md", + "oneOf": [ + { + "type": "string", + "minLength": 1, + "description": "Path to subflow file" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "file": { + "type": "string", + "description": "Relative path to the flow file" + }, + "env": { + "type": "object", + "additionalProperties": true, + "description": "Environment variables for the subflow" + }, + "commands": { + "$ref": "#/$defs/commandList", + "description": "Inline commands" + }, + "when": { + "$ref": "#/$defs/condition" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "runScriptValue": { + "title": "runScript value", + "description": "Run a JavaScript file.\nhttps://docs.maestro.dev/reference/commands-available/runscript.md", + "oneOf": [ + { + "type": "string", + "minLength": 1, + "description": "Path to JS file" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "file": { + "type": "string" + }, + "env": { + "type": "object", + "additionalProperties": true + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "inputTextValue": { + "title": "inputText value", + "description": "Text to type into the focused field.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "text": { + "type": "string", + "description": "Text to input" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "openLinkValue": { + "title": "openLink value", + "description": "Open a URL or deep link.\nhttps://docs.maestro.dev/reference/commands-available/openlink.md", + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "link": { + "type": "string", + "description": "URL or custom scheme" + }, + "autoVerify": { + "type": "boolean", + "description": "Android: auto-verify app link handling" + }, + "browser": { + "type": "boolean", + "description": "Android: force open in Chrome" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "extendedWaitUntilValue": { + "title": "extendedWaitUntil value", + "description": "Wait until visible/notVisible with custom timeout.\nhttps://docs.maestro.dev/reference/commands-available/extendedwaituntil.md", + "type": "object", + "additionalProperties": true, + "properties": { + "visible": { + "$ref": "#/$defs/selector" + }, + "notVisible": { + "$ref": "#/$defs/selector" + }, + "timeout": { + "description": "Timeout in milliseconds", + "oneOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "type": "string" + } + ] + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "repeatValue": { + "title": "repeat value", + "description": "Repeat commands times or while condition.\nhttps://docs.maestro.dev/reference/commands-available/repeat.md", + "type": "object", + "additionalProperties": true, + "properties": { + "times": { + "type": "integer", + "minimum": 1 + }, + "while": { + "$ref": "#/$defs/condition" + }, + "commands": { + "$ref": "#/$defs/commandList" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "retryValue": { + "title": "retry value", + "description": "Retry commands or a flow file on failure.\nhttps://docs.maestro.dev/reference/commands-available/retry.md", + "type": "object", + "additionalProperties": true, + "properties": { + "maxRetries": { + "type": "integer", + "minimum": 0, + "maximum": 3 + }, + "commands": { + "$ref": "#/$defs/commandList" + }, + "file": { + "type": "string" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "swipeValue": { + "title": "swipe value", + "description": "Swipe by direction, coordinates, or from an element.\nhttps://docs.maestro.dev/reference/commands-available/swipe.md", + "type": "object", + "additionalProperties": true, + "properties": { + "direction": { + "$ref": "#/$defs/swipeDirection" + }, + "start": { + "type": "string", + "description": "Start point \"x, y\" or \"x%, y%\"" + }, + "end": { + "type": "string", + "description": "End point \"x, y\" or \"x%, y%\"" + }, + "from": { + "$ref": "#/$defs/selector" + }, + "duration": { + "type": "integer", + "minimum": 0, + "description": "Duration in ms" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "scrollUntilVisibleValue": { + "title": "scrollUntilVisible value", + "description": "Scroll until an element is visible.\nhttps://docs.maestro.dev/reference/commands-available/scrolluntilvisible.md", + "type": "object", + "additionalProperties": true, + "properties": { + "element": { + "$ref": "#/$defs/selector" + }, + "direction": { + "$ref": "#/$defs/swipeDirection" + }, + "timeout": { + "oneOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "type": "string" + } + ] + }, + "speed": { + "type": "number" + }, + "visibilityPercentage": { + "type": "number" + }, + "centerElement": { + "type": "boolean" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "setLocationValue": { + "title": "setLocation value", + "description": "Mock device GPS coordinates.\nhttps://docs.maestro.dev/reference/commands-available/setlocation.md", + "type": "object", + "additionalProperties": true, + "properties": { + "latitude": { + "type": "number" + }, + "longitude": { + "type": "number" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "travelValue": { + "title": "travel value", + "description": "Simulate movement along GPS points.\nhttps://docs.maestro.dev/reference/commands-available/travel.md", + "type": "object", + "additionalProperties": true, + "properties": { + "points": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Coordinate strings \"lat, lon\"" + }, + "speed": { + "type": "number", + "description": "Speed in km/h" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "assertTrueValue": { + "title": "assertTrue value", + "description": "Assert a JavaScript expression is truthy.\nhttps://docs.maestro.dev/reference/commands-available/asserttrue.md", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "condition": { + "type": "string", + "description": "Expression to evaluate" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "assertWithAIValue": { + "title": "assertWithAI value", + "description": "Natural-language UI assertion via AI.\nhttps://docs.maestro.dev/reference/commands-available/assertwithai.md", + "type": "object", + "additionalProperties": true, + "properties": { + "assertion": { + "type": "string" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "extractTextWithAIValue": { + "title": "extractTextWithAI value", + "description": "Extract text from the screen with AI.\nhttps://docs.maestro.dev/reference/commands-available/extracttextwithai.md", + "oneOf": [ + { + "type": "string", + "description": "Query string" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "query": { + "type": "string" + }, + "outputVariable": { + "type": "string" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "assertScreenshotValue": { + "title": "assertScreenshot value", + "description": "Visual regression against a baseline screenshot.\nhttps://docs.maestro.dev/reference/commands-available/assertscreenshot.md", + "oneOf": [ + { + "type": "string", + "description": "Path to baseline image" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "path": { + "type": "string" + }, + "cropOn": { + "$ref": "#/$defs/selector" + }, + "thresholdPercentage": { + "type": "number" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "takeScreenshotValue": { + "title": "takeScreenshot value", + "description": "Capture a screenshot.\nhttps://docs.maestro.dev/reference/commands-available/takescreenshot.md", + "oneOf": [ + { + "type": "string", + "description": "Output path / name" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "path": { + "type": "string" + }, + "cropOn": { + "$ref": "#/$defs/selector" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "startRecordingValue": { + "title": "startRecording value", + "description": "Start screen recording.\nhttps://docs.maestro.dev/reference/commands-available/startrecording.md", + "oneOf": [ + { + "type": "string", + "description": "Recording path / name" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "path": { + "type": "string" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "eraseTextValue": { + "title": "eraseText value", + "description": "Erase characters from the focused field.\nhttps://docs.maestro.dev/reference/commands-available/erasetext.md", + "oneOf": [ + { + "type": "integer", + "minimum": 1, + "maximum": 100 + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "charactersToErase": { + "type": "integer", + "minimum": 1, + "maximum": 100 + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "setPermissionsValue": { + "title": "setPermissions value", + "description": "Grant or deny permissions mid-flow.\nhttps://docs.maestro.dev/reference/commands-available/setpermissions.md", + "type": "object", + "additionalProperties": true, + "properties": { + "permissions": { + "$ref": "#/$defs/permissionsMap" + }, + "appId": { + "type": "string" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "waitForAnimationToEndValue": { + "title": "waitForAnimationToEnd value", + "description": "Wait for UI animations to finish.\nhttps://docs.maestro.dev/reference/commands-available/waitforanimationtoend.md", + "type": "object", + "additionalProperties": true, + "properties": { + "timeout": { + "oneOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "type": "string" + } + ] + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, + "addMediaValue": { + "title": "addMedia value", + "description": "Add media files to the device gallery.\nhttps://docs.maestro.dev/reference/commands-available/addmedia.md", "type": "array", - "items": { "$ref": "#/$defs/commandStep" }, - "description": "Sequence of Maestro commands executed in order." + "items": { + "type": "string" + }, + "minItems": 1 }, - "commandStep": { + "stopAppValue": { + "title": "stopApp value", + "description": "Stop an app without clearing data.\nhttps://docs.maestro.dev/reference/commands-available/stopapp.md", "oneOf": [ { - "$ref": "#/$defs/bareCommandName", - "description": "Shorthand step with no parameters (YAML scalar list item)." + "type": "string", + "description": "App id" }, { - "$ref": "#/$defs/commandObject", - "description": "Single-key object: command name -> arguments map, string, or null." + "type": "object", + "additionalProperties": true, + "properties": { + "appId": { + "type": "string" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } } ] }, - "bareCommandName": { + "killAppValue": { + "title": "killApp value", + "description": "Force-stop an app.\nhttps://docs.maestro.dev/reference/commands-available/killapp.md", + "oneOf": [ + { + "type": "string", + "description": "App id" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "appId": { + "type": "string" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "clearStateValue": { + "title": "clearState value", + "description": "Clear app data / cache.\nhttps://docs.maestro.dev/reference/commands-available/clearstate.md", + "oneOf": [ + { + "type": "string", + "description": "App id" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "appId": { + "type": "string" + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "pressKeyValue": { + "title": "pressKey value", + "description": "Hardware / soft key name.\nhttps://docs.maestro.dev/reference/commands-available/presskey.md", "type": "string", - "title": "Bare command", - "description": "Commands that need no argument object. Maestro accepts many more; list is indicative.", + "minLength": 1, "examples": [ - "launchApp", - "hideKeyboard", + "home", + "lock", + "enter", + "backspace", + "volume up", + "volume down", "back", - "stopApp", - "clearState", - "clearKeychain", - "waitForAnimationToEnd", - "takeScreenshot", - "startRecording", - "stopRecording" + "power", + "tab" ] }, + "setAirplaneModeValue": { + "title": "setAirplaneMode value", + "type": "string", + "description": "Enable or disable airplane mode (Android).\nhttps://docs.maestro.dev/reference/commands-available/setairplanemode.md", + "examples": ["enabled", "disabled"] + }, + "setOrientationValue": { + "title": "setOrientation value", + "description": "Device orientation.\nhttps://docs.maestro.dev/reference/commands-available/setorientation.md", + "type": "string", + "examples": [ + "PORTRAIT", + "LANDSCAPE_LEFT", + "LANDSCAPE_RIGHT", + "UPSIDE_DOWN" + ] + }, + "setClipboardValue": { + "title": "setClipboard value", + "description": "Set clipboard text.\nhttps://docs.maestro.dev/reference/commands-available/setclipboard.md", + "type": "string" + }, + "evalScriptValue": { + "title": "evalScript value", + "description": "Inline JavaScript expression.\nhttps://docs.maestro.dev/reference/commands-available/evalscript.md", + "type": "string" + }, + "randomInputValue": { + "title": "random input value", + "description": "Random input options (length for text/number).\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md", + "type": "object", + "additionalProperties": true, + "properties": { + "length": { + "type": "integer", + "minimum": 1 + }, + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + }, "commandObject": { + "title": "command object", + "description": "Single Maestro command as a one-key mapping (e.g. tapOn: Login, launchApp: { clearState: true }). Unknown future commands are allowed via additionalProperties.", "type": "object", "minProperties": 1, "maxProperties": 1, - "additionalProperties": { - "$ref": "#/$defs/commandValue" - }, - "propertyNames": { - "type": "string", - "description": "Maestro command name (typically camelCase, e.g. tapOn, runFlow)." + "additionalProperties": true, + "properties": { + "addMedia": { + "$ref": "#/$defs/addMediaValue", + "description": "Add media to the gallery.\nhttps://docs.maestro.dev/reference/commands-available/addmedia.md" + }, + "assertNoDefectsWithAI": { + "description": "AI visual defect check.\nhttps://docs.maestro.dev/reference/commands-available/assertnodefectswithai.md", + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "assertNotVisible": { + "$ref": "#/$defs/elementCommandValue", + "description": "Assert element is not visible.\nhttps://docs.maestro.dev/reference/commands-available/assertnotvisible.md" + }, + "assertScreenshot": { + "$ref": "#/$defs/assertScreenshotValue", + "description": "Visual regression assertion.\nhttps://docs.maestro.dev/reference/commands-available/assertscreenshot.md" + }, + "assertTrue": { + "$ref": "#/$defs/assertTrueValue", + "description": "Assert JS expression is true.\nhttps://docs.maestro.dev/reference/commands-available/asserttrue.md" + }, + "assertVisible": { + "$ref": "#/$defs/elementCommandValue", + "description": "Assert element is visible.\nhttps://docs.maestro.dev/reference/commands-available/assertvisible.md" + }, + "assertWithAI": { + "$ref": "#/$defs/assertWithAIValue", + "description": "Natural-language AI assertion.\nhttps://docs.maestro.dev/reference/commands-available/assertwithai.md" + }, + "back": { + "description": "Press system back.\nhttps://docs.maestro.dev/reference/commands-available/back.md", + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "clearKeychain": { + "description": "Clear iOS keychain.\nhttps://docs.maestro.dev/reference/commands-available/clearkeychain.md", + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "clearState": { + "$ref": "#/$defs/clearStateValue", + "description": "Clear app state.\nhttps://docs.maestro.dev/reference/commands-available/clearstate.md" + }, + "copyTextFrom": { + "$ref": "#/$defs/elementCommandValue", + "description": "Copy text from an element.\nhttps://docs.maestro.dev/reference/commands-available/copytextfrom.md" + }, + "doubleTapOn": { + "$ref": "#/$defs/elementCommandValue", + "description": "Double-tap an element.\nhttps://docs.maestro.dev/reference/commands-available/doubletapon.md" + }, + "eraseText": { + "$ref": "#/$defs/eraseTextValue", + "description": "Erase focused text.\nhttps://docs.maestro.dev/reference/commands-available/erasetext.md" + }, + "evalScript": { + "$ref": "#/$defs/evalScriptValue", + "description": "Evaluate inline JavaScript.\nhttps://docs.maestro.dev/reference/commands-available/evalscript.md" + }, + "extendedWaitUntil": { + "$ref": "#/$defs/extendedWaitUntilValue", + "description": "Wait with custom timeout.\nhttps://docs.maestro.dev/reference/commands-available/extendedwaituntil.md" + }, + "extractTextWithAI": { + "$ref": "#/$defs/extractTextWithAIValue", + "description": "Extract text with AI.\nhttps://docs.maestro.dev/reference/commands-available/extracttextwithai.md" + }, + "hideKeyboard": { + "description": "Dismiss the soft keyboard.\nhttps://docs.maestro.dev/reference/commands-available/hidekeyboard.md", + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "inputText": { + "$ref": "#/$defs/inputTextValue", + "description": "Type text into the focused field.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md" + }, + "inputRandomText": { + "description": "Type random text.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md", + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/$defs/randomInputValue" + } + ] + }, + "inputRandomNumber": { + "description": "Type a random number.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md", + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/$defs/randomInputValue" + } + ] + }, + "inputRandomEmail": { + "description": "Type a random email.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md", + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/$defs/randomInputValue" + } + ] + }, + "inputRandomPersonName": { + "description": "Type a random person name.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md", + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/$defs/randomInputValue" + } + ] + }, + "inputRandomCityName": { + "description": "Type a random city name.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md", + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/$defs/randomInputValue" + } + ] + }, + "inputRandomCountryName": { + "description": "Type a random country name.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md", + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/$defs/randomInputValue" + } + ] + }, + "inputRandomColorName": { + "description": "Type a random color name.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md", + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/$defs/randomInputValue" + } + ] + }, + "killApp": { + "$ref": "#/$defs/killAppValue", + "description": "Force-stop an app.\nhttps://docs.maestro.dev/reference/commands-available/killapp.md" + }, + "launchApp": { + "$ref": "#/$defs/launchAppValue", + "description": "Launch an app.\nhttps://docs.maestro.dev/reference/commands-available/launchapp.md" + }, + "longPressOn": { + "$ref": "#/$defs/elementCommandValue", + "description": "Long-press an element.\nhttps://docs.maestro.dev/reference/commands-available/longpresson.md" + }, + "openLink": { + "$ref": "#/$defs/openLinkValue", + "description": "Open a URL or deep link.\nhttps://docs.maestro.dev/reference/commands-available/openlink.md" + }, + "pasteText": { + "description": "Paste clipboard into the focused field.\nhttps://docs.maestro.dev/reference/commands-available/pastetext.md", + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "pressKey": { + "$ref": "#/$defs/pressKeyValue", + "description": "Press a hardware/soft key.\nhttps://docs.maestro.dev/reference/commands-available/presskey.md" + }, + "repeat": { + "$ref": "#/$defs/repeatValue", + "description": "Repeat commands.\nhttps://docs.maestro.dev/reference/commands-available/repeat.md" + }, + "retry": { + "$ref": "#/$defs/retryValue", + "description": "Retry commands on failure.\nhttps://docs.maestro.dev/reference/commands-available/retry.md" + }, + "runFlow": { + "$ref": "#/$defs/runFlowValue", + "description": "Run a nested flow.\nhttps://docs.maestro.dev/reference/commands-available/runflow.md" + }, + "runScript": { + "$ref": "#/$defs/runScriptValue", + "description": "Run a JavaScript file.\nhttps://docs.maestro.dev/reference/commands-available/runscript.md" + }, + "scroll": { + "description": "Simple vertical scroll.\nhttps://docs.maestro.dev/reference/commands-available/scroll.md", + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "scrollUntilVisible": { + "$ref": "#/$defs/scrollUntilVisibleValue", + "description": "Scroll until element is visible.\nhttps://docs.maestro.dev/reference/commands-available/scrolluntilvisible.md" + }, + "setAirplaneMode": { + "$ref": "#/$defs/setAirplaneModeValue", + "description": "Set airplane mode.\nhttps://docs.maestro.dev/reference/commands-available/setairplanemode.md" + }, + "setClipboard": { + "$ref": "#/$defs/setClipboardValue", + "description": "Set clipboard contents.\nhttps://docs.maestro.dev/reference/commands-available/setclipboard.md" + }, + "setLocation": { + "$ref": "#/$defs/setLocationValue", + "description": "Set GPS location.\nhttps://docs.maestro.dev/reference/commands-available/setlocation.md" + }, + "setOrientation": { + "$ref": "#/$defs/setOrientationValue", + "description": "Set device orientation.\nhttps://docs.maestro.dev/reference/commands-available/setorientation.md" + }, + "setPermissions": { + "$ref": "#/$defs/setPermissionsValue", + "description": "Set app permissions.\nhttps://docs.maestro.dev/reference/commands-available/setpermissions.md" + }, + "startRecording": { + "$ref": "#/$defs/startRecordingValue", + "description": "Start screen recording.\nhttps://docs.maestro.dev/reference/commands-available/startrecording.md" + }, + "stopApp": { + "$ref": "#/$defs/stopAppValue", + "description": "Stop an app.\nhttps://docs.maestro.dev/reference/commands-available/stopapp.md" + }, + "stopRecording": { + "description": "Stop screen recording.\nhttps://docs.maestro.dev/reference/commands-available/stoprecording.md", + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "swipe": { + "$ref": "#/$defs/swipeValue", + "description": "Swipe gesture.\nhttps://docs.maestro.dev/reference/commands-available/swipe.md" + }, + "takeScreenshot": { + "$ref": "#/$defs/takeScreenshotValue", + "description": "Capture a screenshot.\nhttps://docs.maestro.dev/reference/commands-available/takescreenshot.md" + }, + "tapOn": { + "$ref": "#/$defs/elementCommandValue", + "description": "Tap an element or coordinate.\nhttps://docs.maestro.dev/reference/commands-available/tapon.md" + }, + "toggleAirplaneMode": { + "description": "Toggle airplane mode.\nhttps://docs.maestro.dev/reference/commands-available/toggleairplanemode.md", + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "additionalProperties": true, + "properties": { + "label": { + "type": "string", + "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + }, + "optional": { + "type": "boolean", + "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md" + } + } + } + ] + }, + "travel": { + "$ref": "#/$defs/travelValue", + "description": "Travel along GPS points.\nhttps://docs.maestro.dev/reference/commands-available/travel.md" + }, + "waitForAnimationToEnd": { + "description": "Wait for animations to end.\nhttps://docs.maestro.dev/reference/commands-available/waitforanimationtoend.md", + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/$defs/waitForAnimationToEndValue" + } + ] + } } }, - "commandValue": { - "title": "Command arguments", - "description": "Depends on the command: omitted/null, boolean, string selector, number, array of nested steps, or parameter object.", - "oneOf": [ - { "type": "null" }, - { "type": "boolean" }, - { "type": "number" }, - { "type": "string" }, - { "type": "array", "items": { "$ref": "#/$defs/commandStep" } }, - { "$ref": "#/$defs/argumentMap" } + "bareCommand": { + "title": "bare command", + "description": "Commands that may be written as a bare YAML scalar with no arguments (e.g. launchApp, hideKeyboard, scroll).", + "type": "string", + "minLength": 1, + "examples": [ + "launchApp", + "hideKeyboard", + "scroll", + "back", + "pasteText", + "stopRecording", + "waitForAnimationToEnd", + "toggleAirplaneMode", + "clearKeychain", + "clearState", + "stopApp", + "killApp", + "inputRandomText", + "inputRandomNumber", + "inputRandomEmail", + "inputRandomPersonName", + "assertNoDefectsWithAI" ] }, - "argumentMap": { - "type": "object", - "additionalProperties": true, - "description": "Command-specific parameters. Commands: https://docs.maestro.dev/reference/commands-available/ — Selectors: https://docs.maestro.dev/reference/selectors — Conditions (when): https://docs.maestro.dev/maestro-flows/flow-control-and-logic/conditions — runFlow: https://docs.maestro.dev/reference/commands-available/runflow — launchApp: https://docs.maestro.dev/reference/commands-available/launchapp — extendedWaitUntil: https://docs.maestro.dev/reference/commands-available/extendedwaituntil" + "commandStep": { + "title": "command step", + "description": "One flow step: bare command name or single-key command object.", + "oneOf": [ + { + "$ref": "#/$defs/bareCommand" + }, + { + "$ref": "#/$defs/commandObject" + } + ] } }, "title": "Maestro Flow", - "description": "YAML flow file for Maestro (mobile & web UI automation). A single file is usually two YAML documents separated by ---: (1) flow configuration, (2) command list. Assign this schema to *.flow.yaml or **/.maestro/**/*.yaml. Official docs: https://docs.maestro.dev/", + "description": "YAML flow file for Maestro (mobile and web UI automation). A file is usually two YAML documents separated by ---: (1) flow configuration, (2) ordered command list.\nhttps://docs.maestro.dev/maestro-flows/readme.md", "oneOf": [ { - "$ref": "#/$defs/flowConfiguration", - "description": "First document: app/url, env, tags, hooks." + "$ref": "#/$defs/flowConfiguration" }, { - "$ref": "#/$defs/commandList", - "description": "Second document: ordered list of Maestro commands." + "$ref": "#/$defs/commandList" } ] } diff --git a/src/test/maestro-flow/flow-control.yaml b/src/test/maestro-flow/flow-control.yaml new file mode 100644 index 00000000000..fdf8487e7ca --- /dev/null +++ b/src/test/maestro-flow/flow-control.yaml @@ -0,0 +1,56 @@ +# yaml-language-server: $schema=../../schemas/json/maestro-flow.json +- runFlow: Login.yaml +- runFlow: + file: anotherFlow.yaml + env: + MY_PARAMETER: '123' +- runFlow: + when: + platform: iOS + file: subflows/ios-permissions.yaml +- runFlow: + when: + notVisible: 'Biometric Login' + commands: + - tapOn: 'Standard Login' +- repeat: + times: 3 + commands: + - tapOn: Button + - scroll +- repeat: + while: + notVisible: 'ValueX' + commands: + - tapOn: Button +- retry: + maxRetries: 3 + commands: + - tapOn: + id: button-that-might-not-be-here-yet +- evalScript: ${output.counter = 0} +- assertTrue: + condition: ${output.counter == 0} + label: Counter starts at zero +- runScript: myScript.js +- runScript: + file: script.js + env: + myParameter: Parameter +- assertWithAI: + assertion: Login and password text fields are visible. +- extractTextWithAI: CAPTCHA value +- inputRandomText: + length: 12 +- inputRandomEmail +- travel: + points: + - '48.8578065, 2.295188' + - '46.2276, 5.9900' + speed: 150000 +- doubleTapOn: + id: icon +- longPressOn: + text: Options +- copyTextFrom: + id: title diff --git a/src/test/maestro-flow/flow-device-and-media.yaml b/src/test/maestro-flow/flow-device-and-media.yaml new file mode 100644 index 00000000000..e83732be99e --- /dev/null +++ b/src/test/maestro-flow/flow-device-and-media.yaml @@ -0,0 +1,40 @@ +# yaml-language-server: $schema=../../schemas/json/maestro-flow.json +- launchApp: + appId: com.example.app + clearState: true + clearKeychain: true + permissions: + all: deny + camera: allow +- setPermissions: + permissions: + all: allow +- setLocation: + latitude: 52.3599976 + longitude: 4.8830301 +- setOrientation: PORTRAIT +- setAirplaneMode: enabled +- toggleAirplaneMode +- setClipboard: custom@example.com +- pasteText +- addMedia: + - './assets/foo.png' + - './assets/foo.mp4' +- takeScreenshot: MainScreen +- takeScreenshot: + path: LoginScreen + cropOn: + id: LoginFormContainer +- assertScreenshot: splash.png +- startRecording: recording +- stopRecording +- pressKey: enter +- eraseText: 10 +- openLink: + link: https://example.com + browser: true +- killApp: com.example.app +- stopApp +- clearState +- waitForAnimationToEnd: + timeout: 5000 diff --git a/src/test/maestro-flow/flow-header.yaml b/src/test/maestro-flow/flow-header.yaml index 6f42fced2f8..1a894c75019 100644 --- a/src/test/maestro-flow/flow-header.yaml +++ b/src/test/maestro-flow/flow-header.yaml @@ -3,5 +3,8 @@ appId: com.example.maestro name: sample flow tags: - e2e + - smoke-test env: API_URL: https://api.example.test + USERNAME: user@example.com +jsEngine: graaljs diff --git a/src/test/maestro-flow/flow-hooks.yaml b/src/test/maestro-flow/flow-hooks.yaml new file mode 100644 index 00000000000..38fd84cacfe --- /dev/null +++ b/src/test/maestro-flow/flow-hooks.yaml @@ -0,0 +1,7 @@ +# yaml-language-server: $schema=../../schemas/json/maestro-flow.json +appId: com.example.app +onFlowStart: + - launchApp + - clearState +onFlowComplete: + - stopApp diff --git a/src/test/maestro-flow/flow-login-helper.yaml b/src/test/maestro-flow/flow-login-helper.yaml new file mode 100644 index 00000000000..097f0a3a502 --- /dev/null +++ b/src/test/maestro-flow/flow-login-helper.yaml @@ -0,0 +1,40 @@ +# yaml-language-server: $schema=../../schemas/json/maestro-flow.json +- launchApp: + clearState: true + arguments: + e2eSkipHealth: 'true' +- extendedWaitUntil: + visible: + id: 'welcome-login-btn' + timeout: 20000 +- tapOn: + id: 'welcome-login-btn' +- tapOn: + id: 'login-email-input' +- inputText: ${E2E_EMAIL} +- tapOn: + id: 'login-password-input' +- inputText: ${E2E_PASSWORD} +- tapOn: + id: 'login-submit-btn' +- extendedWaitUntil: + visible: 'Save Password?' + timeout: 12000 + optional: true +- runFlow: + when: + visible: 'Save Password?' + commands: + - tapOn: 'Not Now' +- runFlow: + when: + visible: + id: 'timezone-mismatch-keep-btn' + commands: + - tapOn: + id: 'timezone-mismatch-keep-btn' +- extendedWaitUntil: + visible: + id: 'header-home-logo' + timeout: 20000 +- assertVisible: 'Today' diff --git a/src/test/maestro-flow/flow-selectors.yaml b/src/test/maestro-flow/flow-selectors.yaml new file mode 100644 index 00000000000..57bc397e5e4 --- /dev/null +++ b/src/test/maestro-flow/flow-selectors.yaml @@ -0,0 +1,33 @@ +# yaml-language-server: $schema=../../schemas/json/maestro-flow.json +- tapOn: Login +- tapOn: + text: '.*Continue.*' +- tapOn: + id: login_button + enabled: true +- tapOn: + id: buy_button + index: 2 +- tapOn: + css: .secondaryButton +- tapOn: + point: '50%, 50%' +- tapOn: + text: Submit + below: + text: Terms +- assertVisible: + id: header_icon + focused: false +- swipe: + direction: LEFT + duration: 2000 +- swipe: + from: + id: feeditem_identifier + direction: UP +- scrollUntilVisible: + element: + text: Footer + direction: DOWN + timeout: 15000 diff --git a/src/test/maestro-flow/flow-web-header.yaml b/src/test/maestro-flow/flow-web-header.yaml new file mode 100644 index 00000000000..2791eac76dc --- /dev/null +++ b/src/test/maestro-flow/flow-web-header.yaml @@ -0,0 +1,5 @@ +# yaml-language-server: $schema=../../schemas/json/maestro-flow.json +url: https://docs.maestro.dev/ +name: web smoke +tags: + - web From d3dfb941f9ca3decd48e21a249df515f5f2755c5 Mon Sep 17 00:00:00 2001 From: Ramith Jayasinghe <3402882+ramith@users.noreply.github.com> Date: Mon, 27 Jul 2026 21:42:47 +0530 Subject: [PATCH 14/21] =?UTF-8?q?Add=20CVX=20cv-content=20schemas=20(perso?= =?UTF-8?q?nal,=20experience,=20config,=20layouts,=20=E2=80=A6)=20(#6130)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/json/catalog.json | 60 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index a1e6859972e..5642d36b54a 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -1750,6 +1750,66 @@ "fileMatch": ["CVE-*.json"], "url": "https://raw.githubusercontent.com/CVEProject/cve-schema/master/schema/docs/CVE_Record_Format_bundled.json" }, + { + "name": "CVX personal.yaml", + "description": "Identity and contact details for a CVX CV (name, title, contact rows)", + "fileMatch": ["**/cv-content/personal.yaml"], + "url": "https://raw.githubusercontent.com/hrtips/cvx/main/schema/v1/personal.schema.json" + }, + { + "name": "CVX summary.yaml", + "description": "Professional-summary bullets for a CVX CV", + "fileMatch": ["**/cv-content/summary.yaml"], + "url": "https://raw.githubusercontent.com/hrtips/cvx/main/schema/v1/summary.schema.json" + }, + { + "name": "CVX experience.yaml", + "description": "Work history entries for a CVX CV (roles, progression, impact bullets)", + "fileMatch": ["**/cv-content/experience.yaml"], + "url": "https://raw.githubusercontent.com/hrtips/cvx/main/schema/v1/experience.schema.json" + }, + { + "name": "CVX education.yaml", + "description": "Education entries for a CVX CV", + "fileMatch": ["**/cv-content/education.yaml"], + "url": "https://raw.githubusercontent.com/hrtips/cvx/main/schema/v1/education.schema.json" + }, + { + "name": "CVX competencies.yaml", + "description": "Skill tags for a CVX CV", + "fileMatch": ["**/cv-content/competencies.yaml"], + "url": "https://raw.githubusercontent.com/hrtips/cvx/main/schema/v1/competencies.schema.json" + }, + { + "name": "CVX achievements.yaml", + "description": "Awards and recognitions for a CVX CV", + "fileMatch": ["**/cv-content/achievements.yaml"], + "url": "https://raw.githubusercontent.com/hrtips/cvx/main/schema/v1/achievements.schema.json" + }, + { + "name": "CVX referees.yaml", + "description": "References for a CVX CV", + "fileMatch": ["**/cv-content/referees.yaml"], + "url": "https://raw.githubusercontent.com/hrtips/cvx/main/schema/v1/referees.schema.json" + }, + { + "name": "CVX keywords.yaml", + "description": "ATS keywords embedded in CVX PDF metadata", + "fileMatch": ["**/cv-content/keywords.yaml"], + "url": "https://raw.githubusercontent.com/hrtips/cvx/main/schema/v1/keywords.schema.json" + }, + { + "name": "CVX config.yaml", + "description": "CVX build configuration (theme, layout, pagination, ATS keywords)", + "fileMatch": ["**/cv-content/config.yaml"], + "url": "https://raw.githubusercontent.com/hrtips/cvx/main/schema/v1/config.schema.json" + }, + { + "name": "CVX layout", + "description": "Custom page layout for a CVX CV (section placement per page)", + "fileMatch": ["**/cv-content/layouts/*.yaml"], + "url": "https://raw.githubusercontent.com/hrtips/cvx/main/schema/v1/layout.schema.json" + }, { "name": "Cycle Stack File", "description": "A Cycle.io stack file for environments as code", From ab3bc9d0ae97222e6700334b871d4ed0ad400085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Le=C3=B4ncio?= Date: Mon, 27 Jul 2026 13:13:05 -0300 Subject: [PATCH 15/21] Add Claude Code launch schema (#6132) * Add Claude Code launch schema Signed-off-by: pragmabits * fix(schema): satisfy AJV strictRequired validation Signed-off-by: pragmabits * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * test(schema): fix Claude Code launch fixture Signed-off-by: pragmabits * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Signed-off-by: pragmabits Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/api/json/catalog.json | 6 + src/schemas/json/claude-code-launch.json | 156 ++++++++++++++++++ .../claude-code-launch.json | 28 ++++ 3 files changed, 190 insertions(+) create mode 100644 src/schemas/json/claude-code-launch.json create mode 100644 src/test/claude-code-launch/claude-code-launch.json diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index 5642d36b54a..9a278b2af94 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -10862,6 +10862,12 @@ "versions": { "0.1": "https://www.schemastore.org/okf-0.1.json" } + }, + { + "name": "Claude Code Launch Preview", + "description": "Configuration for preview servers in Claude Code Desktop", + "fileMatch": ["**/.claude/launch.json"], + "url": "https://www.schemastore.org/claude-code-launch.json" } ] } diff --git a/src/schemas/json/claude-code-launch.json b/src/schemas/json/claude-code-launch.json new file mode 100644 index 00000000000..65ad3583888 --- /dev/null +++ b/src/schemas/json/claude-code-launch.json @@ -0,0 +1,156 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.schemastore.org/claude-code-launch.json", + "title": "launch configuration", + "description": "Configuration for preview servers in Claude Code Desktop.\nhttps://code.claude.com/docs/en/desktop#configure-preview-servers", + "type": "object", + "required": ["version", "configurations"], + "additionalProperties": true, + "properties": { + "$schema": { + "type": "string", + "description": "JSON Schema reference for this configuration file." + }, + "version": { + "type": "string", + "const": "0.0.1", + "description": "Version of the launch configuration format." + }, + "autoVerify": { + "type": "boolean", + "default": true, + "description": "Whether Claude automatically verifies changes after editing files.\nhttps://code.claude.com/docs/en/desktop#auto-verify-changes" + }, + "configurations": { + "type": "array", + "description": "Preview server configurations.", + "items": { + "$ref": "#/definitions/configuration" + } + } + }, + "definitions": { + "configuration": { + "title": "preview server configuration", + "type": "object", + "required": ["name"], + "additionalProperties": true, + "properties": { + "name": { + "type": "string", + "minLength": 1, + "description": "Unique identifier for this server." + }, + "runtimeExecutable": { + "type": "string", + "minLength": 1, + "description": "Command used to start the server, such as npm, yarn, or node." + }, + "runtimeArgs": { + "type": "array", + "description": "Arguments passed to runtimeExecutable.", + "items": { + "type": "string" + } + }, + "port": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "default": 3000, + "description": "Port on which the server listens." + }, + "cwd": { + "type": "string", + "description": "Working directory relative to the project root. Use ${workspaceFolder} to reference the project root explicitly." + }, + "env": { + "type": "object", + "description": "Additional environment variables passed to the server. Do not store secrets here because launch.json is committed to the repository.", + "additionalProperties": { + "type": "string" + } + }, + "autoPort": { + "type": "boolean", + "description": "Whether Claude automatically selects a free port when the configured port is unavailable. When omitted, Claude asks the user." + }, + "program": { + "type": "string", + "minLength": 1, + "description": "Standalone script run directly with Node.js." + }, + "args": { + "type": "array", + "description": "Arguments passed to program.", + "items": { + "type": "string" + } + }, + "url": { + "type": "string", + "format": "uri", + "pattern": "^https?://", + "description": "Address opened by the preview instead of http://localhost:. Must use HTTP or HTTPS and must not contain a username or password. Localhost URLs must contain only the origin, and their port must match port.\nhttps://code.claude.com/docs/en/desktop#open-the-preview-at-a-specific-url" + } + }, + "dependencies": { + "runtimeArgs": ["runtimeExecutable"], + "args": ["program"] + }, + "anyOf": [ + { + "properties": { + "runtimeExecutable": {} + }, + "required": ["runtimeExecutable"] + }, + { + "properties": { + "program": {} + }, + "required": ["program"] + }, + { + "properties": { + "url": {} + }, + "required": ["url"] + } + ] + } + }, + "examples": [ + { + "version": "0.0.1", + "configurations": [ + { + "name": "web", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "port": 3000 + } + ] + }, + { + "version": "0.0.1", + "configurations": [ + { + "name": "server", + "program": "server.js", + "args": ["--verbose"], + "port": 4000 + } + ] + }, + { + "version": "0.0.1", + "configurations": [ + { + "name": "existing-server", + "url": "https://app.localhost:3000" + } + ] + } + ] +} diff --git a/src/test/claude-code-launch/claude-code-launch.json b/src/test/claude-code-launch/claude-code-launch.json new file mode 100644 index 00000000000..20aaa54ee45 --- /dev/null +++ b/src/test/claude-code-launch/claude-code-launch.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://www.schemastore.org/claude-code-launch.json", + "autoVerify": false, + "configurations": [ + { + "autoPort": true, + "cwd": "${workspaceFolder}", + "env": { + "NODE_ENV": "development" + }, + "name": "npm-development-server", + "port": 3000, + "runtimeArgs": ["run", "dev"], + "runtimeExecutable": "npm" + }, + { + "args": ["--verbose"], + "name": "node-server", + "port": 4000, + "program": "server.js" + }, + { + "name": "existing-server", + "url": "https://app.localhost:3000" + } + ], + "version": "0.0.1" +} From bc20003a40d37ded5084caee665a36d8ec254468 Mon Sep 17 00:00:00 2001 From: Wilson Santos Date: Mon, 27 Jul 2026 11:13:21 -0500 Subject: [PATCH 16/21] feat: add Draugr Saga (#6134) --- 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 9a278b2af94..d31f0f239c8 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -2631,6 +2631,12 @@ "fileMatch": ["debugsettings.json"], "url": "https://www.schemastore.org/debugsettings.json" }, + { + "name": "Draugr Saga", + "description": "Draugr Saga - a declarative account of an application's security surface and the controls that must pass", + "fileMatch": ["*.saga.yaml", "*.saga.yml", ".saga.yaml", ".saga.yml"], + "url": "https://draugr.dev/schema/draugr.saga.schema.json" + }, { "name": "Deno Config (deno.json)", "description": "A JSON representation of a Deno configuration file", From bc87d452fed3fbc66906fc32ffe82953875de924 Mon Sep 17 00:00:00 2001 From: Typpi <20943337+Nick2bad4u@users.noreply.github.com> Date: Mon, 27 Jul 2026 12:13:35 -0400 Subject: [PATCH 17/21] Add gh-dash schema catalog entry (#6098) --- 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 d31f0f239c8..ad9935fd88a 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -3704,6 +3704,12 @@ ], "url": "https://www.schemastore.org/gitea-issue-forms.json" }, + { + "name": "gh-dash", + "description": "Configuration for the gh-dash GitHub CLI dashboard", + "fileMatch": [".gh-dash.yml", ".gh-dash.yaml", "**/gh-dash/config.yml"], + "url": "https://gh-dash.dev/schema.json" + }, { "name": "GitHub Action", "description": "YAML GitHub Actions", From 1f43a0e2815a03d7905f1300efeb792c2ae24aa2 Mon Sep 17 00:00:00 2001 From: Joseph Petersen Date: Mon, 27 Jul 2026 16:13:49 +0000 Subject: [PATCH 18/21] Update release-drafter schema.json (#6135) --- src/api/json/catalog.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/json/catalog.json b/src/api/json/catalog.json index ad9935fd88a..9703fb30a5c 100644 --- a/src/api/json/catalog.json +++ b/src/api/json/catalog.json @@ -8274,7 +8274,7 @@ "name": "release drafter", "description": "Release Drafter configuration file", "fileMatch": ["**/.github/release-drafter.yml"], - "url": "https://raw.githubusercontent.com/release-drafter/release-drafter/master/schema.json" + "url": "https://raw.githubusercontent.com/release-drafter/release-drafter/refs/heads/main/drafter/schema.json" }, { "name": "zuul", From 3f006f0303df569467bbcab626693e41305ed462 Mon Sep 17 00:00:00 2001 From: ya7010 <47286750+ya7010@users.noreply.github.com> Date: Tue, 28 Jul 2026 01:14:04 +0900 Subject: [PATCH 19/21] fix: partial-pytest schema by removing redundant 'x-tombi-array-values-order' property from command line arguments description. (#6136) --- src/schemas/json/partial-pytest.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/schemas/json/partial-pytest.json b/src/schemas/json/partial-pytest.json index ae4b01eac4f..a8196c8d81c 100644 --- a/src/schemas/json/partial-pytest.json +++ b/src/schemas/json/partial-pytest.json @@ -47,8 +47,7 @@ "type": "string" } ], - "description": "Add the specified OPTS to the set of command line arguments as if they had been specified by the user.", - "x-tombi-array-values-order": "ascending" + "description": "Add the specified OPTS to the set of command line arguments as if they had been specified by the user." }, "cache_dir": { "type": "string", @@ -716,8 +715,7 @@ "items": { "type": "string" }, - "description": "Add the specified OPTS to the set of command line arguments as if they had been specified by the user.", - "x-tombi-array-values-order": "ascending" + "description": "Add the specified OPTS to the set of command line arguments as if they had been specified by the user." }, "cache_dir": { "type": "string", From 4e44b86b7fbd420b8b5a205268c959f1de024ecf Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 27 Jul 2026 12:14:17 -0400 Subject: [PATCH 20/21] cibuildwheel: 4.1.1 schema (#6137) Signed-off-by: Henry Schreiner --- src/schemas/json/partial-cibuildwheel.json | 29 +++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/schemas/json/partial-cibuildwheel.json b/src/schemas/json/partial-cibuildwheel.json index 4629b864f7c..9ad8a8e96f1 100644 --- a/src/schemas/json/partial-cibuildwheel.json +++ b/src/schemas/json/partial-cibuildwheel.json @@ -1166,7 +1166,34 @@ "$ref": "#/properties/before-test" }, "build-frontend": { - "$ref": "#/properties/build-frontend" + "default": "pyodide-build", + "description": "On the pyodide platform, the build frontend must be \"pyodide-build\"", + "oneOf": [ + { + "enum": ["pyodide-build"] + }, + { + "type": "string", + "pattern": "^pyodide-build; ?args:" + }, + { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "enum": ["pyodide-build"] + }, + "args": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + ], + "title": "CIBW_BUILD_FRONTEND" }, "build-verbosity": { "$ref": "#/properties/build-verbosity" From 7388f7a260e3a3500ccc23efaa7ac483e8acc0b9 Mon Sep 17 00:00:00 2001 From: btea <2356281422@qq.com> Date: Tue, 28 Jul 2026 00:14:34 +0800 Subject: [PATCH 21/21] Add allowScripts field to package.json schema (#6139) Add the `allowScripts` field to the package.json schema based on the npm approve-scripts command (CLI v12). The field is an object mapping package identifiers (name-only or pinned with version) to booleans that control whether each dependency's install scripts (preinstall, install, postinstall, and prepare for non-registry sources) are permitted to run, enforcing a default-deny policy. https://docs.npmjs.com/cli/v12/commands/npm-approve-scripts --- src/schemas/json/package.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/schemas/json/package.json b/src/schemas/json/package.json index 8ebdda53dbe..6c2fdfe9157 100644 --- a/src/schemas/json/package.json +++ b/src/schemas/json/package.json @@ -1326,6 +1326,13 @@ } }, "additionalProperties": false + }, + "allowScripts": { + "description": "Records which dependencies are permitted to run install scripts (preinstall, install, postinstall, and prepare for non-registry sources). Maintained via the \"npm approve-scripts\" command, which enforces a default-deny policy: install scripts for any dependency without a matching entry are silently skipped. Keys are package identifiers — either name-only (e.g. \"pkg\") or pinned with a version (e.g. \"pkg@1.2.3\"); by default entries are pinned so approval is version-specific. A value of true allows the dependency's install scripts to run, while false explicitly denies them (existing false entries are never silently overridden).", + "type": "object", + "additionalProperties": { + "type": "boolean" + } } }, "$id": "https://json.schemastore.org/package.json"