@tankpkg/sdk 0.15.3 → 0.15.5

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/index.mjs CHANGED
@@ -6400,6 +6400,28 @@ function mkdirSafeNoSymlinks(targetDir) {
6400
6400
  } else fs.mkdirSync(current);
6401
6401
  }
6402
6402
  }
6403
+ function isDirNonEmpty(dir) {
6404
+ try {
6405
+ return fs.readdirSync(dir).length > 0;
6406
+ } catch {
6407
+ return false;
6408
+ }
6409
+ }
6410
+ function moveEntryAcrossDevices(src, dst) {
6411
+ try {
6412
+ fs.renameSync(src, dst);
6413
+ } catch (err) {
6414
+ if (err.code === "EXDEV") {
6415
+ fs.cpSync(src, dst, { recursive: true });
6416
+ fs.rmSync(src, {
6417
+ recursive: true,
6418
+ force: true
6419
+ });
6420
+ return;
6421
+ }
6422
+ throw err;
6423
+ }
6424
+ }
6403
6425
  async function extractSafely(tarball, destDir) {
6404
6426
  if (tarball.length > MAX_DOWNLOAD_BYTES) throw new TankIntegrityError(`Tarball exceeds ${MAX_DOWNLOAD_BYTES} byte limit`);
6405
6427
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "tank-extract-"));
@@ -6407,6 +6429,7 @@ async function extractSafely(tarball, destDir) {
6407
6429
  fs.writeFileSync(tmpTarball, tarball, { flag: "wx" });
6408
6430
  let entryCount = 0;
6409
6431
  let totalBytes = 0;
6432
+ let backupDir = null;
6410
6433
  try {
6411
6434
  await extract({
6412
6435
  file: tmpTarball,
@@ -6426,22 +6449,31 @@ async function extractSafely(tarball, destDir) {
6426
6449
  }
6427
6450
  });
6428
6451
  mkdirSafeNoSymlinks(destDir);
6452
+ if (isDirNonEmpty(destDir)) {
6453
+ backupDir = `${destDir}.tank-old-${crypto$1.randomUUID()}`;
6454
+ fs.renameSync(destDir, backupDir);
6455
+ mkdirSafeNoSymlinks(destDir);
6456
+ }
6429
6457
  for (const entry of fs.readdirSync(tmpDir)) {
6430
6458
  if (entry === path.basename(tmpTarball)) continue;
6431
- const src = path.join(tmpDir, entry);
6432
- const dst = path.join(destDir, entry);
6433
- try {
6434
- fs.renameSync(src, dst);
6435
- } catch (err) {
6436
- if (err.code === "EXDEV") {
6437
- fs.cpSync(src, dst, { recursive: true });
6438
- fs.rmSync(src, {
6439
- recursive: true,
6440
- force: true
6441
- });
6442
- } else throw err;
6443
- }
6459
+ moveEntryAcrossDevices(path.join(tmpDir, entry), path.join(destDir, entry));
6460
+ }
6461
+ if (backupDir !== null) {
6462
+ fs.rmSync(backupDir, {
6463
+ recursive: true,
6464
+ force: true
6465
+ });
6466
+ backupDir = null;
6444
6467
  }
6468
+ } catch (err) {
6469
+ if (backupDir !== null && fs.existsSync(backupDir)) try {
6470
+ fs.rmSync(destDir, {
6471
+ recursive: true,
6472
+ force: true
6473
+ });
6474
+ fs.renameSync(backupDir, destDir);
6475
+ } catch {}
6476
+ throw err;
6445
6477
  } finally {
6446
6478
  fs.rmSync(tmpDir, {
6447
6479
  recursive: true,
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/install/pipeline.ts"],"names":[],"mappings":"AAKA,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAsBjE,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,YAAY,EAAE,EACrB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAyE7D;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,YAAY,EAClB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACjC,IAAI,CAsBN;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2BpF;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,YAAY,EAAE,EACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9D,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACjC,UAAU,CAiCZ;AAuBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DnF;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAM3E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAO9E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAWhH"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/install/pipeline.ts"],"names":[],"mappings":"AAKA,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAsBjE,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,YAAY,EAAE,EACrB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAyE7D;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,YAAY,EAClB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACjC,IAAI,CAsBN;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2BpF;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,YAAY,EAAE,EACrB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9D,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACjC,UAAU,CAiCZ;AA4CD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EnF;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAM3E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAO9E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAWhH"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tankpkg/sdk",
3
- "version": "0.15.3",
3
+ "version": "0.15.5",
4
4
  "description": "Official TypeScript SDK for the Tank registry — search, download, install, and audit AI agent skills programmatically",
5
5
  "type": "module",
6
6
  "exports": {