{
    "$schema": "http://json-schema.org/draft-07/schema",
    "title": "Jujutsu config",
    "type": "object",
    "description": "User configuration for Jujutsu VCS. See https://jj-vcs.github.io/jj/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",
                        "snapshot",
                        "git"
                    ],
                    "default": "diff"
                }
            },
            "properties": {
                "allow-init-native": {
                    "type": "boolean",
                    "description": "Whether to allow initializing a repo with the native backend",
                    "default": false
                },
                "allow-filesets": {
                    "type": "boolean",
                    "description": "Whether to parse path arguments as fileset expressions",
                    "default": true
                },
                "always-allow-large-revsets": {
                    "type": "boolean",
                    "description": "Whether to allow large revsets to be used in all commands without the `all:` modifier",
                    "default": false
                },
                "default-command": {
                    "description": "Default command to run when no explicit command is given",
                    "default": "log",
                    "oneOf": [
                        {
                            "type": "string"
                        },
                        {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        }
                    ]
                },
                "default-description": {
                    "type": "string",
                    "description": "Default description to use when describing changes with an empty description",
                    "default": ""
                },
                "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": {
                    "type": "string",
                    "description": "Pager to use for displaying command output",
                    "default": "less -FRX"
                },
                "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": "never"
                        },
                        "wrapping": {
                            "description": "Whether to wrap long lines",
                            "enum": [
                                "anywhere",
                                "word",
                                "none"
                            ],
                            "default": "anywhere"
                        }
                    }
                },
                "diff": {
                    "type": "object",
                    "description": "Options for how diffs are displayed",
                    "properties": {
                        "format": {
                            "description": "The diff format to use",
                            "enum": [
                                "color-words",
                                "git",
                                "summary"
                            ],
                            "default": "color-words"
                        },
                        "tool": {
                            "type": "string",
                            "description": "External tool for generating diffs"
                        }
                    }
                },
                "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://jj-vcs.github.io/jj/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": {
                    "type": "string",
                    "description": "Editor to use for commands that involve editing text"
                },
                "diff-editor": {
                    "type": "string",
                    "description": "Editor tool to use for editing diffs",
                    "default": "meld"
                },
                "merge-editor": {
                    "type": "string",
                    "description": "Tool to use for resolving three-way merges. Behavior for a given tool name can be configured in merge-tools.TOOL tables"
                },
                "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
                        }
                    }
                }
            }
        },
        "core": {
            "type": "object",
            "properties": {
                "fsmonitor": {
                    "type": "string",
                    "enum": ["none", "watchman"],
                    "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"
                    ]
                },
                "hexColor": {
                    "type": "string",
                    "pattern": "^#[0-9a-fA-F]{6}$"
                },
                "colors": {
                  "oneOf": [
                    {
                        "$ref": "#/properties/colors/definitions/colorNames"
                    },
                    {
                        "$ref": "#/properties/colors/definitions/hexColor"
                    }
                  ]
                },
                "basicFormatterLabels": {
                    "enum": [
                        "description",
                        "change_id",
                        "commit_id",
                        "author",
                        "committer",
                        "working_copies",
                        "current_working_copy",
                        "bookmarks",
                        "tags",
                        "git_refs",
                        "is_git_head",
                        "divergent",
                        "hidden",
                        "conflict",
                        "root"
                    ]
                }
            },
            "propertyNames": {
                "oneOf": [
                    {
                        "$ref": "#/properties/colors/definitions/basicFormatterLabels"
                    },
                    {
                        "type": "string"
                    }
                ]
            },
            "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"
                            },
                            "italic": {
                                "type": "boolean"
                            },
                            "underline": {
                                "type": "boolean"
                            }
                        }
                    }
                ]
            }
        },
        "diff": {
            "type": "object",
            "description": "Builtin diff formats settings",
            "properties": {
                "color-words": {
                    "type": "object",
                    "description": "Options for color-words diffs",
                    "properties": {
                        "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
                        }
                    }
                }
            }
        },
        "git": {
            "type": "object",
            "description": "Settings for git behavior (when using git backend)",
            "properties": {
                "auto-local-bookmark": {
                    "type": "boolean",
                    "description": "Whether jj creates a local bookmark with the same name when it imports a remote-tracking branch from git. See https://jj-vcs.github.io/jj/latest/config/#automatic-local-bookmark-creation",
                    "default": false
                },
                "abandon-unreachable-commits": {
                    "type": "boolean",
                    "description": "Whether jj should abandon commits that became unreachable in Git.",
                    "default": true
                },
                "push-bookmark-prefix": {
                    "type": "string",
                    "description": "Prefix used when pushing a bookmark based on a change ID",
                    "default": "push-"
                },
                "push-new-bookmarks": {
                    "type": "boolean",
                    "description": "Allow pushing new bookmarks without --allow-new",
                    "default": false
                },
                "fetch": {
                    "description": "The remote(s) from which commits are fetched",
                    "default": "origin",
                    "oneOf": [
                        {
                            "type": "string"
                        },
                        {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        }
                    ]
                },
                "push": {
                    "type": "string",
                    "description": "The remote to which commits are pushed",
                    "default": "origin"
                },
                "sign-on-push": {
                    "type": "boolean",
                    "description": "Whether jj should sign commits before pushing",
                    "default": "false"
                },
                "subprocess": {
                    "type": "boolean",
                    "description": "Whether jj spawns a git subprocess for network operations (push/fetch/clone)",
                    "default": false
                },
                "executable-path": {
                    "type": "string",
                    "description": "Path to the git executable",
                    "default": "git"
                }
            }
        },
        "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-invocation-mode": {
                      "description": "Invoke the tool with directories or individual files",
                      "enum": [
                        "dir",
                        "file-by-file"
                      ],
                      "default": "dir"
                    },
                    "edit-args": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "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://jj-vcs.github.io/jj/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://jj-vcs.github.io/jj/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": {
                "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) | present(trunk())"
                },
                "short-prefixes": {
                    "type": "string",
                    "description": "Revisions to give shorter change and commit IDs to",
                    "default": "<revsets.log>"
                },
                "simplify-parents": {
                    "type": "string",
                    "description": "Default set of revisions to simplify when no explicit revset is given for jj simplify-parents",
                    "default": "reachable(@, mutable())"
                }
            },
            "additionalProperties": {
                "type": "string"
            }
        },
        "revset-aliases": {
            "type": "object",
            "description": "Custom symbols/function aliases that can 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": "present(trunk()) | tags() | untracked_remote_branches()"
                }
            },
            "additionalProperties": {
                "type": "string"
            }
        },
        "template-aliases": {
            "type": "object",
            "description": "Custom symbols/function aliases that can used in templates",
            "additionalProperties": {
                "type": "string"
            }
        },
        "aliases": {
            "type": "object",
            "description": "Custom subcommand aliases to be supported by the jj command",
            "additionalProperties": {
                "type": "array",
                "items": {
                    "type": "string"
                }
            }
        },
        "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://jj-vcs.github.io/jj/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", "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"
                },
                "sign-all": {
                    "type": "boolean",
                    "description": "Whether to sign all commits by default. Overridden by global `--no-sign` option",
                    "default": false
                },
                "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 invalid",
                                    "default": true
                                }
                            }
                        },
                        "ssh": {
                            "type": "object",
                            "properties": {
                                "program": {
                                    "type": "string",
                                    "description": "Path to the ssh-keygen program to be called",
                                    "default": "ssh-keygen"
                                },
                                "allowed-signers": {
                                    "type": "boolean",
                                    "description": "Path to an allowed signers file used for signature verification",
                                    "default": true
                                }
                            }
                        }
                    },
                    "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": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                },
                                "description": "Arguments used to execute this tool"
                            },
                            "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
                            }
                        }
                    },
                    "description": "Settings for tools run by jj fix"
                }
            }
        }
    }
}
