tanmi-dock 0.4.0-beta.1

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.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +302 -0
  3. package/dist/commands/clean.d.ts +10 -0
  4. package/dist/commands/clean.d.ts.map +1 -0
  5. package/dist/commands/clean.js +215 -0
  6. package/dist/commands/clean.js.map +1 -0
  7. package/dist/commands/config.d.ts +10 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +105 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +7 -0
  12. package/dist/commands/doctor.d.ts.map +1 -0
  13. package/dist/commands/doctor.js +127 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/init.d.ts +7 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +153 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/link.d.ts +7 -0
  20. package/dist/commands/link.d.ts.map +1 -0
  21. package/dist/commands/link.js +522 -0
  22. package/dist/commands/link.js.map +1 -0
  23. package/dist/commands/migrate.d.ts +7 -0
  24. package/dist/commands/migrate.d.ts.map +1 -0
  25. package/dist/commands/migrate.js +137 -0
  26. package/dist/commands/migrate.js.map +1 -0
  27. package/dist/commands/projects.d.ts +7 -0
  28. package/dist/commands/projects.d.ts.map +1 -0
  29. package/dist/commands/projects.js +126 -0
  30. package/dist/commands/projects.js.map +1 -0
  31. package/dist/commands/repair.d.ts +7 -0
  32. package/dist/commands/repair.d.ts.map +1 -0
  33. package/dist/commands/repair.js +256 -0
  34. package/dist/commands/repair.js.map +1 -0
  35. package/dist/commands/status.d.ts +7 -0
  36. package/dist/commands/status.d.ts.map +1 -0
  37. package/dist/commands/status.js +172 -0
  38. package/dist/commands/status.js.map +1 -0
  39. package/dist/commands/unlink.d.ts +7 -0
  40. package/dist/commands/unlink.d.ts.map +1 -0
  41. package/dist/commands/unlink.js +104 -0
  42. package/dist/commands/unlink.js.map +1 -0
  43. package/dist/commands/verify.d.ts +7 -0
  44. package/dist/commands/verify.d.ts.map +1 -0
  45. package/dist/commands/verify.js +190 -0
  46. package/dist/commands/verify.js.map +1 -0
  47. package/dist/core/codepac.d.ts +79 -0
  48. package/dist/core/codepac.d.ts.map +1 -0
  49. package/dist/core/codepac.js +188 -0
  50. package/dist/core/codepac.js.map +1 -0
  51. package/dist/core/config.d.ts +70 -0
  52. package/dist/core/config.d.ts.map +1 -0
  53. package/dist/core/config.js +210 -0
  54. package/dist/core/config.js.map +1 -0
  55. package/dist/core/guard.d.ts +18 -0
  56. package/dist/core/guard.d.ts.map +1 -0
  57. package/dist/core/guard.js +82 -0
  58. package/dist/core/guard.js.map +1 -0
  59. package/dist/core/linker.d.ts +76 -0
  60. package/dist/core/linker.d.ts.map +1 -0
  61. package/dist/core/linker.js +263 -0
  62. package/dist/core/linker.js.map +1 -0
  63. package/dist/core/parser.d.ts +43 -0
  64. package/dist/core/parser.d.ts.map +1 -0
  65. package/dist/core/parser.js +133 -0
  66. package/dist/core/parser.js.map +1 -0
  67. package/dist/core/platform.d.ts +100 -0
  68. package/dist/core/platform.d.ts.map +1 -0
  69. package/dist/core/platform.js +193 -0
  70. package/dist/core/platform.js.map +1 -0
  71. package/dist/core/registry.d.ts +181 -0
  72. package/dist/core/registry.d.ts.map +1 -0
  73. package/dist/core/registry.js +443 -0
  74. package/dist/core/registry.js.map +1 -0
  75. package/dist/core/store.d.ts +77 -0
  76. package/dist/core/store.d.ts.map +1 -0
  77. package/dist/core/store.js +226 -0
  78. package/dist/core/store.js.map +1 -0
  79. package/dist/core/transaction.d.ts +106 -0
  80. package/dist/core/transaction.d.ts.map +1 -0
  81. package/dist/core/transaction.js +295 -0
  82. package/dist/core/transaction.js.map +1 -0
  83. package/dist/index.d.ts +3 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +84 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/types/index.d.ts +174 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +47 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/dist/utils/disk.d.ts +57 -0
  92. package/dist/utils/disk.d.ts.map +1 -0
  93. package/dist/utils/disk.js +313 -0
  94. package/dist/utils/disk.js.map +1 -0
  95. package/dist/utils/exit-codes.d.ts +42 -0
  96. package/dist/utils/exit-codes.d.ts.map +1 -0
  97. package/dist/utils/exit-codes.js +91 -0
  98. package/dist/utils/exit-codes.js.map +1 -0
  99. package/dist/utils/fs-utils.d.ts +44 -0
  100. package/dist/utils/fs-utils.d.ts.map +1 -0
  101. package/dist/utils/fs-utils.js +107 -0
  102. package/dist/utils/fs-utils.js.map +1 -0
  103. package/dist/utils/global-lock.d.ts +28 -0
  104. package/dist/utils/global-lock.d.ts.map +1 -0
  105. package/dist/utils/global-lock.js +89 -0
  106. package/dist/utils/global-lock.js.map +1 -0
  107. package/dist/utils/lock.d.ts +26 -0
  108. package/dist/utils/lock.d.ts.map +1 -0
  109. package/dist/utils/lock.js +68 -0
  110. package/dist/utils/lock.js.map +1 -0
  111. package/dist/utils/logger.d.ts +98 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +190 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/prompt.d.ts +32 -0
  116. package/dist/utils/prompt.d.ts.map +1 -0
  117. package/dist/utils/prompt.js +131 -0
  118. package/dist/utils/prompt.js.map +1 -0
  119. package/package.json +73 -0
