{"id":15286275,"url":"https://github.com/oe/lerna-ci","last_synced_at":"2025-07-03T07:33:06.383Z","repository":{"id":34910869,"uuid":"178793658","full_name":"oe/lerna-ci","owner":"oe","description":"The essential toolkit for monorepo managed by lerna/yarn/pnpm/turbo/etc","archived":false,"fork":false,"pushed_at":"2024-10-22T15:21:03.000Z","size":379,"stargazers_count":5,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-30T22:05:42.717Z","etag":null,"topics":["lerna","monorepo","npm","pnpm","turbo","typescript","yarn"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oe.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-04-01T05:45:56.000Z","updated_at":"2024-10-22T15:21:15.000Z","dependencies_parsed_at":"2025-04-13T03:10:01.127Z","dependency_job_id":"23344222-fdb0-42d4-b385-e4c328f4325f","html_url":"https://github.com/oe/lerna-ci","commit_stats":{"total_commits":111,"total_committers":5,"mean_commits":22.2,"dds":0.4054054054054054,"last_synced_commit":"dbb20c866e3c08ca755c1eeba033a44fa6d645a3"},"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/oe/lerna-ci","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oe%2Flerna-ci","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oe%2Flerna-ci/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oe%2Flerna-ci/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oe%2Flerna-ci/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oe","download_url":"https://codeload.github.com/oe/lerna-ci/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oe%2Flerna-ci/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263283022,"owners_count":23442277,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["lerna","monorepo","npm","pnpm","turbo","typescript","yarn"],"created_at":"2024-09-30T15:11:34.983Z","updated_at":"2025-07-03T07:33:06.354Z","avatar_url":"https://github.com/oe.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003elerna-ci\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/oe/lerna-ci/actions\"\u003e\n    \u003cimg src=\"https://github.com/oe/lerna-ci/actions/workflows/main.yml/badge.svg\" alt=\"github actions\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"#readme\"\u003e\n    \u003cimg src=\"https://badgen.net/badge/Built%20With/TypeScript/blue\" alt=\"code with typescript\" height=\"20\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"#readme\"\u003e\n    \u003cimg src=\"https://badge.fury.io/js/lerna-ci.svg\" alt=\"npm version\" height=\"20\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/lerna-ci\"\u003e\n    \u003cimg src=\"https://img.shields.io/npm/dm/lerna-ci.svg\" alt=\"npm downloads\" height=\"20\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\u003ch4 align=\"center\"\u003eThe essential toolkit for monorepo managed by \u003ca href=\"https://lerna.js.org/\"\u003elerna/npm/yarn/pnpm/turbo/etc\u003c/a\u003e\u003c/h4\u003e\n\n\n- [Features](#features)\n- [Install](#install)\n- [Usage](#usage)\n- [Cli commands](#cli-commands)\n  - [synclocal](#synclocal)\n  - [syncdeps](#syncdeps)\n  - [canpublish](#canpublish)\n  - [fixpack](#fixpack)\n  - [changed](#changed)\n- [API](#api)\n  - [getAllPackageDigests](#getallpackagedigests)\n  - [syncLocal](#synclocal-api)\n  - [syncDeps](#syncdeps-api)\n  - [fixpack](#fixpack-api)\n  - [getChanged](#getChanged)\n  - [getRepoNpmClient](#getreponpmclient)\n  - [getVersionFormRegistry](#getversionformregistry)\n  - [getVersionsFromRegistry](#getversionsfromregistry)\n  - [getPackageVersionsFromGit](#getpackageversionsfromgit)\n  - [isLernaAvailable](#islernaavailable)\n  - [getGitRoot](#getgitroot)\n  - [getProjectRoot](#getprojectroot)\n  - [maxVersion](#maxversion)\n  - [pickOne](#pickone)\n- [Configuration file](#configuration-file)\n- [Breaking changes](#breaking-changes)\n\n## Features\n* sync versions of packages in monorepo (with cli command)\n* sync(update) dependencies versions of all packages (with cli command)\n  * can update to latest version\n  * can update to specified version\n  * can specify packages with wildcard characters\n* format all package.json files (with cli command)\n* check if all packages are qualified to publish to npm (with cli command)\n* list all packages(requires `lerna` or `@changesets/cli`) (with cli command)\n* get all packages' meta info\n* some other useful utilities\n\n**`lerna-ci` is designed for monorepo, but it can also be used in standard repo.**\n\n## Install\n```sh\n# with yarn, install as a devDependency\nyarn add lerna-ci -D\n\n# with npm, install as a devDependency\nnpm install lerna-ci -D\n```\nyou may also install it to global if you use cli commands frequently(not recommended)\n\nNotice: **lerna-ci requires node `\u003e=14.6`**\n\n## Usage\n\n```sh\n# sync versions of packages in monorepo, to fix versions of packages in monorepo when they are messed up\nyarn lerna-ci synclocal\n\n# sync all packages' dependencies versions\n#   following command will sync all @babel scoped npm packages and typescript to latest version, but react and react-dom will be set to 16.x\nyarn lerna-ci syncremote \"@babel/*\" \"react@16.x\" \"react-dom@16.x\" typescript\n\n# format all package.json files\nyarn lerna-ci fixpack\n\n```\n\n## Cli commands\n`lerna-ci` also provide some cli commands, so that you do some task with a single line code.\n\n### synclocal\nsync versions of packages in monorepo, using [syncLocal](#synclocal-api) under the hood.\n\n```sh\n# with yarn\nyarn lerna-ci synclocal [source] [--check-only]\n\n# version source, determine where to get the packages' versions, could be: \n#   git, npm, local, or all, default local\n# if check-only is true, it will only check if packages' versions are synced, exit 1 if not synced\n\n# or if you prefer npm\nnpx lerna-ci synclocal [source] [--check-only]\n\n# check for more options and examples\nyarn lerna-ci synclocal --help\n\n# demo\nyarn lerna-ci synclocal\n```\n\nIt's very useful when local packages versions are messed up, this may lead to some unexpected errors, it can happens in some cases:\n1. publish a beta version inside a package without using lerna(or other monorepo tools)\n2. partial success when publish packages with lerna(or other monorepo tools), you may use `yarn lerna-ci synclocal all` to fix it\n\nYou may need to run `yarn` or `npm install` to make your changes take effect.\n\n### syncdeps\nsync all packages' dependencies versions in monorepo, using [syncDeps](#syncdeps-api) under the hood.\n\nIt will update following kinds of dependencies:\n* dependencies\n* devDependencies\n* optionalDependencies\n* peerDependencies\n\n```sh\n# with yarn\nyarn lerna-ci syncdeps \u003cpackageNames...\u003e [--check-only]\n# packageNames could be a list of package names, or a list of package name with version range, such as: \n#     \"@babel/*\" \"@babel/core@^7.0.0\" \"parcel@^2.0.0\" \"rollup-plugin*\"\n#     package name with asterisk(*) must be quoted\n# packageNames not found or not matched will be ignored\n# if check-only is true, it will check if any package's dependencies need be synced, exit 1 if found\n\n# or if you prefer npm, must use quotes when specify scoped wildcard package name\nnpx lerna-ci syncdeps \u003cpackageNames...\u003e [--check-only]\n\n# check for more options and examples\nyarn lerna-ci syncdeps --help\n\n# demo\n## sync all babel related packages' versions to `^7.0.0`, all packages that start with `eslint-plugin-` to latest, and react react-dom to `18.2.0`\nyarn lerna-ci syncdeps \"@babel/*@^7.0.0\" \"eslint-plugin-*\" react@18.2.0 react-dom@18.2.0\n```\n\nYou may need to run `yarn` or `npm install` to make your changes take effect.\n\n### canpublish\ncheck if all packages are qualified to publish to npm, using [getChanged](#getChanged) under the hood if `lerna` or `@changesets/cli` is available, it will check:\n1. whether local has uncommitted changes when in git repo if `--check-git` is true\n2. whether local has conflicts when in git repo\n3. whether local is behind of remote when in git repo\n4. whether local packages' versions are synced with the latest version when `use-max-version` is true\n5. whether next versions(can be configured via `releaseType` and `period`) of local packages are occupied on npm and git\n\nit will exit 1 if any of the above conditions is satisfied\n\n\n```sh\nyarn lerna-ci canpublish [--releaseType=patch] [--period=alpha]\n# releaseType: patch, minor, major, prepatch, preminor, premajor, prerelease\n#              default patch\n# period: a string like alpha, beta, rc, etc, default alpha, only available when releaseType is pre*\n\n# check for more options and examples\nyarn lerna-ci canpublish --help\n\n# demo\n# check if all (changed) packages are qualified to publish a beta version in patch\nyarn lerna-ci canpublish --releaseType=patch --period=beta\n```\n\n### fixpack\nformat all packages' package.json, using [fixpack](#fixpack-api) under the hood\n\n```sh\n# with yarn\nyarn lerna-ci fixpack\n\n# or if you prefer npm\nnpx lerna-ci fixpack\n```\nabove command will format all package.json files with default configuration, you can configure `fixpack`'s params via [configuration file](#configurationfile)\n\n### changed\nlist all changed packages, using [getChanged](#getChanged) under the hood\n\n```sh\n# with yarn\nyarn lerna-ci changed\n\n# or if you prefer npm\nnpx lerna-ci changed\n```\nabove command requires package [`lerna`](https://www.npmjs.com/package/lerna) or [`@changesets/cli`](https://www.npmjs.com/package/@changesets/cli) to be installed,  or it will exit 1.\n\nYou should configure `lerna` or `@changesets/cli` following their documentations and manage your packages under their official guidelines, or this command will not work as expected.\n\n## API\n\n### getAllPackageDigests\nget all packages info in monorepo(including the root package), you can filter with custom options\n\ne.g.\n```js\nimport { getAllPackageDigests } from 'lerna-ci'\n\n// get all packages\ngetAllPackageDigests().then(res =\u003e console.log(res))\n// [{name: 'my-package', version: '1.0.1', private: false, location: '/Users/xx/work/monorepo/my-package'}]\n\n// find packages with custom filter function\ngetAllPackageDigests((digest =\u003e digest.name.startWith('@inner/a-'))).then(res =\u003e console.log(res))\n\n// find public packages which package name contains '@inner/'\ngetAllPackageDigests({ignorePrivate: true, keyword: '@inner/'}).then(res =\u003e console.log(res))\n```\n\nType Declarations:\n```ts\ngetAllPackageDigests(filter?: IPackageFilterOptions) =\u003e Promise\u003cIPackageDigest[]\u003e\n\n/** package filter object */\nexport interface IPackageFilterObject {\n  /** whether need private package */\n  ignorePrivate?: boolean\n  /** search package contains the keyword */\n  keyword?: string\n}\n/** package filter function */\nexport type IPackageFilter = (pkg: IPackageDigest, index: number, arr: IPackageDigest[]) =\u003e boolean\n\nexport type IPackageFilterOptions = IPackageFilterObject | IPackageFilter\n\n/**\n * package digest info\n */\nexport interface IPackageDigest {\n  /** package name */\n  name: string\n  /** package version */\n  version: string\n  /** whether package is private */\n  private: boolean\n  /** package folder full path */\n  location: string\n}\n```\n### \u003ca id=\"synclocal-api\"\u003e\u003c/a\u003e syncLocal\nsync versions of packages in monorepo(version info can be fetch from npm or git tag), if they depend each other and dependence version will be rematched.\n\n\u003e also available as command [synclocal](#synclocal)\n\ne.g.\n```js\nimport { syncLocal } from 'lerna-ci'\n// return all changed package infos\nconst updatedPkgs = await syncLocal({ versionSource: 'npm' })\n// [{name: 'my-package', version: '1.0.1', private: false, location: '/Users/xx/work/monorepo/my-package'}]\n```\n\nType Declarations:\n```ts\nsyncLocal(options?: ISyncPackageOptions) =\u003e Promise\u003cIPackageDigest[]\u003e\n\n\nexport interface ISyncPackageOptions {\n  /**\n   * version source, default to `local`\n   * how to get latest locale package versions: npm, git, local or all\n   * @default 'all'\n   */\n  versionSource?: EVerSource\n  /**\n   * npm/git version strategy\n   * @default 'latest'\n   */\n  versionStrategy?: IVersionPickStrategy\n  /**\n   * filter which package should be synced\n   */\n  packageFilter?: IPackageFilterOptions\n  /**\n   * version range strategy\n   * @default 'retain'\n   */\n  versionRangeStrategy?: IUpgradeVersionStrategy\n  /**\n   * only check, with package.json files untouched\n   * validate package whether need to update, don't change package.json file actually\n   */\n  checkOnly?: boolean\n  /**\n   * check whether packages' versions are exactly same\n   */\n  exact?: boolean\n}\n\n/**\n * upgrade version strategy\n *  retain: retain the original version range\n */\nexport type IUpgradeVersionStrategy = '\u003e' | '~' | '^' | '\u003e=' | '' | 'retain' | IVerTransform\n\n/**\n * custom version transform\n */\nexport type IVerTransform = (name: string, newVersion: string, oldVersion: string) =\u003e string\n\n```\n\nTips: you may need to reinstall your workspace dependence if anything changed\n\n\n### \u003ca id=\"syncdeps-api\"\u003e\u003c/a\u003e syncDeps\nsync packages dependencies(e.g. babel, react, typescript, etc) versions at once\n\n\u003e also available as command [syncdeps](#syncdeps)\n\n```js\nimport { syncDeps } from 'lerna-ci'\n\n// update all packages that depend `react` and `react-dom` to their latest version(will fetch from npm)\n//  return all changed package infos(aka all packages that depend on these packageNames and be updated)\nconst updatedPkgs = await syncDeps({ packageNames: ['react', 'react-dom'] })\n// [{name: 'my-package', version: '1.0.1', private: false, location: '/Users/xx/work/monorepo/my-package'}]\n\n// as above, but will also update dependence typescript to a fixed version 3.1.0 and parcel to ^2.0.0\nconst updatedPkgs = await syncDeps({ packageNames: ['react', 'react-dom'], versionMap: { typescript: '=3.1.0', parcel: '2.0.0' } })\n// [{name: 'my-package', version: '1.0.1', private: false, location: '/Users/xx/work/monorepo/my-package'}]\n```\n\nType Declarations:\n```ts\nsyncDeps(syncOptions: ISyncDepOptions)=\u003e Promise\u003cIPackageDigest[]\u003e\n\nexport interface ISyncDepOptions {\n  /** \n   * package names that should update\n   *  will fetch its version from npm by default\n   *  package name can use asterisk, e.g. @babel/*\n   * \n   * @example\n   *  ['duplex-message', '@typescript-eslint/parser', '@babel/*', '*plugin*', 'react*']\n   */\n  packageNames?: string[]\n  /**\n   * version map\u003cpkgName, version\u003e\n   *  prefer use this as version map if provided\n   *  pkgName can be a pattern like @babel/*\n   *  if packageNames also provided, will fetch missing versions\n   * @example\n   * {'@babel/*': '7.0.0', 'parcel': '^2.0.0', '@types/react': '~18.0.0'}\n   */\n  versionMap?: IVersionMap\n  /**\n   * npm version strategy\n   *  default to 'max-stable'\n   */\n  versionPickStrategy?: IVersionPickStrategy\n  /**\n   * version range strategy, use retain by default\n   */\n  versionRangeStrategy?: IVersionRangeStrategy\n  /** only check, with package.json files untouched */\n  checkOnly?: boolean\n  /**\n   * update version to the exact given version\n   *  set to false only update when existing version range is not satisfied\n   * @default true\n   */\n  exact?: boolean\n}\n```\n\nTips: you may need to reinstall your workspaces dependence if anything changed\n\n### \u003ca id=\"fixpack-api\"\u003e\u003c/a\u003e fixpack\nMake all your package.json files are written in same criterion: sorting fields, validating required fields.\nThis feature is powered by [fixpack](https://github.com/HenrikJoreteg/fixpack).\n\n\u003e also available as command [fixpack](#fixpack)\n\ne.g.\n```js\nimport { fixpack } from 'lerna-ci'\n\nconst updatedPkgs = await fixpack()\n// [{name: 'my-package', version: '1.0.1', private: false, location: '/Users/xx/work/monorepo/my-package'}]\n\n```\n\nType Declarations:\n```ts\nfixpack (options?: IFixPackOptions) =\u003e Promise\u003cIPackageDigest[]\u003e\n\nexport interface IFixPackOptions {\n  /**\n   * which package's should be fixed\n   */\n  packageFilter?: IPackageFilterOptions\n  /**\n   * package fix configuration\n   *  check source \u003csrc/fixpack-all/config.ts\u003e for default configuration\n   *  see https://github.com/HenrikJoreteg/fixpack#configuration for details\n   */\n  config?: any\n}\n```\n\n### getChanged\nList all changed packages since last release, it requires package `lerna` or `@changesets/cli` to be installed.\n\n\u003e also available as command [changed](#changed)\n\ne.g.\n```js\nimport { getChanged } from 'lerna-ci'\n\nconst changedPkgs = await getChanged()\n// [{name: 'my-package', version: '1.0.1', private: false, location: '/Users/xx/work/monorepo/my-package'}]\n\n```\n\nType Declarations:\n```ts\ngetChanged() =\u003e Promise\u003cIPackageDigest[]\u003e\n\n```\n\n### getRepoNpmClient\nget current monorepo preferred npm client\n\ne.g.\n```js\nimport { getRepoNpmClient } from 'lerna-ci'\n\n// will return npm for default if not specified\n//   get `yarn-next` when yarn version \u003e= 2.0 found \ngetRepoNpmClient().then(client =\u003e console.log(client))\n// yarn\n```\n### getVersionFormRegistry\nget version from npm registry, you can get the latest version or the max version\n\ne.g.\n```js\nimport { getVersionFormRegistry } from 'lerna-ci'\n\ngetVersionFormRegistry(options: IGetPkgVersionFromRegistryOptions) =\u003e Promise\u003cstring | undefined\u003e\n\nexport interface IGetPkgVersionFromRegistryOptions {\n  /** package name */\n  pkgName: string\n  /** strategy: latest or max */\n  versionStrategy?: IVersionPickStrategy\n  /**\n   * specified version, to check for existence\n   *  return itself if found, otherwise return empty string\n   */\n  version?: string\n  /**\n   * preferred npm client, auto detect if omitted\n   */\n  npmClient?: 'yarn' | 'yarn-next' | 'npm' | 'pnpm'\n}\n```\ntips: if you want to fetch version from a npm mirror or custom registry, you should specify the mirror in the `.yarnrc` or `.npmrc` file\n\n### getVersionsFromRegistry\nbatch version of `getVersionFormRegistry`, but return an object(key is package name, value is version)\n\n\nType Declarations:\n```ts\ngetVersionsFromRegistry(options: IGetPkgVersionsFromRegistryOptions) =\u003e Promise\u003cstring | undefined\u003e\n\nexport interface IGetPkgVersionsFromRegistryOptions {\n  /**\n   * package names\n   */\n  pkgNames: string[]\n  /**\n   * version pick strategy\n   *  max: max package version\n   *  max-stable: max stable package version\n   *  latest: latest release package version\n   * @default max\n   */\n  versionStrategy?: 'max' | 'latest' | 'max-stable'\n  /**\n   * preferred npm client, detect automatically if not provided\n   */\n  npmClient?: 'yarn' | 'yarn-next' | 'npm' | 'pnpm'\n}\n```\n\n\n### getPackageVersionsFromGit\nget monorepo package version map from git tag list(only tags in `packageName@versionNumber` like `react@1.0.0` will be recognized).  \n**caution**: this api will run `git fetch origin --prune --tags` to sync tags from server, local un-pushed tags will be removed\n\ne.g.\n```js\nimport { getPackageVersionsFromGit } from 'lerna-ci'\n\n// will return npm for default if not specified\ngetPackageVersionsFromGit().then(ver =\u003e console.log(ver))\n// {'duplex-message': '1.1.2', 'simple-electron-ipc': '1.1.2'}\n```\n\nType Declarations:\n```ts\ngetPackageVersionsFromGit(type: 'latest' | 'max' = 'latest') =\u003e Promise\u003cRecord\u003cstring, string\u003e\u003e\n```\n\n### isLernaAvailable\ncheck whether lerna is installed in current repo\n\ne.g.\n```js\nimport { isLernaAvailable } from 'lerna-ci'\n\nisLernaAvailable().then(isInstalled =\u003e console.log(isInstalled))\n// true\n```\n\n### getGitRoot\nget git root path of current repo\n\ne.g.\n```js\nimport { getGitRoot } from 'lerna-ci'\n\n// return false if not in a git repo\nconst maxVer = await getGitRoot()\n// /User/xx/work/monorepo\n```\n\n### getProjectRoot\nget current project's root path (which contains a `package.json` file)\n\ne.g.\n```js\nimport { getProjectRoot } from 'lerna-ci'\n\n// throw error if not in a valid frontend project\nconst maxVer = await getProjectRoot()\n// /User/xx/work/monorepo\n```\n\n### maxVersion\nget max version(compare in semver) from a version list\n\ne.g.\n```js\nimport { maxVersion } from 'lerna-ci'\n\nconst maxVer = maxVersion('0.1', '0.0.1', '1.0.0-alpha.1', '1.0.0')\n// 1.0.0\n```\n\n### pickOne\npick a value from a list with a custom compare method\n\ne.g.\n```js\nimport { pickOne } from 'lerna-ci'\n\nconst picked = pickOne([{name: 'Lisa', age: 10}, {name: 'Janie', age: 12}, {name: 'Marry', age: 9}], (a, b) =\u003e a.age - b.age)\n// {name: 'Janie', age: 12}\n```\n\nType Declarations:\n```ts\npickOne\u003cV\u003e(list: V[], compare: ICompare\u003cV\u003e) =\u003e V | undefined\n\n// return `a` if result \u003e= 0, or return `b`\ntype ICompare\u003cV\u003e = ((a: V, b: V) =\u003e -1 | 0 | 1\n```\n\n\n## Configuration file\nYou may also add config for these commands via following ways(powered by [cosmiconfig](https://github.com/davidtheclark/cosmiconfig)) so that you don't need to specify the arguments:\n* add `lerna-ci` field to `package.json` in the root of the project\n* add `.lerna-circ` file in the root of the project with json or yaml format\n* add `.lerna-circ.json`, `.lerna-circ.yaml`, `.lerna-circ.yml` or `.lerna-circ.cjs` file in the root of the project\n* add `lerna-ci.config.js` or `lerna-ci.config.cjs` file in the root of the project\n\nall these configurations should return an object with the following properties:\n* `synclocal`: same as the params of [syncPackageVersions](#syncpackageversions)\n* `syncremote`: same as the params of [syncPackageDependenceVersion](#syncpackagedependenceversion)\n* `fixpack`: same as the params of [fixpack](#fixpack-api)\n\n\n## Breaking changes\nIf you are updating from `0.0.x`, you should be careful about following changes:\n\n1. default configuration for `fixpack` has been changed, you may restore the former behavior by setting `fixpack.config` to [old configuration](https://github.com/oe/lerna-ci/blob/legacy/src/fixpack/config.ts) in [configuration file](#configurationfile)\n2. if you are using APIs, most useful APIs are renamed for better understanding, but no feature is removed, you may read docs above to upgrade\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foe%2Flerna-ci","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foe%2Flerna-ci","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foe%2Flerna-ci/lists"}