tanmi-dock 0.7.2 → 0.7.3-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.
- package/dist/commands/CLAUDE.md +7 -0
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +178 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/link.js +2 -0
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/projects.d.ts +7 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +126 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/repair.d.ts +16 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.js +364 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/verify.d.ts +11 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +266 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/CLAUDE.md +7 -0
- package/dist/utils/ios-paths.d.ts +26 -0
- package/dist/utils/ios-paths.d.ts.map +1 -0
- package/dist/utils/ios-paths.js +70 -0
- package/dist/utils/ios-paths.js.map +1 -0
- package/dist/utils/podfile.d.ts +42 -0
- package/dist/utils/podfile.d.ts.map +1 -0
- package/dist/utils/podfile.js +254 -0
- package/dist/utils/podfile.js.map +1 -0
- package/package.json +1 -1
|
@@ -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,16 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* 创建 repair 命令
|
|
4
|
+
*/
|
|
5
|
+
export declare function createRepairCommand(): Command;
|
|
6
|
+
interface RepairOptions {
|
|
7
|
+
dryRun: boolean;
|
|
8
|
+
prune: boolean;
|
|
9
|
+
force: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 修复问题
|
|
13
|
+
*/
|
|
14
|
+
export declare function repairIssues(options: RepairOptions): Promise<void>;
|
|
15
|
+
export default createRepairCommand;
|
|
16
|
+
//# 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;AAepC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqVxE;AAwBD,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,364 @@
|
|
|
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
|
+
export 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
|
+
staleReferencesFixed: 0,
|
|
41
|
+
};
|
|
42
|
+
// 收集问题
|
|
43
|
+
const issues = {
|
|
44
|
+
danglingLinks: [],
|
|
45
|
+
orphanLibraries: [],
|
|
46
|
+
staleProjects: [],
|
|
47
|
+
staleReferences: [],
|
|
48
|
+
};
|
|
49
|
+
// 1. 检查过期项目和悬挂链接
|
|
50
|
+
info('扫描问题...');
|
|
51
|
+
const projects = registry.listProjects();
|
|
52
|
+
for (const project of projects) {
|
|
53
|
+
const projectHash = registry.hashPath(project.path);
|
|
54
|
+
// 检查项目路径是否存在
|
|
55
|
+
try {
|
|
56
|
+
await fs.access(project.path);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
issues.staleProjects.push({ hash: projectHash, path: project.path });
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// 检查依赖的符号链接
|
|
63
|
+
for (const dep of project.dependencies) {
|
|
64
|
+
const linkPath = path.join(project.path, dep.linkedPath);
|
|
65
|
+
try {
|
|
66
|
+
const stat = await fs.lstat(linkPath);
|
|
67
|
+
if (stat.isSymbolicLink()) {
|
|
68
|
+
const actualTarget = await fs.readlink(linkPath);
|
|
69
|
+
const resolvedTarget = path.resolve(path.dirname(linkPath), actualTarget);
|
|
70
|
+
try {
|
|
71
|
+
await fs.access(resolvedTarget);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
issues.danglingLinks.push({
|
|
75
|
+
path: linkPath,
|
|
76
|
+
projectHash,
|
|
77
|
+
dep: { libName: dep.libName, commit: dep.commit },
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// 链接不存在,跳过
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// 2. 检查孤立库
|
|
88
|
+
try {
|
|
89
|
+
const storeEntries = await fs.readdir(storePath);
|
|
90
|
+
for (const libName of storeEntries) {
|
|
91
|
+
const libPath = path.join(storePath, libName);
|
|
92
|
+
const stat = await fs.stat(libPath);
|
|
93
|
+
if (!stat.isDirectory())
|
|
94
|
+
continue;
|
|
95
|
+
const commits = await fs.readdir(libPath);
|
|
96
|
+
for (const commit of commits) {
|
|
97
|
+
const commitPath = path.join(libPath, commit);
|
|
98
|
+
const commitStat = await fs.stat(commitPath);
|
|
99
|
+
if (!commitStat.isDirectory())
|
|
100
|
+
continue;
|
|
101
|
+
const libKey = registry.getLibraryKey(libName, commit);
|
|
102
|
+
const libInfo = registry.getLibrary(libKey);
|
|
103
|
+
if (!libInfo) {
|
|
104
|
+
const size = await getDirSizeRecursive(commitPath);
|
|
105
|
+
issues.orphanLibraries.push({ libName, commit, size, path: commitPath });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Store 目录不存在或无法读取
|
|
112
|
+
}
|
|
113
|
+
// 3. 检查失效引用(Registry 中 referencedBy 指向的项目没有实际符号链接)
|
|
114
|
+
const libraries = registry.listLibraries();
|
|
115
|
+
for (const lib of libraries) {
|
|
116
|
+
const libKey = registry.getLibraryKey(lib.libName, lib.commit);
|
|
117
|
+
for (const projectHash of lib.referencedBy) {
|
|
118
|
+
const project = registry.getProject(projectHash);
|
|
119
|
+
if (!project) {
|
|
120
|
+
// 项目不存在于 registry
|
|
121
|
+
issues.staleReferences.push({
|
|
122
|
+
libKey,
|
|
123
|
+
projectHash,
|
|
124
|
+
projectPath: '(项目已删除)',
|
|
125
|
+
});
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
// 检查项目中是否有符号链接指向此库版本
|
|
129
|
+
let hasValidLink = false;
|
|
130
|
+
const libStorePath = path.join(storePath, lib.libName, lib.commit);
|
|
131
|
+
for (const dep of project.dependencies) {
|
|
132
|
+
if (dep.libName === lib.libName && dep.commit === lib.commit) {
|
|
133
|
+
const linkPath = path.join(project.path, dep.linkedPath);
|
|
134
|
+
try {
|
|
135
|
+
const stat = await fs.lstat(linkPath);
|
|
136
|
+
if (stat.isSymbolicLink()) {
|
|
137
|
+
const target = await fs.readlink(linkPath);
|
|
138
|
+
const resolvedTarget = path.resolve(path.dirname(linkPath), target);
|
|
139
|
+
// 检查链接是否指向此库版本
|
|
140
|
+
if (resolvedTarget.startsWith(libStorePath)) {
|
|
141
|
+
hasValidLink = true;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else if (stat.isDirectory()) {
|
|
146
|
+
// 多平台模式:检查内部是否有符号链接指向此库
|
|
147
|
+
const entries = await fs.readdir(linkPath, { withFileTypes: true });
|
|
148
|
+
for (const entry of entries) {
|
|
149
|
+
if (entry.isSymbolicLink()) {
|
|
150
|
+
const subLinkPath = path.join(linkPath, entry.name);
|
|
151
|
+
const subTarget = await fs.readlink(subLinkPath);
|
|
152
|
+
const resolvedSubTarget = path.resolve(linkPath, subTarget);
|
|
153
|
+
if (resolvedSubTarget.startsWith(libStorePath)) {
|
|
154
|
+
hasValidLink = true;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (hasValidLink)
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// 链接不存在或无法读取
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (!hasValidLink) {
|
|
169
|
+
issues.staleReferences.push({
|
|
170
|
+
libKey,
|
|
171
|
+
projectHash,
|
|
172
|
+
projectPath: project.path,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// 显示问题汇总
|
|
178
|
+
const totalIssues = issues.danglingLinks.length + issues.orphanLibraries.length + issues.staleProjects.length + issues.staleReferences.length;
|
|
179
|
+
if (totalIssues === 0) {
|
|
180
|
+
success('没有发现需要修复的问题');
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
blank();
|
|
184
|
+
info(`发现 ${totalIssues} 个问题:`);
|
|
185
|
+
if (issues.staleProjects.length > 0) {
|
|
186
|
+
info(` - ${issues.staleProjects.length} 个过期项目`);
|
|
187
|
+
}
|
|
188
|
+
if (issues.danglingLinks.length > 0) {
|
|
189
|
+
info(` - ${issues.danglingLinks.length} 个悬挂链接`);
|
|
190
|
+
}
|
|
191
|
+
if (issues.orphanLibraries.length > 0) {
|
|
192
|
+
const totalSize = issues.orphanLibraries.reduce((sum, lib) => sum + lib.size, 0);
|
|
193
|
+
info(` - ${issues.orphanLibraries.length} 个孤立库 (${formatSize(totalSize)})`);
|
|
194
|
+
}
|
|
195
|
+
if (issues.staleReferences.length > 0) {
|
|
196
|
+
info(` - ${issues.staleReferences.length} 个失效引用`);
|
|
197
|
+
}
|
|
198
|
+
// dry-run 模式
|
|
199
|
+
if (options.dryRun) {
|
|
200
|
+
blank();
|
|
201
|
+
separator();
|
|
202
|
+
info('[dry-run] 将执行以下操作:');
|
|
203
|
+
blank();
|
|
204
|
+
for (const p of issues.staleProjects) {
|
|
205
|
+
info(` 清理过期项目: ${p.path}`);
|
|
206
|
+
}
|
|
207
|
+
for (const link of issues.danglingLinks) {
|
|
208
|
+
info(` 移除悬挂链接: ${link.path}`);
|
|
209
|
+
}
|
|
210
|
+
for (const lib of issues.orphanLibraries) {
|
|
211
|
+
if (options.prune) {
|
|
212
|
+
info(` 删除孤立库: ${lib.libName}/${lib.commit.slice(0, 7)} (${formatSize(lib.size)})`);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
info(` 登记孤立库: ${lib.libName}/${lib.commit.slice(0, 7)}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
for (const ref of issues.staleReferences) {
|
|
219
|
+
info(` 移除失效引用: ${ref.libKey} <- ${ref.projectPath}`);
|
|
220
|
+
}
|
|
221
|
+
blank();
|
|
222
|
+
hint('移除 --dry-run 选项以执行修复');
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// 确认执行
|
|
226
|
+
if (!options.force) {
|
|
227
|
+
blank();
|
|
228
|
+
const confirmed = await confirmAction(`确认修复以上 ${totalIssues} 个问题?`, false);
|
|
229
|
+
if (!confirmed) {
|
|
230
|
+
info('已取消修复');
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// 执行修复
|
|
235
|
+
blank();
|
|
236
|
+
separator();
|
|
237
|
+
info('正在修复...');
|
|
238
|
+
blank();
|
|
239
|
+
// 3.1 清理过期项目
|
|
240
|
+
for (const p of issues.staleProjects) {
|
|
241
|
+
try {
|
|
242
|
+
registry.removeProject(p.hash);
|
|
243
|
+
success(`[ok] 清理过期项目: ${p.path}`);
|
|
244
|
+
result.staleProjectsCleaned++;
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
error(`[err] 清理项目失败: ${p.path} - ${err.message}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// 3.2 移除悬挂链接
|
|
251
|
+
for (const link of issues.danglingLinks) {
|
|
252
|
+
try {
|
|
253
|
+
await fs.unlink(link.path);
|
|
254
|
+
// 更新项目依赖
|
|
255
|
+
const project = registry.getProject(link.projectHash);
|
|
256
|
+
if (project) {
|
|
257
|
+
project.dependencies = project.dependencies.filter((d) => !(d.libName === link.dep.libName && d.commit === link.dep.commit));
|
|
258
|
+
registry.updateProject(link.projectHash, { dependencies: project.dependencies });
|
|
259
|
+
}
|
|
260
|
+
success(`[ok] 移除悬挂链接: ${link.path}`);
|
|
261
|
+
result.danglingLinksRemoved++;
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
error(`[err] 移除链接失败: ${link.path} - ${err.message}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// 3.3 处理孤立库
|
|
268
|
+
for (const lib of issues.orphanLibraries) {
|
|
269
|
+
try {
|
|
270
|
+
if (options.prune) {
|
|
271
|
+
// 删除孤立库
|
|
272
|
+
await fs.rm(lib.path, { recursive: true, force: true });
|
|
273
|
+
success(`[ok] 删除孤立库: ${lib.libName}/${lib.commit.slice(0, 7)}`);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
// 登记到 Registry - LibraryInfo
|
|
277
|
+
registry.addLibrary({
|
|
278
|
+
libName: lib.libName,
|
|
279
|
+
commit: lib.commit,
|
|
280
|
+
branch: 'unknown',
|
|
281
|
+
url: 'unknown',
|
|
282
|
+
platforms: [],
|
|
283
|
+
size: lib.size,
|
|
284
|
+
referencedBy: [],
|
|
285
|
+
createdAt: new Date().toISOString(),
|
|
286
|
+
lastAccess: new Date().toISOString(),
|
|
287
|
+
});
|
|
288
|
+
// 扫描平台子目录并登记 StoreEntry
|
|
289
|
+
try {
|
|
290
|
+
const entries = await fs.readdir(lib.path, { withFileTypes: true });
|
|
291
|
+
for (const entry of entries) {
|
|
292
|
+
if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== '_shared') {
|
|
293
|
+
const platform = entry.name;
|
|
294
|
+
const platformPath = path.join(lib.path, platform);
|
|
295
|
+
const platformSize = await getDirSizeRecursive(platformPath);
|
|
296
|
+
registry.addStore({
|
|
297
|
+
libName: lib.libName,
|
|
298
|
+
commit: lib.commit,
|
|
299
|
+
platform,
|
|
300
|
+
branch: 'unknown',
|
|
301
|
+
url: 'unknown',
|
|
302
|
+
size: platformSize,
|
|
303
|
+
usedBy: [],
|
|
304
|
+
createdAt: new Date().toISOString(),
|
|
305
|
+
lastAccess: new Date().toISOString(),
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
// 无法读取目录,跳过 StoreEntry 登记
|
|
312
|
+
}
|
|
313
|
+
success(`[ok] 登记孤立库: ${lib.libName}/${lib.commit.slice(0, 7)}`);
|
|
314
|
+
}
|
|
315
|
+
result.orphanLibrariesFixed++;
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
error(`[err] 处理孤立库失败: ${lib.libName}/${lib.commit.slice(0, 7)} - ${err.message}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// 3.4 修复失效引用
|
|
322
|
+
for (const ref of issues.staleReferences) {
|
|
323
|
+
try {
|
|
324
|
+
registry.removeReference(ref.libKey, ref.projectHash);
|
|
325
|
+
success(`[ok] 移除失效引用: ${ref.libKey} <- ${ref.projectPath}`);
|
|
326
|
+
result.staleReferencesFixed++;
|
|
327
|
+
}
|
|
328
|
+
catch (err) {
|
|
329
|
+
error(`[err] 移除引用失败: ${ref.libKey} - ${err.message}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// 保存 Registry
|
|
333
|
+
await registry.save();
|
|
334
|
+
// 结果汇总
|
|
335
|
+
blank();
|
|
336
|
+
separator();
|
|
337
|
+
const totalFixed = result.danglingLinksRemoved + result.orphanLibrariesFixed + result.staleProjectsCleaned + result.staleReferencesFixed;
|
|
338
|
+
success(`修复完成: ${totalFixed} 个问题已解决`);
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* 递归计算目录大小
|
|
342
|
+
*/
|
|
343
|
+
async function getDirSizeRecursive(dirPath) {
|
|
344
|
+
let size = 0;
|
|
345
|
+
try {
|
|
346
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
347
|
+
for (const entry of entries) {
|
|
348
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
349
|
+
if (entry.isDirectory()) {
|
|
350
|
+
size += await getDirSizeRecursive(fullPath);
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
const stat = await fs.stat(fullPath);
|
|
354
|
+
size += stat.size;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
// 忽略错误
|
|
360
|
+
}
|
|
361
|
+
return size;
|
|
362
|
+
}
|
|
363
|
+
export default createRepairCommand;
|
|
364
|
+
//# 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,11 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* 创建 verify 命令
|
|
4
|
+
*/
|
|
5
|
+
export declare function createVerifyCommand(): Command;
|
|
6
|
+
/**
|
|
7
|
+
* 验证完整性
|
|
8
|
+
*/
|
|
9
|
+
export declare function verifyIntegrity(): Promise<void>;
|
|
10
|
+
export default createVerifyCommand;
|
|
11
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAO7C;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsOrD;AAwBD,eAAe,mBAAmB,CAAC"}
|