{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://catalog.lintel.tools/schemas/schemastore/sfdx-hardis-configuration/latest.json",
  "title": "sfdx-hardis configuration",
  "description": "Configuration file definition for sfdx-hardis Salesforce DX plugin",
  "x-lintel": {
    "source": "https://raw.githubusercontent.com/hardisgroupcom/sfdx-hardis/main/config/sfdx-hardis.jsonschema.json",
    "sourceSha256": "0c3d3fc755752d2ab90c6e06fbd61ab3296b7560bd4f8ed9858f04e5a3e2389e",
    "fileMatch": [
      ".sfdx-hardis.yml",
      ".sfdx-hardis.yaml",
      ".sfdx-hardis.*.yml",
      ".sfdx-hardis.*.yaml"
    ],
    "parsers": [
      "yaml"
    ]
  },
  "type": "object",
  "properties": {
    "promptsLanguage": {
      "default": "en",
      "description": "Language used for AI-generated prompts. If not set, the default language is English (en). Supported languages are defined in the code but not limited to: English (en), French (fr), Spanish (es), German (de), Italian (it), Portuguese (pt). If multiple languages, separate them with comma (ex: \"en,fr,de\") and the first one will be used as default language for prompts. (mirrors PROMPTS_LANGUAGE environment variable)",
      "title": "Prompts language(s)",
      "type": "string"
    },
    "promptsParallelCallNumber": {
      "examples": [
        1,
        5,
        10
      ],
      "description": "Number of parallel AI prompt calls when generating project documentation. Higher values speed up documentation generation but may hit API rate limits. (mirrors PROMPTS_PARALLEL_CALL_NUMBER environment variable)",
      "title": "Prompts parallel call number",
      "type": "number",
      "default": 10,
      "minimum": 1
    },
    "useLangchainLlm": {
      "default": false,
      "description": "Set to true to enable LangChain integration (mirrors the USE_LANGCHAIN_LLM environment variable).",
      "title": "Enable LangChain",
      "type": "boolean"
    },
    "langchainLlmProvider": {
      "enumNames": [
        "OpenAI",
        "Anthropic Claude",
        "Google Gemini (GenAI)",
        "Ollama"
      ],
      "description": "LLM provider identifier used with LangChain (ex: openai, anthropic, google-genai, ollama). Equivalent to LANGCHAIN_LLM_PROVIDER env var.",
      "title": "LangChain provider",
      "type": "string",
      "enum": [
        "openai",
        "anthropic",
        "google-genai",
        "ollama"
      ]
    },
    "langchainLlmModel": {
      "type": "string",
      "description": "Model identifier to use with the configured LangChain provider. Latest models: OpenAI (gpt-5.2, gpt-5.2-mini, gpt-5, gpt-4.1, gpt-4o, gpt-4o-mini...), Anthropic (claude-opus-4-6, claude-3-5-sonnet, claude-3-5-haiku, claude-3-haiku...), Google Gemini (gemini-3-pro, gemini-3-pro-deep-think, gemini-3-flash, gemini-2.5-flash-lite...). Equivalent to LANGCHAIN_LLM_MODEL env var.",
      "title": "LangChain model"
    },
    "langchainLlmTemperature": {
      "type": "number",
      "description": "Sampling temperature override for LangChain requests (maps to LANGCHAIN_LLM_TEMPERATURE env var).",
      "title": "LangChain temperature"
    },
    "langchainLlmMaxTokens": {
      "type": "number",
      "description": "Maximum number of tokens generated per LangChain response (maps to LANGCHAIN_LLM_MAX_TOKENS env var).",
      "title": "LangChain max tokens"
    },
    "langchainLlmMaxRetries": {
      "type": "number",
      "description": "Maximum number of retries for failed LangChain requests (maps to LANGCHAIN_LLM_MAX_RETRIES env var).",
      "title": "LangChain max retries"
    },
    "langchainLlmTimeout": {
      "type": "number",
      "description": "Timeout in milliseconds applied to LangChain calls (maps to LANGCHAIN_LLM_TIMEOUT env var).",
      "title": "LangChain timeout"
    },
    "langchainLlmBaseUrl": {
      "type": "string",
      "description": "Custom base URL for LangChain HTTP-based providers (for example a local Ollama endpoint). Equivalent to LANGCHAIN_LLM_BASE_URL env var.",
      "title": "LangChain base URL"
    },
    "useCodexDirect": {
      "default": false,
      "description": "Set to true to enable the direct Codex connector (mirrors USE_CODEX_DIRECT env var).",
      "title": "Enable Codex",
      "type": "boolean"
    },
    "codexModel": {
      "default": "gpt-5.1-codex",
      "description": "Name of the Codex model to use by default (ex: gpt-5.1-codex). Equivalent to CODEX_MODEL env var.",
      "title": "Codex model",
      "type": "string"
    },
    "codexReasoningEffort": {
      "default": "high",
      "description": "Reasoning effort used for direct Codex prompts. Equivalent to CODEX_REASONING_EFFORT env var. Note: Not all values are supported by all models",
      "title": "Codex reasoning effort",
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high",
        "xhigh"
      ]
    },
    "useOpenaiDirect": {
      "default": true,
      "description": "Set to true to enable the direct OpenAI connector (mirrors USE_OPENAI_DIRECT env var).",
      "title": "Enable OpenAI",
      "type": "boolean"
    },
    "openaiModel": {
      "default": "gpt-4o-mini",
      "description": "Name of the OpenAI model to use by default (ex: gpt-4o, gpt-4o-mini). Equivalent to OPENAI_MODEL env var.",
      "title": "OpenAI model",
      "type": "string"
    },
    "openaiServiceTier": {
      "enum": [
        "auto",
        "default",
        "flex"
      ],
      "description": "Service tier used for direct OpenAI prompts. Equivalent to OPENAI_SERVICE_TIER env var.",
      "title": "OpenAI service tier",
      "type": "string"
    },
    "openaiReasoningEffort": {
      "enum": [
        "low",
        "medium",
        "high"
      ],
      "description": "Reasoning effort used for direct OpenAI prompts on supported models. Equivalent to OPENAI_REASONING_EFFORT env var.",
      "title": "OpenAI reasoning effort",
      "type": "string"
    },
    "useAgentforce": {
      "default": false,
      "description": "Set to true to enable Agentforce integration (mirrors USE_AGENTFORCE env var).",
      "title": "Enable Agentforce",
      "type": "boolean"
    },
    "genericAgentforcePromptTemplate": {
      "default": "SfdxHardisGenericPrompt",
      "description": "Prompt template API name to use by default (ex: SfdxHardisGenericPrompt). Equivalent to GENERIC_AGENTFORCE_PROMPT_TEMPLATE env var.",
      "title": "Agentforce prompt template",
      "type": "string"
    },
    "genericAgentforcePromptUrl": {
      "default": "/services/data/v{{API_VERSION}}/einstein/prompt-templates/{{PROMPT_TEMPLATE}}/generations",
      "description": "Custom Agentforce template URL supporting placeholders {{API_VERSION}} and {{GENERIC_AGENTFORCE_PROMPT_TEMPLATE}} (mirrors GENERIC_AGENTFORCE_PROMPT_URL env var).",
      "title": "Agentforce prompt URL",
      "type": "string"
    },
    "allowedOrgTypes": {
      "type": "array",
      "description": "Types of Salesforce Orgs allowed for config & development. If not set, Sandbox Orgs and Scratch Orgs are allowed by default",
      "examples": [
        [
          "sandbox"
        ]
      ],
      "items": {
        "type": "string",
        "enum": [
          "sandbox",
          "scratch"
        ],
        "enumNames": [
          "Sandbox Orgs",
          "Scratch Orgs"
        ]
      },
      "title": "Allowed org types"
    },
    "autoCleanTypes": {
      "type": "array",
      "description": "When saving/publishing a User Story, sfdx-hardis can automatically clean the sources before submitting a Pull Request.\nSelect the cleanings that will be automatically applied on your project.",
      "docUrl": "https://sfdx-hardis.cloudity.com/salesforce-ci-cd-config-cleaning/",
      "examples": [
        [
          "dashboards",
          "datadotcom",
          "destructivechanges"
        ]
      ],
      "items": {
        "type": "string",
        "enum": [
          "caseentitlement",
          "checkPermissions",
          "dashboards",
          "datadotcom",
          "destructivechanges",
          "flowPositions",
          "localfields",
          "listViewsMine",
          "minimizeProfiles",
          "productrequest",
          "sensitiveMetadatas",
          "systemDebug",
          "v60"
        ],
        "enumNames": [
          "Case Entitlement",
          "Check Permissions",
          "Dashboards",
          "Data.com",
          "Destructive Changes",
          "Flow Positions",
          "Local Fields",
          "List Views Mine",
          "Minimize Profiles",
          "Product Request",
          "Sensitive Metadatas",
          "System Debug",
          "v60"
        ]
      },
      "title": "Auto-Cleaning types"
    },
    "autoRemoveUserPermissions": {
      "type": "array",
      "description": "When your dev sandbox is using the next SF Platform version, sometimes some permissions on Profiles exist on the next version but not the current one.\nTo avoid issues, you can force the removal of such permissions when Saving/Publishing a User Story\nExample:\n- EnableCommunityAppLauncher\n- OmnichannelInventorySync",
      "docUrl": "https://sfdx-hardis.cloudity.com/hardis/work/save/#command-behavior",
      "examples": [
        [
          "EnableCommunityAppLauncher",
          "FieldServiceAccess",
          "OmnichannelInventorySync"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Auto-Remove User Permissions on profiles"
    },
    "autoRetrieveWhenPull": {
      "type": "array",
      "description": "Sometimes, SF Cli forgets to pull some metadata updates, like Custom Application for example.\nsfdx-hardis can automatically retrieve named metadatas to avoid issues.\nExample:\n- CustomApplication:MyApp1\n- CustomApplication:MyApp2\nWorks also with full metadata types (ex: CustomApplication)",
      "docUrl": "https://sfdx-hardis.cloudity.com/hardis/scratch/pull/#command-behavior",
      "examples": [
        [
          "CustomApplication"
        ],
        [
          "CustomApplication:MyApp1",
          "CustomApplication:MyApp2"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Auto-Retrieve when pull"
    },
    "apexTestsMinCoverageOrgWide": {
      "type": "number",
      "default": 75.0,
      "description": "Minimum percentage of apex code coverage accepted.\n75.0% by default, but if you are on a clean project, it's better to define 80.0, 95.0 or 90.0 😎",
      "examples": [
        80.0,
        95.0
      ],
      "title": "Minimum Apex Tests coverage % accepted for a deployment"
    },
    "availableProjects": {
      "type": "array",
      "description": "List of business projects that are managed in the same repository.\nIf defined, when creating a new User Story, it will be prompted to the contributor then used to create the git branch name.\nIf a value contains a comma, the left part will be used for key and the right part as label for the users.",
      "examples": [
        [
          "sales_cloud",
          "service_cloud",
          "community"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Available projects"
    },
    "availableTargetBranches": {
      "type": "array",
      "description": "List of git branches that can be used as target for Pull Requests.\nContributors will be prompt to select one of these target branch when creating a new User Story\nA classic example on a project with BUILD & RUN in parallel is to have preprod and integration as available target branches.\nIf defined, makes obsolete the parameter Default Pull Request target branch.",
      "examples": [
        [
          "preprod",
          "integration"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Available PR/MR target branches"
    },
    "branchPrefixChoices": {
      "type": "array",
      "description": "When calling hardis:work:new, you can override the default branch prefixes. Input title, value and description for each of them",
      "default": [
        {
          "title": "Feature",
          "value": "feature",
          "description": "New feature, evolution of an existing feature... If you don't know, just select Feature"
        },
        {
          "title": "Fix",
          "value": "fix",
          "description": "A bug has been identified and you are the right person to solve it !"
        }
      ],
      "examples": [
        [
          {
            "title": "Feature",
            "value": "feature",
            "description": "New feature, evolution of an existing feature... If you don't know, just select Feature"
          },
          {
            "title": "Debug",
            "value": "fix",
            "description": "A bug has been identified and you are the right person to solve it !"
          }
        ]
      ],
      "title": "New branches prefixes choices"
    },
    "cleanXmlPatterns": {
      "type": "array",
      "examples": [
        [
          {
            "globPattern": "/**/*.flexipage-meta.xml",
            "xpaths": [
              "//ns:flexiPageRegions//ns:name[contains(text(),'dashboardName')]"
            ]
          },
          {
            "globPattern": "/**/*.layout-meta.xml",
            "xpaths": [
              "//ns:relatedLists//ns:relatedList[contains(text(),'RelatedSolutionList')]"
            ]
          }
        ]
      ],
      "description": "List of patterns to automatically clean XML files",
      "items": {
        "required": [
          "globPattern",
          "xpaths"
        ],
        "type": "object",
        "properties": {
          "globPattern": {
            "type": "string",
            "description": "Glob pattern to identify XML files to clean",
            "examples": [
              "/**/*.flexipage-meta.xml"
            ],
            "title": "Glob pattern"
          },
          "xpaths": {
            "type": "array",
            "description": "XPaths to identify elements to remove",
            "examples": [
              [
                "//ns:flexiPageRegions//ns:name[contains(text(),'dashboardName')]"
              ]
            ],
            "title": "XPath list",
            "items": {
              "type": "string"
            }
          }
        },
        "description": "Clean XML pattern and xpaths",
        "additionalProperties": false
      },
      "title": "Clean XML Patterns"
    },
    "commandsPreDeploy": {
      "type": "array",
      "description": "List of actions to run before a deployment",
      "examples": [
        [
          {
            "id": "knowledgeUnassign",
            "label": "Remove KnowledgeUser right to the user who has it",
            "type": "command",
            "command": "sf data update record --sobject User --where \"UserPermissionsKnowledgeUser='true'\" --values \"UserPermissionsKnowledgeUser='false'\" --json",
            "context": "all"
          },
          {
            "id": "importDataPackage",
            "label": "Import SFDMU data package",
            "type": "data",
            "parameters": {
              "sfdmuProject": "EmailTemplate"
            },
            "context": "process-deployment-only"
          }
        ]
      ],
      "items": {
        "title": "Action",
        "type": "object",
        "required": [
          "id",
          "label",
          "type",
          "context"
        ],
        "description": "Command definition",
        "properties": {
          "id": {
            "type": "string",
            "description": "Identifier of the action (can be any string)",
            "title": "Id"
          },
          "label": {
            "type": "string",
            "description": "Label of the action (what does it do ?)",
            "title": "Label"
          },
          "type": {
            "examples": [
              "command",
              "data",
              "apex",
              "publish-community",
              "manual"
            ],
            "description": "Type of the action",
            "title": "Type",
            "type": "string",
            "enum": [
              "command",
              "data",
              "apex",
              "publish-community",
              "manual"
            ],
            "enumNames": [
              "Command",
              "Data Import",
              "Apex Script",
              "Publish Community",
              "Manual Action"
            ]
          },
          "parameters": {
            "properties": {
              "apexScript": {
                "type": "string",
                "description": "Apex script path to run for 'apex' actions"
              },
              "sfdmuProject": {
                "type": "string",
                "description": "Path to SFDMU project for 'data' actions"
              },
              "communityName": {
                "type": "string",
                "description": "Community name for 'publish-community' actions"
              },
              "instructions": {
                "type": "string",
                "description": "Human-readable instructions for 'manual' actions"
              }
            },
            "description": "Known parameters used by action implementations. Additional keys allowed.",
            "title": "Parameters",
            "type": "object",
            "additionalProperties": true
          },
          "command": {
            "type": "string",
            "description": "Command line to run",
            "title": "Command"
          },
          "context": {
            "examples": [
              "all",
              "check-deployment-only",
              "process-deployment-only"
            ],
            "description": "Context when the action must be run",
            "title": "Context",
            "default": "all",
            "type": "string",
            "enum": [
              "all",
              "check-deployment-only",
              "process-deployment-only"
            ],
            "enumNames": [
              "All",
              "Check Deployment Only",
              "Process Deployment Only"
            ]
          },
          "allowFailure": {
            "type": "boolean",
            "description": "Allow action to fail without marking the deployment as failed",
            "title": "Allow failure",
            "default": false
          },
          "runOnlyOnceByOrg": {
            "type": "boolean",
            "description": "Run this action only once per target org (useful for idempotent post-deploy tasks)",
            "title": "Run only once by org",
            "default": false
          },
          "customUsername": {
            "type": "string",
            "description": "If set, the action will be run using this specific username (instead of the default target org). Can be a full username or a starting string (ex: user@company.com will match user@company.com.integration in integration sandbox). This user must be allowed to authenticate through the Connected App used by deployment user.",
            "title": "Custom Username"
          }
        },
        "additionalProperties": false
      },
      "title": "Actions Pre-Deployment"
    },
    "commandsPostDeploy": {
      "type": "array",
      "description": "List of actions to run after a deployment",
      "examples": [
        [
          {
            "id": "knowledgeUnassign",
            "label": "Remove KnowledgeUser right to the user who has it",
            "type": "command",
            "command": "sf data update record --sobject User --where \"UserPermissionsKnowledgeUser='true'\" --values \"UserPermissionsKnowledgeUser='false'\" --json",
            "context": "all",
            "skipIfError": false
          },
          {
            "id": "publishCommunity",
            "label": "Publish community after deploy",
            "type": "publish-community",
            "parameters": {
              "communityName": "CustomerPortal"
            },
            "context": "process-deployment-only",
            "allowFailure": false,
            "runOnlyOnceByOrg": true
          }
        ]
      ],
      "items": {
        "title": "Action",
        "type": "object",
        "required": [
          "id",
          "label",
          "type",
          "context"
        ],
        "description": "Action definition",
        "properties": {
          "id": {
            "type": "string",
            "description": "Identifier of the action (can be any string)",
            "title": "Id"
          },
          "label": {
            "type": "string",
            "description": "Label of the action (what does it do ?)",
            "title": "Label"
          },
          "type": {
            "examples": [
              "command",
              "data",
              "apex",
              "publish-community",
              "manual"
            ],
            "description": "Type of the action",
            "title": "Type",
            "type": "string",
            "enum": [
              "command",
              "data",
              "apex",
              "publish-community",
              "manual"
            ],
            "enumNames": [
              "Command",
              "Data Import",
              "Apex Script",
              "Publish Community",
              "Manual Action"
            ]
          },
          "parameters": {
            "properties": {
              "apexScript": {
                "type": "string",
                "description": "Apex script path to run for 'apex' actions"
              },
              "sfdmuProject": {
                "type": "string",
                "description": "Path to SFDMU project for 'data' actions"
              },
              "communityName": {
                "type": "string",
                "description": "Community name for 'publish-community' actions"
              },
              "instructions": {
                "type": "string",
                "description": "Human-readable instructions for 'manual' actions"
              }
            },
            "description": "Known parameters used by action implementations. Additional keys allowed.",
            "title": "Parameters",
            "type": "object",
            "additionalProperties": true
          },
          "command": {
            "type": "string",
            "description": "Command line to run",
            "title": "Command"
          },
          "context": {
            "examples": [
              "all",
              "check-deployment-only",
              "process-deployment-only"
            ],
            "description": "Context when the action must be run",
            "title": "Context",
            "default": "all",
            "type": "string",
            "enum": [
              "all",
              "check-deployment-only",
              "process-deployment-only"
            ],
            "enumNames": [
              "All",
              "Check Deployment Only",
              "Process Deployment Only"
            ]
          },
          "skipIfError": {
            "type": "boolean",
            "description": "Do not run the action if there is a deployment error",
            "title": "Skip if deploy error",
            "default": false
          },
          "allowFailure": {
            "type": "boolean",
            "description": "Allow action to fail without marking the deployment as failed",
            "title": "Allow failure",
            "default": false
          },
          "runOnlyOnceByOrg": {
            "type": "boolean",
            "description": "Run this action only once per target org (useful for idempotent post-deploy tasks)",
            "title": "Run only once by org",
            "default": false
          },
          "customUsername": {
            "type": "string",
            "description": "If set, the action will be run using this specific username (instead of the default target org). Can be a full username or a starting string (ex: user@company.com will match user@company.com.integration in integration sandbox). This user must be allowed to authenticate through the Connected App used by deployment user.",
            "title": "Custom Username"
          }
        },
        "additionalProperties": false
      },
      "title": "Actions Post-Deployment"
    },
    "customCommands": {
      "type": "array",
      "description": "List of custom menus and commands for the VsCode SFDX-Hardis extension Welcome page and Commands panel",
      "examples": [
        [
          {
            "id": "custom-menu",
            "label": "Custom commands",
            "description": "Optional description shown on the Welcome page card",
            "vscodeIcon": "symbol-misc",
            "sldsIcon": "utility:apps",
            "commands": [
              {
                "id": "generate-manifest-xml",
                "label": "Generate manifest",
                "icon": "file.svg",
                "vscodeIcon": "file",
                "sldsIcon": "utility:file",
                "tooltip": "Generates a manifest package.xml using local sfdx source files",
                "command": "sf project generate manifest --source-dir force-app --name myNewManifest"
              },
              {
                "id": "list-all-orgs",
                "label": "List all orgs",
                "icon": "salesforce.svg",
                "vscodeIcon": "run",
                "sldsIcon": "utility:apex",
                "tooltip": "List all orgs that has already been authenticated using sfdx",
                "command": "sf org list --all"
              }
            ]
          },
          {
            "id": "custom-menu-2",
            "label": "Another custom menu",
            "commands": [
              {
                "id": "echo",
                "label": "Echo something",
                "icon": "user.svg",
                "tooltip": "Useless commands just to show that we can use not sfdx commands too",
                "command": "echo \"Something\""
              }
            ]
          }
        ]
      ],
      "items": {
        "required": [
          "id",
          "label"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Identifier of the menu (can be any string)",
            "title": "Id"
          },
          "label": {
            "type": "string",
            "description": "Label of the menu",
            "title": "Label"
          },
          "description": {
            "type": "string",
            "description": "Optional description shown on the Welcome page card for the menu",
            "title": "Description"
          },
          "vscodeIcon": {
            "default": "symbol-misc",
            "description": "VS Code ThemeIcon id used for the custom menu in the Commands panel. Default: symbol-misc",
            "title": "VS Code icon",
            "type": "string"
          },
          "sldsIcon": {
            "default": "utility:apps",
            "description": "SLDS icon name in category:name format used for the custom menu on the Welcome page. Default: utility:apps",
            "title": "SLDS icon",
            "type": "string"
          },
          "commands": {
            "type": "array",
            "description": "List of commands of the menu",
            "items": {
              "required": [
                "id",
                "label",
                "command"
              ],
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Identifier of the command (can be any string)",
                  "title": "Id"
                },
                "label": {
                  "type": "string",
                  "description": "Label of the command that will appear in menu",
                  "title": "Label"
                },
                "icon": {
                  "type": "string",
                  "description": "SVG icon filename for the command tree item (can be any icon in <https://github.com/hardisgroupcom/vscode-sfdx-hardis/tree/main/resources)>. Default: cloudity-logo.svg",
                  "title": "Icon"
                },
                "vscodeIcon": {
                  "default": "run",
                  "description": "VS Code ThemeIcon id used for the command in the Commands panel. Default: run",
                  "title": "VS Code icon",
                  "type": "string"
                },
                "sldsIcon": {
                  "default": "utility:apex",
                  "description": "SLDS icon name in category:name format used for the command on the Welcome page. Default: utility:apex",
                  "title": "SLDS icon",
                  "type": "string"
                },
                "tooltip": {
                  "type": "string",
                  "description": "Text that will appear when user will hover the command",
                  "title": "Tooltip"
                },
                "command": {
                  "type": "string",
                  "description": "Command line to run when clicking on the menu",
                  "title": "Command"
                },
                "helpUrl": {
                  "type": "string",
                  "description": "URL for help page of the command",
                  "title": "Help url"
                }
              },
              "description": "Custom command definition",
              "additionalProperties": false
            },
            "title": "Label"
          }
        },
        "description": "Custom command definition",
        "additionalProperties": false
      },
      "title": "Custom commands"
    },
    "customCommandsPosition": {
      "type": "string",
      "description": "Position of custom commands in the menu (first or last)",
      "default": "last",
      "enum": [
        "first",
        "last"
      ],
      "enumNames": [
        "First",
        "Last"
      ],
      "examples": [
        "first",
        "last"
      ],
      "title": "Custom commands position"
    },
    "customOrgColors": {
      "type": "object",
      "title": "Custom Org Colors",
      "description": "Custom colors set by VsCode SFDX Hardis",
      "additionalProperties": true
    },
    "mermaidTheme": {
      "additionalProperties": false,
      "description": "Overrides Flow Mermaid colors for generated Flow documentation and Flow diffs. Any value not provided keeps the default from the built-in Flow Mermaid renderConfig.",
      "examples": [
        {
          "decisions": {
            "background": "#F88888",
            "color": "white"
          },
          "actionColor": "#F44444",
          "addedColor": "#4CAF50"
        }
      ],
      "title": "Flow Mermaid theme",
      "type": "object",
      "patternProperties": {
        "^(actionCalls|assignments|collectionProcessors|customErrors|decisions|loops|recordCreates|recordDeletes|recordLookups|recordRollbacks|recordUpdates|screens|subflows|startClass|endClass|transforms)$": {
          "type": "object",
          "properties": {
            "background": {
              "type": "string",
              "description": "Background color for the Mermaid node class"
            },
            "color": {
              "type": "string",
              "description": "Text color for the Mermaid node class"
            },
            "stroke": {
              "type": "string",
              "description": "Stroke color for the Mermaid node class"
            },
            "strokeWidth": {
              "type": "string",
              "description": "Stroke width for the Mermaid node class"
            },
            "mermaidOpen": {
              "type": "string",
              "description": "Opening Mermaid node shape token override"
            },
            "mermaidClose": {
              "type": "string",
              "description": "Closing Mermaid node shape token override"
            }
          },
          "additionalProperties": false
        },
        "^(added|removed|changed)$": {
          "type": "object",
          "properties": {
            "background": {
              "type": "string",
              "description": "Background color for diff-highlighted Mermaid nodes"
            },
            "color": {
              "type": "string",
              "description": "Text color for diff-highlighted Mermaid nodes"
            },
            "lineColor": {
              "type": "string",
              "description": "Link color for diff-highlighted Mermaid connectors"
            },
            "strokeWidth": {
              "type": "string",
              "description": "Stroke width for diff-highlighted Mermaid nodes and connectors"
            }
          },
          "additionalProperties": false
        },
        "^(action|actionCalls|assignment|assignments|collectionProcessor|collectionProcessors|customError|customErrors|decision|decisions|loop|loops|recordCreate|recordCreates|recordDelete|recordDeletes|recordLookup|recordLookups|recordRollback|recordRollbacks|rollback|rollbacks|recordUpdate|recordUpdates|screen|screens|subflow|subflows|start|startClass|end|endClass|transform|transforms|added|removed|changed)(Color|TextColor|LinkColor)$": {
          "type": "string",
          "description": "Flat alias override such as decisionColor, actionTextColor, or addedLinkColor"
        }
      }
    },
    "customPlugins": {
      "type": "array",
      "description": "List of additional plugins that will be displayed in VsCode SFDX-Hardis Dependencies panel",
      "examples": [
        [
          {
            "name": "mo-dx-plugin",
            "helpUrl": "https://github.com/msrivastav13/mo-dx-plugin"
          },
          {
            "name": "shane-sfdx-plugins",
            "helpUrl": "https://github.com/mshanemc/shane-sfdx-plugins"
          }
        ]
      ],
      "items": {
        "title": "Plugin",
        "type": "object",
        "properties": {
          "name": {
            "$Id": "#/properties/customPlugins/items/properties/name",
            "description": "Name of the plugin npm package",
            "examples": [
              "mo-dx-plugin",
              "shane-sfdx-plugins"
            ],
            "title": "Name",
            "type": "string"
          },
          "helpUrl": {
            "$Id": "#/properties/customPlugins/items/properties/helpUrl",
            "description": "Url of plugin documentation",
            "examples": [
              "https://github.com/msrivastav13/mo-dx-plugin",
              "https://github.com/mshanemc/shane-sfdx-plugins"
            ],
            "title": "Name",
            "type": "string"
          }
        },
        "description": "Plugin definition",
        "additionalProperties": false
      },
      "title": "Custom plugins"
    },
    "dataPackages": {
      "type": "array",
      "description": "List of data packages",
      "items": {
        "required": [
          "dataPath",
          "importInScratchOrgs"
        ],
        "type": "object",
        "properties": {
          "dataPath": {
            "type": "string",
            "description": "Path to SFDMU project",
            "title": "SFDMU Data project path"
          },
          "importInScratchOrgs": {
            "type": "boolean",
            "description": "Path to SFDMU project",
            "title": "SFDMU Data project path"
          }
        },
        "description": "Data package",
        "additionalProperties": false
      },
      "title": "Data packages"
    },
    "defaultPackageInstallationKey": {
      "type": "string",
      "description": "When generating a new package version protected with password, use this value as default package installation key",
      "examples": [
        "hardis",
        "myPassword",
        "dFGGF43656YfdFDG{{{dhgfh:::;FSEDSFd78"
      ],
      "title": "Default package installation key"
    },
    "deploymentApexTestClasses": {
      "type": "array",
      "description": "List of Apex Test Classes that will be run during deployments. Requires enableDeploymentApexTestClasses and enableDeltaDeploymentBetweenMajorBranches to be set to true (Not recommended, use only if you have specific needs)",
      "examples": [
        [
          "MyTestClass1",
          "MyTestClass2"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Apex Test Classes to run during deployments (NOT RECOMMENDED) (Beta)"
    },
    "developmentBranch": {
      "type": "string",
      "default": "integration",
      "description": "When creating a new sfdx-hardis User Story, this git branch is used as base to create the feature/debug sub branch. The merge request will later have this branch as target.",
      "docUrl": "https://sfdx-hardis.cloudity.com/hardis/work/new/",
      "examples": [
        "integration",
        "dev_lot2",
        "hotfixes"
      ],
      "title": "Default Pull Request/Merge Request target branch when you create a new User Story."
    },
    "deploymentPlan": {
      "type": "object",
      "description": "(DEPRECATED) Deployment plan that will be performed during deployments. Can be based on packageXmlFile for sources or on dataPath for sfdmu data deployments",
      "examples": [
        {
          "packages": [
            {
              "label": "Import EmailTemplate records",
              "dataPath": "scripts/data/EmailTemplate",
              "order": -21
            },
            {
              "label": "Deploy EmailTemplate",
              "packageXmlFile": "manifest/splits/packageXmlEmails.xml",
              "order": -20
            },
            {
              "label": "Deploy Flow-Workflow",
              "packageXmlFile": "manifest/splits/packageXmlFlowWorkflow.xml",
              "order": 6
            }
          ]
        }
      ],
      "properties": {
        "packages": {
          "type": "array",
          "description": "During deployment, main package.xml will be split into these packages. Can also contain data packages",
          "examples": [
            [
              {
                "label": "Import EmailTemplate records",
                "dataPath": "scripts/data/EmailTemplate",
                "order": -21
              },
              {
                "label": "Deploy EmailTemplate",
                "packageXmlFile": "manifest/splits/packageXmlEmails.xml",
                "order": -20
              }
            ]
          ],
          "items": {
            "properties": {
              "dataPath": {
                "type": "string",
                "examples": [
                  "scripts/data/EmailTemplate"
                ],
                "title": "Path to SFDMU data project to deploy"
              },
              "label": {
                "type": "string",
                "examples": [
                  "Deploy EmailTemplate",
                  "Import EmailTemplate records"
                ],
                "title": "Source or data package label"
              },
              "order": {
                "type": "number",
                "examples": [
                  -20,
                  13,
                  50
                ],
                "title": "Execution order in deployment plan"
              },
              "packageXmlFile": {
                "type": "string",
                "examples": [
                  "manifest/splits/packageXmlEmails.xml"
                ],
                "title": "Path to package.xml file to use for deployment"
              },
              "waitAfter": {
                "type": "number",
                "description": "Delay to wait before installing the next package",
                "examples": [
                  10,
                  20
                ],
                "title": "Wait after install (seconds)"
              }
            },
            "type": "object",
            "description": "Source or data package to deploy",
            "additionalProperties": false
          },
          "required": [
            "label",
            "order"
          ],
          "title": "List of packages to deploy"
        }
      },
      "title": "(DEPRECATED) Deployment plan"
    },
    "devHubAlias": {
      "type": "string",
      "default": "",
      "description": "Dev Hub alias, usually DevHub_ProjectName",
      "examples": [
        "DevHub_MyClientMyProject",
        "DevHub_GoogleGmail",
        "DevHub_AppleIWatch"
      ],
      "title": "Dev Hub org alias"
    },
    "devHubInstanceUrl": {
      "type": "string",
      "default": "https://login.salesforce.com",
      "description": "Dev Hub instance URL used for authenticating to DevHub from CI jobs",
      "examples": [
        "DevHub_MyClientMyProject"
      ],
      "title": "Dev Hub Instance URL"
    },
    "devHubUsername": {
      "type": "string",
      "default": "",
      "description": "Dev Hub username, used to authenticate to DevHub from CI jobs",
      "examples": [
        "cicd-user@myclient.com",
        "scratch-user@google.fr",
        "scratch-user@apple.fr"
      ],
      "title": "Dev Hub Username"
    },
    "docDeployToCloudflare": {
      "type": "boolean",
      "default": false,
      "description": "Automatically deploy MkDocs HTML documentation from sfdx-hardis Monitoring Workflow (BackUp step) to Cloudflare, as a static web site",
      "examples": [
        true
      ],
      "title": "Doc: Deploy to Cloudflare"
    },
    "docDeployToConfluence": {
      "type": "boolean",
      "default": false,
      "description": "Automatically publish MkDocs documentation from sfdx-hardis Monitoring Workflow (BackUp step) to Atlassian Confluence. Requires CONFLUENCE_SPACE_KEY and authentication variables to be set.",
      "examples": [
        true
      ],
      "title": "Doc: Deploy to Confluence"
    },
    "docDeployToOrg": {
      "type": "boolean",
      "default": false,
      "description": "Automatically deploy MkDocs HTML documentation from sfdx-hardis Monitoring Workflow (BackUp step) to Salesforce org, as static resource",
      "examples": [
        true
      ],
      "title": "Doc: Deploy to Salesforce Org"
    },
    "enableDeltaDeploymentBetweenMajorBranches": {
      "type": "boolean",
      "description": "Enable delta deployments between major branches (ex: integration -> uat). Not recommended, as real DevOps best practice is to deploy full source: use only if you have specific needs.",
      "default": false,
      "examples": [
        true,
        false
      ],
      "title": "Enable delta deployments between major branches (NOT RECOMMENDED)"
    },
    "enableDeploymentApexTestClasses": {
      "type": "boolean",
      "description": "Enable the use of custom Apex Test Classes list during deployments. Requires enableDeltaDeploymentBetweenMajorBranches to be set to true. Not recommended, as real DevOps best practice is to run all local tests: use only if you have specific needs.",
      "default": false,
      "examples": [
        true,
        false
      ],
      "title": "Enable custom Apex Test Classes during deployments (NOT RECOMMENDED) (Beta)"
    },
    "enableDeprecatedDeploymentPlan": {
      "type": "boolean",
      "description": "If true, allows the use of the deprecated 'deploymentPlan' configuration for deployments. It's better to use deployment actions at branch or PR level",
      "default": false,
      "title": "Enable Deprecated Deployment Plan"
    },
    "extends": {
      "type": "string",
      "description": "You can base your local sfdx-hardis configuration on a remote config file. That allows you to have the same config base for all your projects",
      "examples": [
        "https://raw.githubusercontent.com/worldcompany/shared-config/main/.sfdx-hardis.yml"
      ],
      "title": "Extends remote configuration URL"
    },
    "genericTicketingProviderRegex": {
      "visible-conditions": [
        {
          "property": "ticketingProvider",
          "operator": "equals",
          "value": "GENERIC"
        }
      ],
      "description": "Regular expression to identify ticket IDs from your ticketing system. Example: ([R|I][0-9]+-[0-9]+) for EasyVista.",
      "examples": [
        "([R|I][0-9]+-[0-9]+)",
        "(^[A-Z]{2,5}-\\d{1,6}$)"
      ],
      "title": "Generic Ticketing Provider Regex",
      "type": "string"
    },
    "genericTicketingProviderUrlBuilder": {
      "visible-conditions": [
        {
          "property": "ticketingProvider",
          "operator": "equals",
          "value": "GENERIC"
        }
      ],
      "description": "URL pattern to build ticket URLs from ticket IDs. Use {ticketId} as placeholder for the ticket ID. Example: <https://tickets.mycompany.com/ticket/{ticketId}>",
      "examples": [
        "https://tickets.mycompany.com/ticket/{ticketId}"
      ],
      "title": "Generic Ticketing Provider URL Builder",
      "type": "string"
    },
    "initPermissionSets": {
      "type": "array",
      "description": "When creating a scratch org, Admin user will be automatically assigned to those permission sets. Example: PS_Admin",
      "examples": [
        [
          "MyPermissionSet",
          "MyPermissionSetGroup"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Initial Permission Sets"
    },
    "installedPackages": {
      "type": "array",
      "description": "Defines the list of packages installed on the project. Use ",
      "examples": [
        [
          {
            "Id": "0A30N000000ALWrSAO",
            "SubscriberPackageId": "033b0000000Pf2AAAS",
            "SubscriberPackageName": "Declarative Lookup Rollup Summaries Tool",
            "SubscriberPackageNamespace": "dlrs",
            "SubscriberPackageVersionId": "04t0N000000IyYrQAK",
            "SubscriberPackageVersionName": "2.11",
            "SubscriberPackageVersionNumber": "2.11.0.1",
            "installOnScratchOrgs": false,
            "installDuringDeployments": true,
            "installationkey": "MyInstallationKey",
            "VersionSettings": "namespace"
          },
          {
            "Id": "0A35r000000GveVCAS",
            "SubscriberPackageId": "0330o000000B3vIAAS",
            "SubscriberPackageName": "Files Attachment Notes",
            "SubscriberPackageNamespace": "fan_astrea",
            "SubscriberPackageVersionId": "04t0o000003nRWAAA2",
            "SubscriberPackageVersionName": "Summer2021",
            "SubscriberPackageVersionNumber": "1.22.0.2",
            "installOnScratchOrgs": true,
            "installDuringDeployments": true,
            "VersionSettings": "namespace"
          }
        ]
      ],
      "items": {
        "title": "Salesforce package",
        "type": "object",
        "required": [
          "SubscriberPackageVersionId"
        ],
        "description": "Salesforce package info (managed, unlocked or unmanaged)",
        "properties": {
          "Id": {
            "$Id": "#/properties/install/properties/packages/items/Id",
            "examples": [
              "0A35r000000GveVCAS"
            ],
            "title": "(unused) PackageId",
            "type": "string"
          },
          "SubscriberPackageId": {
            "$Id": "#/properties/install/properties/packages/items/SubscriberPackageId",
            "examples": [
              "033b0000000Pf2AAAS"
            ],
            "title": "Subscriber Package Id",
            "type": "string"
          },
          "SubscriberPackageName": {
            "$Id": "#/properties/install/properties/packages/items/SubscriberPackageName",
            "examples": [
              "Files Attachment Notes"
            ],
            "title": "Subscriber Package Name",
            "type": "string"
          },
          "SubscriberPackageNamespace": {
            "$Id": "#/properties/install/properties/packages/items/SubscriberPackageNamespace",
            "examples": [
              "fan_astrea"
            ],
            "title": "Subscriber Package NameSpace",
            "type": [
              "string",
              "null"
            ]
          },
          "SubscriberPackageVersionId": {
            "$Id": "#/properties/install/properties/packages/items/SubscriberPackageVersionId",
            "examples": [
              "04t0o000003nRWAAA2"
            ],
            "title": "Subscriber Version Id (IMPORTANT)",
            "type": "string"
          },
          "SubscriberPackageVersionName": {
            "$Id": "#/properties/install/properties/packages/items/SubscriberPackageVersionName",
            "examples": [
              "Summer2021"
            ],
            "title": "Subscriber Version Name",
            "type": "string"
          },
          "SubscriberPackageVersionNumber": {
            "$Id": "#/properties/install/properties/packages/items/SubscriberPackageVersionNumber",
            "examples": [
              "1.22.0.2"
            ],
            "title": "Subscriber Version Number",
            "type": "string"
          },
          "VersionSettings": {
            "$Id": "#/properties/install/properties/packages/items/VersionSettings",
            "examples": [
              "namespace",
              "none"
            ],
            "title": "Version Settings",
            "type": "string"
          },
          "installDuringDeployments": {
            "$Id": "#/properties/install/properties/packages/items/installDuringDeployments",
            "default": false,
            "description": "If true, during deployments this package will be installed in target org if not installed yet",
            "examples": [
              true,
              false
            ],
            "title": "Install during deployments",
            "type": "boolean"
          },
          "installOnScratchOrgs": {
            "$Id": "#/properties/install/properties/packages/items/installOnScratchOrgs",
            "default": false,
            "description": "If true, this package will be installed when creating a new scratch org with sfdx-hardis",
            "examples": [
              true,
              false
            ],
            "title": "Install on scratch orgs",
            "type": "boolean"
          },
          "installationkey": {
            "$Id": "#/properties/install/properties/packages/items/installationkey",
            "examples": [
              "MyInstallationKey",
              "4FzkMzUSwFfP#@"
            ],
            "description": "Installation key for key-protected package",
            "title": "Package installation key",
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "title": "Installed Packages"
    },
    "installPackagesDuringCheckDeploy": {
      "type": "boolean",
      "default": false,
      "description": "If your configuration contains an installedPackages property, activating this option allows you to make sfdx-hardis automatically install packages during the Deployments Check workflow, and not to wait after the merge of the Pull Request.",
      "docUrl": "https://sfdx-hardis.cloudity.com/salesforce-ci-cd-work-on-task-install-packages/",
      "examples": [
        true
      ],
      "title": "Install packages during deployment checks workflow"
    },
    "instanceUrl": {
      "type": "string",
      "default": "",
      "description": "Salesforce instance URL used by CI for deployment or backups",
      "examples": [
        "https://myclient.force.com",
        "https://google.force.com",
        "https://apple.force.com"
      ],
      "title": "Instance URL"
    },
    "jiraHost": {
      "type": "string",
      "description": "Jira host URL (without <https://)>. Example: mycompany.atlassian.net",
      "examples": [
        "mycompany.atlassian.net",
        "hardisgroup.atlassian.net"
      ],
      "title": "Jira Host"
    },
    "jiraTicketRegex": {
      "visible-conditions": [
        {
          "property": "ticketingProvider",
          "operator": "equals",
          "value": "JIRA"
        }
      ],
      "description": "Regular expression to identify Jira ticket IDs. Example: (CLOUDITY-[0-9]+)",
      "examples": [
        "(CLOUDITY-[0-9]+)",
        "(?<=[^a-zA-Z0-9_-]|^)([A-Za-z0-9]{2,10}-\\d{1,6})(?=[^a-zA-Z0-9_-]|$)"
      ],
      "title": "Jira Ticket Regex",
      "type": "string"
    },
    "listViewsToSetToMine": {
      "type": "array",
      "default": [],
      "description": "List of ListView items to set to Mine after a delivery (that does not accept value 'Everything')",
      "examples": [],
      "items": {
        "type": "string"
      },
      "title": "List views to set to Mine"
    },
    "sourcesToRetrofit": {
      "type": "array",
      "description": "List of metadata to retrieve for retrofit job",
      "examples": [
        [
          "CustomField",
          "Layout",
          "PermissionSet"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Metadata to retrofit"
    },
    "manualActionsFileUrl": {
      "type": "string",
      "default": "",
      "description": "URL of the XLS file that contains manual actions to perform before or after a deployment",
      "examples": [
        "https://some.sharepoint.com/file.xlsx"
      ],
      "title": "Manual Actions File URL"
    },
    "mergeTargets": {
      "type": "array",
      "description": "In branch-scoped config file, declares the list of branches that the current one can have as merge target. For example, integration will have mergeTargets [uat]",
      "examples": [
        [
          "preprod"
        ],
        [
          "integration"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Merge target branches"
    },
    "monitoringCommands": {
      "type": "array",
      "description": "List of monitoring commands to run with command hardis:org:monitor:all",
      "examples": [
        [
          {
            "title": "Detect calls to deprecated API versions",
            "key": "LEGACYAPI",
            "command": "sf hardis:org:diagnose:legacyapi",
            "frequency": "weekly"
          },
          {
            "title": "My custom command",
            "key": "MY_CUSTOM_KEY",
            "command": "sf my:custom:command",
            "frequency": "daily"
          }
        ]
      ],
      "items": {
        "required": [
          "title",
          "command"
        ],
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "description": "Unique identifier of the monitoring command. Can be used with monitoringDisable",
            "title": "Key"
          },
          "title": {
            "type": "string",
            "description": "Title of the command (will appear in logs)",
            "title": "Title"
          },
          "command": {
            "type": "string",
            "description": "Bash command to run",
            "title": "Command"
          },
          "frequency": {
            "type": "string",
            "description": "daily or weekly",
            "title": "Frequency"
          }
        },
        "description": "Monitoring command",
        "additionalProperties": false
      },
      "title": "Monitoring commands"
    },
    "monitoringAllowedSectionsActions": {
      "type": "object",
      "description": "Override list of Setup Audit Trail elements that won't be considered as suspect by monitoring tools",
      "title": "Monitoring Allowed Sections Actions",
      "additionalProperties": true
    },
    "monitoringDisable": {
      "type": "array",
      "description": "List of commands to skip during monitoring jobs",
      "examples": [
        [
          "METADATA_STATUS",
          "UNUSED_METADATAS"
        ]
      ],
      "items": {
        "$ref": "#/$defs/enum_monitoring_commands"
      },
      "title": "Disabled monitoring commands"
    },
    "monitoringExcludeUsernames": {
      "type": "array",
      "description": "List of usernames to exclude while running monitoring commands",
      "examples": [
        [
          "deploymentuser@cloudity.com",
          "mc-cloud-user@cloudity.com"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Monitoring usernames to exclude"
    },
    "monitoringUnsecureConnectedAppsIgnore": {
      "type": "array",
      "description": "List of Connected App names to ignore while running Unsecure Connected Apps monitoring command",
      "examples": [
        [
          "ForcePad",
          "Another Unsecure Connected App"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Unsecure Connected Apps to ignore"
    },
    "msTeamsWebhookUrl": {
      "type": "string",
      "default": "",
      "description": "Url of the Ms Teams channel Web Hook that can be used to send ALL notifications",
      "examples": [
        "https://my.msteams.webhook.url"
      ],
      "title": "MsTeams WebHook Url (ALL)"
    },
    "msTeamsWebhookUrlCritical": {
      "type": "string",
      "default": "",
      "description": "Url of the Ms Teams channel Web Hook that can be used to send CRITICAL notifications",
      "examples": [
        "https://my.msteams.webhook.url"
      ],
      "title": "MsTeams WebHook Url (CRITICAL)"
    },
    "msTeamsWebhookUrlSevere": {
      "type": "string",
      "default": "",
      "description": "Url of the Ms Teams channel Web Hook that can be used to send SEVERE notifications",
      "examples": [
        "https://my.msteams.webhook.url"
      ],
      "title": "MsTeams WebHook Url (SEVERE)"
    },
    "msTeamsWebhookUrlWarning": {
      "type": "string",
      "default": "",
      "description": "Url of the Ms Teams channel Web Hook that can be used to send WARNING notifications",
      "examples": [
        "https://my.msteams.webhook.url"
      ],
      "title": "MsTeams WebHook Url (WARNING)"
    },
    "msTeamsWebhookUrlInfo": {
      "type": "string",
      "default": "",
      "description": "Url of the Ms Teams channel Web Hook that can be used to send INFO notifications",
      "examples": [
        "https://my.msteams.webhook.url"
      ],
      "title": "MsTeams WebHook Url (INFO)"
    },
    "newTaskNameRegex": {
      "type": "string",
      "default": "",
      "description": "If you define a regular expression, it will be used to validate the name of new User Stories.\nFor example, you can enforce a Jira number in the name with regex '^MYPROJECT-[0-9]+ .*'",
      "examples": [
        "^[A-Z]+-[0-9]+ .*",
        "^CLOUDITY-[0-9]+ .*",
        "^MYPROJECT-[0-9]+ .*"
      ],
      "title": "User Story name validation regex"
    },
    "newTaskNameRegexExample": {
      "type": "string",
      "default": "",
      "description": "If you activated User Story name validation via RegEx, define an example value that will be displayed to users.\nExample: 'MYPROJECT-168 Update account status validation rule'",
      "examples": [
        "MYPROJECT-123 Update account status validation rule"
      ],
      "title": "Example string for User Story name validation regex"
    },
    "notificationsDisable": {
      "type": "array",
      "description": "List of notifications types to skip sending",
      "examples": [
        [
          "METADATA_STATUS",
          "UNUSED_METADATAS"
        ]
      ],
      "items": {
        "$ref": "#/$defs/enum_notification_types"
      },
      "title": "Disabled notification types"
    },
    "packageNoOverwritePath": {
      "type": "string",
      "default": "",
      "description": "By default, manifest/package-no-overwrite.xml is used, but you could decide to use a different file for specific major branches.\nIn that case, set the path to a custom package-no-overwrite XML file in a branch-scoped sfdx-hardis configuration file.",
      "examples": [
        "manifest/package-no-overwrite-main.xml",
        "manifest/package-no-overwrite-custom.xml"
      ],
      "title": "Branch-scoped custom Package-No-Overwrite path"
    },
    "poolConfig": {
      "properties": {
        "minScratchOrgRemainingDays": {
          "type": "number",
          "description": "When pool scratch org is less than this number, it is deleted and another one is created",
          "title": "Min scratch org remaining days",
          "default": 25
        },
        "maxScratchOrgsNumber": {
          "type": "number",
          "description": "Maximum number of active scratch orgs in the scratch org pool",
          "title": "Maximum number of scratch orgs"
        },
        "maxScratchOrgsNumberToCreateOnce": {
          "type": "number",
          "description": "Maximum number of scratch orgs to create in one CI job",
          "title": "Maximum number of scratch orgs to create once"
        },
        "storageService": {
          "type": "string",
          "description": "Remote service allowing to store scratch org pool details",
          "title": "Storage service for scratch org pool"
        }
      },
      "description": "Configuration allowing to generate and fetch scratch orgs from scratch org pool",
      "examples": [
        {
          "maxScratchOrgsNumber": 10,
          "storageService": "kvdb.io"
        }
      ],
      "title": "Scratch org pool configuration",
      "type": "object"
    },
    "productionBranch": {
      "type": "string",
      "default": "",
      "description": "Name of the git branch corresponding to production environment",
      "examples": [
        "master",
        "main",
        "production"
      ],
      "title": "Production branch name"
    },
    "projectName": {
      "type": "string",
      "default": "",
      "description": "Identifier for the project (can be the client and project)",
      "examples": [
        "MyClientMyProject",
        "GoogleGmail",
        "AppleIWatch"
      ],
      "title": "Project Name"
    },
    "refreshSandboxConfig": {
      "type": "object",
      "description": "Configuration for sandbox refresh. Will be used by command hardis:org:refresh:before-refresh and hardis:org:refresh:after-refresh",
      "properties": {
        "connectedApps": {
          "type": "array",
          "description": "List of connected apps to download before refresh and to upload after refresh",
          "examples": [
            [
              "My_Connected_App_1",
              "My_Connected_App_2"
            ]
          ],
          "items": {
            "type": "string"
          },
          "title": "Connected Apps"
        },
        "customSettings": {
          "type": "array",
          "description": "List of Custom Settings to download before refresh and to upload after refresh",
          "examples": [
            [
              "MyCustomSetting1__c",
              "MyCustomSetting2__c"
            ]
          ],
          "items": {
            "type": "string"
          },
          "title": "Custom Settings"
        },
        "dataWorkspaces": {
          "type": "array",
          "description": "List of data workspaces to download before refresh and to upload after refresh",
          "examples": [
            [
              "scripts/data/AnonymizeAccounts",
              "scripts/data/AnonymizeContacts",
              "scripts/data/AnonymizeLeads"
            ]
          ],
          "items": {
            "type": "string"
          },
          "title": "Data Workspaces"
        }
      },
      "title": "Refresh Sandbox Configuration",
      "additionalProperties": false
    },
    "retrofitBranch": {
      "type": "string",
      "default": "",
      "description": "Name of the git branch where retrofit merge requests targets to",
      "examples": [
        "preprod",
        "dev",
        "maintenance"
      ],
      "title": "Retrofit branch name"
    },
    "retrofitIgnoredFiles": {
      "type": "array",
      "description": "When calling hardis:org:retrieve:sources:retrofit, list of files to ignore (discard just after retrieve)",
      "examples": [
        [
          "force-app/main/default/applications/MyAppIWantToManageInProduction.app-meta.xml",
          "force-app/main/default/flexipages/MyFlexipageWithDashboards.flexipage-meta.xml"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Retrofit ignored files"
    },
    "runtests": {
      "type": "string",
      "default": "",
      "description": "WARNING: Use with caution, only in branch scoped config ! Can be a list of test classes if testLevel=RunSpecifiedTests, or a regex if testLevel=RunRepositoryTests",
      "examples": [
        "MyTestClass1,MyTestClass2",
        "^(?!FLI|fli|BatchableCodeSolvaTest|BatchableRemoveCodeSolvaTest|HelperNovaxelApiTest).*"
      ],
      "title": "Selected tests to run (list or regex)"
    },
    "scratchOrgInitApexScripts": {
      "type": "array",
      "description": "Apex scripts to call after scratch org initialization. Example: scripts/apex/init-scratch.apex",
      "examples": [
        [
          "scripts/apex/init-scratch.apex",
          "scripts/apex/init-custom-settings.apex"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Scratch org init apex scripts"
    },
    "scratchOrgDuration": {
      "maximum": 30,
      "default": 30,
      "description": "Defines the lifespan of the scratch org in number of days, from 1 to 30",
      "title": "Duration of Scratch Org",
      "type": "number",
      "minimum": 1
    },
    "sfdmuCanModify": {
      "type": "string",
      "default": "",
      "description": "Instance host name to allow SFDMU to deploy data in a production org",
      "examples": [
        "myproject.force.com"
      ],
      "title": "SFDMU can modify"
    },
    "skipCodeCoverage": {
      "type": "boolean",
      "default": false,
      "description": "WARNING: Use with caution, only in branch scoped config ! Do not check code coverage for a deployment",
      "title": "Skip code coverage check"
    },
    "skipMinimizeProfiles": {
      "type": "array",
      "description": "These profiles will not be reformatted by command hardis:project:clean:minimizeprofiles",
      "examples": [
        [
          "MyClient Customer Community Login User",
          "MyClientPortail Profile"
        ]
      ],
      "items": {
        "type": "string"
      },
      "title": "Skip Minimize Profiles"
    },
    "skipUpdateForceIgnore": {
      "type": "boolean",
      "default": false,
      "description": "Defines if sfdx-hardis will propose to upgrade local .forceignore file",
      "title": "Skip update .forceignore file"
    },
    "skipUpdateGitIgnore": {
      "type": "boolean",
      "default": false,
      "description": "Defines if sfdx-hardis will propose to upgrade local .gitignore file",
      "title": "Skip update .gitignore file"
    },
    "sharedDevSandboxes": {
      "type": "boolean",
      "default": false,
      "description": "Set to true if contributors can share dev sandboxes\nIf active, contributors will never be asked to refresh their sandbox metadata, to avoid to overwrite by accident their colleagues work :)",
      "title": "Contributors can share Dev Sandboxes"
    },
    "targetUsername": {
      "type": "string",
      "default": "",
      "description": "Salesforce username used by CI for deployment or backups",
      "examples": [
        "deployments@myclient.com",
        "deployments@google.fr",
        "deployments@apple.com"
      ],
      "title": "Target Username"
    },
    "testCoverageNotBlocking": {
      "type": "boolean",
      "default": false,
      "description": "Does not make the deployment job fail if apex tests code coverage is failing",
      "title": "Test Coverage not blocking (not recommended)"
    },
    "testLevel": {
      "type": "string",
      "description": "WARNING: Use with caution, only in branch scoped config! You can override default test level for deployments for special use cases, for example when you have SeeAllData=true you can use RunRepositoryTests associated with a regex in runtests option",
      "default": "RunLocalTests",
      "enum": [
        "RunLocalTests",
        "RunRelevantTests",
        "RunRepositoryTests",
        "RunRepositoryTestsExceptSeeAllData",
        "RunSpecifiedTests",
        "RunAllTestsInOrg",
        "NoTestRun"
      ],
      "enumNames": [
        "Run Local Tests (recommended at least for production deployments)",
        "Run Relevant Tests (beta since Spring 26, still new so use with caution)",
        "Run Repository Tests (will run only test classes that are present in the repository)",
        "Run Repository Tests Except SeeAllData (same than RunRepositoryTests but without test classes with SeeAllData=true)",
        "Run Specified Tests (never use it, instead use Run Local Tests + deploymentApexTestClasses)",
        "Run All Tests In Org (never use it)",
        "No Test Run (not recommended, better use Run Local Tests + deploymentApexTestClasses)"
      ],
      "examples": [
        "RunRepositoryTests",
        "RunSpecifiedTests"
      ],
      "title": "Test level for deployments"
    },
    "ticketingProvider": {
      "type": "string",
      "description": "Ticketing provider used on the project",
      "enum": [
        "JIRA",
        "AZURE",
        "GENERIC"
      ],
      "enumNames": [
        "Jira",
        "Azure Boards",
        "Generic"
      ],
      "examples": [
        "JIRA",
        "AZURE"
      ],
      "title": "Ticketing Provider"
    },
    "useDeltaDeployment": {
      "type": "boolean",
      "default": false,
      "description": "Defines if sfdx-hardis will deploy in delta from minor to major branches.\nWhen active, Delta Deployments allow to deploy only the metadatas in the branch / User Story, and not the full sources of the SFDX project.\nNote: Even if activated, Delta Deployments will be applied only for Pull Requests from minor (features,hotfixes) to major branches (integration,preprod).",
      "docUrl": "https://sfdx-hardis.cloudity.com/salesforce-ci-cd-config-delta-deployment/#delta-mode",
      "title": "Use Delta Deployment"
    },
    "useDeltaDeploymentWithDependencies": {
      "type": "boolean",
      "default": false,
      "description": "Also deploy dependencies of the metadatas identified by delta deployment, to avoid broken deployments due to missing dependencies.\n Example: removed picklist value in a field, that is still used in a record type.",
      "docUrl": "https://sfdx-hardis.cloudity.com/salesforce-ci-cd-config-delta-deployment/#delta-with-dependencies-beta",
      "title": "Use Delta Deployment with dependencies (beta)"
    },
    "useSmartDeploymentTests": {
      "type": "boolean",
      "default": false,
      "description": "Define if Smart Deployment Tests will be activated and run Apex test classes only if metadata that can impact them are present in the branch / User Story.\nNote: Smart Deployment Tests will be applied only for Pull Requests from minor (features,hotfixes) to major branches (integration,preprod).",
      "docUrl": "https://sfdx-hardis.cloudity.com/hardis/project/deploy/smart/#smart-deployments-tests",
      "title": "Use Smart Deployment Tests"
    },
    "linterIgnoreRightMetadataFile": {
      "type": "string",
      "default": "",
      "description": "Ignore profiles or permission sets",
      "examples": [
        "Profile",
        "Profile:ProfileA",
        "PermissionSet",
        "PermissionSet:PermissionSetA, Profile:ProfileA"
      ],
      "title": "Linter ignore permission set or/and profile"
    }
  },
  "additionalProperties": false,
  "$defs": {
    "enum_notification_types": {
      "enum": [
        "AUDIT_TRAIL",
        "APEX_TESTS",
        "BACKUP",
        "DEPLOYMENT",
        "LEGACY_API",
        "LINT_ACCESS",
        "UNUSED_METADATAS",
        "METADATA_STATUS",
        "MISSING_ATTRIBUTES",
        "UNUSED_LICENSES",
        "RELEASE_UPDATES"
      ],
      "enumNames": [
        "Audit Trail",
        "Apex Tests",
        "Backup",
        "Deployment",
        "Legacy API",
        "Lint Access",
        "Unused Metadatas",
        "Metadata Status",
        "Missing Attributes",
        "Unused Licenses",
        "Release Updates"
      ],
      "type": "string"
    },
    "enum_monitoring_commands": {
      "enum": [
        "AUDIT_TRAIL",
        "LEGACY_API",
        "LINT_ACCESS",
        "UNUSED_METADATAS",
        "METADATA_STATUS",
        "MISSING_ATTRIBUTES",
        "UNUSED_LICENSES",
        "RELEASE_UPDATES"
      ],
      "enumNames": [
        "Audit Trail",
        "Legacy API",
        "Lint Access",
        "Unused Metadatas",
        "Metadata Status",
        "Missing Attributes",
        "Unused Licenses",
        "Release Updates"
      ],
      "type": "string"
    }
  }
}