@@ -0,0 +1,137 @@
1
+ /**
2
+ * migrate 命令 - 迁移 Store 位置
3
+ */
4
+ import fs from 'fs/promises';
5
+ import path from 'path';
6
+ import { Command } from 'commander';
7
+ import { ensureInitialized } from '../core/guard.js';
8
+ import * as config from '../core/config.js';
9
+ import { getRegistry } from '../core/registry.js';
10
+ import * as linker from '../core/linker.js';
11
+ import { expandHome, shrinkHome, isPathSafe } from '../core/platform.js';
12
+ import { formatSize, getFreeSpace } from '../utils/disk.js';
13
+ import { copyDirWithProgress } from '../utils/fs-utils.js';
14
+ import * as store from '../core/store.js';
15
+ import { info, success, warn, error, title, blank, separator, progressBar, } from '../utils/logger.js';
16
+ import { withGlobalLock } from '../utils/global-lock.js';
17
+ /**
18
+ * 创建 migrate 命令
19
+ */
20
+ export function createMigrateCommand() {
21
+ return new Command('migrate')
22
+ .description('迁移 Store 到新位置')
23
+ .argument('<new-path>', '新的存储路径')
24
+ .option('--force', '跳过确认')
25
+ .option('--keep-old', '保留旧目录(默认删除)')
26
+ .action(async (newPath, options) => {
27
+ await ensureInitialized();
28
+ try {
29
+ await withGlobalLock(() => migrateStore(newPath, options));
30
+ }
31
+ catch (err) {
32
+ error(err.message);
33
+ process.exit(1);
34
+ }
35
+ });
36
+ }
37
+ /**
38
+ * 迁移 Store
39
+ */
40
+ async function migrateStore(newPath, options) {
41
+ const absoluteNewPath = expandHome(newPath);
42
+ // 安全检查
43
+ const safetyResult = isPathSafe(absoluteNewPath);
44
+ if (!safetyResult.safe) {
45
+ error(`目标路径不安全: ${safetyResult.reason}`);
46
+ process.exit(1);
47
+ }
48
+ const oldPath = await store.getStorePath();
49
+ if (absoluteNewPath === oldPath) {
50
+ warn('新路径与当前路径相同');
51
+ return;
52
+ }
53
+ title('迁移 Store');
54
+ blank();
55
+ // 获取当前 Store 信息
56
+ const libraries = await store.listLibraries();
57
+ const totalSize = await store.getTotalSize();
58
+ info(`当前位置: ${shrinkHome(oldPath)} (${formatSize(totalSize)}, ${libraries.length} 个库)`);
59
+ info(`目标位置: ${shrinkHome(absoluteNewPath)}`);
60
+ blank();
61
+ // 检查目标路径
62
+ info('检查:');
63
+ // 检查可写性
64
+ try {
65
+ await fs.mkdir(absoluteNewPath, { recursive: true });
66
+ success(' [ok] 目标路径可写');
67
+ }
68
+ catch (err) {
69
+ error(` [err] 无法创建目标目录: ${err.message}`);
70
+ process.exit(1);
71
+ }
72
+ // 检查空间
73
+ const freeSpace = await getFreeSpace(absoluteNewPath);
74
+ if (freeSpace < totalSize) {
75
+ error(` [err] 目标空间不足 (需要 ${formatSize(totalSize)}, 可用 ${formatSize(freeSpace)})`);
76
+ process.exit(1);
77
+ }
78
+ success(` [ok] 目标空间充足 (${formatSize(freeSpace)} 可用)`);
79
+ // 获取需要更新的项目
80
+ const registry = getRegistry();
81
+ await registry.load();
82
+ const projects = registry.listProjects();
83
+ info(` [info] ${projects.length} 个项目的符号链接需要更新`);
84
+ blank();
85
+ if (!options.force) {
86
+ warn('使用 --force 选项确认迁移');
87
+ return;
88
+ }
89
+ // 执行迁移
90
+ separator();
91
+ // 1. 复制文件
92
+ info('[1/3] 复制文件...');
93
+ await copyDirWithProgress(oldPath, absoluteNewPath, totalSize, (copied, total) => {
94
+ progressBar(copied, total);
95
+ });
96
+ // 确保进度条完成
97
+ if (totalSize > 0) {
98
+ progressBar(totalSize, totalSize);
99
+ }
100
+ // 2. 更新符号链接
101
+ info('[2/3] 更新符号链接...');
102
+ for (const project of projects) {
103
+ let updatedCount = 0;
104
+ for (const dep of project.dependencies) {
105
+ const localPath = path.join(project.path, dep.linkedPath);
106
+ // 使用依赖记录的平台,或项目的第一个平台
107
+ const migratePlatform = dep.platform ?? project.platforms?.[0] ?? 'macOS';
108
+ const newStorePath = store.getLibraryPath(absoluteNewPath, dep.libName, dep.commit, migratePlatform);
109
+ if (await linker.isSymlink(localPath)) {
110
+ await linker.unlink(localPath);
111
+ await linker.link(newStorePath, localPath);
112
+ updatedCount++;
113
+ }
114
+ }
115
+ success(` [ok] ${shrinkHome(project.path)} (${updatedCount} 个链接)`);
116
+ }
117
+ // 3. 更新配置
118
+ await config.setStorePath(absoluteNewPath);
119
+ // 4. 清理旧目录
120
+ if (!options.keepOld) {
121
+ info('[3/3] 清理旧目录...');
122
+ try {
123
+ await fs.rm(oldPath, { recursive: true, force: true });
124
+ success(` [ok] 已删除 ${shrinkHome(oldPath)}`);
125
+ }
126
+ catch (err) {
127
+ warn(` [warn] 删除旧目录失败: ${err.message}`);
128
+ }
129
+ }
130
+ else {
131
+ info('[3/3] 保留旧目录');
132
+ }
133
+ blank();
134
+ success('迁移完成');
135
+ }
136
+ export default createMigrateCommand;
137
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EACL,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,KAAK,EACL,KAAK,EACL,KAAK,EACL,SAAS,EACT,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CAAC,eAAe,CAAC;SAC5B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;SAChC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;SACzB,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAAO,EAAE,EAAE;QACzC,MAAM,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAOD;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,OAAuB;IAClE,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAE5C,OAAO;IACP,MAAM,YAAY,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IACjD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,YAAY,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;IAE3C,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnB,OAAO;IACT,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,CAAC;IAClB,KAAK,EAAE,CAAC;IAER,gBAAgB;IAChB,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;IAE7C,IAAI,CAAC,SAAS,UAAU,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,MAAM,MAAM,CAAC,CAAC;IACxF,IAAI,CAAC,SAAS,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC;IAER,SAAS;IACT,IAAI,CAAC,KAAK,CAAC,CAAC;IAEZ,QAAQ;IACR,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,qBAAsB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO;IACP,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;IACtD,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;QAC1B,KAAK,CAAC,sBAAsB,UAAU,CAAC,SAAS,CAAC,QAAQ,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,kBAAkB,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEvD,YAAY;IACZ,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;IAEzC,IAAI,CAAC,YAAY,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC;IACjD,KAAK,EAAE,CAAC;IAER,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,OAAO;IACP,SAAS,EAAE,CAAC;IAEZ,UAAU;IACV,IAAI,CAAC,eAAe,CAAC,CAAC;IACtB,MAAM,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC/E,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,UAAU;IACV,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,YAAY;IACZ,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACxB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;YAC1D,sBAAsB;YACtB,MAAM,eAAe,GAAG,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;YAC1E,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAErG,IAAI,MAAM,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC/B,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;gBAC3C,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,UAAU,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC;IACtE,CAAC;IAED,UAAU;IACV,MAAM,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAE3C,WAAW;IACX,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,cAAc,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,qBAAsB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,aAAa,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,EAAE,CAAC;IACR,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * 创建 projects 命令
4
+ */
5
+ export declare function createProjectsCommand(): Command;
6
+ export default createProjectsCommand;
7
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAS/C;AAmID,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * projects 命令 - 查看所有已跟踪项目
3
+ */
4
+ import fs from 'fs/promises';
5
+ import { Command } from 'commander';
6
+ import { ensureInitialized } from '../core/guard.js';
7
+ import { getRegistry } from '../core/registry.js';
8
+ import { shrinkHome } from '../core/platform.js';
9
+ import { formatSize } from '../utils/disk.js';
10
+ import { info, warn, title, blank, tree as printTree } from '../utils/logger.js';
11
+ /**
12
+ * 创建 projects 命令
13
+ */
14
+ export function createProjectsCommand() {
15
+ return new Command('projects')
16
+ .description('查看所有已跟踪项目')
17
+ .option('--tree', '树状展示库引用关系')
18
+ .option('--json', 'JSON 格式输出')
19
+ .action(async (options) => {
20
+ await ensureInitialized();
21
+ await showProjects(options);
22
+ });
23
+ }
24
+ /**
25
+ * 显示项目列表
26
+ */
27
+ async function showProjects(options) {
28
+ const registry = getRegistry();
29
+ await registry.load();
30
+ const projects = registry.listProjects();
31
+ const libraries = registry.listLibraries();
32
+ if (options.json) {
33
+ console.log(JSON.stringify({ projects, libraries }, null, 2));
34
+ return;
35
+ }
36
+ if (options.tree) {
37
+ await showTreeView(libraries, projects);
38
+ return;
39
+ }
40
+ // 普通列表视图
41
+ if (projects.length === 0) {
42
+ info('暂无已跟踪的项目');
43
+ blank();
44
+ info('使用 tanmi-dock link <path> 链接项目');
45
+ return;
46
+ }
47
+ title(`已跟踪项目 (${projects.length} 个):`);
48
+ blank();
49
+ let index = 1;
50
+ for (const project of projects) {
51
+ const displayPath = shrinkHome(project.path);
52
+ const pathExists = await checkPathExists(project.path);
53
+ info(` ${index}. ${displayPath}`);
54
+ info(` 最后链接: ${formatDate(project.lastLinked)}`);
55
+ info(` 平台: ${project.platforms?.join(', ') || '未指定'}`);
56
+ info(` 依赖: ${project.dependencies.length} 个`);
57
+ if (!pathExists) {
58
+ warn(` [warn] 路径不存在(项目可能已删除)`);
59
+ }
60
+ blank();
61
+ index++;
62
+ }
63
+ }
64
+ /**
65
+ * 显示树状视图
66
+ */
67
+ async function showTreeView(libraries, projects) {
68
+ const registry = getRegistry();
69
+ // 计算总大小
70
+ let totalSize = 0;
71
+ for (const lib of libraries) {
72
+ totalSize += lib.size;
73
+ }
74
+ title(`Store: ${formatSize(totalSize)} (${libraries.length} 个库)`);
75
+ blank();
76
+ // 构建项目 hash 到路径的映射
77
+ const hashToPath = {};
78
+ for (const project of projects) {
79
+ const hash = registry.hashPath(project.path);
80
+ hashToPath[hash] = shrinkHome(project.path);
81
+ }
82
+ // 构建树
83
+ const treeItems = [];
84
+ for (const lib of libraries) {
85
+ const libLabel = `${lib.libName} (${lib.commit.slice(0, 7)}) - ${formatSize(lib.size)}`;
86
+ const children = [];
87
+ for (const refHash of lib.referencedBy) {
88
+ const projectPath = hashToPath[refHash];
89
+ if (projectPath) {
90
+ children.push({ label: projectPath });
91
+ }
92
+ }
93
+ treeItems.push({
94
+ label: libLabel,
95
+ children,
96
+ warn: lib.referencedBy.length === 0,
97
+ });
98
+ }
99
+ printTree(treeItems);
100
+ }
101
+ /**
102
+ * 检查路径是否存在
103
+ */
104
+ async function checkPathExists(p) {
105
+ try {
106
+ await fs.access(p);
107
+ return true;
108
+ }
109
+ catch {
110
+ return false;
111
+ }
112
+ }
113
+ /**
114
+ * 格式化日期
115
+ */
116
+ function formatDate(isoString) {
117
+ const date = new Date(isoString);
118
+ const year = date.getFullYear();
119
+ const month = String(date.getMonth() + 1).padStart(2, '0');
120
+ const day = String(date.getDate()).padStart(2, '0');
121
+ const hour = String(date.getHours()).padStart(2, '0');
122
+ const minute = String(date.getMinutes()).padStart(2, '0');
123
+ return `${year}-${month}-${day} ${hour}:${minute}`;
124
+ }
125
+ export default createProjectsCommand;
126
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * 创建 repair 命令
4
+ */
5
+ export declare function createRepairCommand(): Command;
6
+ export default createRepairCommand;
7
+ //# sourceMappingURL=repair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C;AAuQD,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * repair 命令 - 修复 Store 和 Registry 问题
3
+ */
4
+ import fs from 'fs/promises';
5
+ import path from 'path';
6
+ import { Command } from 'commander';
7
+ import { ensureInitialized } from '../core/guard.js';
8
+ import { getRegistry } from '../core/registry.js';
9
+ import * as store from '../core/store.js';
10
+ import { formatSize } from '../utils/disk.js';
11
+ import { info, success, error, hint, blank, title, separator } from '../utils/logger.js';
12
+ import { confirmAction } from '../utils/prompt.js';
13
+ /**
14
+ * 创建 repair 命令
15
+ */
16
+ export function createRepairCommand() {
17
+ return new Command('repair')
18
+ .description('修复 Store 和 Registry 问题')
19
+ .option('--dry-run', '只显示将执行的操作')
20
+ .option('--prune', '删除孤立库而非登记')
21
+ .option('--force', '跳过确认')
22
+ .action(async (options) => {
23
+ await ensureInitialized();
24
+ await repairIssues(options);
25
+ });
26
+ }
27
+ /**
28
+ * 修复问题
29
+ */
30
+ async function repairIssues(options) {
31
+ title('修复 Store 问题');
32
+ blank();
33
+ const registry = getRegistry();
34
+ await registry.load();
35
+ const storePath = await store.getStorePath();
36
+ const result = {
37
+ danglingLinksRemoved: 0,
38
+ orphanLibrariesFixed: 0,
39
+ staleProjectsCleaned: 0,
40
+ };
41
+ // 收集问题
42
+ const issues = {
43
+ danglingLinks: [],
44
+ orphanLibraries: [],
45
+ staleProjects: [],
46
+ };
47
+ // 1. 检查过期项目和悬挂链接
48
+ info('扫描问题...');
49
+ const projects = registry.listProjects();
50
+ for (const project of projects) {
51
+ const projectHash = registry.hashPath(project.path);
52
+ // 检查项目路径是否存在
53
+ try {
54
+ await fs.access(project.path);
55
+ }
56
+ catch {
57
+ issues.staleProjects.push({ hash: projectHash, path: project.path });
58
+ continue;
59
+ }
60
+ // 检查依赖的符号链接
61
+ for (const dep of project.dependencies) {
62
+ const linkPath = path.join(project.path, dep.linkedPath);
63
+ try {
64
+ const stat = await fs.lstat(linkPath);
65
+ if (stat.isSymbolicLink()) {
66
+ const actualTarget = await fs.readlink(linkPath);
67
+ const resolvedTarget = path.resolve(path.dirname(linkPath), actualTarget);
68
+ try {
69
+ await fs.access(resolvedTarget);
70
+ }
71
+ catch {
72
+ issues.danglingLinks.push({
73
+ path: linkPath,
74
+ projectHash,
75
+ dep: { libName: dep.libName, commit: dep.commit },
76
+ });
77
+ }
78
+ }
79
+ }
80
+ catch {
81
+ // 链接不存在,跳过
82
+ }
83
+ }
84
+ }
85
+ // 2. 检查孤立库
86
+ try {
87
+ const storeEntries = await fs.readdir(storePath);
88
+ for (const libName of storeEntries) {
89
+ const libPath = path.join(storePath, libName);
90
+ const stat = await fs.stat(libPath);
91
+ if (!stat.isDirectory())
92
+ continue;
93
+ const commits = await fs.readdir(libPath);
94
+ for (const commit of commits) {
95
+ const commitPath = path.join(libPath, commit);
96
+ const commitStat = await fs.stat(commitPath);
97
+ if (!commitStat.isDirectory())
98
+ continue;
99
+ const libKey = registry.getLibraryKey(libName, commit);
100
+ const libInfo = registry.getLibrary(libKey);
101
+ if (!libInfo) {
102
+ const size = await getDirSizeRecursive(commitPath);
103
+ issues.orphanLibraries.push({ libName, commit, size, path: commitPath });
104
+ }
105
+ }
106
+ }
107
+ }
108
+ catch {
109
+ // Store 目录不存在或无法读取
110
+ }
111
+ // 显示问题汇总
112
+ const totalIssues = issues.danglingLinks.length + issues.orphanLibraries.length + issues.staleProjects.length;
113
+ if (totalIssues === 0) {
114
+ success('没有发现需要修复的问题');
115
+ return;
116
+ }
117
+ blank();
118
+ info(`发现 ${totalIssues} 个问题:`);
119
+ if (issues.staleProjects.length > 0) {
120
+ info(` - ${issues.staleProjects.length} 个过期项目`);
121
+ }
122
+ if (issues.danglingLinks.length > 0) {
123
+ info(` - ${issues.danglingLinks.length} 个悬挂链接`);
124
+ }
125
+ if (issues.orphanLibraries.length > 0) {
126
+ const totalSize = issues.orphanLibraries.reduce((sum, lib) => sum + lib.size, 0);
127
+ info(` - ${issues.orphanLibraries.length} 个孤立库 (${formatSize(totalSize)})`);
128
+ }
129
+ // dry-run 模式
130
+ if (options.dryRun) {
131
+ blank();
132
+ separator();
133
+ info('[dry-run] 将执行以下操作:');
134
+ blank();
135
+ for (const p of issues.staleProjects) {
136
+ info(` 清理过期项目: ${p.path}`);
137
+ }
138
+ for (const link of issues.danglingLinks) {
139
+ info(` 移除悬挂链接: ${link.path}`);
140
+ }
141
+ for (const lib of issues.orphanLibraries) {
142
+ if (options.prune) {
143
+ info(` 删除孤立库: ${lib.libName}/${lib.commit.slice(0, 7)} (${formatSize(lib.size)})`);
144
+ }
145
+ else {
146
+ info(` 登记孤立库: ${lib.libName}/${lib.commit.slice(0, 7)}`);
147
+ }
148
+ }
149
+ blank();
150
+ hint('移除 --dry-run 选项以执行修复');
151
+ return;
152
+ }
153
+ // 确认执行
154
+ if (!options.force) {
155
+ blank();
156
+ const confirmed = await confirmAction(`确认修复以上 ${totalIssues} 个问题?`, false);
157
+ if (!confirmed) {
158
+ info('已取消修复');
159
+ return;
160
+ }
161
+ }
162
+ // 执行修复
163
+ blank();
164
+ separator();
165
+ info('正在修复...');
166
+ blank();
167
+ // 3.1 清理过期项目
168
+ for (const p of issues.staleProjects) {
169
+ try {
170
+ registry.removeProject(p.hash);
171
+ success(`[ok] 清理过期项目: ${p.path}`);
172
+ result.staleProjectsCleaned++;
173
+ }
174
+ catch (err) {
175
+ error(`[err] 清理项目失败: ${p.path} - ${err.message}`);
176
+ }
177
+ }
178
+ // 3.2 移除悬挂链接
179
+ for (const link of issues.danglingLinks) {
180
+ try {
181
+ await fs.unlink(link.path);
182
+ // 更新项目依赖
183
+ const project = registry.getProject(link.projectHash);
184
+ if (project) {
185
+ project.dependencies = project.dependencies.filter((d) => !(d.libName === link.dep.libName && d.commit === link.dep.commit));
186
+ registry.updateProject(link.projectHash, { dependencies: project.dependencies });
187
+ }
188
+ success(`[ok] 移除悬挂链接: ${link.path}`);
189
+ result.danglingLinksRemoved++;
190
+ }
191
+ catch (err) {
192
+ error(`[err] 移除链接失败: ${link.path} - ${err.message}`);
193
+ }
194
+ }
195
+ // 3.3 处理孤立库
196
+ for (const lib of issues.orphanLibraries) {
197
+ try {
198
+ if (options.prune) {
199
+ // 删除孤立库
200
+ await fs.rm(lib.path, { recursive: true, force: true });
201
+ success(`[ok] 删除孤立库: ${lib.libName}/${lib.commit.slice(0, 7)}`);
202
+ }
203
+ else {
204
+ // 登记到 Registry
205
+ registry.addLibrary({
206
+ libName: lib.libName,
207
+ commit: lib.commit,
208
+ branch: 'unknown',
209
+ url: 'unknown',
210
+ platforms: [],
211
+ size: lib.size,
212
+ referencedBy: [],
213
+ createdAt: new Date().toISOString(),
214
+ lastAccess: new Date().toISOString(),
215
+ });
216
+ success(`[ok] 登记孤立库: ${lib.libName}/${lib.commit.slice(0, 7)}`);
217
+ }
218
+ result.orphanLibrariesFixed++;
219
+ }
220
+ catch (err) {
221
+ error(`[err] 处理孤立库失败: ${lib.libName}/${lib.commit.slice(0, 7)} - ${err.message}`);
222
+ }
223
+ }
224
+ // 保存 Registry
225
+ await registry.save();
226
+ // 结果汇总
227
+ blank();
228
+ separator();
229
+ const totalFixed = result.danglingLinksRemoved + result.orphanLibrariesFixed + result.staleProjectsCleaned;
230
+ success(`修复完成: ${totalFixed} 个问题已解决`);
231
+ }
232
+ /**
233
+ * 递归计算目录大小
234
+ */
235
+ async function getDirSizeRecursive(dirPath) {
236
+ let size = 0;
237
+ try {
238
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
239
+ for (const entry of entries) {
240
+ const fullPath = path.join(dirPath, entry.name);
241
+ if (entry.isDirectory()) {
242
+ size += await getDirSizeRecursive(fullPath);
243
+ }
244
+ else {
245
+ const stat = await fs.stat(fullPath);
246
+ size += stat.size;
247
+ }
248
+ }
249
+ }
250
+ catch {
251
+ // 忽略错误
252
+ }
253
+ return size;
254
+ }
255
+ export default createRepairCommand;
256
+ //# sourceMappingURL=repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * 创建 status 命令
4
+ */
5
+ export declare function createStatusCommand(): Command;
6
+ export default createStatusCommand;
7
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAS7C;AAmKD,eAAe,mBAAmB,CAAC"}