{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://streetraceing.github.io/package/schema.json",
  "title": "@streetraceing/package configuration",
  "description": "Strict JSON configuration for the @streetraceing/package CLI. Store this object in .packagerc or .packagerc.json.",
  "markdownDescription": "Strict JSON configuration for `@streetraceing/package`. Store the object in `.packagerc` or `.packagerc.json`.\n\nAll options have conservative defaults: package and apply hooks are disabled, apply keeps source archives, conflicts abort, symbolic links are not followed, and deleted-file caching is enabled so destructive CLI operations remain recoverable.",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "$schema": {
      "type": "string",
      "const": "https://streetraceing.github.io/package/schema.json",
      "default": "https://streetraceing.github.io/package/schema.json",
      "description": "Enables editor completion and validation for .packagerc.",
      "markdownDescription": "Connects `.packagerc` to the published JSON Schema so supported editors can provide validation, hover documentation, and completion.\n\nKeep the value exactly as shown."
    },
    "type": {
      "type": "string",
      "default": "zip",
      "description": "Archive format to create.",
      "markdownDescription": "Selects the output archive format.\n\n`zip` - Create a standard ZIP archive. This is currently the only supported format.",
      "enum": ["zip"],
      "examples": ["zip"]
    },
    "root": {
      "type": "string",
      "default": ".",
      "description": "Project root resolved from the directory where the CLI is started.",
      "markdownDescription": "Project directory used as the working root for collection, hooks, archive naming, and apply operations.\n\n`.` - Use the current project directory.\n\n`./packages/app` - Package a nested project.",
      "minLength": 1,
      "examples": [".", "./packages/app"]
    },
    "output": {
      "type": "string",
      "default": ".",
      "description": "Output directory resolved relative to the project root.",
      "markdownDescription": "Directory where generated archives are written. Relative values are resolved from `root`.\n\n`.` - Write beside the project files.\n\n`./artifacts` - Write into an artifacts directory.",
      "minLength": 1,
      "examples": [".", "./artifacts"]
    },
    "name": {
      "type": "string",
      "default": "{folder}.zip",
      "description": "Default snapshot archive filename.",
      "markdownDescription": "Filename used by `package zip` when `--output` is omitted.\n\n`{folder}` - Replaced with the project root folder name.\n\n`{workspace}` and `{workspaces}` - Replaced with a filesystem-safe workspace label when scoped monorepo packaging is active. With the default `{folder}.zip`, a single selected workspace automatically uses `<workspace>.zip`.",
      "minLength": 1,
      "examples": ["{folder}.zip", "{folder}-source.zip"]
    },
    "strategy": {
      "type": "string",
      "default": "git",
      "description": "File collection strategy.",
      "markdownDescription": "`git` - Prefer `git ls-files` so nested `.gitignore`, repository excludes, tracked files, and untracked non-ignored files follow Git behavior. Falls back to the internal walker when Git is unavailable.\n\n`walk` - Always use the built-in filesystem walker and ignore matcher.",
      "enum": ["git", "walk"],
      "examples": ["git"]
    },
    "gitignore": {
      "type": "boolean",
      "default": true,
      "description": "Respect Git ignore rules.",
      "markdownDescription": "`true` - Apply `.gitignore` and standard Git exclusions.\n\n`false` - Do not use `.gitignore` rules. Reserved package metadata and internal exclusions still apply."
    },
    "npmignore": {
      "type": "boolean",
      "default": false,
      "description": "Legacy alias for packageManagerIgnore when using .npmignore.",
      "markdownDescription": "Backward-compatible alias for `packageManagerIgnore`. New configuration should use `packageManagerIgnore` and `packageManagerIgnoreFile`.\n\n`true` - Apply the configured package-manager ignore file.\n\n`false` - Do not enable that filter through this legacy option."
    },
    "packageManager": {
      "type": "string",
      "default": "npm",
      "description": "Package-manager or build-runner command exposed to lifecycle hooks.",
      "markdownDescription": "Command used by the `{packageManager}` hook placeholder and exposed as `PACKAGE_MANAGER`. It defaults to `npm`, but may be `pnpm`, `yarn`, `bun`, or any executable command accepted by the shell.\n\nPackage never rewrites explicit hook commands; use `{packageManager}` where the configured command should be substituted.",
      "minLength": 1,
      "examples": ["npm", "pnpm", "yarn", "bun"]
    },
    "packageManagerIgnore": {
      "type": "boolean",
      "default": false,
      "description": "Apply the configured package-manager ignore file during collection.",
      "markdownDescription": "`true` - Exclude paths matched by `packageManagerIgnoreFile` in addition to other filters.\n\n`false` - Do not read that file. `npmignore` remains a backward-compatible alias."
    },
    "packageManagerIgnoreFile": {
      "type": "string",
      "default": ".npmignore",
      "description": "Ignore-file name used when packageManagerIgnore is enabled.",
      "markdownDescription": "The ignore filename read in each traversed directory when `packageManagerIgnore` is `true`. The npm-compatible default is `.npmignore`; set another filename for a different build system or package manager.\n\nExamples: `.npmignore`, `.publishignore`, `.releaseignore`.",
      "minLength": 1,
      "examples": [".npmignore", ".publishignore"]
    },
    "include": {
      "type": "array",
      "default": ["**/*"],
      "description": "Glob patterns selecting files eligible for packaging.",
      "markdownDescription": "Ordered allow-list of project-relative glob patterns. A file must match at least one entry before ignore rules are applied.\n\n`**/*` - Select every regular file recursively.\n\n`src/**` - Select only files below `src`.",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "minItems": 1,
      "examples": [["**/*"], ["src/**", "package.json"]]
    },
    "ignore": {
      "type": "array",
      "default": [],
      "description": "Additional project-relative glob patterns to exclude.",
      "markdownDescription": "Extra deny-list evaluated after standard exclusions. Empty by default, so enabling the option does not remove additional files.\n\n`dist/**` - Exclude generated output.\n\n`src/assets/**` - Exclude a subtree.",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "examples": [[], ["dist/**", "coverage/**"]]
    },
    "forceInclude": {
      "type": "array",
      "default": [],
      "description": "Glob patterns that include files despite normal selection and ignore rules.",
      "markdownDescription": "Paths matching these project-relative globs are included even when excluded by `include`, `ignore`, dotfile filtering, `.gitignore`, or the configured package-manager ignore file.\n\nSafety exclusions still win: `.git`, `node_modules`, reserved Package metadata, and the archive currently being written are never collected. `forceIgnore` has higher priority than `forceInclude`.",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "examples": [[], [".env.example", "generated/required/**"]]
    },
    "forceIgnore": {
      "type": "array",
      "default": [],
      "description": "Glob patterns that exclude files despite normal include or forceInclude rules.",
      "markdownDescription": "Highest-priority user-defined deny-list. Paths matching these project-relative globs are excluded even when `forceInclude`, `include`, or ignore-file negation would otherwise select them.\n\nSafety exclusions remain enforced independently.",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "examples": [[], ["secrets/**", "**/*.local"]]
    },
    "dot": {
      "type": "boolean",
      "default": true,
      "description": "Include dotfiles unless another rule excludes them.",
      "markdownDescription": "`true` - Allow files such as `.github/workflows/ci.yml` and `.npmrc`.\n\n`false` - Exclude ordinary dotfiles. Reserved `.packagemanifest.json` and `.packageshift` handling is independent."
    },
    "followSymlinks": {
      "type": "boolean",
      "default": false,
      "description": "Follow symbolic links while walking the project.",
      "markdownDescription": "`false` - Do not follow symbolic links. This is the safe default and prevents collecting content outside the project root.\n\n`true` - Follow links only when the resolved target remains inside `root`."
    },
    "includeEmptyDirectories": {
      "type": "boolean",
      "default": false,
      "description": "Include explicit empty-directory entries.",
      "markdownDescription": "`false` - Store files only, preserving existing archive behavior.\n\n`true` - Add entries for selected empty directories when supported by collection."
    },
    "manifest": {
      "type": "boolean",
      "default": true,
      "description": "Embed .packagemanifest.json in generated archives.",
      "markdownDescription": "`true` - Write `.packagemanifest.json` with file size, mode, SHA-256, and root hash metadata.\n\n`false` - Reserved for manifestless workflows. Disabling metadata reduces base verification and is not recommended."
    },
    "shiftFile": {
      "type": "string",
      "default": ".packageshift",
      "description": "Project-relative source file embedded as .packageshift when present.",
      "markdownDescription": "Path to the source `.packageshift` file. `package zip` validates it and stores it under the reserved archive path `.packageshift`, regardless of dotfile, include, ignore, or Git filtering.\n\nThe protocol header inside the file remains `PACKAGESHIFT 1`.",
      "minLength": 1,
      "examples": [".packageshift", "config/release.packageshift"]
    },
    "compressionLevel": {
      "type": "integer",
      "default": 9,
      "description": "ZIP deflate compression level.",
      "markdownDescription": "`0` - Store entries without deflate compression.\n\n`1` - Faster compression with larger output.\n\n`9` - Maximum compression and the default.",
      "minimum": 0,
      "maximum": 9,
      "examples": [9]
    },
    "deterministic": {
      "type": "boolean",
      "default": true,
      "description": "Normalize archive metadata for reproducible output.",
      "markdownDescription": "`true` - Sort entries and normalize timestamps so unchanged inputs produce stable archives.\n\n`false` - Allow source metadata to influence archive bytes."
    },
    "preserveMode": {
      "type": "boolean",
      "default": true,
      "description": "Preserve Unix permission modes.",
      "markdownDescription": "`true` - Record source permission modes in manifest and ZIP metadata.\n\n`false` - Normalize file modes to `0644`."
    },
    "preserveMtime": {
      "type": "boolean",
      "default": false,
      "description": "Preserve source modification timestamps.",
      "markdownDescription": "`false` - Omit source mtimes from the manifest and use deterministic ZIP timestamps.\n\n`true` - Store source mtimes; this can make otherwise identical archives differ."
    },
    "sensitiveFiles": {
      "type": "string",
      "default": "warn",
      "description": "Behavior when selected paths look sensitive.",
      "markdownDescription": "`warn` - Package files but print a warning. This preserves usability without silently discarding files.\n\n`error` - Stop packaging before the archive is written.\n\n`allow` - Package without a sensitive-file warning.",
      "enum": ["warn", "error", "allow"],
      "examples": ["warn"]
    },
    "backupOnApply": {
      "type": "boolean",
      "default": true,
      "description": "Create a persistent rollback archive before apply.",
      "markdownDescription": "`true` - Before a successful `apply` writes project files, save every affected path as a versioned rollback archive under the current user's package data directory. The default location is `~/streetraceing/.package/backups/<project-id>` on Linux and macOS and `%USERPROFILE%\\streetraceing\\.package\\backups\\<project-id>` on Windows. Use `package backup list`, `package backup inspect <version>`, and `package backup restore <version>` to work with history.\n\n`false` - Do not create a persistent version. In-memory rollback is still attempted when the current apply operation fails."
    },
    "conflictStrategy": {
      "type": "string",
      "default": "abort",
      "description": "Default apply behavior for local and hash conflicts.",
      "markdownDescription": "`abort` - Make no changes when an unresolved conflict exists. This is the safe default.\n\n`overwrite` - Replace conflicting local paths.\n\n`skip` - Keep conflicting local paths and apply non-conflicting changes.",
      "enum": ["abort", "overwrite", "skip"],
      "examples": ["abort"]
    },
    "renameDetection": {
      "type": "boolean",
      "default": true,
      "description": "Detect exact renames while creating shift archives.",
      "markdownDescription": "`true` - Pair removed and added files with identical SHA-256 content and emit `MOVE` instructions in `.packageshift`.\n\n`false` - Represent the same change as a removal plus payload addition."
    },
    "renameThreshold": {
      "type": "number",
      "default": 0.8,
      "description": "Similarity threshold reserved for approximate rename detection.",
      "markdownDescription": "A number from `0` to `1`.\n\n`0.8` - Require 80% similarity when approximate rename detection becomes available. Exact hash-based detection is used today.",
      "minimum": 0,
      "maximum": 1,
      "examples": [0.8]
    },
    "beforePackage": {
      "default": [],
      "description": "Shell commands executed before creating a snapshot or shift archive.",
      "markdownDescription": "Commands run sequentially from the owning project's `root` before file collection for `package zip` and `package shift`. An empty array preserves current behavior. A non-zero exit stops packaging before a new archive is written.\n\n`\"npm run build\"` - Run one command.\n\n`[\"npm run lint\", \"npm run build\"]` - Run multiple commands in order.\n\nAvailable environment variables:\n\n`PACKAGE_HOOK` - `beforePackage`\n\n`PACKAGE_COMMAND` - `zip` or `shift`\n\n`PACKAGE_ROOT` - Absolute project root\n\n`PACKAGE_ARCHIVE` - Absolute intended archive path\n\nWhen `depends_on` is used, this hook is loaded from every project's `.packagerc` and runs in that project's own directory in dependency-first order. `PACKAGE_PROJECT_NAME`, `PACKAGE_PROJECT_PATH`, and `PACKAGE_COMPOSITION_ROOT` identify the active project and shared archive root.",
      "examples": [[], "npm run build", ["npm run lint", "npm run build"]],
      "oneOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "afterPackage": {
      "default": [],
      "description": "Shell commands executed after a snapshot or shift archive is written.",
      "markdownDescription": "Commands run sequentially from the owning project's `root` only after the archive is successfully created. An empty array preserves current behavior. If a command fails, the created archive is retained and the CLI exits with an error.\n\n`\"node scripts/report-package.mjs\"` - Run one command.\n\n`[\"npm run checksum\", \"npm run publish:artifact\"]` - Run multiple commands in order.\n\nAvailable environment variables:\n\n`PACKAGE_HOOK` - `afterPackage`\n\n`PACKAGE_COMMAND` - `zip` or `shift`\n\n`PACKAGE_ROOT` - Absolute project root\n\n`PACKAGE_ARCHIVE` - Absolute created archive path\n\nWhen `depends_on` is used, this hook is loaded from every project's `.packagerc` and runs in that project's own directory in dependency-first order. `PACKAGE_PROJECT_NAME`, `PACKAGE_PROJECT_PATH`, and `PACKAGE_COMPOSITION_ROOT` identify the active project and shared archive root.",
      "examples": [
        [],
        "node scripts/report-package.mjs",
        ["npm run checksum", "npm run publish:artifact"]
      ],
      "oneOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "beforeApply": {
      "default": [],
      "description": "Shell commands executed before applying archive changes.",
      "markdownDescription": "Commands run sequentially from the owning project's `root` after archive validation, conflict handling, and user confirmation, but before the first project file is changed. An empty array preserves current behavior. A non-zero exit stops apply before package changes are written. The hook is not run for `--dry-run`.\n\n`\"npm run preapply\"` - Run one command.\n\n`[\"npm run validate\", \"npm run migrate\"]` - Run multiple commands in order.\n\nAvailable environment variables:\n\n`PACKAGE_HOOK` - `beforeApply`\n\n`PACKAGE_COMMAND` - `apply`\n\n`PACKAGE_ROOT` - Absolute target project root\n\n`PACKAGE_ARCHIVE` - Absolute source archive path\n\nWhen `depends_on` is used, this hook is loaded from every project's `.packagerc` and runs in that project's own directory in dependency-first order. `PACKAGE_PROJECT_NAME`, `PACKAGE_PROJECT_PATH`, and `PACKAGE_COMPOSITION_ROOT` identify the active project and shared archive root.",
      "examples": [
        [],
        "npm run preapply",
        ["npm run validate", "npm run migrate"]
      ],
      "oneOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "afterApply": {
      "default": [],
      "description": "Best-effort shell commands executed after archive changes are applied successfully.",
      "markdownDescription": "Commands run sequentially from the owning project's `root` only after all package changes are applied successfully. A non-zero exit or start error is reported as a warning: applied files are not rolled back, the CLI remains successful, remaining `afterApply` commands continue, and optional archive cleanup still runs. An empty array preserves current behavior. The hook is not run for `--dry-run`, cancelled apply, validation failure, conflict abort, or rollback.\n\n`\"npm run prepare\"` - Run one command.\n\n`[\"npm install\", \"npm run build\"]` - Run multiple commands in order, continuing after individual failures.\n\nAvailable environment variables:\n\n`PACKAGE_HOOK` - `afterApply`\n\n`PACKAGE_COMMAND` - `apply`\n\n`PACKAGE_ROOT` - Absolute target project root\n\n`PACKAGE_ARCHIVE` - Absolute source archive path\n\nWhen `depends_on` is used, this hook is loaded from every project's `.packagerc` and runs in that project's own directory in dependency-first order. `PACKAGE_PROJECT_NAME`, `PACKAGE_PROJECT_PATH`, and `PACKAGE_COMPOSITION_ROOT` identify the active project and shared archive root.",
      "examples": [[], "npm run prepare", ["npm install", "npm run build"]],
      "oneOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "deletePackageOnApply": {
      "type": "boolean",
      "default": false,
      "description": "Delete the applied archive after a successful apply.",
      "markdownDescription": "`false` - Keep the archive passed to `package apply`. This is the non-destructive default.\n\n`true` - Delete the applied archive after project files are applied. Best-effort `afterApply` failures are warnings and do not prevent deletion. The archive is retained during `--dry-run`, on validation errors, conflicts, cancellation, or rollback.\n\n`--delete-package` - Enable this behavior for one apply.\n\n`--keep-package` - Disable it for one apply."
    },
    "deleteSourcePackageOnApply": {
      "type": "boolean",
      "default": false,
      "description": "Delete the exact source snapshot after a successful apply.",
      "markdownDescription": "`false` - Keep source snapshot archives. This is the non-destructive default and preserves existing behavior.\n\n`true` - After project files are applied and best-effort `afterApply` hooks run, delete one safely identified source snapshot. The CLI first uses the exact name and SHA-256 recorded by `package shift`. If that reference is unavailable, it searches only beside the applied archive and in the target project root for exactly one regular `.zip` snapshot whose embedded manifest matches the project state captured before apply. Ambiguous matches, symlinks, changed archives, missing metadata, dry runs, cancelled applies, validation failures, and rolled-back applies are never deleted.\n\n`--delete-source-package` - Enable this behavior for one apply.\n\n`--keep-source-package` - Disable it for one apply.",
      "examples": [false]
    },
    "saveDeletedCache": {
      "type": "boolean",
      "default": true,
      "description": "Save files that the CLI is about to delete or replace in the user cache.",
      "markdownDescription": "`true` - Before Package deletes or replaces a regular file, copy its current contents to the per-project deleted-file cache. The default location is `~/streetraceing/.package/cache/<project-id>/<operation-id>` on Linux and macOS and `%USERPROFILE%\\streetraceing\\.package\\cache\\<project-id>\\<operation-id>` on Windows. Each operation includes `.packagecache.json` metadata with original paths, reasons, sizes, modes, and SHA-256 values.\n\nCovered operations include project files removed or overwritten by `apply`, files replaced by `backup restore`, existing output archives replaced by `zip` or `shift`, `.packagerc` replaced by `init --force`, and archives removed by `deletePackageOnApply` or `deleteSourcePackageOnApply`. Files deleted by user-defined hook scripts cannot be intercepted.\n\nFiles larger than `10 MiB` are still cached, but the CLI prints a warning before continuing. Cache writes are performed before the destructive action; if a required cache write fails, Package does not perform that deletion or replacement.\n\n`false` - Do not create deleted-file cache copies. Versioned apply backups remain controlled separately by `backupOnApply`.\n\n`--save-deleted-cache` - Enable caching for one command.\n\n`--no-save-deleted-cache` - Disable caching for one command.",
      "examples": [true, false]
    },
    "depends_on": {
      "type": "array",
      "default": [],
      "description": "Compose this project with explicitly declared local project dependencies.",
      "markdownDescription": "Declares other local projects that must travel with the current project. Paths are resolved from this project's effective `root`. Each dependency loads and applies its own `.packagerc`, may declare further `depends_on` projects, and is stored in the archive under the shared parent directory. Dependency cycles and duplicate project names are rejected. Lifecycle hooks run in each project's own directory in dependency-first order.\n\n`[\"../backend\"]` - Include a sibling project using its package name or folder name.\n\n`[{ \"path\": \"../backend\", \"name\": \"@codeissue/backend\" }]` - Include a sibling with an explicit stable name.",
      "items": {
        "oneOf": [
          {
            "type": "string",
            "minLength": 1
          },
          {
            "type": "object",
            "additionalProperties": false,
            "required": ["path"],
            "properties": {
              "path": {
                "type": "string",
                "minLength": 1,
                "description": "Path to the dependent project directory, relative to this project root."
              },
              "name": {
                "type": "string",
                "minLength": 1,
                "description": "Optional stable project name. Defaults to package.json name or the directory name."
              }
            }
          }
        ]
      },
      "examples": [
        [],
        ["../backend"],
        [
          {
            "path": "../backend",
            "name": "@codeissue/backend"
          }
        ]
      ]
    },
    "monorepo": {
      "type": "object",
      "default": {
        "mode": "auto",
        "workspacePatterns": [],
        "selection": [],
        "includeDependencies": false,
        "includeDependents": false,
        "includeRootFiles": true,
        "shared": [
          "package.json",
          "package-lock.json",
          "npm-shrinkwrap.json",
          "pnpm-lock.yaml",
          "pnpm-workspace.yaml",
          "yarn.lock",
          "bun.lock",
          "bun.lockb",
          "lerna.json",
          "rush.json",
          "nx.json",
          "turbo.json",
          "tsconfig.json",
          "tsconfig.base.json",
          ".npmrc",
          ".yarnrc.yml",
          ".gitignore",
          ".gitattributes",
          ".editorconfig",
          ".packagerc",
          ".packagerc.json"
        ]
      },
      "description": "Workspace discovery and scoped packaging for monorepositories.",
      "markdownDescription": "Configures first-class `npm`, `pnpm`, Yarn/Bun, Lerna, and Rush workspace discovery. An empty `selection` preserves whole-repository packaging. Selectors may use a package name, relative workspace path, basename, or glob. Scoped archives keep paths relative to the monorepo root so `diff`, `shift`, and `apply` remain root-safe.",
      "additionalProperties": false,
      "properties": {
        "mode": {
          "type": "string",
          "default": "auto",
          "enum": ["auto", "off", "on"],
          "description": "Workspace discovery mode.",
          "markdownDescription": "`auto` - Enable discovery when workspace metadata exists.\n\n`on` - Also probe common directories such as `packages/*` and `apps/*`.\n\n`off` - Disable workspace selection."
        },
        "workspacePatterns": {
          "type": "array",
          "default": [],
          "description": "Additional workspace directory globs.",
          "markdownDescription": "Adds project-relative workspace globs such as `packages/*` or `apps/**`. Prefix a pattern with `!` to exclude matches. These patterns are combined with detected package-manager metadata.",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "examples": [[], ["packages/*", "apps/*", "!apps/legacy"]]
        },
        "selection": {
          "type": "array",
          "default": [],
          "description": "Workspace selectors used for scoped collection.",
          "markdownDescription": "An empty array packages the whole repository for backward compatibility. Entries match workspace package names, relative paths, basenames, or globs. The CLI `--workspace` and `--all-workspaces` flags override this list.",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "examples": [[], ["@acme/api"], ["apps/*"]]
        },
        "includeDependencies": {
          "type": "boolean",
          "default": false,
          "description": "Expand selection to local workspace dependencies.",
          "markdownDescription": "`true` - Recursively include selected workspaces' local dependencies from dependency fields.\n\n`false` - Package only directly selected workspaces. Use `--with-dependencies` for one command."
        },
        "includeDependents": {
          "type": "boolean",
          "default": false,
          "description": "Expand selection to local workspace dependents.",
          "markdownDescription": "`true` - Recursively include local workspaces that depend on a selected workspace.\n\n`false` - Do not expand in the reverse direction. Use `--with-dependents` for one command."
        },
        "includeRootFiles": {
          "type": "boolean",
          "default": true,
          "description": "Include configured shared root files in scoped archives.",
          "markdownDescription": "`true` - Include paths matched by `monorepo.shared`, such as lockfiles and root build configuration.\n\n`false` - Include only selected workspace trees, except explicit `forceInclude` matches."
        },
        "shared": {
          "type": "array",
          "default": [
            "package.json",
            "package-lock.json",
            "npm-shrinkwrap.json",
            "pnpm-lock.yaml",
            "pnpm-workspace.yaml",
            "yarn.lock",
            "bun.lock",
            "bun.lockb",
            "lerna.json",
            "rush.json",
            "nx.json",
            "turbo.json",
            "tsconfig.json",
            "tsconfig.base.json",
            ".npmrc",
            ".yarnrc.yml",
            ".gitignore",
            ".gitattributes",
            ".editorconfig",
            ".packagerc",
            ".packagerc.json"
          ],
          "description": "Root-shared files and globs included with scoped workspaces.",
          "markdownDescription": "Project-relative globs for files needed by selected workspaces, including root `package.json`, lockfiles, workspace declarations, TypeScript/build configuration, and Package configuration. Add entries such as `scripts/**` or `.github/**` when those files are required by the scoped archive.",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      }
    }
  },
  "examples": [
    {
      "$schema": "https://streetraceing.github.io/package/schema.json",
      "type": "zip",
      "root": ".",
      "output": ".",
      "name": "{folder}.zip",
      "strategy": "git",
      "gitignore": true,
      "npmignore": false,
      "packageManager": "npm",
      "packageManagerIgnore": false,
      "packageManagerIgnoreFile": ".npmignore",
      "include": ["**/*"],
      "ignore": ["dist/**", "coverage/**"],
      "forceInclude": [],
      "forceIgnore": [],
      "dot": true,
      "beforePackage": [],
      "afterPackage": [],
      "beforeApply": [],
      "afterApply": [],
      "deletePackageOnApply": false,
      "compressionLevel": 9,
      "deterministic": true,
      "backupOnApply": true,
      "conflictStrategy": "abort",
      "deleteSourcePackageOnApply": false,
      "monorepo": {
        "mode": "auto",
        "workspacePatterns": [],
        "selection": [],
        "includeDependencies": false,
        "includeDependents": false,
        "includeRootFiles": true,
        "shared": [
          "package.json",
          "package-lock.json",
          "npm-shrinkwrap.json",
          "pnpm-lock.yaml",
          "pnpm-workspace.yaml",
          "yarn.lock",
          "bun.lock",
          "bun.lockb",
          "lerna.json",
          "rush.json",
          "nx.json",
          "turbo.json",
          "tsconfig.json",
          "tsconfig.base.json",
          ".npmrc",
          ".yarnrc.yml",
          ".gitignore",
          ".gitattributes",
          ".editorconfig",
          ".packagerc",
          ".packagerc.json"
        ]
      }
    }
  ]
}
