@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.
- package/.claude/settings.local.json +8 -0
- package/README.md +203 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +87 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +2 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +24 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +89 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +105 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +22 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/pull.d.ts +6 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +52 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +6 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +60 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/remove.d.ts +2 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +20 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +46 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config/config-file.d.ts +22 -0
- package/dist/config/config-file.d.ts.map +1 -0
- package/dist/config/config-file.js +86 -0
- package/dist/config/config-file.js.map +1 -0
- package/dist/config/schema.d.ts +101 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +24 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/backup.d.ts +8 -0
- package/dist/core/backup.d.ts.map +1 -0
- package/dist/core/backup.js +50 -0
- package/dist/core/backup.js.map +1 -0
- package/dist/core/checksum.d.ts +14 -0
- package/dist/core/checksum.d.ts.map +1 -0
- package/dist/core/checksum.js +23 -0
- package/dist/core/checksum.js.map +1 -0
- package/dist/core/exclusions.d.ts +8 -0
- package/dist/core/exclusions.d.ts.map +1 -0
- package/dist/core/exclusions.js +29 -0
- package/dist/core/exclusions.js.map +1 -0
- package/dist/core/file-collector.d.ts +16 -0
- package/dist/core/file-collector.d.ts.map +1 -0
- package/dist/core/file-collector.js +104 -0
- package/dist/core/file-collector.js.map +1 -0
- package/dist/core/manifest.d.ts +18 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +42 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/path-expander.d.ts +6 -0
- package/dist/core/path-expander.d.ts.map +1 -0
- package/dist/core/path-expander.js +25 -0
- package/dist/core/path-expander.js.map +1 -0
- package/dist/core/sync-engine.d.ts +24 -0
- package/dist/core/sync-engine.d.ts.map +1 -0
- package/dist/core/sync-engine.js +206 -0
- package/dist/core/sync-engine.js.map +1 -0
- package/dist/core/sync-package.d.ts +12 -0
- package/dist/core/sync-package.d.ts.map +1 -0
- package/dist/core/sync-package.js +95 -0
- package/dist/core/sync-package.js.map +1 -0
- package/dist/crypto/encryptor.d.ts +15 -0
- package/dist/crypto/encryptor.d.ts.map +1 -0
- package/dist/crypto/encryptor.js +77 -0
- package/dist/crypto/encryptor.js.map +1 -0
- package/dist/crypto/key-resolver.d.ts +28 -0
- package/dist/crypto/key-resolver.d.ts.map +1 -0
- package/dist/crypto/key-resolver.js +62 -0
- package/dist/crypto/key-resolver.js.map +1 -0
- package/dist/gist/client.d.ts +18 -0
- package/dist/gist/client.d.ts.map +1 -0
- package/dist/gist/client.js +58 -0
- package/dist/gist/client.js.map +1 -0
- package/dist/gist/mock-client.d.ts +19 -0
- package/dist/gist/mock-client.d.ts.map +1 -0
- package/dist/gist/mock-client.js +61 -0
- package/dist/gist/mock-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/presets/claude-code.d.ts +3 -0
- package/dist/presets/claude-code.d.ts.map +1 -0
- package/dist/presets/claude-code.js +27 -0
- package/dist/presets/claude-code.js.map +1 -0
- package/dist/presets/hermes.d.ts +3 -0
- package/dist/presets/hermes.d.ts.map +1 -0
- package/dist/presets/hermes.js +27 -0
- package/dist/presets/hermes.js.map +1 -0
- package/dist/presets/index.d.ts +15 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +42 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/openclaw.d.ts +3 -0
- package/dist/presets/openclaw.d.ts.map +1 -0
- package/dist/presets/openclaw.js +27 -0
- package/dist/presets/openclaw.js.map +1 -0
- package/dist/types/config.d.ts +45 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/gist.d.ts +25 -0
- package/dist/types/gist.d.ts.map +1 -0
- package/dist/types/gist.js +2 -0
- package/dist/types/gist.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/sync.d.ts +78 -0
- package/dist/types/sync.d.ts.map +1 -0
- package/dist/types/sync.js +2 -0
- package/dist/types/sync.js.map +1 -0
- package/dist/utils/diff.d.ts +7 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +99 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/env.d.ts +13 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +29 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +39 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/table.d.ts +5 -0
- package/dist/utils/table.d.ts.map +1 -0
- package/dist/utils/table.js +59 -0
- package/dist/utils/table.js.map +1 -0
- package/package.json +41 -0
- package/tests/integration/encryption-flow.test.ts +142 -0
- package/tests/integration/init-flow.test.ts +69 -0
- package/tests/integration/push-pull-flow.test.ts +183 -0
- package/tests/integration/status-flow.test.ts +149 -0
- package/tsconfig.json +19 -0
- package/vitest.config.ts +10 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
3
|
+
const KEY_LENGTH = 32; // 256 bits
|
|
4
|
+
const IV_LENGTH = 16; // 128 bits
|
|
5
|
+
const TAG_LENGTH = 16; // 128 bits
|
|
6
|
+
const SALT_LENGTH = 32;
|
|
7
|
+
const PBKDF2_ITERATIONS = 100000;
|
|
8
|
+
const PBKDF2_DIGEST = 'sha256';
|
|
9
|
+
/**
|
|
10
|
+
* Derive an AES-256 key from a password using PBKDF2.
|
|
11
|
+
*/
|
|
12
|
+
function deriveKey(password, salt) {
|
|
13
|
+
return crypto.pbkdf2Sync(password, salt, PBKDF2_ITERATIONS, KEY_LENGTH, PBKDF2_DIGEST);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Encrypt plaintext with AES-256-GCM.
|
|
17
|
+
* Returns a base64-encoded string in the format: salt:iv:authTag:ciphertext
|
|
18
|
+
*/
|
|
19
|
+
export function encrypt(plaintext, password) {
|
|
20
|
+
const salt = crypto.randomBytes(SALT_LENGTH);
|
|
21
|
+
const key = deriveKey(password, salt);
|
|
22
|
+
const iv = crypto.randomBytes(IV_LENGTH);
|
|
23
|
+
const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
|
|
24
|
+
const encrypted = Buffer.concat([
|
|
25
|
+
cipher.update(plaintext, 'utf-8'),
|
|
26
|
+
cipher.final(),
|
|
27
|
+
]);
|
|
28
|
+
const authTag = cipher.getAuthTag();
|
|
29
|
+
// Format: salt:iv:authTag:ciphertext (all base64)
|
|
30
|
+
return [
|
|
31
|
+
salt.toString('base64'),
|
|
32
|
+
iv.toString('base64'),
|
|
33
|
+
authTag.toString('base64'),
|
|
34
|
+
encrypted.toString('base64'),
|
|
35
|
+
].join(':');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Decrypt ciphertext produced by encrypt().
|
|
39
|
+
* Expects the format: salt:iv:authTag:ciphertext
|
|
40
|
+
*/
|
|
41
|
+
export function decrypt(encryptedData, password) {
|
|
42
|
+
const parts = encryptedData.split(':');
|
|
43
|
+
if (parts.length !== 4) {
|
|
44
|
+
throw new Error('Invalid encrypted data format. Expected salt:iv:authTag:ciphertext');
|
|
45
|
+
}
|
|
46
|
+
const [saltB64, ivB64, authTagB64, ciphertextB64] = parts;
|
|
47
|
+
const salt = Buffer.from(saltB64, 'base64');
|
|
48
|
+
const iv = Buffer.from(ivB64, 'base64');
|
|
49
|
+
const authTag = Buffer.from(authTagB64, 'base64');
|
|
50
|
+
const ciphertext = Buffer.from(ciphertextB64, 'base64');
|
|
51
|
+
const key = deriveKey(password, salt);
|
|
52
|
+
const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
|
|
53
|
+
decipher.setAuthTag(authTag);
|
|
54
|
+
const decrypted = Buffer.concat([
|
|
55
|
+
decipher.update(ciphertext),
|
|
56
|
+
decipher.final(),
|
|
57
|
+
]);
|
|
58
|
+
return decrypted.toString('utf-8');
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check whether a string looks like an encrypted payload.
|
|
62
|
+
*/
|
|
63
|
+
export function isEncrypted(data) {
|
|
64
|
+
const parts = data.split(':');
|
|
65
|
+
if (parts.length !== 4)
|
|
66
|
+
return false;
|
|
67
|
+
try {
|
|
68
|
+
for (const part of parts) {
|
|
69
|
+
Buffer.from(part, 'base64');
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=encryptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryptor.js","sourceRoot":"","sources":["../../src/crypto/encryptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the encryption password.
|
|
3
|
+
* Priority:
|
|
4
|
+
* 1. Previously cached password (in-memory for this process)
|
|
5
|
+
* 2. AITOOLSYNC_PASSWORD environment variable
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolvePassword(): string | null;
|
|
8
|
+
/**
|
|
9
|
+
* Set the cached password.
|
|
10
|
+
*/
|
|
11
|
+
export declare function setPassword(password: string): void;
|
|
12
|
+
/**
|
|
13
|
+
* Clear the cached password.
|
|
14
|
+
*/
|
|
15
|
+
export declare function clearPassword(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Check if a password is available.
|
|
18
|
+
*/
|
|
19
|
+
export declare function hasPassword(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Encrypt using the resolved password.
|
|
22
|
+
*/
|
|
23
|
+
export declare function encryptWithPassword(plaintext: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Decrypt using the resolved password.
|
|
26
|
+
*/
|
|
27
|
+
export declare function decryptWithPassword(encryptedData: string): string;
|
|
28
|
+
//# sourceMappingURL=key-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-resolver.d.ts","sourceRoot":"","sources":["../../src/crypto/key-resolver.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAU/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAMjE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { getEncryptionPassword } from '../utils/env.js';
|
|
2
|
+
import { encrypt, decrypt } from './encryptor.js';
|
|
3
|
+
/**
|
|
4
|
+
* In-memory cache for the encryption password.
|
|
5
|
+
* Never written to disk.
|
|
6
|
+
*/
|
|
7
|
+
let cachedPassword = null;
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the encryption password.
|
|
10
|
+
* Priority:
|
|
11
|
+
* 1. Previously cached password (in-memory for this process)
|
|
12
|
+
* 2. AITOOLSYNC_PASSWORD environment variable
|
|
13
|
+
*/
|
|
14
|
+
export function resolvePassword() {
|
|
15
|
+
if (cachedPassword)
|
|
16
|
+
return cachedPassword;
|
|
17
|
+
const envPassword = getEncryptionPassword();
|
|
18
|
+
if (envPassword) {
|
|
19
|
+
cachedPassword = envPassword;
|
|
20
|
+
return envPassword;
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Set the cached password.
|
|
26
|
+
*/
|
|
27
|
+
export function setPassword(password) {
|
|
28
|
+
cachedPassword = password;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Clear the cached password.
|
|
32
|
+
*/
|
|
33
|
+
export function clearPassword() {
|
|
34
|
+
cachedPassword = null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a password is available.
|
|
38
|
+
*/
|
|
39
|
+
export function hasPassword() {
|
|
40
|
+
return resolvePassword() !== null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Encrypt using the resolved password.
|
|
44
|
+
*/
|
|
45
|
+
export function encryptWithPassword(plaintext) {
|
|
46
|
+
const password = resolvePassword();
|
|
47
|
+
if (!password) {
|
|
48
|
+
throw new Error('No encryption password available. Set AITOOLSYNC_PASSWORD or provide via prompt.');
|
|
49
|
+
}
|
|
50
|
+
return encrypt(plaintext, password);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Decrypt using the resolved password.
|
|
54
|
+
*/
|
|
55
|
+
export function decryptWithPassword(encryptedData) {
|
|
56
|
+
const password = resolvePassword();
|
|
57
|
+
if (!password) {
|
|
58
|
+
throw new Error('No encryption password available. Set AITOOLSYNC_PASSWORD or provide via prompt.');
|
|
59
|
+
}
|
|
60
|
+
return decrypt(encryptedData, password);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=key-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-resolver.js","sourceRoot":"","sources":["../../src/crypto/key-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;GAGG;AACH,IAAI,cAAc,GAAkB,IAAI,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAC5C,IAAI,WAAW,EAAE,CAAC;QAChB,cAAc,GAAG,WAAW,CAAC;QAC7B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,cAAc,GAAG,QAAQ,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,eAAe,EAAE,KAAK,IAAI,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAqB;IACvD,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { GistClientInterface, GistDescriptor } from '../types/gist.js';
|
|
2
|
+
/**
|
|
3
|
+
* Real Gist client using Octokit.
|
|
4
|
+
*/
|
|
5
|
+
export declare class GistClient implements GistClientInterface {
|
|
6
|
+
private readonly octokit;
|
|
7
|
+
constructor(token?: string);
|
|
8
|
+
createGist(description: string, files: Record<string, {
|
|
9
|
+
content: string;
|
|
10
|
+
}>): Promise<GistDescriptor>;
|
|
11
|
+
getGist(gistId: string): Promise<GistDescriptor>;
|
|
12
|
+
updateGist(gistId: string, files: Record<string, {
|
|
13
|
+
content: string;
|
|
14
|
+
}>): Promise<GistDescriptor>;
|
|
15
|
+
deleteGist(gistId: string): Promise<void>;
|
|
16
|
+
private toDescriptor;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/gist/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAY,MAAM,kBAAkB,CAAC;AAItF;;GAEG;AACH,qBAAa,UAAW,YAAW,mBAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,KAAK,CAAC,EAAE,MAAM;IAQpB,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GACzC,OAAO,CAAC,cAAc,CAAC;IAWpB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAMhD,UAAU,CACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GACzC,OAAO,CAAC,cAAc,CAAC;IASpB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,OAAO,CAAC,YAAY;CAgBrB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Octokit } from '@octokit/rest';
|
|
2
|
+
import { getGithubToken } from '../utils/env.js';
|
|
3
|
+
import { debug } from '../utils/logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Real Gist client using Octokit.
|
|
6
|
+
*/
|
|
7
|
+
export class GistClient {
|
|
8
|
+
octokit;
|
|
9
|
+
constructor(token) {
|
|
10
|
+
const auth = token || getGithubToken();
|
|
11
|
+
if (!auth) {
|
|
12
|
+
throw new Error('GitHub token not found. Set GITHUB_TOKEN environment variable.');
|
|
13
|
+
}
|
|
14
|
+
this.octokit = new Octokit({ auth });
|
|
15
|
+
}
|
|
16
|
+
async createGist(description, files) {
|
|
17
|
+
debug(`Creating Gist: ${description}`);
|
|
18
|
+
const response = await this.octokit.gists.create({
|
|
19
|
+
description,
|
|
20
|
+
public: false,
|
|
21
|
+
files,
|
|
22
|
+
});
|
|
23
|
+
return this.toDescriptor(response.data);
|
|
24
|
+
}
|
|
25
|
+
async getGist(gistId) {
|
|
26
|
+
debug(`Fetching Gist: ${gistId}`);
|
|
27
|
+
const response = await this.octokit.gists.get({ gist_id: gistId });
|
|
28
|
+
return this.toDescriptor(response.data);
|
|
29
|
+
}
|
|
30
|
+
async updateGist(gistId, files) {
|
|
31
|
+
debug(`Updating Gist: ${gistId}`);
|
|
32
|
+
const response = await this.octokit.gists.update({
|
|
33
|
+
gist_id: gistId,
|
|
34
|
+
files,
|
|
35
|
+
});
|
|
36
|
+
return this.toDescriptor(response.data);
|
|
37
|
+
}
|
|
38
|
+
async deleteGist(gistId) {
|
|
39
|
+
debug(`Deleting Gist: ${gistId}`);
|
|
40
|
+
await this.octokit.gists.delete({ gist_id: gistId });
|
|
41
|
+
}
|
|
42
|
+
toDescriptor(data) {
|
|
43
|
+
const files = [];
|
|
44
|
+
for (const [filename, fileData] of Object.entries(data.files || {})) {
|
|
45
|
+
files.push({
|
|
46
|
+
filename,
|
|
47
|
+
content: fileData?.content || '',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
gistId: data.id,
|
|
52
|
+
description: data.description || '',
|
|
53
|
+
files,
|
|
54
|
+
updatedAt: data.updated_at,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/gist/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C;;GAEG;AACH,MAAM,OAAO,UAAU;IACJ,OAAO,CAAU;IAElC,YAAY,KAAc;QACxB,MAAM,IAAI,GAAG,KAAK,IAAI,cAAc,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CACd,WAAmB,EACnB,KAA0C;QAE1C,KAAK,CAAC,kBAAkB,WAAW,EAAE,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YAC/C,WAAW;YACX,MAAM,EAAE,KAAK;YACb,KAAK;SACN,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,KAAK,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,UAAU,CACd,MAAc,EACd,KAA0C;QAE1C,KAAK,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YAC/C,OAAO,EAAE,MAAM;YACf,KAAK;SACN,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,KAAK,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IAEO,YAAY,CAAC,IAAS;QAC5B,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAQ,EAAE,CAAC;YAC3E,KAAK,CAAC,IAAI,CAAC;gBACT,QAAQ;gBACR,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,EAAE;aACjC,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { GistClientInterface, GistDescriptor } from '../types/gist.js';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory mock Gist client for testing.
|
|
4
|
+
*/
|
|
5
|
+
export declare class MockGistClient implements GistClientInterface {
|
|
6
|
+
private gists;
|
|
7
|
+
private nextId;
|
|
8
|
+
createGist(description: string, files: Record<string, {
|
|
9
|
+
content: string;
|
|
10
|
+
}>): Promise<GistDescriptor>;
|
|
11
|
+
getGist(gistId: string): Promise<GistDescriptor>;
|
|
12
|
+
updateGist(gistId: string, files: Record<string, {
|
|
13
|
+
content: string;
|
|
14
|
+
}>): Promise<GistDescriptor>;
|
|
15
|
+
deleteGist(gistId: string): Promise<void>;
|
|
16
|
+
/** Reset mock storage (for test setup) */
|
|
17
|
+
reset(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=mock-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-client.d.ts","sourceRoot":"","sources":["../../src/gist/mock-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAY,MAAM,kBAAkB,CAAC;AAGtF;;GAEG;AACH,qBAAa,cAAe,YAAW,mBAAmB;IACxD,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,MAAM,CAAK;IAEb,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GACzC,OAAO,CAAC,cAAc,CAAC;IAmBpB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQhD,UAAU,CACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GACzC,OAAO,CAAC,cAAc,CAAC;IAsBpB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,0CAA0C;IAC1C,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { debug } from '../utils/logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory mock Gist client for testing.
|
|
4
|
+
*/
|
|
5
|
+
export class MockGistClient {
|
|
6
|
+
gists = new Map();
|
|
7
|
+
nextId = 1;
|
|
8
|
+
async createGist(description, files) {
|
|
9
|
+
const gistId = `mock-gist-${this.nextId++}`;
|
|
10
|
+
const gistFiles = Object.entries(files).map(([filename, fileData]) => ({
|
|
11
|
+
filename,
|
|
12
|
+
content: fileData.content,
|
|
13
|
+
}));
|
|
14
|
+
const gist = {
|
|
15
|
+
gistId,
|
|
16
|
+
description,
|
|
17
|
+
files: gistFiles,
|
|
18
|
+
updatedAt: new Date().toISOString(),
|
|
19
|
+
};
|
|
20
|
+
this.gists.set(gistId, gist);
|
|
21
|
+
debug(`Mock: Created Gist ${gistId}`);
|
|
22
|
+
return gist;
|
|
23
|
+
}
|
|
24
|
+
async getGist(gistId) {
|
|
25
|
+
const gist = this.gists.get(gistId);
|
|
26
|
+
if (!gist) {
|
|
27
|
+
throw new Error(`Gist not found: ${gistId}`);
|
|
28
|
+
}
|
|
29
|
+
return gist;
|
|
30
|
+
}
|
|
31
|
+
async updateGist(gistId, files) {
|
|
32
|
+
const gist = this.gists.get(gistId);
|
|
33
|
+
if (!gist) {
|
|
34
|
+
throw new Error(`Gist not found: ${gistId}`);
|
|
35
|
+
}
|
|
36
|
+
// Merge or replace files
|
|
37
|
+
for (const [filename, fileData] of Object.entries(files)) {
|
|
38
|
+
const existingIndex = gist.files.findIndex((f) => f.filename === filename);
|
|
39
|
+
if (existingIndex >= 0) {
|
|
40
|
+
gist.files[existingIndex] = { filename, content: fileData.content };
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
gist.files.push({ filename, content: fileData.content });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
gist.updatedAt = new Date().toISOString();
|
|
47
|
+
this.gists.set(gistId, gist);
|
|
48
|
+
debug(`Mock: Updated Gist ${gistId}`);
|
|
49
|
+
return gist;
|
|
50
|
+
}
|
|
51
|
+
async deleteGist(gistId) {
|
|
52
|
+
this.gists.delete(gistId);
|
|
53
|
+
debug(`Mock: Deleted Gist ${gistId}`);
|
|
54
|
+
}
|
|
55
|
+
/** Reset mock storage (for test setup) */
|
|
56
|
+
reset() {
|
|
57
|
+
this.gists.clear();
|
|
58
|
+
this.nextId = 1;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=mock-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-client.js","sourceRoot":"","sources":["../../src/gist/mock-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/presets/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,eAAO,MAAM,gBAAgB,EAAE,UAyB9B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const claudeCodePreset = {
|
|
2
|
+
id: 'claude-code',
|
|
3
|
+
name: 'Claude Code',
|
|
4
|
+
description: 'Anthropic Claude Code CLI tool configuration',
|
|
5
|
+
defaultPaths: [
|
|
6
|
+
{
|
|
7
|
+
name: 'claude-code-settings',
|
|
8
|
+
path: '~/.claude/settings.json',
|
|
9
|
+
enabled: true,
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: 'claude-code-mcp',
|
|
13
|
+
path: '~/.claude/mcp.json',
|
|
14
|
+
enabled: true,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'claude-code-claude-json',
|
|
18
|
+
path: '~/.claude/claude.json',
|
|
19
|
+
enabled: true,
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
defaultExclusions: [
|
|
23
|
+
{ pattern: '**/.claude/credentials.json' },
|
|
24
|
+
{ pattern: '**/.claude/*.log' },
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/presets/claude-code.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAe;IAC1C,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,8CAA8C;IAC3D,YAAY,EAAE;QACZ;YACE,IAAI,EAAE,sBAAsB;YAC5B,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,IAAI;SACd;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,IAAI;SACd;QACD;YACE,IAAI,EAAE,yBAAyB;YAC/B,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,IAAI;SACd;KACF;IACD,iBAAiB,EAAE;QACjB,EAAE,OAAO,EAAE,6BAA6B,EAAE;QAC1C,EAAE,OAAO,EAAE,kBAAkB,EAAE;KAChC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../src/presets/hermes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,eAAO,MAAM,YAAY,EAAE,UAyB1B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const hermesPreset = {
|
|
2
|
+
id: 'hermes',
|
|
3
|
+
name: 'Hermes',
|
|
4
|
+
description: 'Hermes AI agent tool configuration',
|
|
5
|
+
defaultPaths: [
|
|
6
|
+
{
|
|
7
|
+
name: 'hermes-config',
|
|
8
|
+
path: '~/.hermes/config.yaml',
|
|
9
|
+
enabled: true,
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: 'hermes-tools',
|
|
13
|
+
path: '~/.hermes/tools',
|
|
14
|
+
enabled: true,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'hermes-prompts',
|
|
18
|
+
path: '~/.hermes/prompts',
|
|
19
|
+
enabled: true,
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
defaultExclusions: [
|
|
23
|
+
{ pattern: '**/.hermes/cache/**' },
|
|
24
|
+
{ pattern: '**/.hermes/*.log' },
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=hermes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../src/presets/hermes.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,oCAAoC;IACjD,YAAY,EAAE;QACZ;YACE,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,IAAI;SACd;QACD;YACE,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,IAAI;SACd;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,IAAI;SACd;KACF;IACD,iBAAiB,EAAE;QACjB,EAAE,OAAO,EAAE,qBAAqB,EAAE;QAClC,EAAE,OAAO,EAAE,kBAAkB,EAAE;KAChC;CACF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ToolPreset, ToolPresetId } from '../types/config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Get a preset by ID.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getPreset(id: ToolPresetId): ToolPreset | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Get all available presets.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getAllPresets(): ToolPreset[];
|
|
10
|
+
/**
|
|
11
|
+
* Detect which presets are installed on this machine
|
|
12
|
+
* by checking if their default paths exist.
|
|
13
|
+
*/
|
|
14
|
+
export declare function detectInstalledPresets(): ToolPreset[];
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWnE;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAElE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,EAAE,CAE5C;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,UAAU,EAAE,CAOrD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import { claudeCodePreset } from './claude-code.js';
|
|
4
|
+
import { hermesPreset } from './hermes.js';
|
|
5
|
+
import { openclawPreset } from './openclaw.js';
|
|
6
|
+
const ALL_PRESETS = [
|
|
7
|
+
claudeCodePreset,
|
|
8
|
+
hermesPreset,
|
|
9
|
+
openclawPreset,
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* Get a preset by ID.
|
|
13
|
+
*/
|
|
14
|
+
export function getPreset(id) {
|
|
15
|
+
return ALL_PRESETS.find((p) => p.id === id);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get all available presets.
|
|
19
|
+
*/
|
|
20
|
+
export function getAllPresets() {
|
|
21
|
+
return ALL_PRESETS;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Detect which presets are installed on this machine
|
|
25
|
+
* by checking if their default paths exist.
|
|
26
|
+
*/
|
|
27
|
+
export function detectInstalledPresets() {
|
|
28
|
+
return ALL_PRESETS.filter((preset) => {
|
|
29
|
+
return preset.defaultPaths.some((p) => {
|
|
30
|
+
const expanded = expandPath(p.path);
|
|
31
|
+
return fs.existsSync(expanded);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function expandPath(raw) {
|
|
36
|
+
let expanded = raw;
|
|
37
|
+
if (expanded.startsWith('~')) {
|
|
38
|
+
expanded = expanded.replace(/^~(?=$|\/)/, os.homedir());
|
|
39
|
+
}
|
|
40
|
+
return expanded;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,WAAW,GAAiB;IAChC,gBAAgB;IAChB,YAAY;IACZ,cAAc;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,EAAgB;IACxC,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QACnC,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,QAAQ,GAAG,GAAG,CAAC;IACnB,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;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/presets/openclaw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,eAAO,MAAM,cAAc,EAAE,UAyB5B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const openclawPreset = {
|
|
2
|
+
id: 'openclaw',
|
|
3
|
+
name: 'OpenClaw',
|
|
4
|
+
description: 'OpenClaw AI agent tool configuration',
|
|
5
|
+
defaultPaths: [
|
|
6
|
+
{
|
|
7
|
+
name: 'openclaw-config',
|
|
8
|
+
path: '~/.openclaw/config.json',
|
|
9
|
+
enabled: true,
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: 'openclaw-tools',
|
|
13
|
+
path: '~/.openclaw/tools',
|
|
14
|
+
enabled: true,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'openclaw-profiles',
|
|
18
|
+
path: '~/.openclaw/profiles',
|
|
19
|
+
enabled: true,
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
defaultExclusions: [
|
|
23
|
+
{ pattern: '**/.openclaw/cache/**' },
|
|
24
|
+
{ pattern: '**/.openclaw/*.log' },
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=openclaw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/presets/openclaw.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,sCAAsC;IACnD,YAAY,EAAE;QACZ;YACE,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,IAAI;SACd;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,IAAI;SACd;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,IAAI;SACd;KACF;IACD,iBAAiB,EAAE;QACjB,EAAE,OAAO,EAAE,uBAAuB,EAAE;QACpC,EAAE,OAAO,EAAE,oBAAoB,EAAE;KAClC;CACF,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface SyncPathEntry {
|
|
2
|
+
/** Display name for this path entry */
|
|
3
|
+
name: string;
|
|
4
|
+
/** Absolute or relative path (supports ~, $HOME, globs) */
|
|
5
|
+
path: string;
|
|
6
|
+
/** Whether this entry is enabled for sync */
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ExclusionRule {
|
|
10
|
+
/** Glob pattern to exclude */
|
|
11
|
+
pattern: string;
|
|
12
|
+
}
|
|
13
|
+
export interface EncryptionRule {
|
|
14
|
+
/** Glob pattern matching files to encrypt */
|
|
15
|
+
pattern: string;
|
|
16
|
+
}
|
|
17
|
+
export type ToolPresetId = 'claude-code' | 'hermes' | 'openclaw';
|
|
18
|
+
export interface ToolPreset {
|
|
19
|
+
id: ToolPresetId;
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
defaultPaths: SyncPathEntry[];
|
|
23
|
+
defaultExclusions: ExclusionRule[];
|
|
24
|
+
}
|
|
25
|
+
export interface AppConfig {
|
|
26
|
+
/** Config file version (for schema migration) */
|
|
27
|
+
version: 1;
|
|
28
|
+
/** GitHub Gist ID for sync storage */
|
|
29
|
+
gistId: string | null;
|
|
30
|
+
/** GitHub personal access token (stored locally, never synced) */
|
|
31
|
+
githubToken: string | null;
|
|
32
|
+
/** Paths to sync */
|
|
33
|
+
syncPaths: SyncPathEntry[];
|
|
34
|
+
/** Exclusion glob patterns */
|
|
35
|
+
exclusions: ExclusionRule[];
|
|
36
|
+
/** Encryption glob patterns */
|
|
37
|
+
encryption: EncryptionRule[];
|
|
38
|
+
/** Last known remote manifest (for three-way merge detection) */
|
|
39
|
+
lastKnownManifest: string | null;
|
|
40
|
+
/** Timestamp of last successful push */
|
|
41
|
+
lastPushAt: string | null;
|
|
42
|
+
/** Timestamp of last successful pull */
|
|
43
|
+
lastPullAt: string | null;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,iBAAiB,EAAE,aAAa,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,iDAAiD;IACjD,OAAO,EAAE,CAAC,CAAC;IACX,sCAAsC;IACtC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kEAAkE;IAClE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oBAAoB;IACpB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,8BAA8B;IAC9B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,+BAA+B;IAC/B,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,iEAAiE;IACjE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,wCAAwC;IACxC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wCAAwC;IACxC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":""}
|