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,226 @@
1
+ /**
2
+ * Store 存储操作
3
+ * Store 目录结构: {storePath}/{libName}/{commit}/{platform}/
4
+ */
5
+ import fs from 'fs/promises';
6
+ import path from 'path';
7
+ import * as config from './config.js';
8
+ import { withFileLock } from '../utils/lock.js';
9
+ import { copyDir, getDirSize } from '../utils/fs-utils.js';
10
+ /**
11
+ * 获取库在 Store 中的路径
12
+ */
13
+ export function getLibraryPath(storePath, libName, commit, platform) {
14
+ return path.join(storePath, libName, commit, platform);
15
+ }
16
+ /**
17
+ * 获取当前配置的 Store 路径
18
+ */
19
+ export async function getStorePath() {
20
+ const storePath = await config.getStorePath();
21
+ if (!storePath) {
22
+ throw new Error('Store 路径未配置,请先运行 tanmi-dock init');
23
+ }
24
+ return storePath;
25
+ }
26
+ /**
27
+ * 检查库是否存在于 Store 中
28
+ */
29
+ export async function exists(libName, commit, platform) {
30
+ try {
31
+ const storePath = await getStorePath();
32
+ const libPath = getLibraryPath(storePath, libName, commit, platform);
33
+ await fs.access(libPath);
34
+ return true;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ /**
41
+ * 获取库的完整路径
42
+ */
43
+ export async function getPath(libName, commit, platform) {
44
+ const storePath = await getStorePath();
45
+ const libPath = getLibraryPath(storePath, libName, commit, platform);
46
+ try {
47
+ await fs.access(libPath);
48
+ return libPath;
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ /**
55
+ * 将本地库目录移入 Store (absorb)
56
+ * 使用原子重命名 + 错误处理,避免 TOCTOU 竞态条件
57
+ * @param sourcePath 源目录路径
58
+ * @param libName 库名
59
+ * @param commit commit hash
60
+ * @param platform 平台名
61
+ * @returns Store 中的库路径
62
+ */
63
+ export async function absorb(sourcePath, libName, commit, platform) {
64
+ const storePath = await getStorePath();
65
+ const targetPath = getLibraryPath(storePath, libName, commit, platform);
66
+ // 确保目标父目录存在
67
+ const parentDir = path.dirname(targetPath);
68
+ await fs.mkdir(parentDir, { recursive: true });
69
+ // 直接尝试重命名,让文件系统保证原子性
70
+ // 如果目标已存在,rename 会失败并返回 ENOTEMPTY 或 EEXIST
71
+ try {
72
+ await fs.rename(sourcePath, targetPath);
73
+ }
74
+ catch (err) {
75
+ const code = err.code;
76
+ if (code === 'ENOTEMPTY' || code === 'EEXIST') {
77
+ throw new Error(`库已存在于 Store 中: ${libName}@${commit.slice(0, 7)}/${platform}`);
78
+ }
79
+ throw err;
80
+ }
81
+ return targetPath;
82
+ }
83
+ /**
84
+ * 复制库到 Store(不删除源目录)
85
+ * 使用文件锁保护检查-创建操作,避免 TOCTOU 竞态条件
86
+ */
87
+ export async function copy(sourcePath, libName, commit, platform) {
88
+ const storePath = await getStorePath();
89
+ const targetPath = getLibraryPath(storePath, libName, commit, platform);
90
+ // 确保目标父目录存在
91
+ const parentDir = path.dirname(targetPath);
92
+ await fs.mkdir(parentDir, { recursive: true });
93
+ // 使用文件锁保护检查和复制操作
94
+ // 锁定父目录,防止并发复制同一库
95
+ await withFileLock(parentDir, async () => {
96
+ // 检查目标是否已存在(在锁内检查,安全)
97
+ try {
98
+ await fs.access(targetPath);
99
+ throw new Error(`库已存在于 Store 中: ${libName}@${commit.slice(0, 7)}/${platform}`);
100
+ }
101
+ catch (err) {
102
+ if (err.code !== 'ENOENT') {
103
+ throw err;
104
+ }
105
+ }
106
+ // 递归复制目录(在锁内执行,安全)
107
+ await copyDir(sourcePath, targetPath);
108
+ });
109
+ return targetPath;
110
+ }
111
+ /**
112
+ * 从 Store 中删除库
113
+ */
114
+ export async function remove(libName, commit, platform) {
115
+ const storePath = await getStorePath();
116
+ const libPath = getLibraryPath(storePath, libName, commit, platform);
117
+ await fs.rm(libPath, { recursive: true, force: true });
118
+ // 如果 commit 目录为空,也删除
119
+ const commitDir = path.dirname(libPath);
120
+ try {
121
+ const remaining = await fs.readdir(commitDir);
122
+ if (remaining.length === 0) {
123
+ await fs.rmdir(commitDir);
124
+ // 如果 lib 目录也为空,也删除
125
+ const libDir = path.dirname(commitDir);
126
+ const libRemaining = await fs.readdir(libDir);
127
+ if (libRemaining.length === 0) {
128
+ await fs.rmdir(libDir);
129
+ }
130
+ }
131
+ }
132
+ catch {
133
+ // 目录可能已不存在
134
+ }
135
+ }
136
+ /**
137
+ * 获取库占用空间 (bytes)
138
+ */
139
+ export async function getSize(libName, commit, platform) {
140
+ const storePath = await getStorePath();
141
+ const libPath = getLibraryPath(storePath, libName, commit, platform);
142
+ return getDirSize(libPath);
143
+ }
144
+ /**
145
+ * 获取 Store 总大小
146
+ */
147
+ export async function getTotalSize() {
148
+ const storePath = await getStorePath();
149
+ return getDirSize(storePath);
150
+ }
151
+ /**
152
+ * 列出 Store 中所有库
153
+ */
154
+ export async function listLibraries() {
155
+ const storePath = await getStorePath();
156
+ const libraries = [];
157
+ try {
158
+ const libDirs = await fs.readdir(storePath, { withFileTypes: true });
159
+ for (const libDir of libDirs) {
160
+ if (!libDir.isDirectory())
161
+ continue;
162
+ const libPath = path.join(storePath, libDir.name);
163
+ const commits = await fs.readdir(libPath, { withFileTypes: true });
164
+ for (const commitDir of commits) {
165
+ if (!commitDir.isDirectory())
166
+ continue;
167
+ const commitPath = path.join(libPath, commitDir.name);
168
+ const platforms = await fs.readdir(commitPath, { withFileTypes: true });
169
+ for (const platformDir of platforms) {
170
+ if (!platformDir.isDirectory())
171
+ continue;
172
+ libraries.push({
173
+ libName: libDir.name,
174
+ commit: commitDir.name,
175
+ platform: platformDir.name,
176
+ path: path.join(commitPath, platformDir.name),
177
+ });
178
+ }
179
+ }
180
+ }
181
+ }
182
+ catch {
183
+ // Store 目录不存在
184
+ }
185
+ return libraries;
186
+ }
187
+ /**
188
+ * 验证平台目录是否有有效内容
189
+ * @returns true 有内容,false 为空或只有隐藏文件
190
+ */
191
+ export async function validatePlatform(libName, commit, platform) {
192
+ const platformPath = await getPath(libName, commit, platform);
193
+ if (!platformPath)
194
+ return false;
195
+ try {
196
+ const entries = await fs.readdir(platformPath);
197
+ // 过滤隐藏文件
198
+ const visible = entries.filter(e => !e.startsWith('.'));
199
+ return visible.length > 0;
200
+ }
201
+ catch {
202
+ return false;
203
+ }
204
+ }
205
+ /**
206
+ * 确保 Store 目录存在
207
+ */
208
+ export async function ensureStoreDir() {
209
+ const storePath = await getStorePath();
210
+ await fs.mkdir(storePath, { recursive: true });
211
+ }
212
+ export default {
213
+ getLibraryPath,
214
+ getStorePath,
215
+ exists,
216
+ getPath,
217
+ absorb,
218
+ copy,
219
+ remove,
220
+ getSize,
221
+ getTotalSize,
222
+ listLibraries,
223
+ validatePlatform,
224
+ ensureStoreDir,
225
+ };
226
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * 操作类型
3
+ */
4
+ export type OperationType = 'link' | 'unlink' | 'move' | 'absorb' | 'replace' | 'download';
5
+ export interface Operation {
6
+ type: OperationType;
7
+ target: string;
8
+ source?: string;
9
+ backup?: string;
10
+ completed: boolean;
11
+ }
12
+ /**
13
+ * 事务日志
14
+ */
15
+ export interface TransactionLog {
16
+ id: string;
17
+ startTime: string;
18
+ projectPath: string;
19
+ operations: Operation[];
20
+ status: 'pending' | 'committed' | 'rolledback';
21
+ }
22
+ /**
23
+ * 事务管理器
24
+ */
25
+ export declare class Transaction {
26
+ private log;
27
+ private logPath;
28
+ readonly id: string;
29
+ /**
30
+ * 创建新事务实例(需调用 begin() 开始)
31
+ */
32
+ constructor(projectPath: string);
33
+ /**
34
+ * 从现有日志恢复事务(内部用)
35
+ */
36
+ private static fromLog;
37
+ /**
38
+ * 开始事务(持久化日志)
39
+ */
40
+ begin(): Promise<void>;
41
+ /**
42
+ * 静态方法:开始新事务
43
+ */
44
+ static start(projectPath: string): Promise<Transaction>;
45
+ /**
46
+ * 查找第一个未完成事务
47
+ */
48
+ static findPending(): Promise<Transaction | null>;
49
+ /**
50
+ * 从日志恢复事务
51
+ */
52
+ static recover(id: string): Promise<Transaction | null>;
53
+ /**
54
+ * 获取所有未完成事务
55
+ */
56
+ static getPendingTransactions(): Promise<TransactionLog[]>;
57
+ /**
58
+ * 记录操作(执行前调用)
59
+ */
60
+ recordOperation(op: Omit<Operation, 'completed'>): Promise<void>;
61
+ /**
62
+ * 简化的操作记录方法
63
+ * @param type 操作类型
64
+ * @param target 目标路径
65
+ * @param source 来源路径(可选)
66
+ */
67
+ recordOp(type: OperationType, target: string, source?: string): void;
68
+ /**
69
+ * 标记操作完成
70
+ */
71
+ markCompleted(index: number): Promise<void>;
72
+ /**
73
+ * 获取最后一个操作的索引
74
+ */
75
+ getLastOperationIndex(): number;
76
+ /**
77
+ * 提交事务(删除日志)
78
+ */
79
+ commit(): Promise<void>;
80
+ /**
81
+ * 回滚事务
82
+ */
83
+ rollback(): Promise<string[]>;
84
+ /**
85
+ * 回滚单个操作
86
+ */
87
+ private rollbackOperation;
88
+ /**
89
+ * 保存事务日志
90
+ */
91
+ save(): Promise<void>;
92
+ /**
93
+ * 获取事务 ID
94
+ */
95
+ getId(): string;
96
+ /**
97
+ * 获取事务状态
98
+ */
99
+ getStatus(): TransactionLog['status'];
100
+ /**
101
+ * 获取项目路径
102
+ */
103
+ getProjectPath(): string;
104
+ }
105
+ export default Transaction;
106
+ //# sourceMappingURL=transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/core/transaction.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAE3F,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;CAChD;AAuBD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;OAEG;gBACS,WAAW,EAAE,MAAM;IAa/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,OAAO;IAQtB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;WACU,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAM7D;;OAEG;WACU,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQvD;;OAEG;WACU,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAW7D;;OAEG;WACU,sBAAsB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAyBhE;;OAEG;IACG,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAIpE;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjD;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAI/B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA8BnC;;OAEG;YACW,iBAAiB;IAiE/B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;OAEG;IACH,KAAK,IAAI,MAAM;IAIf;;OAEG;IACH,SAAS,IAAI,cAAc,CAAC,QAAQ,CAAC;IAIrC;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * 事务管理
3
+ * 支持 link 操作的原子性,中断后可恢复
4
+ */
5
+ import fs from 'fs/promises';
6
+ import path from 'path';
7
+ import crypto from 'crypto';
8
+ import { getConfigDir } from './platform.js';
9
+ /**
10
+ * 获取事务目录
11
+ */
12
+ function getTransactionDir() {
13
+ return path.join(getConfigDir(), 'transactions');
14
+ }
15
+ /**
16
+ * 获取事务日志路径
17
+ */
18
+ function getTransactionPath(id) {
19
+ return path.join(getTransactionDir(), `${id}.json`);
20
+ }
21
+ /**
22
+ * 生成事务 ID
23
+ */
24
+ function generateTransactionId() {
25
+ return crypto.randomBytes(8).toString('hex');
26
+ }
27
+ /**
28
+ * 事务管理器
29
+ */
30
+ export class Transaction {
31
+ log;
32
+ logPath;
33
+ id;
34
+ /**
35
+ * 创建新事务实例(需调用 begin() 开始)
36
+ */
37
+ constructor(projectPath) {
38
+ const id = generateTransactionId();
39
+ this.id = id;
40
+ this.log = {
41
+ id,
42
+ startTime: new Date().toISOString(),
43
+ projectPath,
44
+ operations: [],
45
+ status: 'pending',
46
+ };
47
+ this.logPath = getTransactionPath(id);
48
+ }
49
+ /**
50
+ * 从现有日志恢复事务(内部用)
51
+ */
52
+ static fromLog(log, logPath) {
53
+ const tx = Object.create(Transaction.prototype);
54
+ tx.log = log;
55
+ tx.logPath = logPath;
56
+ tx.id = log.id;
57
+ return tx;
58
+ }
59
+ /**
60
+ * 开始事务(持久化日志)
61
+ */
62
+ async begin() {
63
+ const txDir = getTransactionDir();
64
+ await fs.mkdir(txDir, { recursive: true });
65
+ await fs.writeFile(this.logPath, JSON.stringify(this.log, null, 2), 'utf-8');
66
+ }
67
+ /**
68
+ * 静态方法:开始新事务
69
+ */
70
+ static async start(projectPath) {
71
+ const tx = new Transaction(projectPath);
72
+ await tx.begin();
73
+ return tx;
74
+ }
75
+ /**
76
+ * 查找第一个未完成事务
77
+ */
78
+ static async findPending() {
79
+ const pending = await Transaction.getPendingTransactions();
80
+ if (pending.length === 0)
81
+ return null;
82
+ const log = pending[0];
83
+ const logPath = getTransactionPath(log.id);
84
+ return Transaction.fromLog(log, logPath);
85
+ }
86
+ /**
87
+ * 从日志恢复事务
88
+ */
89
+ static async recover(id) {
90
+ const logPath = getTransactionPath(id);
91
+ try {
92
+ const content = await fs.readFile(logPath, 'utf-8');
93
+ const log = JSON.parse(content);
94
+ return Transaction.fromLog(log, logPath);
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ /**
101
+ * 获取所有未完成事务
102
+ */
103
+ static async getPendingTransactions() {
104
+ const txDir = getTransactionDir();
105
+ const pending = [];
106
+ try {
107
+ const files = await fs.readdir(txDir);
108
+ for (const file of files) {
109
+ if (!file.endsWith('.json'))
110
+ continue;
111
+ try {
112
+ const content = await fs.readFile(path.join(txDir, file), 'utf-8');
113
+ const log = JSON.parse(content);
114
+ if (log.status === 'pending') {
115
+ pending.push(log);
116
+ }
117
+ }
118
+ catch {
119
+ // 忽略损坏的日志文件
120
+ }
121
+ }
122
+ }
123
+ catch {
124
+ // 目录不存在
125
+ }
126
+ return pending;
127
+ }
128
+ /**
129
+ * 记录操作(执行前调用)
130
+ */
131
+ async recordOperation(op) {
132
+ this.log.operations.push({ ...op, completed: false });
133
+ await this.save();
134
+ }
135
+ /**
136
+ * 简化的操作记录方法
137
+ * @param type 操作类型
138
+ * @param target 目标路径
139
+ * @param source 来源路径(可选)
140
+ */
141
+ recordOp(type, target, source) {
142
+ this.log.operations.push({ type, target, source, completed: true });
143
+ }
144
+ /**
145
+ * 标记操作完成
146
+ */
147
+ async markCompleted(index) {
148
+ if (index >= 0 && index < this.log.operations.length) {
149
+ this.log.operations[index].completed = true;
150
+ await this.save();
151
+ }
152
+ }
153
+ /**
154
+ * 获取最后一个操作的索引
155
+ */
156
+ getLastOperationIndex() {
157
+ return this.log.operations.length - 1;
158
+ }
159
+ /**
160
+ * 提交事务(删除日志)
161
+ */
162
+ async commit() {
163
+ this.log.status = 'committed';
164
+ try {
165
+ await fs.unlink(this.logPath);
166
+ }
167
+ catch {
168
+ // 日志已删除
169
+ }
170
+ }
171
+ /**
172
+ * 回滚事务
173
+ */
174
+ async rollback() {
175
+ const errors = [];
176
+ // 逆序回滚已完成的操作
177
+ for (let i = this.log.operations.length - 1; i >= 0; i--) {
178
+ const op = this.log.operations[i];
179
+ if (!op.completed)
180
+ continue;
181
+ try {
182
+ await this.rollbackOperation(op);
183
+ }
184
+ catch (err) {
185
+ errors.push(`回滚操作 ${op.type} (${op.target}) 失败: ${err.message}`);
186
+ }
187
+ }
188
+ this.log.status = 'rolledback';
189
+ await this.save();
190
+ // 回滚完成后删除日志
191
+ if (errors.length === 0) {
192
+ try {
193
+ await fs.unlink(this.logPath);
194
+ }
195
+ catch {
196
+ // 忽略
197
+ }
198
+ }
199
+ return errors;
200
+ }
201
+ /**
202
+ * 回滚单个操作
203
+ */
204
+ async rollbackOperation(op) {
205
+ switch (op.type) {
206
+ case 'link':
207
+ // 删除创建的符号链接
208
+ try {
209
+ const stat = await fs.lstat(op.target);
210
+ if (stat.isSymbolicLink()) {
211
+ await fs.unlink(op.target);
212
+ }
213
+ }
214
+ catch {
215
+ // 链接不存在
216
+ }
217
+ // 如果有备份,恢复
218
+ if (op.backup) {
219
+ try {
220
+ await fs.rename(op.backup, op.target);
221
+ }
222
+ catch {
223
+ // 备份不存在
224
+ }
225
+ }
226
+ break;
227
+ case 'unlink':
228
+ // unlink 操作的回滚需要重新创建链接
229
+ if (op.source) {
230
+ await fs.symlink(op.source, op.target, 'dir');
231
+ }
232
+ break;
233
+ case 'move':
234
+ case 'absorb':
235
+ // 移动操作的回滚:移回原位置
236
+ if (op.source) {
237
+ try {
238
+ await fs.rename(op.target, op.source);
239
+ }
240
+ catch {
241
+ // 目标可能不存在或已被修改
242
+ }
243
+ }
244
+ break;
245
+ case 'replace':
246
+ // replace 删除了原目录并创建了链接,回滚时删除链接
247
+ // 注意:原目录已被删除,无法完全恢复
248
+ try {
249
+ const stat = await fs.lstat(op.target);
250
+ if (stat.isSymbolicLink()) {
251
+ await fs.unlink(op.target);
252
+ }
253
+ }
254
+ catch {
255
+ // 链接不存在
256
+ }
257
+ break;
258
+ case 'download':
259
+ // download 创建了新目录,回滚时删除
260
+ try {
261
+ await fs.rm(op.target, { recursive: true, force: true });
262
+ }
263
+ catch {
264
+ // 目录不存在
265
+ }
266
+ break;
267
+ }
268
+ }
269
+ /**
270
+ * 保存事务日志
271
+ */
272
+ async save() {
273
+ await fs.writeFile(this.logPath, JSON.stringify(this.log, null, 2), 'utf-8');
274
+ }
275
+ /**
276
+ * 获取事务 ID
277
+ */
278
+ getId() {
279
+ return this.log.id;
280
+ }
281
+ /**
282
+ * 获取事务状态
283
+ */
284
+ getStatus() {
285
+ return this.log.status;
286
+ }
287
+ /**
288
+ * 获取项目路径
289
+ */
290
+ getProjectPath() {
291
+ return this.log.projectPath;
292
+ }
293
+ }
294
+ export default Transaction;
295
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/core/transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}