{ "$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 `.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/` on Linux and macOS and `%USERPROFILE%\\streetraceing\\.package\\backups\\` on Windows. Use `package backup list`, `package backup inspect `, and `package backup restore ` 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//` on Linux and macOS and `%USERPROFILE%\\streetraceing\\.package\\cache\\\\` 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`, `shift`, or `repair`, `.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" ] } } ] }