@drawcall/market 0.1.35 → 0.1.36
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/README.md +2 -2
- package/dist/asset-implementation.d.ts +10 -7
- package/dist/asset-implementation.d.ts.map +1 -1
- package/dist/asset-implementation.js +8 -1
- package/dist/asset-implementation.js.map +1 -1
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/install.d.ts +3 -4
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +57 -11
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/upload.d.ts.map +1 -1
- package/dist/commands/upload.js +64 -2
- package/dist/commands/upload.js.map +1 -1
- package/dist/contract.d.ts +7 -1
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +1 -1
- package/dist/contract.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +14 -0
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +133 -23
- package/dist/install.js.map +1 -1
- package/dist/market-lock.d.ts +17 -0
- package/dist/market-lock.d.ts.map +1 -0
- package/dist/market-lock.js +44 -0
- package/dist/market-lock.js.map +1 -0
- package/dist/output.d.ts +2 -2
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +5 -2
- package/dist/output.js.map +1 -1
- package/dist/package-json.d.ts +11 -0
- package/dist/package-json.d.ts.map +1 -0
- package/dist/package-json.js +23 -0
- package/dist/package-json.js.map +1 -0
- package/dist/skill.d.ts +1 -1
- package/dist/skill.d.ts.map +1 -1
- package/dist/skill.js +4 -2
- package/dist/skill.js.map +1 -1
- package/package.json +1 -1
- package/src/asset-implementation.ts +18 -6
- package/src/cli.ts +16 -9
- package/src/commands/install.ts +76 -16
- package/src/commands/upload.ts +84 -2
- package/src/contract.ts +8 -1
- package/src/index.ts +9 -0
- package/src/install.ts +197 -35
- package/src/market-lock.ts +65 -0
- package/src/output.ts +7 -3
- package/src/package-json.ts +37 -0
- package/src/skill.ts +4 -2
- package/tests/install-command.test.ts +23 -1
- package/tests/install-layout.test.ts +117 -0
- package/tests/output.test.ts +19 -2
package/dist/install.js
CHANGED
|
@@ -14,21 +14,40 @@ import * as fs from 'fs/promises';
|
|
|
14
14
|
import * as path from 'path';
|
|
15
15
|
import { unzipSync } from 'fflate';
|
|
16
16
|
import { detectPackageManager, installDependencies } from 'nypm';
|
|
17
|
+
import { readMarketLock, sha256, writeMarketLock } from './market-lock.js';
|
|
18
|
+
import { parsePackageJson } from './package-json.js';
|
|
17
19
|
export async function install(client, resolution, opts = {}) {
|
|
18
20
|
const log = opts.onProgress ?? (() => { });
|
|
19
21
|
const installRoot = await findInstallRoot(opts.cwd ?? process.cwd());
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
const metadata = opts.installMetadata ?? {};
|
|
23
|
+
const download = await downloadAssets(client, resolution, installRoot, {
|
|
24
|
+
force: opts.force ?? false,
|
|
25
|
+
log,
|
|
26
|
+
});
|
|
27
|
+
await writeInstalledAssetLock(installRoot, download.assets);
|
|
28
|
+
const packageJsonUpdate = await updatePackageJson(resolution, installRoot, {
|
|
29
|
+
rootRequests: opts.rootRequests ?? [],
|
|
30
|
+
installMetadata: metadata,
|
|
31
|
+
packageManagerNeeded: download.wrotePackageJson,
|
|
32
|
+
});
|
|
33
|
+
if (packageJsonUpdate.packageManagerNeeded) {
|
|
34
|
+
await runPackageManagerInstall(installRoot, log);
|
|
35
|
+
}
|
|
24
36
|
// Skills are installed after asset files land on disk: a skill source may be
|
|
25
37
|
// a local path pointing at a skill directory shipped inside an installed
|
|
26
38
|
// asset, which only exists once downloadAssets has completed.
|
|
27
39
|
const skillDependencies = await installSkills(resolution, installRoot, log, opts.runSkillAdd ?? defaultRunSkillAdd);
|
|
28
40
|
return {
|
|
29
|
-
assets
|
|
41
|
+
assets: download.assets.map((asset) => ({
|
|
42
|
+
name: asset.name,
|
|
43
|
+
type: asset.type,
|
|
44
|
+
version: asset.version,
|
|
45
|
+
description: asset.description,
|
|
46
|
+
files: asset.files,
|
|
47
|
+
})),
|
|
30
48
|
npmDependencies: resolution.npmDependencies,
|
|
31
49
|
skillDependencies,
|
|
50
|
+
warnings: download.warnings,
|
|
32
51
|
};
|
|
33
52
|
}
|
|
34
53
|
export async function findInstallRoot(cwd = process.cwd()) {
|
|
@@ -42,13 +61,16 @@ export async function findInstallRoot(cwd = process.cwd()) {
|
|
|
42
61
|
}
|
|
43
62
|
}
|
|
44
63
|
}
|
|
45
|
-
async function downloadAssets(client, resolution, projectRoot,
|
|
64
|
+
async function downloadAssets(client, resolution, projectRoot, opts) {
|
|
46
65
|
const installedAssets = [];
|
|
66
|
+
const warnings = [];
|
|
67
|
+
let wrotePackageJson = false;
|
|
47
68
|
for (const asset of resolution.assets) {
|
|
48
|
-
log(`Downloading ${asset.name}@${asset.version}...`);
|
|
69
|
+
opts.log(`Downloading ${asset.name}@${asset.version}...`);
|
|
49
70
|
const zip = await client.asset.downloadZip({ name: asset.name, version: asset.version });
|
|
50
71
|
const files = unzipSync(new Uint8Array(await zip.arrayBuffer()));
|
|
51
72
|
const installedFiles = [];
|
|
73
|
+
const fileHashes = {};
|
|
52
74
|
for (const [relativePath, content] of Object.entries(files)) {
|
|
53
75
|
const zipPath = relativePath.replace(/\\/g, '/');
|
|
54
76
|
if (zipPath.split('/').includes('..') ||
|
|
@@ -58,14 +80,25 @@ async function downloadAssets(client, resolution, projectRoot, log) {
|
|
|
58
80
|
}
|
|
59
81
|
const normalizedPath = path.posix.normalize(zipPath);
|
|
60
82
|
if (normalizedPath === '.' ||
|
|
61
|
-
normalizedPath === 'README.md' ||
|
|
83
|
+
(normalizedPath === 'README.md' && asset.type !== 'template') ||
|
|
62
84
|
normalizedPath.endsWith('/')) {
|
|
63
85
|
continue;
|
|
64
86
|
}
|
|
65
87
|
const filePath = path.join(projectRoot, normalizedPath);
|
|
66
|
-
await
|
|
67
|
-
|
|
88
|
+
const existing = await maybeReadFile(filePath);
|
|
89
|
+
if (existing && !bytesEqual(existing, content) && !opts.force) {
|
|
90
|
+
warnings.push(`Skipped ${normalizedPath} from ${asset.name}@${asset.version}; file already exists. Re-run with --force to overwrite.`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (!existing || !bytesEqual(existing, content)) {
|
|
94
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
95
|
+
await fs.writeFile(filePath, content);
|
|
96
|
+
if (normalizedPath === 'package.json') {
|
|
97
|
+
wrotePackageJson = true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
68
100
|
installedFiles.push(normalizedPath);
|
|
101
|
+
fileHashes[normalizedPath] = { sha256: sha256(content) };
|
|
69
102
|
}
|
|
70
103
|
installedAssets.push({
|
|
71
104
|
name: asset.name,
|
|
@@ -73,10 +106,11 @@ async function downloadAssets(client, resolution, projectRoot, log) {
|
|
|
73
106
|
version: asset.version,
|
|
74
107
|
description: asset.description,
|
|
75
108
|
files: installedFiles,
|
|
109
|
+
fileHashes,
|
|
76
110
|
});
|
|
77
|
-
log(`Downloaded ${installedFiles.length} files.`);
|
|
111
|
+
opts.log(`Downloaded ${installedFiles.length} files.`);
|
|
78
112
|
}
|
|
79
|
-
return installedAssets;
|
|
113
|
+
return { assets: installedAssets, wrotePackageJson, warnings };
|
|
80
114
|
}
|
|
81
115
|
async function isFile(file) {
|
|
82
116
|
try {
|
|
@@ -86,25 +120,101 @@ async function isFile(file) {
|
|
|
86
120
|
return false;
|
|
87
121
|
}
|
|
88
122
|
}
|
|
89
|
-
async function
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
123
|
+
async function maybeReadFile(file) {
|
|
124
|
+
try {
|
|
125
|
+
return await fs.readFile(file);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (isMissingFile(error))
|
|
129
|
+
return null;
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function isMissingFile(error) {
|
|
134
|
+
return error instanceof Error && 'code' in error && error.code === 'ENOENT';
|
|
135
|
+
}
|
|
136
|
+
async function updatePackageJson(resolution, projectRoot, opts) {
|
|
93
137
|
const pkgPath = path.join(projectRoot, 'package.json');
|
|
94
|
-
// Only synthesize a package.json when none exists. A malformed existing file
|
|
95
|
-
// is a real error that must surface — never silently overwrite it.
|
|
96
138
|
const pkg = (await isFile(pkgPath))
|
|
97
|
-
?
|
|
98
|
-
:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
139
|
+
? parsePackageJson(await fs.readFile(pkgPath, 'utf-8'), pkgPath)
|
|
140
|
+
: defaultPackageJson();
|
|
141
|
+
let changed = false;
|
|
142
|
+
let packageManagerNeeded = opts.packageManagerNeeded;
|
|
143
|
+
const npmChanged = mergeRecord(pkg, 'dependencies', resolution.npmDependencies);
|
|
144
|
+
if (npmChanged) {
|
|
145
|
+
changed = true;
|
|
146
|
+
packageManagerNeeded = true;
|
|
147
|
+
}
|
|
148
|
+
const assetDependencies = assetDependenciesToSave(resolution, opts.rootRequests, opts.installMetadata);
|
|
149
|
+
if (mergeRecord(pkg, 'assetDependencies', assetDependencies)) {
|
|
150
|
+
changed = true;
|
|
151
|
+
}
|
|
152
|
+
if (changed) {
|
|
153
|
+
await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
|
|
154
|
+
}
|
|
155
|
+
return { packageManagerNeeded };
|
|
156
|
+
}
|
|
157
|
+
async function runPackageManagerInstall(projectRoot, log) {
|
|
158
|
+
log('Installing npm dependencies...');
|
|
102
159
|
const pm = await detectPackageManager(projectRoot);
|
|
103
160
|
const pmName = pm?.name ?? 'npm';
|
|
104
161
|
log(`Using ${pmName}...`);
|
|
105
162
|
await installDependencies({ cwd: projectRoot, packageManager: { name: pmName, command: pmName } });
|
|
106
163
|
log('npm dependencies installed.');
|
|
107
164
|
}
|
|
165
|
+
async function writeInstalledAssetLock(projectRoot, assets) {
|
|
166
|
+
const lock = await readMarketLock(projectRoot);
|
|
167
|
+
for (const asset of assets) {
|
|
168
|
+
lock.assets[asset.name] = {
|
|
169
|
+
version: asset.version,
|
|
170
|
+
type: asset.type,
|
|
171
|
+
files: asset.fileHashes,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
await writeMarketLock(projectRoot, lock);
|
|
175
|
+
}
|
|
176
|
+
function defaultPackageJson() {
|
|
177
|
+
return { name: 'my-project', private: true, dependencies: {} };
|
|
178
|
+
}
|
|
179
|
+
function mergeRecord(pkg, field, values) {
|
|
180
|
+
const entries = Object.entries(values);
|
|
181
|
+
if (entries.length === 0)
|
|
182
|
+
return false;
|
|
183
|
+
const current = pkg[field] ?? {};
|
|
184
|
+
let changed = false;
|
|
185
|
+
for (const [name, range] of entries) {
|
|
186
|
+
if (current[name] === range)
|
|
187
|
+
continue;
|
|
188
|
+
current[name] = range;
|
|
189
|
+
changed = true;
|
|
190
|
+
}
|
|
191
|
+
pkg[field] = current;
|
|
192
|
+
return changed;
|
|
193
|
+
}
|
|
194
|
+
function assetDependenciesToSave(resolution, rootRequests, metadata) {
|
|
195
|
+
const resolvedByName = new Map(resolution.assets.map((asset) => [asset.name, asset]));
|
|
196
|
+
const out = {};
|
|
197
|
+
for (const request of rootRequests) {
|
|
198
|
+
if (!request.save)
|
|
199
|
+
continue;
|
|
200
|
+
const asset = resolvedByName.get(request.name);
|
|
201
|
+
if (!asset)
|
|
202
|
+
continue;
|
|
203
|
+
if ((metadata[asset.type]?.saveOnInstall ?? true) === false)
|
|
204
|
+
continue;
|
|
205
|
+
out[asset.name] = request.saveRange;
|
|
206
|
+
}
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
function bytesEqual(a, b) {
|
|
210
|
+
if (a.length !== b.length)
|
|
211
|
+
return false;
|
|
212
|
+
for (let i = 0; i < a.length; i += 1) {
|
|
213
|
+
if (a[i] !== b[i])
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
108
218
|
async function installSkills(resolution, projectRoot, log, runSkillAdd) {
|
|
109
219
|
const skills = resolution.skillDependencies ?? {};
|
|
110
220
|
const entries = Object.entries(skills);
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const MARKET_LOCK_PATH = ".drawcall/market-lock.json";
|
|
2
|
+
export interface MarketLockAsset {
|
|
3
|
+
version: string;
|
|
4
|
+
type: string;
|
|
5
|
+
files: Record<string, {
|
|
6
|
+
sha256: string;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
export interface MarketLock {
|
|
10
|
+
version: 1;
|
|
11
|
+
assets: Record<string, MarketLockAsset>;
|
|
12
|
+
}
|
|
13
|
+
export declare function readMarketLock(projectRoot: string): Promise<MarketLock>;
|
|
14
|
+
export declare function writeMarketLock(projectRoot: string, lock: MarketLock): Promise<void>;
|
|
15
|
+
export declare function emptyMarketLock(): MarketLock;
|
|
16
|
+
export declare function sha256(bytes: Uint8Array): string;
|
|
17
|
+
//# sourceMappingURL=market-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market-lock.d.ts","sourceRoot":"","sources":["../src/market-lock.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB,+BAA+B,CAAA;AAE5D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAA;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CACxC;AAmBD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ7E;AAED,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1F;AAED,wBAAgB,eAAe,IAAI,UAAU,CAK5C;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEhD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import * as fs from 'fs/promises';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
export const MARKET_LOCK_PATH = '.drawcall/market-lock.json';
|
|
6
|
+
const marketLockSchema = z.object({
|
|
7
|
+
version: z.literal(1),
|
|
8
|
+
assets: z.record(z.string(), z.object({
|
|
9
|
+
version: z.string(),
|
|
10
|
+
type: z.string(),
|
|
11
|
+
files: z.record(z.string(), z.object({
|
|
12
|
+
sha256: z.string(),
|
|
13
|
+
})),
|
|
14
|
+
})),
|
|
15
|
+
});
|
|
16
|
+
export async function readMarketLock(projectRoot) {
|
|
17
|
+
const lockPath = path.join(projectRoot, MARKET_LOCK_PATH);
|
|
18
|
+
try {
|
|
19
|
+
return marketLockSchema.parse(JSON.parse(await fs.readFile(lockPath, 'utf-8')));
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (isMissingFile(error))
|
|
23
|
+
return emptyMarketLock();
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function writeMarketLock(projectRoot, lock) {
|
|
28
|
+
const lockPath = path.join(projectRoot, MARKET_LOCK_PATH);
|
|
29
|
+
await fs.mkdir(path.dirname(lockPath), { recursive: true });
|
|
30
|
+
await fs.writeFile(lockPath, JSON.stringify(lock, null, 2) + '\n');
|
|
31
|
+
}
|
|
32
|
+
export function emptyMarketLock() {
|
|
33
|
+
return {
|
|
34
|
+
version: 1,
|
|
35
|
+
assets: {},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function sha256(bytes) {
|
|
39
|
+
return createHash('sha256').update(bytes).digest('hex');
|
|
40
|
+
}
|
|
41
|
+
function isMissingFile(error) {
|
|
42
|
+
return error instanceof Error && 'code' in error && error.code === 'ENOENT';
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=market-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market-lock.js","sourceRoot":"","sources":["../src/market-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAA;AAa5D,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,CAAC,CAAC,MAAM,CACd,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CACb,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;SACnB,CAAC,CACH;KACF,CAAC,CACH;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;IACzD,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IACjF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO,eAAe,EAAE,CAAA;QAClD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB,EAAE,IAAgB;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;IACzD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;AACpE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,EAAE;KACX,CAAA;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAiB;IACtC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAA;AAC7E,CAAC"}
|
package/dist/output.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AssetSearchResult } from './contract.js';
|
|
1
|
+
import type { AssetInstallMetadata, AssetSearchResult } from './contract.js';
|
|
2
2
|
import type { InstallResult } from './install.js';
|
|
3
3
|
export declare function assetVersionRef(name: string, version?: string): string;
|
|
4
4
|
export declare function assetApproval(approved: boolean): 'approved' | 'unapproved';
|
|
@@ -10,7 +10,7 @@ export declare function searchSummary(input: {
|
|
|
10
10
|
total: number;
|
|
11
11
|
}): string;
|
|
12
12
|
export declare function assetSearchResultLine(item: AssetSearchResult): string;
|
|
13
|
-
export declare function installResult(result: InstallResult,
|
|
13
|
+
export declare function installResult(result: InstallResult, installMetadata?: Record<string, AssetInstallMetadata>): string;
|
|
14
14
|
export declare function generatedInstallResult(name: string, version: string): string;
|
|
15
15
|
export declare function uploadResult(name: string, version: string): string;
|
|
16
16
|
export declare function unchangedUploadResult(name: string, version: string): string;
|
package/dist/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,GAAG,YAAY,CAE1E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,iBAAiB,EAAE,OAAO,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,MAAM,CAOT;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAKrE;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,eAAe,GAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAM,GACzD,MAAM,CA0CR;AAqBD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,MAAM,CAGvD"}
|
package/dist/output.js
CHANGED
|
@@ -16,7 +16,7 @@ export function assetSearchResultLine(item) {
|
|
|
16
16
|
const description = item.description ? ` | ${normalizeInline(item.description)}` : '';
|
|
17
17
|
return `- ${assetVersionRef(item.name, item.latestVersion)} | ${item.type} | ${assetApproval(item.approved)}${description}`;
|
|
18
18
|
}
|
|
19
|
-
export function installResult(result,
|
|
19
|
+
export function installResult(result, installMetadata = {}) {
|
|
20
20
|
const npmDependencies = Object.entries(result.npmDependencies);
|
|
21
21
|
const lines = ['Installed:'];
|
|
22
22
|
for (const asset of result.assets) {
|
|
@@ -28,7 +28,7 @@ export function installResult(result, postInstallMessages = {}) {
|
|
|
28
28
|
if (files.length > 0) {
|
|
29
29
|
lines.push(' files:', ...indent(fileTree(files), ' '));
|
|
30
30
|
}
|
|
31
|
-
const message =
|
|
31
|
+
const message = installMetadata[asset.type]?.installMessage;
|
|
32
32
|
if (message) {
|
|
33
33
|
lines.push(...block(' note: ', message));
|
|
34
34
|
}
|
|
@@ -44,6 +44,9 @@ export function installResult(result, postInstallMessages = {}) {
|
|
|
44
44
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
45
45
|
.map(([label, source]) => `- ${label} ← ${source} (skill)`));
|
|
46
46
|
}
|
|
47
|
+
if (result.warnings.length > 0) {
|
|
48
|
+
lines.push('Warnings:', ...result.warnings.map((warning) => `- ${warning}`));
|
|
49
|
+
}
|
|
47
50
|
return lines.join('\n');
|
|
48
51
|
}
|
|
49
52
|
function block(label, message, width = 68) {
|
package/dist/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAgB;IAC5D,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAiB;IAC7C,OAAO,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAM7B;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAA;IAC7E,MAAM,KAAK,GAAG,UAAU,KAAK,CAAC,KAAK,UAAU,KAAK,CAAC,IAAI,aAAa,QAAQ,EAAE,CAAA;IAC9E,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,eAAe,KAAK,EAAE,CAAA;IAC/B,CAAC;IACD,OAAO,YAAY,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,EAAE,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAuB;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACrF,OAAO,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,aAAa,CAC1F,IAAI,CAAC,QAAQ,CACd,GAAG,WAAW,EAAE,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface PackageJson {
|
|
2
|
+
name?: string;
|
|
3
|
+
private?: boolean;
|
|
4
|
+
dependencies?: Record<string, string>;
|
|
5
|
+
assetDependencies?: Record<string, string>;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
export declare function packageJsonAssetDependenciesFromFiles(files: Record<string, Uint8Array>): Record<string, string>;
|
|
9
|
+
export declare function packageJsonAssetDependencies(json: string, source: string): Record<string, string>;
|
|
10
|
+
export declare function parsePackageJson(json: string, source: string): PackageJson;
|
|
11
|
+
//# sourceMappingURL=package-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../src/package-json.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAID,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKxB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMjG;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CAO1E"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const stringRecordSchema = z.record(z.string(), z.string());
|
|
3
|
+
export function packageJsonAssetDependenciesFromFiles(files) {
|
|
4
|
+
const bytes = files['package.json'];
|
|
5
|
+
if (!bytes)
|
|
6
|
+
return {};
|
|
7
|
+
return packageJsonAssetDependencies(new TextDecoder().decode(bytes), 'package.json');
|
|
8
|
+
}
|
|
9
|
+
export function packageJsonAssetDependencies(json, source) {
|
|
10
|
+
const parsed = parsePackageJson(json, source);
|
|
11
|
+
const dependencies = parsed.assetDependencies;
|
|
12
|
+
if (dependencies === undefined)
|
|
13
|
+
return {};
|
|
14
|
+
return stringRecordSchema.parse(dependencies);
|
|
15
|
+
}
|
|
16
|
+
export function parsePackageJson(json, source) {
|
|
17
|
+
const parsed = JSON.parse(json);
|
|
18
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
19
|
+
throw new Error(`${source} must contain a JSON object`);
|
|
20
|
+
}
|
|
21
|
+
return parsed;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=package-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../src/package-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAUvB,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;AAE3D,MAAM,UAAU,qCAAqC,CACnD,KAAiC;IAEjC,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,CAAA;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAA;IAErB,OAAO,4BAA4B,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,CAAA;AACtF,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAY,EAAE,MAAc;IACvE,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAA;IAC7C,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAEzC,OAAO,kBAAkB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAc;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAA;IAC1C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,6BAA6B,CAAC,CAAA;IACzD,CAAC;IAED,OAAO,MAAqB,CAAA;AAC9B,CAAC"}
|
package/dist/skill.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const marketSkill = "---\nname: market\ndescription: Find, preview, install, generate, and publish Drawcall Market assets from a coding agent.\n---\n\n# Drawcall Market\n\nUse the `market` CLI. Keep commands short and read the summary lines.\n\n## Quick Start\n\n```sh\nmarket search \"wooden chair\" --type model --limit 3\nmarket install wooden-chair --cwd \"$PWD\"\nmarket preview wooden-chair --out /tmp/wooden-chair.png\n```\n\n## Workflow\n\n1. Search first unless the user already gave an exact asset name. `search` requires `--type`; use `model` unless the user names another supported type: `humanoid-model`, `texture`, `humanoid-animation`, `template`, `sound-effect`, `background-music`, `environment`, or `flipbook`.\n2. Use `--limit 1` for lookup, `--limit 3` for choice. Search caps at 5 and prints full descriptions.\n3. `install` takes
|
|
1
|
+
export declare const marketSkill = "---\nname: market\ndescription: Find, preview, install, generate, and publish Drawcall Market assets from a coding agent.\n---\n\n# Drawcall Market\n\nUse the `market` CLI. Keep commands short and read the summary lines.\n\n## Quick Start\n\n```sh\nmarket search \"wooden chair\" --type model --limit 3\nmarket install wooden-chair --cwd \"$PWD\"\nmarket preview wooden-chair --out /tmp/wooden-chair.png\n```\n\n## Workflow\n\n1. Search first unless the user already gave an exact asset name. `search` requires `--type`; use `model` unless the user names another supported type: `humanoid-model`, `texture`, `humanoid-animation`, `template`, `sound-effect`, `background-music`, `environment`, or `flipbook`.\n2. Use `--limit 1` for lookup, `--limit 3` for choice. Search caps at 5 and prints full descriptions.\n3. `install` takes zero or more exact asset names (optionally `name@range`). With names, it installs those assets; with no names, it installs `assetDependencies` from the nearest `package.json`. It does not search or generate. Find names with `search` first. No `--type` is needed \u2014 asset names are unique. Use `--force` only when the user agrees to overwrite changed local files.\n4. `preview <name>` saves the preview image; no `--type` is needed. Not every type has previews (e.g. `humanoid-animation`, `template`, `sound-effect`, `background-music`); the CLI reports when one is unavailable.\n5. Use `--unapproved` only when the user asks for unapproved/private/admin assets. Do not install unapproved assets without explicit acceptance.\n6. `generate --type <type> \"<prompt>\"` creates a new asset; it requires login and a type that supports generation. No asset type currently supports generation.\n7. Upload only when publishing is requested: `market upload <name> <zip> \"<description>\" --type <type>`. Declare dependencies with repeatable flags: `--npm name@range`, `--asset name@range`, `--skill label=source`. Template uploads also read root `package.json.assetDependencies`; `--asset` flags are additive and must not conflict. Template upload omits installed dependency files whose hashes still match `.drawcall/market-lock.json`, so edited local files stay in the template. A skill source is a `skills add` argument: a whole repo (`owner/repo` or a git URL), a single skill via the full URL form `https://github.com/owner/repo/tree/<branch>/<subpath>` (the `tree/<branch>/<subpath>` shorthand needs the full URL, not `owner/repo`), or a local path to a skill directory inside the zip. Example: `market upload my-scene scene.zip \"A scene\" --type model --npm three@^0.178.0 --skill web-design=https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design-guidelines`.\n8. Installed `environment` assets contain `public/environment/<name>.hdr` for Three.js IBL lighting and `public/environment/<name>-background.webp` for the visible equirectangular background. Use `market preview` to fetch the preview image separately.\n9. Installed `flipbook` assets contain `public/flipbook/<name>.ktx2`. Render them with `@drawcall/flipbook`'s `Flipbook` class and Three.js `KTX2Loader` for Basis-compressed files; `market preview` fetches the middle frame from the flipbook.\n\n## Humanoid animations\n\n`humanoid-animation` assets are single-clip GLBs \u2014 one motion per asset (one idle, one walk-forward, one jump, one attack) on a normalized skeleton that retargets onto any humanoid, whatever its role. A behaving character is therefore a *set* of clips, not one asset: from what the character actually does, budget the clips it needs \u2014 an idle, its locomotion (walk/run, often split by direction: fwd/bwd/left/right), and one clip per distinct action and reaction it performs \u2014 then search for each separately.\n\nSearch one motion per query, named by the motion, because results rank by keyword overlap: a query naming several motions at once is dominated by whichever word matches the most assets and buries the others, so real clips look like a gap when they exist. Names describe the motion, not the character \u2014 so search the motion (`\"walk forward\"`, `\"reload\"`, `\"jump\"`), not the role (`\"player run\"`, `\"boss attack\"`). If a motion finds nothing, retry with synonyms (run/jog/sprint, attack/swing/strike).\n\n## Output\n\nCommands print concise, line-oriented summaries:\n\n```text\nResults: 2/8 query=\"wooden chair\" type=model approval=approved\n- wooden-chair@1.0.0 | model | approved | Low-poly wooden chair\nInstalled:\n- wooden-chair@1.0.0 (asset)\n description: Low-poly wooden chair\n files:\n public/model\n \u2514\u2500 wooden-chair.glb\n- three@^0.178.0 (npm)\n- web-design \u2190 https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design-guidelines (skill)\nSaved preview for wooden-chair@1.0.0: /tmp/wooden-chair.png\n```\n\nAssets may also declare `skill` dependencies, installed for you via the `skills` CLI (`skills add`) during `install`. Sources are either a GitHub/git ref or a local path to a skill directory shipped inside the asset. This requires `npx` to be available.\n\nInstalled non-template assets are saved to `package.json.assetDependencies`; templates are scaffolds and are not saved as project asset dependencies. Exact installed versions and file hashes are recorded in `.drawcall/market-lock.json`.\n\nIf search returns no results, try one broader noun phrase. If a command returns `Error: Not logged in...`, ask before running `market login`.\n";
|
|
2
2
|
//# sourceMappingURL=skill.d.ts.map
|
package/dist/skill.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,q2KA0DvB,CAAA"}
|
package/dist/skill.js
CHANGED
|
@@ -19,11 +19,11 @@ market preview wooden-chair --out /tmp/wooden-chair.png
|
|
|
19
19
|
|
|
20
20
|
1. Search first unless the user already gave an exact asset name. \`search\` requires \`--type\`; use \`model\` unless the user names another supported type: \`humanoid-model\`, \`texture\`, \`humanoid-animation\`, \`template\`, \`sound-effect\`, \`background-music\`, \`environment\`, or \`flipbook\`.
|
|
21
21
|
2. Use \`--limit 1\` for lookup, \`--limit 3\` for choice. Search caps at 5 and prints full descriptions.
|
|
22
|
-
3. \`install\` takes
|
|
22
|
+
3. \`install\` takes zero or more exact asset names (optionally \`name@range\`). With names, it installs those assets; with no names, it installs \`assetDependencies\` from the nearest \`package.json\`. It does not search or generate. Find names with \`search\` first. No \`--type\` is needed — asset names are unique. Use \`--force\` only when the user agrees to overwrite changed local files.
|
|
23
23
|
4. \`preview <name>\` saves the preview image; no \`--type\` is needed. Not every type has previews (e.g. \`humanoid-animation\`, \`template\`, \`sound-effect\`, \`background-music\`); the CLI reports when one is unavailable.
|
|
24
24
|
5. Use \`--unapproved\` only when the user asks for unapproved/private/admin assets. Do not install unapproved assets without explicit acceptance.
|
|
25
25
|
6. \`generate --type <type> "<prompt>"\` creates a new asset; it requires login and a type that supports generation. No asset type currently supports generation.
|
|
26
|
-
7. Upload only when publishing is requested: \`market upload <name> <zip> "<description>" --type <type>\`. Declare dependencies with repeatable flags: \`--npm name@range\`, \`--asset name@range\`, \`--skill label=source\`. A skill source is a \`skills add\` argument: a whole repo (\`owner/repo\` or a git URL), a single skill via the full URL form \`https://github.com/owner/repo/tree/<branch>/<subpath>\` (the \`tree/<branch>/<subpath>\` shorthand needs the full URL, not \`owner/repo\`), or a local path to a skill directory inside the zip. Example: \`market upload my-scene scene.zip "A scene" --type model --npm three@^0.178.0 --skill web-design=https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design-guidelines\`.
|
|
26
|
+
7. Upload only when publishing is requested: \`market upload <name> <zip> "<description>" --type <type>\`. Declare dependencies with repeatable flags: \`--npm name@range\`, \`--asset name@range\`, \`--skill label=source\`. Template uploads also read root \`package.json.assetDependencies\`; \`--asset\` flags are additive and must not conflict. Template upload omits installed dependency files whose hashes still match \`.drawcall/market-lock.json\`, so edited local files stay in the template. A skill source is a \`skills add\` argument: a whole repo (\`owner/repo\` or a git URL), a single skill via the full URL form \`https://github.com/owner/repo/tree/<branch>/<subpath>\` (the \`tree/<branch>/<subpath>\` shorthand needs the full URL, not \`owner/repo\`), or a local path to a skill directory inside the zip. Example: \`market upload my-scene scene.zip "A scene" --type model --npm three@^0.178.0 --skill web-design=https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design-guidelines\`.
|
|
27
27
|
8. Installed \`environment\` assets contain \`public/environment/<name>.hdr\` for Three.js IBL lighting and \`public/environment/<name>-background.webp\` for the visible equirectangular background. Use \`market preview\` to fetch the preview image separately.
|
|
28
28
|
9. Installed \`flipbook\` assets contain \`public/flipbook/<name>.ktx2\`. Render them with \`@drawcall/flipbook\`'s \`Flipbook\` class and Three.js \`KTX2Loader\` for Basis-compressed files; \`market preview\` fetches the middle frame from the flipbook.
|
|
29
29
|
|
|
@@ -53,6 +53,8 @@ Saved preview for wooden-chair@1.0.0: /tmp/wooden-chair.png
|
|
|
53
53
|
|
|
54
54
|
Assets may also declare \`skill\` dependencies, installed for you via the \`skills\` CLI (\`skills add\`) during \`install\`. Sources are either a GitHub/git ref or a local path to a skill directory shipped inside the asset. This requires \`npx\` to be available.
|
|
55
55
|
|
|
56
|
+
Installed non-template assets are saved to \`package.json.assetDependencies\`; templates are scaffolds and are not saved as project asset dependencies. Exact installed versions and file hashes are recorded in \`.drawcall/market-lock.json\`.
|
|
57
|
+
|
|
56
58
|
If search returns no results, try one broader noun phrase. If a command returns \`Error: Not logged in...\`, ask before running \`market login\`.
|
|
57
59
|
`;
|
|
58
60
|
//# sourceMappingURL=skill.js.map
|
package/dist/skill.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../src/skill.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0D1B,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
AssetInstallMetadata,
|
|
2
3
|
AssetSearchResult,
|
|
3
4
|
AssetVersion,
|
|
4
5
|
GenerateAssetResult,
|
|
@@ -45,12 +46,14 @@ export interface AssetGenerateInput {
|
|
|
45
46
|
|
|
46
47
|
export interface AssetProvider {
|
|
47
48
|
type: AssetType
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
/** Shown to the user after an asset of this type is installed. */
|
|
50
|
+
installMessage?: string
|
|
51
|
+
/** Whether a top-level install should save this asset to package.json assetDependencies. */
|
|
52
|
+
saveOnInstall?: boolean
|
|
53
|
+
/** Whether upload should read package.json assetDependencies from the source zip. */
|
|
54
|
+
readAssetDependenciesFromPackageJson?: boolean
|
|
55
|
+
/** Whether upload should omit unchanged installed dependency files from the source zip. */
|
|
56
|
+
omitUnchangedInstalledFilesOnUpload?: boolean
|
|
54
57
|
search(input: AssetSearchInput): Promise<PaginatedList<AssetSearchResult>>
|
|
55
58
|
exact(input: AssetExactInput): Promise<AssetSearchResult | null>
|
|
56
59
|
uploadZip(input: AssetUploadZipInput, owner: { id: string; role: string }): Promise<AssetVersion>
|
|
@@ -59,3 +62,12 @@ export interface AssetProvider {
|
|
|
59
62
|
}
|
|
60
63
|
|
|
61
64
|
export type AssetImplementation = AssetProvider
|
|
65
|
+
|
|
66
|
+
export function installMetadataForProvider(provider: AssetProvider): AssetInstallMetadata {
|
|
67
|
+
return {
|
|
68
|
+
installMessage: provider.installMessage,
|
|
69
|
+
saveOnInstall: provider.saveOnInstall ?? true,
|
|
70
|
+
readAssetDependenciesFromPackageJson: provider.readAssetDependenciesFromPackageJson ?? false,
|
|
71
|
+
omitUnchangedInstalledFilesOnUpload: provider.omitUnchangedInstalledFilesOnUpload ?? false,
|
|
72
|
+
}
|
|
73
|
+
}
|
package/src/cli.ts
CHANGED
|
@@ -75,18 +75,25 @@ program
|
|
|
75
75
|
|
|
76
76
|
program
|
|
77
77
|
.command('install')
|
|
78
|
-
.description('Install assets by name')
|
|
79
|
-
.argument('
|
|
78
|
+
.description('Install assets by name, or package.json assetDependencies when no names are given')
|
|
79
|
+
.argument('[assets...]', 'Asset names, optionally with @range')
|
|
80
80
|
.addOption(apiOption)
|
|
81
81
|
.option('--unapproved', 'Include unapproved versions', false)
|
|
82
|
+
.option('--force', 'Overwrite existing files', false)
|
|
82
83
|
.option('--cwd <dir>', 'Project directory')
|
|
83
|
-
.action(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
unapproved:
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
84
|
+
.action(
|
|
85
|
+
async (
|
|
86
|
+
args: string[],
|
|
87
|
+
opts: { api?: string; unapproved: boolean; force: boolean; cwd?: string },
|
|
88
|
+
) => {
|
|
89
|
+
await installCommand(args, {
|
|
90
|
+
baseUrl: opts.api,
|
|
91
|
+
unapproved: opts.unapproved,
|
|
92
|
+
force: opts.force,
|
|
93
|
+
cwd: opts.cwd,
|
|
94
|
+
})
|
|
95
|
+
},
|
|
96
|
+
)
|
|
90
97
|
|
|
91
98
|
program
|
|
92
99
|
.command('search')
|