@drawcall/market 0.1.26 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/asset-implementation.d.ts +1 -0
- package/dist/asset-implementation.d.ts.map +1 -1
- package/dist/cli.js +23 -15
- package/dist/cli.js.map +1 -1
- package/dist/commands/install.d.ts +8 -4
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +24 -59
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/preview.d.ts +0 -2
- package/dist/commands/preview.d.ts.map +1 -1
- package/dist/commands/preview.js +4 -6
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/upload.d.ts +18 -0
- package/dist/commands/upload.d.ts.map +1 -1
- package/dist/commands/upload.js +67 -3
- package/dist/commands/upload.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/contract.d.ts +3 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +11 -2
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +69 -19
- package/dist/install.js.map +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +6 -0
- package/dist/output.js.map +1 -1
- package/dist/resolve.d.ts +6 -3
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +66 -20
- package/dist/resolve.js.map +1 -1
- package/dist/schemas.d.ts +2 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +5 -0
- package/dist/schemas.js.map +1 -1
- package/dist/skill.d.ts +1 -1
- package/dist/skill.d.ts.map +1 -1
- package/dist/skill.js +19 -12
- package/dist/skill.js.map +1 -1
- package/package.json +1 -1
- package/src/asset-implementation.ts +1 -0
- package/src/cli.ts +44 -33
- package/src/commands/install.ts +30 -77
- package/src/commands/preview.ts +5 -10
- package/src/commands/upload.ts +79 -3
- package/src/config.ts +6 -0
- package/src/contract.ts +2 -0
- package/src/index.ts +1 -0
- package/src/install.ts +95 -19
- package/src/output.ts +9 -0
- package/src/resolve.ts +81 -22
- package/src/schemas.ts +6 -0
- package/src/skill.ts +19 -12
- package/tests/install-command.test.ts +13 -46
- package/tests/install-layout.test.ts +60 -2
- package/tests/output.test.ts +18 -0
- package/tests/resolve-skills.test.ts +87 -0
- package/tests/upload-deps.test.ts +44 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import assert from 'node:assert/strict'
|
|
2
|
+
import test from 'node:test'
|
|
3
|
+
import { resolve, ResolutionError } from '../src/resolve.js'
|
|
4
|
+
|
|
5
|
+
interface FakeAsset {
|
|
6
|
+
latestVersion: string
|
|
7
|
+
approved?: boolean
|
|
8
|
+
npmDependencies?: Record<string, string>
|
|
9
|
+
assetDependencies?: Record<string, string>
|
|
10
|
+
skillDependencies?: Record<string, string>
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function clientWith(assets: Record<string, FakeAsset>) {
|
|
14
|
+
return {
|
|
15
|
+
exact: async ({ name }: { name: string }) => {
|
|
16
|
+
const asset = assets[name]
|
|
17
|
+
if (!asset) return null
|
|
18
|
+
return {
|
|
19
|
+
name,
|
|
20
|
+
latestVersion: asset.latestVersion,
|
|
21
|
+
approved: asset.approved ?? true,
|
|
22
|
+
npmDependencies: JSON.stringify(asset.npmDependencies ?? {}),
|
|
23
|
+
assetDependencies: JSON.stringify(asset.assetDependencies ?? {}),
|
|
24
|
+
skillDependencies: JSON.stringify(asset.skillDependencies ?? {}),
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
} as never
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
test('resolve collects skill dependencies across transitive assets', async () => {
|
|
31
|
+
const client = clientWith({
|
|
32
|
+
root: {
|
|
33
|
+
latestVersion: '1.0.0',
|
|
34
|
+
assetDependencies: { dep: '*' },
|
|
35
|
+
skillDependencies: { 'web-design-guidelines': 'vercel-labs/agent-skills' },
|
|
36
|
+
},
|
|
37
|
+
dep: {
|
|
38
|
+
latestVersion: '2.0.0',
|
|
39
|
+
skillDependencies: { 'local-skill': './public/skills/local-skill' },
|
|
40
|
+
},
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
const result = await resolve(client, [{ name: 'root', range: '*' }])
|
|
44
|
+
|
|
45
|
+
assert.deepEqual(result.skillDependencies, {
|
|
46
|
+
'web-design-guidelines': 'vercel-labs/agent-skills',
|
|
47
|
+
'local-skill': './public/skills/local-skill',
|
|
48
|
+
})
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test('resolve unions identical skill sources without complaint', async () => {
|
|
52
|
+
const client = clientWith({
|
|
53
|
+
root: {
|
|
54
|
+
latestVersion: '1.0.0',
|
|
55
|
+
assetDependencies: { dep: '*' },
|
|
56
|
+
skillDependencies: { shared: 'vercel-labs/agent-skills' },
|
|
57
|
+
},
|
|
58
|
+
dep: {
|
|
59
|
+
latestVersion: '1.0.0',
|
|
60
|
+
skillDependencies: { shared: 'vercel-labs/agent-skills' },
|
|
61
|
+
},
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
const result = await resolve(client, [{ name: 'root', range: '*' }])
|
|
65
|
+
|
|
66
|
+
assert.deepEqual(result.skillDependencies, { shared: 'vercel-labs/agent-skills' })
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
test('resolve rejects the same skill label with conflicting sources', async () => {
|
|
70
|
+
const client = clientWith({
|
|
71
|
+
root: {
|
|
72
|
+
latestVersion: '1.0.0',
|
|
73
|
+
assetDependencies: { dep: '*' },
|
|
74
|
+
skillDependencies: { shared: 'vercel-labs/agent-skills' },
|
|
75
|
+
},
|
|
76
|
+
dep: {
|
|
77
|
+
latestVersion: '1.0.0',
|
|
78
|
+
skillDependencies: { shared: 'other-org/other-skills' },
|
|
79
|
+
},
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
await assert.rejects(
|
|
83
|
+
resolve(client, [{ name: 'root', range: '*' }]),
|
|
84
|
+
(err: unknown) =>
|
|
85
|
+
err instanceof ResolutionError && /skill dependency conflict for "shared"/u.test(err.message),
|
|
86
|
+
)
|
|
87
|
+
})
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import assert from 'node:assert/strict'
|
|
2
|
+
import test from 'node:test'
|
|
3
|
+
import { parseSkillDeps, parseVersionedDeps } from '../src/commands/upload.js'
|
|
4
|
+
|
|
5
|
+
test('parseVersionedDeps parses name@range and defaults a missing range to *', () => {
|
|
6
|
+
assert.deepEqual(parseVersionedDeps(['three@^0.178.0', 'gsap'], 'npm'), {
|
|
7
|
+
three: '^0.178.0',
|
|
8
|
+
gsap: '*',
|
|
9
|
+
})
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
test('parseVersionedDeps keeps the scope marker on scoped npm packages', () => {
|
|
13
|
+
assert.deepEqual(parseVersionedDeps(['@react-three/drei@^9.0.0', '@types/node'], 'npm'), {
|
|
14
|
+
'@react-three/drei': '^9.0.0',
|
|
15
|
+
'@types/node': '*',
|
|
16
|
+
})
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
test('parseVersionedDeps rejects duplicates', () => {
|
|
20
|
+
assert.throws(() => parseVersionedDeps(['three@^1', 'three@^2'], 'npm'), /Duplicate npm dependency/u)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test('parseSkillDeps splits label=source on the first = only', () => {
|
|
24
|
+
assert.deepEqual(
|
|
25
|
+
parseSkillDeps([
|
|
26
|
+
'web-design=vercel-labs/agent-skills/tree/main/skills/web-design-guidelines',
|
|
27
|
+
'local=./public/skills/local',
|
|
28
|
+
]),
|
|
29
|
+
{
|
|
30
|
+
'web-design': 'vercel-labs/agent-skills/tree/main/skills/web-design-guidelines',
|
|
31
|
+
local: './public/skills/local',
|
|
32
|
+
},
|
|
33
|
+
)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test('parseSkillDeps rejects specs without a usable label=source', () => {
|
|
37
|
+
assert.throws(() => parseSkillDeps(['no-separator']), /Use label=source/u)
|
|
38
|
+
assert.throws(() => parseSkillDeps(['=missing-label']), /Use label=source/u)
|
|
39
|
+
assert.throws(() => parseSkillDeps(['missing-source=']), /Use label=source/u)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test('parseSkillDeps rejects duplicate labels', () => {
|
|
43
|
+
assert.throws(() => parseSkillDeps(['a=one', 'a=two']), /Duplicate skill dependency "a"/u)
|
|
44
|
+
})
|