@drawcall/market 0.3.0 → 0.4.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import type { AssetFileManifest } from '../schemas.js';
2
+ import type { AssetVersionsResult } from '../schemas.js';
3
3
  import type { AssetExactResult, AssetFileEntry, AssetInstallMetadata, AssetSearchResult, AssetVersion, PaginatedList, User } from '../contract.js';
4
4
  /**
5
5
  * The v1 manifest of an asset version — the one linkable, cacheable answer to "what is this
@@ -81,10 +81,10 @@ export declare const contract: {
81
81
  }, {
82
82
  files: AssetFileEntry[];
83
83
  }>, Record<never, never>, Record<never, never>>;
84
- fileManifest: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
84
+ versions: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
85
85
  name: z.ZodString;
86
- version: z.ZodString;
87
- }, z.core.$strip>, z.ZodCustom<AssetFileManifest, AssetFileManifest>, Record<never, never>, Record<never, never>>;
86
+ key: z.ZodOptional<z.ZodString>;
87
+ }, z.core.$strip>, z.ZodCustom<AssetVersionsResult, AssetVersionsResult>, Record<never, never>, Record<never, never>>;
88
88
  uploadZip: import("@orpc/contract").ContractProcedureBuilderWithInputOutput<z.ZodObject<{
89
89
  name: z.ZodString;
90
90
  type: z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/v1/contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,IAAI,EACL,MAAM,gBAAgB,CAAA;AAkBvB;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC5B,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAqBW,cAAc,EAAE;;mBAAhB,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAuDf,MAAM;uBAAa,IAAI;;oBAAvB,MAAM;uBAAa,IAAI;;;;;;;CAMvD,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,QAAQ,CAAA"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/v1/contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,IAAI,EACL,MAAM,gBAAgB,CAAA;AAkBvB;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC5B,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAqBW,cAAc,EAAE;;mBAAhB,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAyDf,MAAM;uBAAa,IAAI;;oBAAvB,MAAM;uBAAa,IAAI;;;;;;;CAMvD,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,QAAQ,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { oc } from '@orpc/contract';
2
2
  import { z } from 'zod';
3
- import { MAX_UPLOAD_ZIP_SIZE_BYTES, agentRunStatusSchema, agentStartSchema, agentStatusSchema, assetFilesSchema, exactAssetSchema, fileManifestSchema, generateAssetSchema, generateJobStatusSchema, generateResponseSchema, generateStatusInputSchema, listAssetsSchema, updateProfileSchema, uploadZipSchema, } from '../schemas.js';
3
+ import { MAX_UPLOAD_ZIP_SIZE_BYTES, agentRunStatusSchema, agentStartSchema, agentStatusSchema, assetFilesSchema, assetVersionsSchema, exactAssetSchema, generateAssetSchema, generateJobStatusSchema, generateResponseSchema, generateStatusInputSchema, listAssetsSchema, updateProfileSchema, uploadZipSchema, } from '../schemas.js';
4
4
  /**
5
5
  * The v1 contract: the same procedure tree as the legacy RPC surface (so call sites migrate by
6
6
  * swapping only the client), with HTTP routes attached — served as plain REST under `/api/v1`.
@@ -25,9 +25,11 @@ export const contract = {
25
25
  .route({ method: 'GET', path: '/assets/{name}/{version}/files' })
26
26
  .input(assetFilesSchema)
27
27
  .output(z.custom()),
28
- fileManifest: oc
29
- .route({ method: 'GET', path: '/assets/{name}/{version}/file-manifest' })
30
- .input(fileManifestSchema)
28
+ // Every published version of an asset. Feeds multi-version content matching: without a local
29
+ // lockfile the installed version is unknown, so clients merge hashes across the range.
30
+ versions: oc
31
+ .route({ method: 'GET', path: '/assets/{name}/versions' })
32
+ .input(assetVersionsSchema)
31
33
  .output(z.custom()),
32
34
  uploadZip: oc
33
35
  .route({ method: 'PUT', path: '/assets/{name}/{version}' })
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/v1/contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/v1/contract.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drawcall/market",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/drawcall-ai/market",
@@ -8,7 +8,7 @@ import {
8
8
  packPolicyFromInstallMetadata,
9
9
  parsePackDependencies,
10
10
  } from '../pack.js'
11
- import { unchangedUploadResult, uploadResult } from '../output.js'
11
+ import { packWarnings, unchangedUploadResult, uploadResult } from '../output.js'
12
12
  import {
13
13
  assetDescriptionSchema,
14
14
  assetNameSchema,
@@ -69,6 +69,8 @@ export async function uploadCommand(
69
69
  fetchFileManifest: fileManifestForRange(client.asset),
70
70
  })
71
71
  const { zip, npmDependencies, assetDependencies, skillDependencies } = packed
72
+ // Loud fail-open: what pack could not verify ships in the zip — say so before publishing it.
73
+ for (const line of packWarnings(packed)) console.warn(line)
72
74
  const profile = await client.user.getProfile()
73
75
  if (!profile) {
74
76
  throw new Error('Not logged in. Run `market login` first.')
package/src/index.ts CHANGED
@@ -69,7 +69,7 @@ export {
69
69
  skillDependenciesSchema,
70
70
  uploadZipSchema,
71
71
  exactAssetSchema,
72
- fileManifestSchema,
72
+ assetVersionsSchema,
73
73
  generateAssetSchema,
74
74
  updateProfileSchema,
75
75
  listAssetsSchema,
@@ -88,7 +88,8 @@ export type {
88
88
  AssetAccess,
89
89
  AssetDependencies,
90
90
  AssetDependencyValue,
91
- AssetFileManifest,
91
+ AssetVersionListing,
92
+ AssetVersionsResult,
92
93
  AgentResultAsset,
93
94
  AgentResult,
94
95
  AgentRunStatus,
package/src/install.ts CHANGED
@@ -11,15 +11,17 @@
11
11
  */
