Help us improve
Share bugs, ideas, or general feedback.
From syncpack
Defines syncpack version groups for monorepo dependency management: pin/ban versions, prefer highest/lowest semver, filter by deps/packages/types/locations.
npx claudepluginhub thebushidocollective/han --plugin syncpackHow this skill is triggered — by the user, by Claude, or both
Slash command
/syncpack:syncpack-version-groupsThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Version groups allow you to define sophisticated dependency version policies in your monorepo. This skill covers advanced patterns for version management.
Configures syncpack for JavaScript/TypeScript monorepos including workspace detection, dependency types, semver groups, version groups, and package.json formatting.
Configures secure dependency upgrades for npm, pnpm, Yarn, Bun, Deno with cooldowns, script blocking, lockfile hardening, and CI tools like Dependabot/Renovate. Use for upgrades, security policies, supply chain protection.
Guides monorepo workflows including local dev setup with Turborepo/pnpm, cross-package development, watch modes, CI/CD patterns, versioning, publishing, and Vite/Next.js configs.
Share bugs, ideas, or general feedback.
Version groups allow you to define sophisticated dependency version policies in your monorepo. This skill covers advanced patterns for version management.
export default {
versionGroups: [
{
label: 'Description of this group',
dependencies: ['package-name', '@scope/**'],
dependencyTypes: ['prod', 'dev'],
packages: ['apps/**'],
specifierTypes: ['exact', 'range'],
// Policy options (choose one)
preferVersion: 'highestSemver',
// pinVersion: '1.0.0',
// isBanned: true,
// isIgnored: true,
},
],
};
Match specific packages by name or glob:
dependencies: [
'react', // exact match
'react-*', // wildcard
'@types/**', // scoped packages
'{react,vue}', // either/or
]
Filter by where dependencies appear:
dependencyTypes: [
'dev', // devDependencies
'local', // workspace: protocol
'overrides', // npm overrides
'peer', // peerDependencies
'pnpmOverrides', // pnpm.overrides
'prod', // dependencies
'resolutions', // yarn resolutions
]
Filter by which package.json files:
packages: [
'apps/**', // all apps
'packages/core', // specific package
'!packages/legacy', // exclude pattern
]
Filter by version specifier format:
specifierTypes: [
'exact', // 1.2.3
'range', // ^1.2.3, ~1.0.0, >=2.0.0
'tag', // latest, next, canary
'url', // https://, git://
'file', // file:../path
'workspace', // workspace:*
]
Choose which version wins when mismatches exist:
// Use the highest semver version found
preferVersion: 'highestSemver'
// Use the lowest semver version found
preferVersion: 'lowestSemver'
// Use whatever a specific package has
preferVersion: 'packages/core'
// Use local workspace version
preferVersion: 'local'
Force all matches to use a specific version:
{
label: 'Pin TypeScript to LTS',
dependencies: ['typescript'],
pinVersion: '5.3.3',
}
Prevent packages from being used:
{
label: 'Ban deprecated packages',
dependencies: ['moment', 'request'],
isBanned: true,
}
Exclude from version checking:
{
label: 'Ignore local packages',
dependencyTypes: ['local'],
isIgnored: true,
}
export default {
versionGroups: [
{
label: 'Ignore local workspace packages',
dependencyTypes: ['local'],
isIgnored: true,
},
{
label: 'Use highest version for everything else',
preferVersion: 'highestSemver',
},
],
};
export default {
versionGroups: [
{
label: 'Pin React version across all packages',
dependencies: ['react', 'react-dom', '@types/react', '@types/react-dom'],
pinVersion: '18.2.0',
},
],
};
export default {
versionGroups: [
{
label: 'Apps can have any version',
packages: ['apps/**'],
isIgnored: true,
},
{
label: 'Libraries must have consistent versions',
packages: ['packages/**'],
preferVersion: 'highestSemver',
},
],
};
export default {
versionGroups: [
{
label: 'Ban packages with known vulnerabilities',
dependencies: [
'lodash', // use lodash-es instead
'moment', // use date-fns instead
'request', // use axios/fetch instead
],
isBanned: true,
},
],
};
export default {
versionGroups: [
{
label: 'Allow peer dependency flexibility',
dependencyTypes: ['peer'],
isIgnored: true,
},
{
label: 'Strict versions for prod/dev',
dependencyTypes: ['prod', 'dev'],
preferVersion: 'highestSemver',
},
],
};
export default {
versionGroups: [
{
label: 'Core team owns @myorg/core',
dependencies: ['@myorg/core'],
preferVersion: 'packages/core',
},
{
label: 'UI team owns @myorg/ui-*',
dependencies: ['@myorg/ui-*'],
preferVersion: 'packages/ui',
},
],
};
# List all version mismatches
npx syncpack list-mismatches
# Fix version mismatches
npx syncpack fix
# Only fix specific dependencies
npx syncpack fix --dependencies react
# Only fix specific dependency types
npx syncpack fix --dependency-types prod,peer
Use labels and run with verbose output:
npx syncpack list-mismatches --log-levels warn,error
Version groups are evaluated in order. First matching group wins:
export default {
versionGroups: [
// Specific rule first
{ dependencies: ['react'], pinVersion: '18.2.0' },
// General rule second
{ preferVersion: 'highestSemver' },
],
};