@tengx5383/aitool-sync-cli 0.1.0

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 (153) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/README.md +203 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +87 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/add.d.ts +2 -0
  8. package/dist/commands/add.d.ts.map +1 -0
  9. package/dist/commands/add.js +24 -0
  10. package/dist/commands/add.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +2 -0
  12. package/dist/commands/doctor.d.ts.map +1 -0
  13. package/dist/commands/doctor.js +89 -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 +105 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/list.d.ts +2 -0
  20. package/dist/commands/list.d.ts.map +1 -0
  21. package/dist/commands/list.js +22 -0
  22. package/dist/commands/list.js.map +1 -0
  23. package/dist/commands/pull.d.ts +6 -0
  24. package/dist/commands/pull.d.ts.map +1 -0
  25. package/dist/commands/pull.js +52 -0
  26. package/dist/commands/pull.js.map +1 -0
  27. package/dist/commands/push.d.ts +6 -0
  28. package/dist/commands/push.d.ts.map +1 -0
  29. package/dist/commands/push.js +60 -0
  30. package/dist/commands/push.js.map +1 -0
  31. package/dist/commands/remove.d.ts +2 -0
  32. package/dist/commands/remove.d.ts.map +1 -0
  33. package/dist/commands/remove.js +20 -0
  34. package/dist/commands/remove.js.map +1 -0
  35. package/dist/commands/status.d.ts +2 -0
  36. package/dist/commands/status.d.ts.map +1 -0
  37. package/dist/commands/status.js +46 -0
  38. package/dist/commands/status.js.map +1 -0
  39. package/dist/config/config-file.d.ts +22 -0
  40. package/dist/config/config-file.d.ts.map +1 -0
  41. package/dist/config/config-file.js +86 -0
  42. package/dist/config/config-file.js.map +1 -0
  43. package/dist/config/schema.d.ts +101 -0
  44. package/dist/config/schema.d.ts.map +1 -0
  45. package/dist/config/schema.js +24 -0
  46. package/dist/config/schema.js.map +1 -0
  47. package/dist/core/backup.d.ts +8 -0
  48. package/dist/core/backup.d.ts.map +1 -0
  49. package/dist/core/backup.js +50 -0
  50. package/dist/core/backup.js.map +1 -0
  51. package/dist/core/checksum.d.ts +14 -0
  52. package/dist/core/checksum.d.ts.map +1 -0
  53. package/dist/core/checksum.js +23 -0
  54. package/dist/core/checksum.js.map +1 -0
  55. package/dist/core/exclusions.d.ts +8 -0
  56. package/dist/core/exclusions.d.ts.map +1 -0
  57. package/dist/core/exclusions.js +29 -0
  58. package/dist/core/exclusions.js.map +1 -0
  59. package/dist/core/file-collector.d.ts +16 -0
  60. package/dist/core/file-collector.d.ts.map +1 -0
  61. package/dist/core/file-collector.js +104 -0
  62. package/dist/core/file-collector.js.map +1 -0
  63. package/dist/core/manifest.d.ts +18 -0
  64. package/dist/core/manifest.d.ts.map +1 -0
  65. package/dist/core/manifest.js +42 -0
  66. package/dist/core/manifest.js.map +1 -0
  67. package/dist/core/path-expander.d.ts +6 -0
  68. package/dist/core/path-expander.d.ts.map +1 -0
  69. package/dist/core/path-expander.js +25 -0
  70. package/dist/core/path-expander.js.map +1 -0
  71. package/dist/core/sync-engine.d.ts +24 -0
  72. package/dist/core/sync-engine.d.ts.map +1 -0
  73. package/dist/core/sync-engine.js +206 -0
  74. package/dist/core/sync-engine.js.map +1 -0
  75. package/dist/core/sync-package.d.ts +12 -0
  76. package/dist/core/sync-package.d.ts.map +1 -0
  77. package/dist/core/sync-package.js +95 -0
  78. package/dist/core/sync-package.js.map +1 -0
  79. package/dist/crypto/encryptor.d.ts +15 -0
  80. package/dist/crypto/encryptor.d.ts.map +1 -0
  81. package/dist/crypto/encryptor.js +77 -0
  82. package/dist/crypto/encryptor.js.map +1 -0
  83. package/dist/crypto/key-resolver.d.ts +28 -0
  84. package/dist/crypto/key-resolver.d.ts.map +1 -0
  85. package/dist/crypto/key-resolver.js +62 -0
  86. package/dist/crypto/key-resolver.js.map +1 -0
  87. package/dist/gist/client.d.ts +18 -0
  88. package/dist/gist/client.d.ts.map +1 -0
  89. package/dist/gist/client.js +58 -0
  90. package/dist/gist/client.js.map +1 -0
  91. package/dist/gist/mock-client.d.ts +19 -0
  92. package/dist/gist/mock-client.d.ts.map +1 -0
  93. package/dist/gist/mock-client.js +61 -0
  94. package/dist/gist/mock-client.js.map +1 -0
  95. package/dist/index.d.ts +3 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +3 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/presets/claude-code.d.ts +3 -0
  100. package/dist/presets/claude-code.d.ts.map +1 -0
  101. package/dist/presets/claude-code.js +27 -0
  102. package/dist/presets/claude-code.js.map +1 -0
  103. package/dist/presets/hermes.d.ts +3 -0
  104. package/dist/presets/hermes.d.ts.map +1 -0
  105. package/dist/presets/hermes.js +27 -0
  106. package/dist/presets/hermes.js.map +1 -0
  107. package/dist/presets/index.d.ts +15 -0
  108. package/dist/presets/index.d.ts.map +1 -0
  109. package/dist/presets/index.js +42 -0
  110. package/dist/presets/index.js.map +1 -0
  111. package/dist/presets/openclaw.d.ts +3 -0
  112. package/dist/presets/openclaw.d.ts.map +1 -0
  113. package/dist/presets/openclaw.js +27 -0
  114. package/dist/presets/openclaw.js.map +1 -0
  115. package/dist/types/config.d.ts +45 -0
  116. package/dist/types/config.d.ts.map +1 -0
  117. package/dist/types/config.js +2 -0
  118. package/dist/types/config.js.map +1 -0
  119. package/dist/types/gist.d.ts +25 -0
  120. package/dist/types/gist.d.ts.map +1 -0
  121. package/dist/types/gist.js +2 -0
  122. package/dist/types/gist.js.map +1 -0
  123. package/dist/types/index.d.ts +4 -0
  124. package/dist/types/index.d.ts.map +1 -0
  125. package/dist/types/index.js +2 -0
  126. package/dist/types/index.js.map +1 -0
  127. package/dist/types/sync.d.ts +78 -0
  128. package/dist/types/sync.d.ts.map +1 -0
  129. package/dist/types/sync.js +2 -0
  130. package/dist/types/sync.js.map +1 -0
  131. package/dist/utils/diff.d.ts +7 -0
  132. package/dist/utils/diff.d.ts.map +1 -0
  133. package/dist/utils/diff.js +99 -0
  134. package/dist/utils/diff.js.map +1 -0
  135. package/dist/utils/env.d.ts +13 -0
  136. package/dist/utils/env.d.ts.map +1 -0
  137. package/dist/utils/env.js +29 -0
  138. package/dist/utils/env.js.map +1 -0
  139. package/dist/utils/logger.d.ts +14 -0
  140. package/dist/utils/logger.d.ts.map +1 -0
  141. package/dist/utils/logger.js +39 -0
  142. package/dist/utils/logger.js.map +1 -0
  143. package/dist/utils/table.d.ts +5 -0
  144. package/dist/utils/table.d.ts.map +1 -0
  145. package/dist/utils/table.js +59 -0
  146. package/dist/utils/table.js.map +1 -0
  147. package/package.json +41 -0
  148. package/tests/integration/encryption-flow.test.ts +142 -0
  149. package/tests/integration/init-flow.test.ts +69 -0
  150. package/tests/integration/push-pull-flow.test.ts +183 -0
  151. package/tests/integration/status-flow.test.ts +149 -0
  152. package/tsconfig.json +19 -0
  153. package/vitest.config.ts +10 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exclusions.js","sourceRoot":"","sources":["../../src/core/exclusions.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC,MAAM,kBAAkB,GAAoB;IAC1C,EAAE,OAAO,EAAE,oBAAoB,EAAE;IACjC,EAAE,OAAO,EAAE,YAAY,EAAE;IACzB,EAAE,OAAO,EAAE,YAAY,EAAE;IACzB,EAAE,OAAO,EAAE,UAAU,EAAE;IACvB,EAAE,OAAO,EAAE,cAAc,EAAE;CAC5B,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,YAAoB,EACpB,KAAsB;IAEtB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,uDAAuD;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,OAAO,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { SyncPathEntry, EncryptionRule } from '../types/config.js';