12
12
 
13
13
  import { execFile } from 'child_process'
14
- import { createHash } from 'crypto'
15
14
  import * as fs from 'fs/promises'
16
15
  import * as path from 'path'
17
16
  import { detectPackageManager, installDependencies } from 'nypm'
18
17
  import type { MarketClient } from './client.js'
19
18
  import type { AssetFilesResult, AssetInstallMetadata } from './contract.js'
20
19
  import { withProjectInstallLock } from './install-lock.js'
20
+ import { md5, resolveDependencyLayout } from './pack.js'
21
+ import { findInstallRoot, walkWithGitignore } from './project-walk.js'
21
22
  import { packageJsonAssetDependencies, parsePackageJson, type PackageJson } from './package-json.js'
22
23
  import type { ResolveResult } from './resolve.js'
24
+ export { findInstallRoot }
23
25
  import { assetDependencyAlias, assetDependencyRange, assetDependencyValue } from './schemas.js'
24
26
 
25
27
  export interface InstallOptions {
@@ -72,6 +74,8 @@ interface DownloadResult {
72
74
  assets: InstalledAsset[]
73
75
  wrotePackageJson: boolean
74
76
  warnings: string[]
77
+ /** Renames adopted during this install (per asset: canonical path → adopted project path). */
78
+ adoptedAliases: Record<string, Record<string, string>>
75
79
  }
76
80
 
77
81
  interface DownloadOptions {
@@ -80,6 +84,14 @@ interface DownloadOptions {
80
84
  key?: string
81
85
  /** File aliases per asset name: canonical install path → the project's current path for it. */
82
86
  aliases: Record<string, Record<string, string>>
87
+ /** md5 of every project file, computed at most once per install (rename adoption). */
88
+ projectHashes: () => Promise<Map<string, string>>
89
+ /**
90
+ * Etags across an asset's published versions — the "recognized bytes" set for content-aware
91
+ * updates. `null` when the server cannot answer: fail-open in the conservative direction
92
+ * (never overwrite on uncertainty).
93
+ */
94
+ knownHashes: (name: string) => Promise<Set<string> | null>
83
95
  }
84
96
 
85
97
  export async function install(
@@ -97,6 +109,8 @@ export async function install(
97
109
  log,
98
110
  key: opts.key,
99
111
  aliases,
112
+ projectHashes: memoizedProjectHashes(installRoot),
113
+ knownHashes: memoizedKnownHashes(client),
100
114
  })
101
115
  const integration = await withProjectInstallLock(
102
116
  installRoot,
@@ -105,6 +119,7 @@ export async function install(
105
119
  rootRequests: opts.rootRequests ?? [],
106
120
  installMetadata: metadata,
107
121
  packageManagerNeeded: download.wrotePackageJson,
122
+ adoptedAliases: download.adoptedAliases,
108
123
  })
109
124
  if (packageJsonUpdate.packageManagerNeeded) {
110
125
  await (opts.runPackageManagerInstall ?? runPackageManagerInstall)(installRoot, log)
@@ -137,19 +152,6 @@ export async function install(
137
152
  }
138
153
  }
139
154
 
140
- export async function findInstallRoot(cwd: string = process.cwd()): Promise<string> {
141
- const start = path.resolve(cwd)
142
-
143
- for (let dir = start; ; dir = path.dirname(dir)) {
144
- if (await isFile(path.join(dir, 'package.json'))) {
145
- return dir
146
- }
147
- if (path.dirname(dir) === dir) {
148
- return start
149
- }
150
- }
151
- }
152
-
153
155
  /** Max asset downloads in flight at once. Assets write disjoint file trees, so downloading them
154
156
  * concurrently is safe and turns a ~40-asset install from serial round-trips into a few batched
155
157
  * waves. Kept modest so one install does not itself overwhelm the worker's per-request memory. */
@@ -175,6 +177,11 @@ async function downloadAssets(
175
177
  // the package manager to bring its npm deps.
176
178
  wrotePackageJson: perAsset.some((r) => r.wrotePackageJson),
177
179
  warnings: perAsset.flatMap((r) => r.warnings),
180
+ adoptedAliases: Object.fromEntries(
181
+ perAsset
182
+ .filter((r) => Object.keys(r.adopted).length > 0)
183
+ .map((r) => [r.asset.name, r.adopted]),
184
+ ),
178
185
  }
179
186
  }
180
187
 
@@ -183,53 +190,78 @@ async function downloadOneAsset(
183
190
  asset: ResolveResult['assets'][number],
184
191
  projectRoot: string,
185
192
  opts: DownloadOptions,
186
- ): Promise<{ asset: InstalledAsset; wrotePackageJson: boolean; warnings: string[] }> {
193
+ ): Promise<{
194
+ asset: InstalledAsset
195
+ wrotePackageJson: boolean
196
+ warnings: string[]
197
+ adopted: Record<string, string>
198
+ }> {
187
199
  opts.log(`Downloading ${asset.name}@${asset.version}...`)
188
200
 
189
201
  // Only the network fetches are retried — downloads are the sole transient step; file writes are
190
202
  // deterministic local work and a failure there is a real error, not worth re-attempting.
191
- const files = await fetchAssetEntries(client, asset, opts)
192
- const alias = opts.aliases[asset.name] ?? {}
193
- const installedFiles: string[] = []
194
- const warnings: string[] = []
195
- let wrotePackageJson = false
196
-
197
- for (const [relativePath, content] of files) {
203
+ const entries = await fetchAssetEntries(client, asset, opts)
204
+ const planned = entries.flatMap((entry) => {
198
205
  const normalizedPath = safeRelativePath(
199
- relativePath,
200
- () => `Zip contains an unsafe path: ${relativePath}`,
206
+ entry.path,
207
+ () => `Zip contains an unsafe path: ${entry.path}`,
201
208
  )
202
209
  if (
203
210
  normalizedPath === '.' ||
204
211
  (normalizedPath === 'README.md' && asset.type !== 'template') ||
205
212
  normalizedPath.endsWith('/')
206
213
  ) {
207
- continue
214
+ return []
208
215
  }
216
+ return [{ ...entry, normalizedPath }]
217
+ })
218
+
219
+ // Alias targets come from metadata; reject traversal before any path is stat'd or resolved —
220
+ // adoption must never quietly route around unsafe metadata.
221
+ const declaredAlias = opts.aliases[asset.name] ?? {}
222
+ for (const [canonical, target] of Object.entries(declaredAlias)) {
223
+ safeRelativePath(
224
+ target,
225
+ () => `Alias for ${canonical} in ${asset.name} is an unsafe path: ${target}`,
226
+ )
227
+ }
228
+ const adopted = await adoptRenamedFiles(planned, asset.name, declaredAlias, projectRoot, opts)
229
+ const alias = { ...declaredAlias, ...adopted }
230
+
231
+ const installedFiles: string[] = []
232
+ const warnings: string[] = []
233
+ let wrotePackageJson = false
209
234
 
210
- // An alias redirects the file to where this project keeps it (a rename recorded by pack or a
211
- // dependent asset). Alias targets come from metadata, so they pass the same traversal guard.
212
- const aliased = alias[normalizedPath]
235
+ for (const entry of planned) {
236
+ // An alias redirects the file to where this project keeps it (a rename recorded by pack, a
237
+ // dependent asset, or adoption above). Alias targets pass the same traversal guard.
238
+ const aliased = alias[entry.normalizedPath]
213
239
  const targetPath =
214
240
  aliased === undefined
215
- ? normalizedPath
241
+ ? entry.normalizedPath
216
242
  : safeRelativePath(
217
243
  aliased,
218
- () => `Alias for ${normalizedPath} in ${asset.name} is an unsafe path: ${aliased}`,
244
+ () =>
245
+ `Alias for ${entry.normalizedPath} in ${asset.name} is an unsafe path: ${aliased}`,
219
246
  )
220
247
 
221
248
  const filePath = path.join(projectRoot, targetPath)
222
249
  const existing = await maybeReadFile(filePath)
223
- if (existing && !bytesEqual(existing, content) && !opts.force) {
224
- warnings.push(
225
- `Skipped ${targetPath} from ${asset.name}@${asset.version}; file already exists. Re-run with --force to overwrite.`,
226
- )
227
- continue
250
+ if (existing && !bytesEqual(existing, entry.bytes)) {
251
+ // Recognized bytes — a published version of this same dependency file — are replaceable
252
+ // without --force; unrecognized bytes are the user's and keep the skip-and-warn behavior.
253
+ const known = opts.force ? null : await opts.knownHashes(asset.name)
254
+ if (!opts.force && !known?.has(md5(existing))) {
255
+ warnings.push(
256
+ `Skipped ${targetPath} from ${asset.name}@${asset.version}; file already exists. Re-run with --force to overwrite.`,
257
+ )
258
+ continue
259
+ }
228
260
  }
229
261
 
230
- if (!existing || !bytesEqual(existing, content)) {
262
+ if (!existing || !bytesEqual(existing, entry.bytes)) {
231
263
  await fs.mkdir(path.dirname(filePath), { recursive: true })
232
- await fs.writeFile(filePath, content)
264
+ await fs.writeFile(filePath, entry.bytes)
233
265
  if (targetPath === 'package.json') {
234
266
  wrotePackageJson = true
235
267
  }
@@ -249,6 +281,103 @@ async function downloadOneAsset(
249
281
  },
250
282
  wrotePackageJson,
251
283
  warnings,
284
+ adopted,
285
+ }
286
+ }
287
+
288
+ interface PlannedEntry {
289
+ normalizedPath: string
290
+ etag: string
291
+ bytes: Uint8Array
292
+ }
293
+
294
+ /**
295
+ * Install-time adoption of unsynced renames: when a file's write target is absent but identical
296
+ * bytes already live elsewhere in the project, that location is used instead of creating a
297
+ * duplicate — an implicit `sync` before writing. Uses the same layout resolution as pack/sync
298
+ * (recorded alias → canonical → first match), so the selection rule stays identical everywhere.
299
+ * The project is only hashed when some target is actually absent; a reinstall with every file in
300
+ * place never scans.
301
+ */
302
+ async function adoptRenamedFiles(
303
+ planned: PlannedEntry[],
304
+ name: string,
305
+ declaredAlias: Record<string, string>,
306
+ projectRoot: string,
307
+ opts: DownloadOptions,
308
+ ): Promise<Record<string, string>> {
309
+ const provisionalTargets = planned.map(
310
+ (entry) => declaredAlias[entry.normalizedPath] ?? entry.normalizedPath,
311
+ )
312
+ if (!(await anyPathMissing(projectRoot, provisionalTargets))) return {}
313
+
314
+ const layout = resolveDependencyLayout(
315
+ { [name]: assetDependencyValue('*', declaredAlias) },
316
+ {
317
+ files: planned.map((entry) => ({
318
+ name,
319
+ canonicalPath: entry.normalizedPath,
320
+ hash: entry.etag,
321
+ })),
322
+ fetched: new Set([name]),
323
+ },
324
+ await opts.projectHashes(),
325
+ )
326
+ const resolved = assetDependencyAlias(layout.assetDependencies[name])
327
+ return Object.fromEntries(
328
+ Object.entries(resolved).filter(([canonical, target]) => declaredAlias[canonical] !== target),
329
+ )
330
+ }
331
+
332
+ async function anyPathMissing(projectRoot: string, targets: string[]): Promise<boolean> {
333
+ for (const target of targets) {
334
+ if (!(await isFile(path.join(projectRoot, target)))) return true
335
+ }
336
+ return false
337
+ }
338
+
339
+ /** md5 of every project file (gitignored trees excluded), computed at most once per install. */
340
+ function memoizedProjectHashes(projectRoot: string): () => Promise<Map<string, string>> {
341
+ let cached: Promise<Map<string, string>> | undefined
342
+ return () =>
343
+ (cached ??= (async () => {
344
+ const walk = await walkWithGitignore(projectRoot)
345
+ const hashes = new Map<string, string>()
346
+ for (const relative of walk.kept) {
347
+ hashes.set(
348
+ relative,
349
+ md5(new Uint8Array(await fs.readFile(path.join(projectRoot, relative)))),
350
+ )
351
+ }
352
+ return hashes
353
+ })())
354
+ }
355
+
356
+ /** Newest published versions contributing to the recognized-bytes set (same bound as pack). */
357
+ const KNOWN_HASH_VERSION_CAP = 20
358
+
359
+ function memoizedKnownHashes(client: MarketClient): (name: string) => Promise<Set<string> | null> {
360
+ const cache = new Map<string, Promise<Set<string> | null>>()
361
+ return (name) => {
362
+ const hit = cache.get(name)
363
+ if (hit) return hit
364
+ const result = (async () => {
365
+ try {
366
+ const { versions } = await client.asset.versions({ name })
367
+ const recent = versions.map((entry) => entry.version).slice(-KNOWN_HASH_VERSION_CAP)
368
+ const etags = await Promise.all(
369
+ recent.map(async (version) =>
370
+ (await client.asset.files({ name, version })).files.map((file) => file.etag),
371
+ ),
372
+ )
373
+ return new Set(etags.flat())
374
+ } catch {
375
+ // Offline or not visible — the conservative fail-open: the caller keeps skip-and-warn.
376
+ return null
377
+ }
378
+ })()
379
+ cache.set(name, result)
380
+ return result
252
381
  }
253
382
  }
254
383
 
@@ -304,7 +433,7 @@ async function fetchAssetEntries(
304
433
  client: MarketClient,
305
434
  asset: ResolveResult['assets'][number],
306
435
  opts: DownloadOptions,
307
- ): Promise<Array<[string, Uint8Array]>> {
436
+ ): Promise<Array<{ path: string; etag: string; bytes: Uint8Array }>> {
308
437
  const index = await client.asset.files({
309
438
  name: asset.name,
310
439
  version: asset.version,
@@ -317,7 +446,7 @@ async function fetchAssetEntries(
317
446
  attempts: DOWNLOAD_ATTEMPTS,
318
447
  onRetry: (msg) => opts.log(`Downloading ${label} ${file.path}: ${msg}`),
319
448
  })
320
- return [file.path, bytes] as [string, Uint8Array]
449
+ return { path: file.path, etag: file.etag, bytes }
321
450
  })
322
451
  }
323
452
 
@@ -329,9 +458,9 @@ async function fetchVerifiedFile(file: AssetFilesResult['files'][number]): Promi
329
458
  const bytes = new Uint8Array(await res.arrayBuffer())
330
459
  // A digest mismatch is a corrupt transfer; thrown without a status so withRetry treats it as
331
460
  // transient and re-fetches.
332
- const md5 = createHash('md5').update(bytes).digest('hex')
333
- if (md5 !== file.etag) {
334
- throw new Error(`md5 mismatch for ${file.path}: expected ${file.etag}, got ${md5}`)
461
+ const digest = md5(bytes)
462
+ if (digest !== file.etag) {
463
+ throw new Error(`md5 mismatch for ${file.path}: expected ${file.etag}, got ${digest}`)
335
464
  }
336
465
  return bytes
337
466
  }
@@ -424,6 +553,7 @@ async function updatePackageJson(
424
553
  rootRequests: InstallRootRequest[]
425
554
  installMetadata: Record<string, AssetInstallMetadata>
426
555
  packageManagerNeeded: boolean
556
+ adoptedAliases: Record<string, Record<string, string>>
427
557
  },
428
558
  ): Promise<{ packageManagerNeeded: boolean }> {
429
559
  const pkgPath = path.join(projectRoot, 'package.json')
@@ -448,6 +578,9 @@ async function updatePackageJson(
448
578
  if (mergeAssetDependencyRanges(pkg, assetDependencies)) {
449
579
  changed = true
450
580
  }
581
+ if (mergeAdoptedAliases(pkg, opts.adoptedAliases)) {
582
+ changed = true
583
+ }
451
584
 
452
585
  if (changed) {
453
586
  await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n')
@@ -456,6 +589,30 @@ async function updatePackageJson(
456
589
  return { packageManagerNeeded }
457
590
  }
458
591
 
592
+ /** Record renames adopted during this install on the entries package.json already declares —
593
+ * adoption is thereby persisted, not just applied. Undeclared (transitive) deps stay out. */
594
+ function mergeAdoptedAliases(
595
+ pkg: PackageJson,
596
+ adopted: Record<string, Record<string, string>>,
597
+ ): boolean {
598
+ const current = pkg.assetDependencies
599
+ if (!current) return false
600
+
601
+ let changed = false
602
+ for (const [name, alias] of Object.entries(adopted)) {
603
+ const existing = current[name]
604
+ if (existing === undefined) continue
605
+ const next = assetDependencyValue(assetDependencyRange(existing), {
606
+ ...assetDependencyAlias(existing),
607
+ ...alias,
608
+ })
609
+ if (JSON.stringify(existing) === JSON.stringify(next)) continue
610
+ current[name] = next
611
+ changed = true
612
+ }
613
+ return changed
614
+ }
615
+
459
616
  async function runPackageManagerInstall(projectRoot: string, log: (msg: string) => void) {
460
617
  log('Installing npm dependencies...')
461
618
  const pm = await detectPackageManager(projectRoot)
package/src/output.ts CHANGED
@@ -219,12 +219,34 @@ export function packResult(out: string, packed: PackedAsset): string {
219
219
  if (packed.omittedUnchangedInstalledFiles) {
220
220
  lines.push('Omitted unchanged installed dependency files.')
221
221
  }
222
+ lines.push(...packWarnings(packed))
222
223
  lines.push(...dependencyLines('npm dependencies', packed.npmDependencies))
223
224
  lines.push(...dependencyLines('asset dependencies', packed.assetDependencies))
224
225
  lines.push(...dependencyLines('skill dependencies', packed.skillDependencies))
225
226
  return lines.join('\n')
226
227
  }
227
228
 
229
+ /**
230
+ * What pack could not check — the silent-fail-open cases with real consequences: an unfetchable
231
+ * dependency ships its files inside the zip, and a missing dependency file means a local edit or
232
+ * deletion the packer should know about.
233
+ */
234
+ export function packWarnings(packed: PackedAsset): string[] {
235
+ const lines: string[] = []
236
+ if (packed.skippedDependencies.length > 0) {
237
+ lines.push(
238
+ `Dependency file indexes unavailable (their files ship in the zip): ${[...packed.skippedDependencies].sort().join(', ')}`,
239
+ )
240
+ }
241
+ if (packed.missingDependencyFiles.length > 0) {
242
+ lines.push('Dependency files not found (locally modified or deleted):')
243
+ lines.push(
244
+ ...packed.missingDependencyFiles.map((file) => `- ${file.name}: ${file.path}`).sort(),
245
+ )
246
+ }
247
+ return lines
248
+ }
249
+
228
250
  export function previewResult(name: string, version: string, out: string): string {
229
251
  return `Saved preview for ${assetVersionRef(name, version)}: ${out}`
230
252
  }