@icyfenix-dmla/cli 2026.5.2-2339 → 2026.5.3-726

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icyfenix-dmla/cli",
3
- "version": "2026.5.2-2339",
3
+ "version": "2026.5.3-726",
4
4
  "description": "DMLA 沙箱服务命令行工具",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -22,13 +22,14 @@
22
22
  "README.md"
23
23
  ],
24
24
  "dependencies": {
25
- "commander": "^12.1.0",
25
+ "@icyfenix-dmla/install": "*",
26
+ "adm-zip": "^0.5.17",
26
27
  "chalk": "^5.3.0",
27
- "enquirer": "^2.4.1",
28
- "dockerode": "^5.0.0",
29
- "express": "^4.21.2",
28
+ "commander": "^12.1.0",
30
29
  "cors": "^2.8.5",
31
- "@icyfenix-dmla/install": "*"
30
+ "dockerode": "^5.0.0",
31
+ "enquirer": "^2.4.1",
32
+ "express": "^4.21.2"
32
33
  },
33
34
  "devDependencies": {
34
35
  "jest": "^29.7.0"
@@ -10,6 +10,7 @@ import path from 'path'
10
10
  import os from 'os'
11
11
  import { spawn } from 'child_process'
12
12
  import { execSync } from 'child_process'
13
+ import AdmZip from 'adm-zip'
13
14
 
14
15
  // 配置文件路径
15
16
  const DMLA_CONFIG_DIR = path.join(os.homedir(), '.dmla')
@@ -27,7 +28,11 @@ const DATASETS = [
27
28
  size: '247MB',
28
29
  format: 'git',
29
30
  targetDir: 'datasets/tiny-imagenet-200',
30
- source: 'ModelScope (icyfenix)'
31
+ source: 'ModelScope (icyfenix)',
32
+ // git clone 后需要解压的 zip 文件
33
+ zipFile: 'tiny-imagenet-200.zip',
34
+ // zip 内部的顶层目录名(解压后需要将此目录内容移到上层)
35
+ zipInnerDir: 'tiny-imagenet-200'
31
36
  },
32
37
  {
33
38
  id: 'cifar-10',
@@ -526,6 +531,58 @@ async function downloadDataset(dataPath, dataset) {
526
531
  console.log()
527
532
  console.log(chalk.green('下载完成'))
528
533
 
534
+ // 解压数据集内的 zip 文件(如果有)
535
+ if (dataset.zipFile) {
536
+ const zipPath = path.join(targetDir, dataset.zipFile)
537
+
538
+ if (fs.existsSync(zipPath)) {
539
+ console.log()
540
+ console.log(chalk.gray(`解压 ${dataset.zipFile}...`))
541
+
542
+ try {
543
+ const zip = new AdmZip(zipPath)
544
+
545
+ // 解压到临时目录
546
+ const tempDir = path.join(targetDir, '_extract_temp')
547
+ zip.extractAllTo(tempDir, true)
548
+
549
+ // 将 zip 内部目录内容移到目标目录
550
+ const innerDir = dataset.zipInnerDir
551
+ ? path.join(tempDir, dataset.zipInnerDir)
552
+ : tempDir
553
+
554
+ if (fs.existsSync(innerDir)) {
555
+ // 移动内部目录的所有内容到目标目录
556
+ const items = fs.readdirSync(innerDir)
557
+ for (const item of items) {
558
+ const srcPath = path.join(innerDir, item)
559
+ const destPath = path.join(targetDir, item)
560
+
561
+ // 如果目标已存在且不是 zip 文件,跳过
562
+ if (fs.existsSync(destPath) && item !== dataset.zipFile) {
563
+ continue
564
+ }
565
+
566
+ fs.cpSync(srcPath, destPath, { recursive: true, force: true })
567
+ }
568
+
569
+ // 清理临时目录
570
+ fs.rmSync(tempDir, { recursive: true, force: true })
571
+
572
+ // 删除 zip 文件
573
+ fs.rmSync(zipPath, { force: true })
574
+
575
+ console.log(chalk.green('解压完成'))
576
+ } else {
577
+ console.log(chalk.yellow(` ⚠ zip 内部目录 ${dataset.zipInnerDir} 不存在`))
578
+ }
579
+ } catch (err) {
580
+ console.log(chalk.red(`解压失败: ${err.message}`))
581
+ console.log(chalk.yellow(`请手动解压: ${zipPath}`))
582
+ }
583
+ }
584
+ }
585
+
529
586
  } else {
530
587
  // 原有的 curl/wget 下载逻辑(保留兼容性)
531
588
  const cacheDir = path.join(dataPath, 'cache', 'downloads')
@@ -569,17 +626,17 @@ async function downloadDataset(dataPath, dataset) {
569
626
  console.log(chalk.gray('正在解压...'))
570
627
 
571
628
  if (dataset.format === 'zip') {
572
- const unzipDir = path.join(cacheDir, dataset.id)
573
- fs.mkdirSync(unzipDir, { recursive: true })
574
- execSync(`unzip -o "${downloadFile}" -d "${unzipDir}"`, { stdio: 'inherit' })
575
-
576
- const extractedDir = path.join(unzipDir, dataset.id)
577
- if (fs.existsSync(extractedDir)) {
578
- fs.cpSync(extractedDir, targetDir, { recursive: true })
579
- fs.rmSync(unzipDir, { recursive: true, force: true })
629
+ try {
630
+ const zip = new AdmZip(downloadFile)
631
+ zip.extractAllTo(targetDir, true) // overwrite = true
632
+ console.log(chalk.green('解压完成'))
633
+ } catch (err) {
634
+ console.log(chalk.red(`解压失败: ${err.message}`))
635
+ throw err
580
636
  }
581
637
 
582
638
  } else if (dataset.format === 'tar.gz') {
639
+ // tar.gz 文件仍使用系统命令(adm-zip 不支持)
583
640
  execSync(`tar -xzf "${downloadFile}" -C "${path.join(dataPath, 'datasets')}"`, { stdio: 'inherit' })
584
641
  }
585
642
 
package/version.json CHANGED
@@ -1,4 +1,4 @@
1
1
  {
2
- "buildTime": "2026-05-02T15:40:30.403Z",
3
- "cliVersion": "2026.5.2-2339"
2
+ "buildTime": "2026-05-02T23:27:23.551Z",
3
+ "cliVersion": "2026.5.3-726"
4
4
  }