{ "$schema": "http://json-schema.org/draft-04/schema", "$comment": "`taplo` and the corresponding VS Code plugins only support version draft-04 of JSON Schema, see . draft-07 is mostly compatible with it, newer versions may not be.", "title": "Jujutsu config", "type": "object", "description": "User configuration for Jujutsu VCS. See https://docs.jj-vcs.dev/latest/config/ for details", "properties": { "user": { "type": "object", "description": "Settings about the user", "properties": { "name": { "type": "string", "description": "Full name of the user, used in commits" }, "email": { "type": "string", "description": "User's email address, used in commits", "format": "email" } } }, "operation": { "type": "object", "description": "Metadata to be attached to jj operations (shown in jj op log)", "properties": { "hostname": { "type": "string", "format": "hostname" }, "username": { "type": "string" } } }, "ui": { "type": "object", "description": "UI settings", "definitions": { "conflict-marker-style": { "type": "string", "description": "Conflict marker style to use when materializing conflicts in the working copy", "enum": [ "diff", "diff-experimental", "snapshot", "git" ], "default": "diff" }, "command": { "type": [ "string", "array" ], "minItems": 1, "items": { "type": "string" } }, "command-env": { "type": "object", "properties": { "command": { "type": "array", "minItems": 1, "items": { "type": "string" } }, "env": { "type": "object" } }, "required": [ "command", "env" ] } }, "properties": { "default-command": { "description": "Default command to run when no explicit command is given", "default": "log", "oneOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ] }, "color": { "description": "Whether to colorize command output", "enum": [ "always", "never", "debug", "auto" ], "default": "auto" }, "paginate": { "type": "string", "description": "Whether or not to use a pager", "enum": [ "never", "auto" ], "default": "auto" }, "pager": { "description": "Pager to use for displaying command output", "default": "less -FRX", "oneOf": [ { "$ref": "#/properties/ui/definitions/command" }, { "$ref": "#/properties/ui/definitions/command-env" } ] }, "streampager": { "type": "object", "description": "':builtin' (streampager-based) pager configuration", "properties": { "interface": { "description": "Whether to quit automatically, whether to clear screen on startup/exit", "enum": [ "quit-if-one-page", "full-screen-clear-output", "quit-quickly-or-clear-output" ], "default": "quit-if-one-page" }, "wrapping": { "description": "Whether to wrap long lines", "enum": [ "anywhere", "word", "none" ], "default": "anywhere" }, "show-ruler": { "type": "boolean", "description": "Whether the ruler should start visible", "default": true } } }, "diff-instructions": { "type": "boolean", "description": "Whether to generate the JJ-INSTRUCTIONS file as part of editing a diff", "default": true }, "graph": { "type": "object", "description": "Options for rendering revision graphs from jj log etc", "properties": { "style": { "description": "Style of connectors/markings used to render the graph. See https://docs.jj-vcs.dev/latest/config/#graph-style", "enum": [ "curved", "square", "ascii", "ascii-large" ], "default": "curved" } } }, "log-word-wrap": { "type": "boolean", "description": "Whether to wrap log template output", "default": false }, "log-synthetic-elided-nodes": { "type": "boolean", "description": "Whether to render elided parts of the graph as synthetic nodes.", "default": true }, "editor": { "description": "Editor to use for commands that involve editing text", "oneOf": [ { "$ref": "#/properties/ui/definitions/command" }, { "$ref": "#/properties/ui/definitions/command-env" } ] }, "diff-editor": { "description": "Editor tool to use for editing diffs", "default": ":builtin", "oneOf": [ { "$ref": "#/properties/ui/definitions/command" }, { "$ref": "#/properties/ui/definitions/command-env" } ] }, "diff-formatter": { "description": "Tool for displaying or generating diffs", "default": ":color-words", "oneOf": [ { "$ref": "#/properties/ui/definitions/command" }, { "$ref": "#/properties/ui/definitions/command-env" } ] }, "merge-editor": { "description": "Tool to use for resolving three-way merges. Behavior for a given tool name can be configured in merge-tools.TOOL tables", "default": ":builtin", "oneOf": [ { "$ref": "#/properties/ui/definitions/command" }, { "$ref": "#/properties/ui/definitions/command-env" } ] }, "conflict-marker-style": { "$ref": "#/properties/ui/definitions/conflict-marker-style" }, "show-cryptographic-signatures": { "type": "boolean", "default": false, "description": "Whether the built-in templates should show cryptographic signature information" }, "movement": { "type": "object", "properties": { "edit": { "type": "boolean", "description": "Whether the next and prev commands should behave as if the --edit flag was passed", "default": false } } }, "bookmark-list-sort-keys": { "type": "array", "description": "Specifies the sort keys for the bookmarks list. See the `jj bookmark list --help` for the `--sort` option", "items": { "type": "string", "enum": [ "name", "name-", "author-name", "author-name-", "author-email", "author-email-", "author-date", "author-date-", "committer-name", "committer-name-", "committer-email", "committer-email-", "committer-date", "committer-date-" ] } }, "tag-list-sort-keys": { "type": "array", "description": "Specifies the sort keys for the tags list. See the `jj tag list --help` for the `--sort` option", "items": { "type": "string", "enum": [ "name", "name-", "author-name", "author-name-", "author-email", "author-email-", "author-date", "author-date-", "committer-name", "committer-name-", "committer-email", "committer-email-", "committer-date", "committer-date-" ] } } } }, "fsmonitor": { "type": "object", "description": "External filesystem monitor settings, useful for large repos", "properties": { "backend": { "type": "string", "enum": [ "none", "watchman" ], "default": "none", "description": "Whether to use an external filesystem monitor, useful for large repos" }, "watchman": { "type": "object", "properties": { "register-snapshot-trigger": { "type": "boolean", "default": false, "description": "Whether to use triggers to monitor for changes in the background." } } } } }, "colors": { "type": "object", "description": "Mapping from jj formatter labels to colors", "definitions": { "colorNames": { "enum": [ "default", "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", "bright black", "bright red", "bright green", "bright yellow", "bright blue", "bright magenta", "bright cyan", "bright white" ] }, "ansi256Color": { "type": "string", "pattern": "^ansi-color-([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" }, "hexColor": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "colors": { "oneOf": [ { "$ref": "#/properties/colors/definitions/colorNames" }, { "$ref": "#/properties/colors/definitions/ansi256Color" }, { "$ref": "#/properties/colors/definitions/hexColor" } ] } }, "additionalProperties": { "description": "A color profile for the given formatter label. Either a bare color name used as the foreground color or a table describing color and formatting", "oneOf": [ { "$ref": "#/properties/colors/definitions/colors" }, { "type": "object", "properties": { "fg": { "$ref": "#/properties/colors/definitions/colors" }, "bg": { "$ref": "#/properties/colors/definitions/colors" }, "bold": { "type": "boolean" }, "dim": { "type": "boolean" }, "italic": { "type": "boolean" }, "underline": { "type": "boolean" }, "crossed-out": { "type": "boolean" }, "reverse": { "type": "boolean" } } } ] } }, "diff": { "type": "object", "description": "Builtin diff formats settings", "properties": { "color-words": { "type": "object", "description": "Options for color-words diffs", "properties": { "conflict": { "type": "string", "description": "How conflicts are processed and displayed", "enum": [ "materialize", "pair" ], "default": "materialize" }, "max-inline-alternation": { "type": "integer", "description": "Maximum number of removed/added word alternation to inline", "default": 3 }, "context": { "type": "integer", "description": "Number of lines of context to show", "default": 3 } } }, "git": { "type": "object", "description": "Options for git diffs", "properties": { "context": { "type": "integer", "description": "Number of lines of context to show", "default": 3 }, "show-path-prefix": { "type": "boolean", "description": "Whether to show the 'a/' and 'b/' path prefixes", "default": true } } } } }, "fileset-aliases": { "type": "object", "description": "Custom symbols/function aliases that can be used in fileset expressions", "additionalProperties": { "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "definition": { "type": "string" }, "doc": { "type": "string" } }, "required": [ "definition" ] } ] } }, "git": { "type": "object", "description": "Settings for git behavior (when using git backend)", "properties": { "abandon-unreachable-commits": { "type": "boolean", "description": "Whether jj should abandon commits that became unreachable in Git.", "default": true }, "fetch": { "description": "The remote(s) from which commits are fetched", "default": "origin", "oneOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ] }, "private-commits": { "type": "string", "description": "Revset of commits to refuse to push to remotes", "default": "none()" }, "push": { "type": "string", "description": "The remote to which commits are pushed", "default": "origin" }, "record-synthetic-predecessors": { "type": "boolean", "description": "Whether to generate synthetic predecessors for fetched/imported commits", "default": true }, "sign-on-push": { "type": "boolean", "description": "Whether jj should sign commits before pushing", "default": false }, "track-default-bookmark-on-clone": { "type": "boolean", "description": "Whether `jj git clone` creates a local bookmark tracking the default remote bookmark", "default": true }, "write-change-id-header": { "type": "boolean", "description": "Whether the change id should be stored in the Git commit object", "default": true }, "executable-path": { "type": "string", "description": "Path to the git executable", "default": "git" }, "auto-register-worktrees": { "type": "boolean", "description": "Whether `jj workspace add` in a colocated repo automatically registers a Git worktree for the new workspace, so plain `git` commands work inside it. Distinct from `git.colocate` (which controls `jj git init`/`jj git clone`). No-op in a non-colocated repo.", "default": true }, "colocate": { "type": "boolean", "description": "Whether to colocate the working copy with the git repository", "default": true }, "object-hash": { "enum": ["sha1", "sha256"], "description": "Object hash algorithm used when initializing a new Git repository", "default": "sha1" } } }, "remotes": { "type": "object", "description": "Settings related to specific remotes", "additionalProperties": { "type": "object", "properties": { "auto-track-bookmarks": { "type": "string", "description": "A string pattern describing the bookmarks to automatically track with this remote. It will be applied to any new bookmark, created or fetched. See https://docs.jj-vcs.dev/latest/config/#automatic-tracking-of-bookmarks", "default": "~*" }, "auto-track-created-bookmarks": { "type": "string", "description": "A string pattern describing the locally-created bookmarks which should track this remote automatically. It will be applied to new bookmarks created with `jj bookmark create` or `jj bookmark set`. See https://docs.jj-vcs.dev/latest/config/#automatic-tracking-of-bookmarks", "default": "~*" }, "fetch-bookmarks": { "type": "string", "description": "A string pattern describing the bookmarks to fetch by default" }, "fetch-tags": { "type": "string", "description": "A string pattern describing the tags to fetch by default" } } } }, "gerrit": { "type": "object", "description": "Settings for interacting with Gerrit", "properties": { "default-remote": { "type": "string", "description": "The Gerrit remote to interact with" }, "default-remote-branch": { "type": "string", "description": "The default branch to propose changes for" }, "review-url": { "type": "string", "description": "Generate Link trailers with this URL instead of Change-Id trailers in `jj gerrit upload`" } } }, "merge": { "type": "object", "description": "Merge settings", "properties": { "hunk-level": { "type": "string", "description": "Granularity of hunks when merging files", "enum": [ "line", "word" ], "default": "line" }, "same-change": { "type": "string", "description": "Whether to resolve conflict that makes the same change at all sides", "enum": [ "keep", "accept" ], "default": "accept" } } }, "merge-tools": { "type": "object", "description": "Tables of custom options to pass to the given merge tool (selected in ui.merge-editor)", "additionalProperties": { "type": "object", "properties": { "program": { "type": "string" }, "diff-args": { "type": "array", "items": { "type": "string" } }, "diff-expected-exit-codes": { "type": "array", "items": { "type": "integer" }, "description": "Array of exit codes that do not indicate tool failure, i.e. [0, 1] for unix diff.", "default": [ 0 ] }, "diff-do-chdir": { "type": "boolean", "description": "Invoke the tool in the temporary diff directory. This setting will be removed soon", "default": true }, "diff-invocation-mode": { "description": "Invoke the tool with directories or individual files when generating diffs.", "enum": [ "dir", "file-by-file" ], "default": "dir" }, "edit-args": { "type": "array", "items": { "type": "string" } }, "edit-invocation-mode": { "description": "Invoke the tool with directories or individual files when editing diffs (e.g. jj diffedit, jj split).", "enum": [ "dir", "file-by-file" ], "default": "dir" }, "merge-args": { "type": "array", "items": { "type": "string" } }, "merge-conflict-exit-codes": { "type": "array", "items": { "type": "number" }, "description": "Array of exit codes to indicate that the conflict was only partially resolved. See https://docs.jj-vcs.dev/latest/config/#editing-conflict-markers-with-a-tool-or-a-text-editor", "default": [] }, "merge-tool-edits-conflict-markers": { "type": "boolean", "description": "Whether to populate the output file with conflict markers before starting the merge tool. See https://docs.jj-vcs.dev/latest/config/#editing-conflict-markers-with-a-tool-or-a-text-editor", "default": false }, "conflict-marker-style": { "$ref": "#/properties/ui/definitions/conflict-marker-style" } } } }, "revsets": { "type": "object", "description": "Revset expressions used by various commands", "properties": { "arrange": { "type": "string", "description": "Default set of revisions to open in the TUI when no explicit revset is given for jj arrange", "default": "reachable(@, mutable())" }, "fix": { "type": "string", "description": "Default set of revisions to fix when no explicit revset is given for jj fix", "default": "reachable(@, mutable())" }, "log": { "type": "string", "description": "Default set of revisions to show when no explicit revset is given for jj log and similar commands", "default": "present(@) | ancestors(immutable_heads().., 2) | trunk()" }, "short-prefixes": { "type": "string", "description": "Revisions to give shorter change and commit IDs to", "default": "" }, "run": { "type": "string", "description": "Default set of revisions to run a command on when no explicit revset is given for jj run", "default": "reachable(@, mutable())" }, "simplify-parents": { "type": "string", "description": "Default set of revisions to simplify when no explicit revset is given for jj simplify-parents", "default": "reachable(@, mutable())" }, "sign": { "type": "string", "description": "Default set of revisions to sign when no explicit revset is given for jj sign", "default": "reachable(@, mutable())" }, "log-graph-prioritize": { "type": "string", "description": "Set of revisions to prioritize when rendering the graph for jj log", "default": "present(@)" }, "bookmark-advance-to": { "type": "string", "description": "Default revision to advance bookmarks to when no explicit revision is given to jj advance `--to`", "default": "@" }, "bookmark-advance-from": { "type": "string", "description": "Default set of revisions to advance bookmarks from for jj advance (has access to `to`, the advance destination)", "default": "heads(::to & bookmarks())" } }, "additionalProperties": { "type": "string" } }, "revset-aliases": { "type": "object", "description": "Custom symbols/function aliases that can be used in revset expressions", "properties": { "immutable_heads()": { "type": "string", "description": "Revisions to consider immutable. Ancestors of these are also considered immutable. The root commit is always considered immutable.", "default": "trunk() | tags() | untracked_remote_bookmarks()" } }, "additionalProperties": { "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "definition": { "type": "string" }, "doc": { "type": "string" } }, "required": [ "definition" ] } ] } }, "template-aliases": { "type": "object", "description": "Custom symbols/function aliases that can be used in templates", "additionalProperties": { "oneOf": [ { "type": "string" }, { "type": "object", "properties": { "definition": { "type": "string" }, "doc": { "type": "string" } }, "required": [ "definition" ] } ] } }, "aliases": { "type": "object", "description": "Custom subcommand aliases to be supported by the jj command", "additionalProperties": { "oneOf": [ { "type": "array", "items": { "type": "string" } }, { "type": "object", "properties": { "definition": { "type": "array", "items": { "type": "string" } }, "doc": { "type": "string" } }, "required": [ "definition" ] } ] } }, "run": { "type": "object", "description": "Settings for the `jj run` command, which runs a shell command across a set of revisions.", "properties": { "jobs": { "type": "integer", "minimum": 1, "description": "Maximum number of working copies (and parallel jobs) `jj run` uses. Defaults to 1. Overridden by `--jobs`." } } }, "snapshot": { "type": "object", "description": "Parameters governing automatic capture of files into the working copy commit", "properties": { "auto-track": { "type": "string", "description": "Fileset pattern describing what new files to automatically track on snapshotting. By default all new files are tracked.", "default": "all()" }, "auto-update-stale": { "type": "boolean", "description": "Whether to automatically update the working copy if it is stale. See https://docs.jj-vcs.dev/latest/working-copy/#stale-working-copy", "default": false }, "max-new-file-size": { "type": [ "integer", "string" ], "description": "New files with a size in bytes above this threshold are not snapshotted, unless the threshold is 0", "default": "1MiB" } } }, "experimental-advance-branches": { "type": "object", "description": "Settings controlling the 'advance-branches' feature which moves bookmarks forward when new commits are created.", "properties": { "enabled-branches": { "type": "array", "description": "Patterns used to identify bookmarks which may be advanced.", "items": { "type": "string" } }, "disabled-branches": { "type": "array", "description": "Patterns used to identify bookmarks which are not advanced. Takes precedence over 'enabled-branches'.", "items": { "type": "string" } } } }, "signing": { "type": "object", "description": "Settings for verifying and creating cryptographic commit signatures", "properties": { "backend": { "type": "string", "enum": [ "gpg", "gpgsm", "none", "ssh" ], "description": "The backend to use for signing commits. The string `none` disables signing.", "default": "none" }, "key": { "type": "string", "description": "The key the configured signing backend will use to to sign commits. Overridden by `jj sign` parameter or by the global `--sign-with` option" }, "behavior": { "type": "string", "enum": [ "drop", "keep", "own", "force" ], "description": "Which commits to sign by default. Values: drop (never sign), keep (preserve existing signatures), own (sign own commits), force (sign all commits)" }, "backends": { "type": "object", "description": "Tables of options to pass to specific signing backends", "properties": { "gpg": { "type": "object", "properties": { "program": { "type": "string", "description": "Path to the gpg program to be called", "default": "gpg" }, "allow-expired-keys": { "type": "boolean", "description": "Whether to consider signatures generated with an expired key as valid", "default": false } } }, "gpgsm": { "type": "object", "properties": { "program": { "type": "string", "description": "Path to the gpgsm program to be called", "default": "gpgsm" }, "allow-expired-keys": { "type": "boolean", "description": "Whether to consider signatures generated with an expired key as valid", "default": false } } }, "ssh": { "type": "object", "properties": { "program": { "type": "string", "description": "Path to the ssh-keygen program to be called", "default": "ssh-keygen" }, "allowed-signers": { "type": "string", "description": "Path to an allowed signers file used for signature verification" }, "revocation-list": { "type": "string", "description": "Path to a revocation list file used for revoking public keys" } } } }, "additionalProperties": true } } }, "fix": { "type": "object", "description": "Settings for jj fix", "properties": { "tools": { "type": "object", "additionalProperties": { "type": "object", "description": "Settings for how specific filesets are affected by a tool", "properties": { "command": { "description": "Arguments used to execute this tool", "oneOf": [ { "$ref": "#/properties/ui/definitions/command" }, { "$ref": "#/properties/ui/definitions/command-env" } ] }, "patterns": { "type": "array", "items": { "type": "string" }, "description": "Filesets that will be affected by this tool" }, "enabled": { "type": "boolean", "description": "Disables this tool if set to false", "default": true }, "line-range-arg": { "type": "string", "description": "Argument template for changed line ranges (e.g. '--lines=$first-$last')" }, "run-tool-if-zero-line-ranges": { "type": "boolean", "description": "Whether to run the tool if there are zero line ranges to format.", "default": false } } }, "description": "Settings for tools run by jj fix" } } }, "split": { "type": "object", "description": "Settings for jj split", "properties": { "legacy-bookmark-behavior": { "type": "boolean", "description": "If true, bookmarks will move to the second commit instead of the first.", "default": true } } }, "hints": { "type": "object", "description": "Various hints in jj's UI that can be disabled", "additionalProperties": { "type": "boolean" } }, "templates": { "type": "object", "description": "Definitions for the templates that various jj commands use", "properties": { "arrange": { "type": "string", "description": "`jj arrange``'s template for commits in the main view" }, "bookmark_list": { "type": "string", "description": "`jj bookmark list`'s output" }, "commit_summary": { "type": "string", "description": "The short commit summary used by many commands" }, "commit_trailers": { "type": "string", "description": "Trailers that will be appended to a commit's description" }, "file_annotate": { "type": "string", "description": "`jj file annotate`'s output" }, "config_list": { "type": "string", "description": "`jj config list`'s output" }, "draft_commit_description": { "type": "string", "description": "The draft commit description opened in an editor" }, "evolog": { "type": "string", "description": "`jj evolog`'s output" }, "file_list": { "type": "string", "description": "`jj file list`'s output" }, "file_show": { "type": "string", "description": "`jj file show`'s output" }, "git_push_bookmark": { "type": "string", "description": "Bookmark name to be assigned when pushing a change to Git remote" }, "log": { "type": "string", "description": "`jj log`'s output" }, "op_log": { "type": "string", "description": "`jj op log`'s output" }, "op_show": { "type": "string", "description": "`jj op show`'s output" }, "op_summary": { "type": "string", "description": "The operation summary used by many commands" }, "show": { "type": "string", "description": "`jj show`'s output" }, "revert_description": { "type": "string", "description": "The description of commits reverted by `jj revert`" }, "tag_list": { "type": "string", "description": "`jj tag list`'s output" }, "workspace_list": { "type": "string", "description": "`jj workspace list`'s output" } }, "additionalProperties": { "type": "string" } }, "working-copy": { "type": "object", "description": "Working copy settings", "properties": { "eol-conversion": { "type": "string", "description": "Configuring auto-converting CRLF line endings into LF when you add a file to the backend, and vice versa when it checks out code onto your filesystem.", "enum": [ "input", "input-output", "none" ], "default": "none" }, "exec-bit-change": { "type": "string", "description": "Whether to respect changes to executable bits on Unix. This is unused on Windows.", "enum": [ "respect", "ignore", "auto" ], "default": "auto" } } }, "--when": { "type": "object", "description": "Conditions restricting the application of the configuration", "properties": { "repositories": { "type": "array", "description": "List of paths to match the repository path prefix", "items": { "type": "string" } }, "hostnames": { "type": "array", "description": "List of hostnames to match the hostname", "items": { "type": "string" } }, "workspaces": { "type": "array", "description": "List of paths to match the workspace path prefix", "items": { "type": "string" } }, "commands": { "type": "array", "description": "List of subcommands to match", "items": { "type": "string" } }, "platforms": { "type": "array", "description": "List of platforms to match", "items": { "type": "string", "enum": [ "aix", "android", "apple", "dragonfly", "emscripten", "espidf", "fortanix", "freebsd", "fuchsia", "haiku", "hermit", "horizon", "hurd", "illumos", "ios", "itron", "l4re", "linux", "macos", "netbsd", "nto", "openbsd", "redox", "solaris", "solid_asp3", "tvos", "uefi", "unix", "visionos", "vita", "vxworks", "wasi", "wasm", "watchos", "windows", "xous" ] } }, "environments": { "type": "array", "description": "List of environment conditions, any of which must match (NAME=VALUE) or be present (NAME).", "items": { "type": "string" } } } }, "--scope": { "type": "array", "description": "Scoped tables for conditional configuration", "items": { "$comment": "https://json-schema.org/understanding-json-schema/structuring#recursion", "$ref": "#" } } } }