2
+ import type { ManifestEntry } from '../types/sync.js';
3
+ import type { ExclusionRule } from '../types/config.js';
4
+ interface CollectOptions {
5
+ syncPaths: SyncPathEntry[];
6
+ exclusions: ExclusionRule[];
7
+ encryption: EncryptionRule[];
8
+ }
9
+ /**
10
+ * Walk sync paths and collect file entries.
11
+ * Handles both single-file and directory paths.
12
+ * Globs are expanded using simple fs.glob-like behavior.
13
+ */
14
+ export declare function collectFiles(options: CollectOptions): ManifestEntry[];
15
+ export {};
16
+ //# sourceMappingURL=file-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-collector.d.ts","sourceRoot":"","sources":["../../src/core/file-collector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,UAAU,cAAc;IACtB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,EAAE,CAuCrE"}
@@ -0,0 +1,104 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { expandPath } from './path-expander.js';
4
+ import { isExcluded } from './exclusions.js';
5
+ import { computeChecksum } from './checksum.js';
6
+ import { debug, warn } from '../utils/logger.js';
7
+ /**
8
+ * Walk sync paths and collect file entries.
9
+ * Handles both single-file and directory paths.
10
+ * Globs are expanded using simple fs.glob-like behavior.
11
+ */
12
+ export function collectFiles(options) {
13
+ const entries = [];
14
+ const seen = new Set();
15
+ for (const syncPath of options.syncPaths) {
16
+ if (!syncPath.enabled)
17
+ continue;
18
+ const expanded = expandPath(syncPath.path);
19
+ debug(`Collecting files from: ${syncPath.name} -> ${expanded}`);
20
+ let stat;
21
+ try {
22
+ stat = fs.statSync(expanded);
23
+ }
24
+ catch {
25
+ warn(`Path not found, skipping: ${syncPath.name} (${expanded})`);
26
+ continue;
27
+ }
28
+ if (stat.isDirectory()) {
29
+ // Walk directory recursively
30
+ walkDirectory(expanded, expanded, syncPath.name, seen, entries, options);
31
+ }
32
+ else if (stat.isFile()) {
33
+ // Single file
34
+ const relativePath = path.basename(expanded);
35
+ if (seen.has(relativePath)) {
36
+ warn(`Duplicate file skipped: ${relativePath}`);
37
+ continue;
38
+ }
39
+ if (isExcluded(relativePath, options.exclusions)) {
40
+ debug(`Excluded: ${relativePath}`);
41
+ continue;
42
+ }
43
+ seen.add(relativePath);
44
+ const entry = createEntry(expanded, relativePath, syncPath.name, options.encryption);
45
+ if (entry)
46
+ entries.push(entry);
47
+ }
48
+ }
49
+ return entries;
50
+ }
51
+ function walkDirectory(baseDir, currentDir, sourceName, seen, entries, options) {
52
+ let items;
53
+ try {
54
+ items = fs.readdirSync(currentDir, { withFileTypes: true });
55
+ }
56
+ catch {
57
+ warn(`Cannot read directory: ${currentDir}`);
58
+ return;
59
+ }
60
+ for (const item of items) {
61
+ const fullPath = path.join(currentDir, item.name);
62
+ const relativePath = path.relative(baseDir, fullPath);
63
+ if (isExcluded(relativePath, options.exclusions)) {
64
+ debug(`Excluded: ${relativePath}`);
65
+ continue;
66
+ }
67
+ if (item.isDirectory()) {
68
+ walkDirectory(baseDir, fullPath, sourceName, seen, entries, options);
69
+ }
70
+ else if (item.isFile()) {
71
+ if (seen.has(relativePath)) {
72
+ warn(`Duplicate file skipped: ${relativePath}`);
73
+ continue;
74
+ }
75
+ seen.add(relativePath);
76
+ const entry = createEntry(fullPath, relativePath, sourceName, options.encryption);
77
+ if (entry)
78
+ entries.push(entry);
79
+ }
80
+ }
81
+ }
82
+ function createEntry(fullPath, relativePath, sourceName, encryptionRules) {
83
+ try {
84
+ const stat = fs.statSync(fullPath);
85
+ const checksum = computeChecksum(fullPath);
86
+ // Check if file matches any encryption pattern
87
+ const encrypted = false; // Encryption is applied during packaging
88
+ const encryptionPattern = null; // Determined at package time
89
+ return {
90
+ relativePath,
91
+ checksum,
92
+ size: stat.size,
93
+ modifiedAt: stat.mtime.toISOString(),
94
+ sourceName,
95
+ encrypted,
96
+ encryptionPattern,
97
+ };
98
+ }
99
+ catch {
100
+ warn(`Failed to read file: ${fullPath}`);
101
+ return null;
102
+ }
103
+ }
104
+ //# sourceMappingURL=file-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-collector.js","sourceRoot":"","sources":["../../src/core/file-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Manifest, ManifestEntry } from '../types/sync.js';
2
+ /**
3
+ * Generate a Manifest from collected entries.
4
+ */
5
+ export declare function createManifest(entries: ManifestEntry[]): Manifest;
6
+ /**
7
+ * Serialize a Manifest to a JSON string.
8
+ */
9
+ export declare function serializeManifest(manifest: Manifest): string;
10
+ /**
11
+ * Parse a JSON string into a Manifest.
12
+ */
13
+ export declare function parseManifest(json: string): Manifest | null;
14
+ /**
15
+ * Create a lookup map from relativePath to ManifestEntry.
16
+ */
17
+ export declare function manifestToMap(manifest: Manifest): Map<string, ManifestEntry>;
18
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAyB,MAAM,kBAAkB,CAAC;AAGvF;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,QAAQ,CAMjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAU3D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAM5E"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Generate a Manifest from collected entries.
3
+ */
4
+ export function createManifest(entries) {
5
+ return {
6
+ version: 1,
7
+ generatedAt: new Date().toISOString(),
8
+ entries,
9
+ };
10
+ }
11
+ /**
12
+ * Serialize a Manifest to a JSON string.
13
+ */
14
+ export function serializeManifest(manifest) {
15
+ return JSON.stringify(manifest);
16
+ }
17
+ /**
18
+ * Parse a JSON string into a Manifest.
19
+ */
20
+ export function parseManifest(json) {
21
+ try {
22
+ const obj = JSON.parse(json);
23
+ if (obj.version !== 1 || !Array.isArray(obj.entries)) {
24
+ return null;
25
+ }
26
+ return obj;
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ /**
33
+ * Create a lookup map from relativePath to ManifestEntry.
34
+ */
35
+ export function manifestToMap(manifest) {
36
+ const map = new Map();
37
+ for (const entry of manifest.entries) {
38
+ map.set(entry.relativePath, entry);
39
+ }
40
+ return map;
41
+ }
42
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,OAAO;QACL,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAkB;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAe,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB;IAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Expand paths containing ~, $HOME, and other shell-like expansions.
3
+ * Returns absolute paths.
4
+ */
5
+ export declare function expandPath(raw: string): string;
6
+ //# sourceMappingURL=path-expander.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-expander.d.ts","sourceRoot":"","sources":["../../src/core/path-expander.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsB9C"}
@@ -0,0 +1,25 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ /**
4
+ * Expand paths containing ~, $HOME, and other shell-like expansions.
5
+ * Returns absolute paths.
6
+ */
7
+ export function expandPath(raw) {
8
+ let expanded = raw;
9
+ // Expand tilde
10
+ if (expanded.startsWith('~')) {
11
+ expanded = expanded.replace(/^~(?=$|\/)/, os.homedir());
12
+ }
13
+ // Expand $HOME and %HOME%
14
+ expanded = expanded.replace(/\$HOME|%HOME%/gi, os.homedir());
15
+ // Expand ~user (just do a basic check)
16
+ expanded = expanded.replace(/~(\w+)/g, (_match, user) => {
17
+ return path.join('/Users', user);
18
+ });
19
+ // Resolve to absolute path
20
+ if (!path.isAbsolute(expanded)) {
21
+ expanded = path.resolve(process.cwd(), expanded);
22
+ }
23
+ return expanded;
24
+ }
25
+ //# sourceMappingURL=path-expander.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-expander.js","sourceRoot":"","sources":["../../src/core/path-expander.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,QAAQ,GAAG,GAAG,CAAC;IAEnB,eAAe;IACf,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,0BAA0B;IAC1B,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7D,uCAAuC;IACvC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QACtD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { AppConfig } from '../types/config.js';
2
+ import type { Manifest, SyncDiff, SyncResult, SyncPackage } from '../types/sync.js';
3
+ import type { GistClientInterface } from '../types/gist.js';
4
+ /**
5
+ * Build a local Manifest from the current file system state.
6
+ */
7
+ export declare function buildLocalManifest(config: AppConfig): Manifest;
8
+ /**
9
+ * Compute diff between local and remote manifests.
10
+ */
11
+ export declare function computeDiff(config: AppConfig, remoteManifest: Manifest): SyncDiff;
12
+ /**
13
+ * Push local files to remote Gist.
14
+ */
15
+ export declare function pushSync(config: AppConfig, gistClient: GistClientInterface, force: boolean, encryptFn?: (content: string) => string): Promise<SyncResult>;
16
+ /**
17
+ * Pull remote files from Gist to local.
18
+ */
19
+ export declare function pullSync(config: AppConfig, gistClient: GistClientInterface, force: boolean, decryptFn?: (content: string) => string): Promise<SyncResult>;
20
+ /**
21
+ * Write remote files locally, handling encryption.
22
+ */
23
+ export declare function writeRemoteFiles(remotePackage: SyncPackage, config: AppConfig, decryptFn?: (content: string) => string): Promise<string[]>;
24
+ //# sourceMappingURL=sync-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-engine.d.ts","sourceRoot":"","sources":["../../src/core/sync-engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAY5D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAO9D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,GAAG,QAAQ,CAIjF;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,mBAAmB,EAC/B,KAAK,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACtC,OAAO,CAAC,UAAU,CAAC,CAqErB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,mBAAmB,EAC/B,KAAK,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACtC,OAAO,CAAC,UAAU,CAAC,CA8DrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,WAAW,EAC1B,MAAM,EAAE,SAAS,EACjB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACtC,OAAO,CAAC,MAAM,EAAE,CAAC,CAgDnB"}
@@ -0,0 +1,206 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { collectFiles } from './file-collector.js';
4
+ import { createManifest, serializeManifest, parseManifest } from './manifest.js';
5
+ import { diffManifests } from '../utils/diff.js';
6
+ import { buildSyncPackage, parseSyncPackage } from './sync-package.js';
7
+ import { createBackup } from './backup.js';
8
+ import { expandPath } from './path-expander.js';
9
+ import { writeConfig } from '../config/config-file.js';
10
+ import { warn } from '../utils/logger.js';
11
+ const PACKAGE_FILENAME = 'aitool-sync-package.json';
12
+ /**
13
+ * Build a local Manifest from the current file system state.
14
+ */
15
+ export function buildLocalManifest(config) {
16
+ const entries = collectFiles({
17
+ syncPaths: config.syncPaths,
18
+ exclusions: config.exclusions,
19
+ encryption: config.encryption,
20
+ });
21
+ return createManifest(entries);
22
+ }
23
+ /**
24
+ * Compute diff between local and remote manifests.
25
+ */
26
+ export function computeDiff(config, remoteManifest) {
27
+ const localManifest = buildLocalManifest(config);
28
+ const lastKnown = config.lastKnownManifest ? parseManifest(config.lastKnownManifest) : null;
29
+ return diffManifests(localManifest, remoteManifest, lastKnown);
30
+ }
31
+ /**
32
+ * Push local files to remote Gist.
33
+ */
34
+ export async function pushSync(config, gistClient, force, encryptFn) {
35
+ const errors = [];
36
+ // Ensure Gist exists
37
+ if (!config.gistId) {
38
+ return { success: false, action: 'push', filesUploaded: 0, filesDownloaded: 0, errors: ['No Gist configured. Run `aitool-sync init` first.'] };
39
+ }
40
+ let remoteManifest = null;
41
+ try {
42
+ const gist = await gistClient.getGist(config.gistId);
43
+ const pkgFile = gist.files.find((f) => f.filename === PACKAGE_FILENAME);
44
+ if (pkgFile) {
45
+ const parsed = parseSyncPackage(pkgFile.content);
46
+ remoteManifest = parsed?.manifest || null;
47
+ }
48
+ }
49
+ catch (e) {
50
+ warn(`Could not fetch remote Gist: ${e.message}`);
51
+ }
52
+ const localManifest = buildLocalManifest(config);
53
+ const lastKnown = config.lastKnownManifest ? parseManifest(config.lastKnownManifest) : null;
54
+ // If remote exists, check for conflicts
55
+ if (remoteManifest) {
56
+ const diff = diffManifests(localManifest, remoteManifest, lastKnown);
57
+ if (diff.hasConflicts && !force) {
58
+ return {
59
+ success: false,
60
+ action: 'push',
61
+ filesUploaded: 0,
62
+ filesDownloaded: 0,
63
+ errors: ['Conflicts detected. Use --force to overwrite remote.'],
64
+ };
65
+ }
66
+ }
67
+ // Build sync package
68
+ const syncPackage = await buildSyncPackage(localManifest, config, encryptFn);
69
+ const packageJson = JSON.stringify(syncPackage, null, 2);
70
+ // Upload to Gist
71
+ try {
72
+ await gistClient.updateGist(config.gistId, {
73
+ [PACKAGE_FILENAME]: { content: packageJson },
74
+ });
75
+ // Update config
76
+ config.lastKnownManifest = serializeManifest(localManifest);
77
+ config.lastPushAt = new Date().toISOString();
78
+ writeConfig(config);
79
+ return {
80
+ success: true,
81
+ action: force ? 'force-push' : 'push',
82
+ filesUploaded: syncPackage.files.length,
83
+ filesDownloaded: 0,
84
+ errors: [],
85
+ };
86
+ }
87
+ catch (e) {
88
+ return {
89
+ success: false,
90
+ action: 'push',
91
+ filesUploaded: 0,
92
+ filesDownloaded: 0,
93
+ errors: [`Upload failed: ${e.message}`],
94
+ };
95
+ }
96
+ }
97
+ /**
98
+ * Pull remote files from Gist to local.
99
+ */
100
+ export async function pullSync(config, gistClient, force, decryptFn) {
101
+ const errors = [];
102
+ if (!config.gistId) {
103
+ return { success: false, action: 'pull', filesUploaded: 0, filesDownloaded: 0, errors: ['No Gist configured. Run `aitool-sync init` first.'] };
104
+ }
105
+ // Fetch remote
106
+ let gist;
107
+ try {
108
+ gist = await gistClient.getGist(config.gistId);
109
+ }
110
+ catch (e) {
111
+ return { success: false, action: 'pull', filesUploaded: 0, filesDownloaded: 0, errors: [`Failed to fetch Gist: ${e.message}`] };
112
+ }
113
+ const pkgFile = gist.files.find((f) => f.filename === PACKAGE_FILENAME);
114
+ if (!pkgFile) {
115
+ return { success: false, action: 'pull', filesUploaded: 0, filesDownloaded: 0, errors: ['No sync package found in Gist.'] };
116
+ }
117
+ const remotePackage = parseSyncPackage(pkgFile.content);
118
+ if (!remotePackage) {
119
+ return { success: false, action: 'pull', filesUploaded: 0, filesDownloaded: 0, errors: ['Failed to parse remote sync package.'] };
120
+ }
121
+ const remoteManifest = remotePackage.manifest;
122
+ const localManifest = buildLocalManifest(config);
123
+ const lastKnown = config.lastKnownManifest ? parseManifest(config.lastKnownManifest) : null;
124
+ // Check conflicts
125
+ const diff = diffManifests(localManifest, remoteManifest, lastKnown);
126
+ if (diff.hasConflicts && !force) {
127
+ return {
128
+ success: false,
129
+ action: 'pull',
130
+ filesUploaded: 0,
131
+ filesDownloaded: 0,
132
+ errors: ['Conflicts detected. Use --force to overwrite local files.'],
133
+ };
134
+ }
135
+ // Create backup before overwriting
136
+ createBackup(config);
137
+ // Write files locally
138
+ const writeErrors = await writeRemoteFiles(remotePackage, config, decryptFn);
139
+ for (const e of writeErrors) {
140
+ errors.push(e);
141
+ }
142
+ // Update config
143
+ config.lastKnownManifest = serializeManifest(remoteManifest);
144
+ config.lastPullAt = new Date().toISOString();
145
+ writeConfig(config);
146
+ return {
147
+ success: true,
148
+ action: force ? 'force-pull' : 'pull',
149
+ filesUploaded: 0,
150
+ filesDownloaded: remotePackage.files.length,
151
+ errors,
152
+ };
153
+ }
154
+ /**
155
+ * Write remote files locally, handling encryption.
156
+ */
157
+ export async function writeRemoteFiles(remotePackage, config, decryptFn) {
158
+ const errors = [];
159
+ for (const file of remotePackage.files) {
160
+ // Determine output path by matching source name in syncPaths
161
+ const sourceName = file.entry.sourceName;
162
+ const syncPath = config.syncPaths.find((sp) => sp.name === sourceName);
163
+ if (!syncPath) {
164
+ errors.push(`No matching sync path for source "${sourceName}"`);
165
+ continue;
166
+ }
167
+ const expandedBase = expandPath(syncPath.path);
168
+ let fullPath;
169
+ // Check if the base path is a file or directory
170
+ const baseStat = (() => {
171
+ try {
172
+ return fs.statSync(expandedBase);
173
+ }
174
+ catch {
175
+ return null;
176
+ }
177
+ })();
178
+ if (baseStat?.isFile()) {
179
+ fullPath = expandedBase;
180
+ }
181
+ else {
182
+ fullPath = path.join(expandedBase, file.relativePath);
183
+ }
184
+ // Ensure directory exists
185
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
186
+ let content;
187
+ if (file.encrypted && decryptFn) {
188
+ try {
189
+ // Content is base64(encrypted_payload), so decode outer base64 first
190
+ const decoded = Buffer.from(file.content, 'base64').toString('utf-8');
191
+ content = decryptFn(decoded);
192
+ }
193
+ catch (e) {
194
+ errors.push(`Failed to decrypt ${file.relativePath}: ${e.message}`);
195
+ continue;
196
+ }
197
+ }
198
+ else {
199
+ // Content is base64 encoded in the package
200
+ content = Buffer.from(file.content, 'base64').toString('utf-8');
201
+ }
202
+ fs.writeFileSync(fullPath, content, 'utf-8');
203
+ }
204
+ return errors;
205
+ }
206
+ //# sourceMappingURL=sync-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-engine.js","sourceRoot":"","sources":["../../src/core/sync-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { AppConfig } from '../types/config.js';
2
+ import type { Manifest, SyncPackage } from '../types/sync.js';
3
+ /**
4
+ * Build a SyncPackage from a local manifest and config.
5
+ * Reads file contents from disk, optionally encrypting them.
6
+ */
7
+ export declare function buildSyncPackage(manifest: Manifest, config: AppConfig, encryptFn?: (content: string) => string): Promise<SyncPackage>;
8
+ /**
9
+ * Parse a SyncPackage from a JSON string.
10
+ */
11
+ export declare function parseSyncPackage(json: string): SyncPackage | null;
12
+ //# sourceMappingURL=sync-package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-package.d.ts","sourceRoot":"","sources":["../../src/core/sync-package.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAiB,WAAW,EAAY,MAAM,kBAAkB,CAAC;AAIvF;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,SAAS,EACjB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACtC,OAAO,CAAC,WAAW,CAAC,CA4EtB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAUjE"}
@@ -0,0 +1,95 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { expandPath } from './path-expander.js';
4
+ import { warn } from '../utils/logger.js';
5
+ import micromatch from 'micromatch';
6
+ /**
7
+ * Build a SyncPackage from a local manifest and config.
8
+ * Reads file contents from disk, optionally encrypting them.
9
+ */
10
+ export async function buildSyncPackage(manifest, config, encryptFn) {
11
+ const files = [];
12
+ const encryptionPatterns = config.encryption.map((r) => r.pattern);
13
+ for (const entry of manifest.entries) {
14
+ const sourcePath = config.syncPaths.find((sp) => sp.name === entry.sourceName);
15
+ if (!sourcePath) {
16
+ warn(`No matching source for ${entry.sourceName}, skipping ${entry.relativePath}`);
17
+ continue;
18
+ }
19
+ const expandedBase = expandPath(sourcePath.path);
20
+ const baseIsFile = (() => {
21
+ try {
22
+ return fs.statSync(expandedBase).isFile();
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ })();
28
+ // Determine full file path
29
+ let fullPath;
30
+ if (baseIsFile) {
31
+ // Single file source — relativePath is the filename
32
+ fullPath = expandedBase;
33
+ }
34
+ else {
35
+ // Directory source — relativePath is from the base
36
+ fullPath = path.join(expandedBase, entry.relativePath);
37
+ }
38
+ let content;
39
+ try {
40
+ content = fs.readFileSync(fullPath, 'utf-8');
41
+ }
42
+ catch {
43
+ warn(`Failed to read file, skipping: ${fullPath}`);
44
+ continue;
45
+ }
46
+ // Check if this file should be encrypted
47
+ let encrypted = false;
48
+ let encryptionPattern = null;
49
+ if (encryptionPatterns.length > 0 && encryptFn) {
50
+ const matched = encryptionPatterns.find((p) => micromatch.isMatch(entry.relativePath, p));
51
+ if (matched) {
52
+ try {
53
+ content = encryptFn(content);
54
+ encrypted = true;
55
+ encryptionPattern = matched;
56
+ entry.encrypted = true;
57
+ entry.encryptionPattern = matched;
58
+ }
59
+ catch (e) {
60
+ warn(`Failed to encrypt ${entry.relativePath}: ${e.message}`);
61
+ }
62
+ }
63
+ }
64
+ // Store content as base64 to avoid encoding issues
65
+ const base64Content = Buffer.from(content, 'utf-8').toString('base64');
66
+ files.push({
67
+ relativePath: entry.relativePath,
68
+ content: base64Content,
69
+ encrypted,
70
+ entry: { ...entry, encrypted, encryptionPattern },
71
+ });
72
+ }
73
+ return {
74
+ version: 1,
75
+ createdAt: new Date().toISOString(),
76
+ manifest,
77
+ files,
78
+ };
79
+ }
80
+ /**
81
+ * Parse a SyncPackage from a JSON string.
82
+ */
83
+ export function parseSyncPackage(json) {
84
+ try {
85
+ const obj = JSON.parse(json);
86
+ if (obj.version !== 1 || !Array.isArray(obj.files) || !obj.manifest) {
87
+ return null;
88
+ }
89
+ return obj;
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ //# sourceMappingURL=sync-package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-package.js","sourceRoot":"","sources":["../../src/core/sync-package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Encrypt plaintext with AES-256-GCM.
3
+ * Returns a base64-encoded string in the format: salt:iv:authTag:ciphertext
4
+ */
5
+ export declare function encrypt(plaintext: string, password: string): string;
6
+ /**
7
+ * Decrypt ciphertext produced by encrypt().
8
+ * Expects the format: salt:iv:authTag:ciphertext
9
+ */
10
+ export declare function decrypt(encryptedData: string, password: string): string;
11
+ /**
12
+ * Check whether a string looks like an encrypted payload.
13
+ */
14
+ export declare function isEncrypted(data: string): boolean;
15
+ //# sourceMappingURL=encryptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryptor.d.ts","sourceRoot":"","sources":["../../src/crypto/encryptor.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBnE;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuBvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYjD"}