| name | syncpack-version-groups |
| user-invocable | false |
| description | Use when defining version policies, banning dependencies, pinning versions, or creating partitioned version groups in syncpack. Covers advanced version management patterns. |
| allowed-tools | ["Read","Write","Edit","Bash","Grep","Glob"] |
Syncpack Version Groups
Version groups allow you to define sophisticated dependency version policies in your monorepo. This skill covers advanced patterns for version management.
Version Group Structure
export default {
versionGroups: [
{
label: 'Description of this group',
dependencies: ['package-name', '@scope/**'],
dependencyTypes: ['prod', 'dev'],
packages: ['apps/**'],
specifierTypes: ['exact', 'range'],
preferVersion: 'highestSemver',
},
],
};
Filter Options
dependencies
Match specific packages by name or glob:
dependencies: [
'react',
'react-*',
'@types/**',
'{react,vue}',
]
dependencyTypes
Filter by where dependencies appear:
dependencyTypes: [
'dev',
'local',
'overrides',
'peer',
'pnpmOverrides',
'prod',
'resolutions',
]
packages
Filter by which package.json files:
packages: [
'apps/**',
'packages/core',
'!packages/legacy',
]
specifierTypes
Filter by version specifier format:
specifierTypes: [
'exact',
'range',
'tag',
'url',
'file',
'workspace',
]
Version Policies
preferVersion
Choose which version wins when mismatches exist:
preferVersion: 'highestSemver'
preferVersion: 'lowestSemver'
preferVersion: 'packages/core'
preferVersion: 'local'
pinVersion
Force all matches to use a specific version:
{
label: 'Pin TypeScript to LTS',
dependencies: ['typescript'],
pinVersion: '5.3.3',
}
isBanned
Prevent packages from being used:
{
label: 'Ban deprecated packages',
dependencies: ['moment', 'request'],
isBanned: true,
}
isIgnored
Exclude from version checking:
{
label: 'Ignore local packages',
dependencyTypes: ['local'],
isIgnored: true,
}
Common Patterns
Monorepo Single Version Policy
export default {
versionGroups: [
{
label: 'Ignore local workspace packages',
dependencyTypes: ['local'],
isIgnored: true,
},
{
label: 'Use highest version for everything else',
preferVersion: 'highestSemver',
},
],
};
Framework Pinning
export default {
versionGroups: [
{
label: 'Pin React version across all packages',
dependencies: ['react', 'react-dom', '@types/react', '@types/react-dom'],
pinVersion: '18.2.0',
},
],
};
Different Rules for Apps vs Libraries
export default {
versionGroups: [
{
label: 'Apps can have any version',
packages: ['apps/**'],
isIgnored: true,
},
{
label: 'Libraries must have consistent versions',
packages: ['packages/**'],
preferVersion: 'highestSemver',
},
],
};
Ban Security Vulnerabilities
export default {
versionGroups: [
{
label: 'Ban packages with known vulnerabilities',
dependencies: [
'lodash',
'moment',
'request',
],
isBanned: true,
},
],
};
Peer Dependency Flexibility
export default {
versionGroups: [
{
label: 'Allow peer dependency flexibility',
dependencyTypes: ['peer'],
isIgnored: true,
},
{
label: 'Strict versions for prod/dev',
dependencyTypes: ['prod', 'dev'],
preferVersion: 'highestSemver',
},
],
};
Scoped Package Ownership
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',
},
],
};
CLI Commands for Version Groups
npx syncpack list-mismatches
npx syncpack fix
npx syncpack fix --dependencies react
npx syncpack fix --dependency-types prod,peer
Debugging Version Groups
Use labels and run with verbose output:
npx syncpack list-mismatches --log-levels warn,error
Order Matters
Version groups are evaluated in order. First matching group wins:
export default {
versionGroups: [
{ dependencies: ['react'], pinVersion: '18.2.0' },
{ preferVersion: 'highestSemver' },
],
};