diff --git a/package-lock.json b/package-lock.json index 0a7789a..0135e2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,16 +16,17 @@ "@deepseek-ai/dsh-llm": "0.1.5-rc.3", "@deepseek-ai/dsh-skill": "0.1.5-rc.3", "@deepseek-ai/dsh-tools": "0.1.5-rc.3", - "@deepseek-ai/schemastery": "3.18.2" + "@deepseek-ai/schemastery": "3.18.2", + "semver": "7.6.3" }, "engines": { "node": ">=22.13.0" }, "peerDependencies": { - "@deepseek-ai/cordis": "^4.0.1-rc.1", - "@deepseek-ai/dsh-llm": ">=0.1.5-0", - "@deepseek-ai/dsh-skill": ">=0.1.5-0", - "@deepseek-ai/dsh-tools": ">=0.1.5-0", + "@deepseek-ai/cordis": "^4.0.1-rc.1 || ^4.0.5-0", + "@deepseek-ai/dsh-llm": ">=0.1.5-0 || >=0.2.0-0 || >=0.2.1-0", + "@deepseek-ai/dsh-skill": ">=0.1.5-0 || >=0.2.0-0 || >=0.2.1-0", + "@deepseek-ai/dsh-tools": ">=0.1.5-0 || >=0.2.0-0 || >=0.2.1-0", "@deepseek-ai/schemastery": "^3.18.2" }, "peerDependenciesMeta": { @@ -735,6 +736,19 @@ "node": ">=0.10.0" } }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ulid": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.4.0.tgz", diff --git a/package.json b/package.json index 5ea1c1d..769b572 100644 --- a/package.json +++ b/package.json @@ -43,10 +43,10 @@ "sync-profile": "bash scripts/sync-dsh-profile.sh" }, "peerDependencies": { - "@deepseek-ai/cordis": "^4.0.1-rc.1", - "@deepseek-ai/dsh-llm": ">=0.1.5-0", - "@deepseek-ai/dsh-skill": ">=0.1.5-0", - "@deepseek-ai/dsh-tools": ">=0.1.5-0", + "@deepseek-ai/cordis": "^4.0.1-rc.1 || ^4.0.5-0", + "@deepseek-ai/dsh-llm": ">=0.1.5-0 || >=0.2.0-0 || >=0.2.1-0", + "@deepseek-ai/dsh-skill": ">=0.1.5-0 || >=0.2.0-0 || >=0.2.1-0", + "@deepseek-ai/dsh-tools": ">=0.1.5-0 || >=0.2.0-0 || >=0.2.1-0", "@deepseek-ai/schemastery": "^3.18.2" }, "peerDependenciesMeta": { @@ -71,7 +71,8 @@ "@deepseek-ai/dsh-llm": "0.1.5-rc.3", "@deepseek-ai/dsh-skill": "0.1.5-rc.3", "@deepseek-ai/dsh-tools": "0.1.5-rc.3", - "@deepseek-ai/schemastery": "3.18.2" + "@deepseek-ai/schemastery": "3.18.2", + "semver": "7.6.3" }, "dsh": { "bundle": { diff --git a/test/peer-ranges.test.js b/test/peer-ranges.test.js new file mode 100644 index 0000000..e6986a4 --- /dev/null +++ b/test/peer-ranges.test.js @@ -0,0 +1,30 @@ +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { test } from 'node:test'; + +import semver from 'semver'; + +const { peerDependencies } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')); +const DSH_PACKAGES = ['@deepseek-ai/dsh-llm', '@deepseek-ai/dsh-skill', '@deepseek-ai/dsh-tools']; + +// npm and pnpm check peers without includePrerelease, so a prerelease only +// matches a comparator on its own major.minor.patch: every dsh line needs a branch. +const accepts = (version, range) => semver.satisfies(version, range); + +test('dsh peers accept every dsh line the plugin runs on, prereleases included', () => { + for (const version of ['0.1.5-rc.3', '0.1.5', '0.2.0-rc.2', '0.2.0', '0.2.1-alpha.5', '0.2.1-rc.2', '0.2.1']) { + for (const name of DSH_PACKAGES) assert.equal(accepts(version, peerDependencies[name]), true, `${name}@${version}`); + } +}); + +test('dsh peers still refuse lines older than 0.1.5', () => { + for (const version of ['0.1.1-rc.2', '0.1.4']) { + for (const name of DSH_PACKAGES) assert.equal(accepts(version, peerDependencies[name]), false, `${name}@${version}`); + } +}); + +test('the cordis peer accepts the cordis each dsh line pins', () => { + for (const version of ['4.0.1-rc.4', '4.0.4', '4.0.5-alpha.2', '4.0.5']) { + assert.equal(accepts(version, peerDependencies['@deepseek-ai/cordis']), true, version); + } +});