contextmate 0.1.3 → 0.1.5
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/adapters/base.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,8BAAsB,WAAW;IAC/B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,cAAc;IAKnC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAC7D,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IACtE,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9F,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAE7C,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAOhE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/adapters/base.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,8BAAsB,WAAW;IAC/B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,cAAc;IAKnC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAC7D,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IACtE,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9F,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAE7C,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAOhE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAuB5D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;cASzC,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK1F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdir, symlink, lstat, copyFile, unlink } from 'node:fs/promises';
|
|
1
|
+
import { mkdir, symlink, lstat, copyFile, unlink, rm } from 'node:fs/promises';
|
|
2
2
|
import { join, dirname, relative } from 'node:path';
|
|
3
3
|
export class BaseAdapter {
|
|
4
4
|
vaultPath;
|
|
@@ -20,6 +20,11 @@ export class BaseAdapter {
|
|
|
20
20
|
if (linkStat.isSymbolicLink()) {
|
|
21
21
|
await unlink(linkPath);
|
|
22
22
|
}
|
|
23
|
+
else if (linkStat.isDirectory()) {
|
|
24
|
+
// Directory exists — back it up then remove
|
|
25
|
+
await this.backupFile(linkPath, this.name).catch(() => { });
|
|
26
|
+
await rm(linkPath, { recursive: true });
|
|
27
|
+
}
|
|
23
28
|
else {
|
|
24
29
|
// Regular file exists — back it up first
|
|
25
30
|
await this.backupFile(linkPath, this.name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/adapters/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,EAAE,OAAO,EAAkB,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAkB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/adapters/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,EAAE,OAAO,EAAkB,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAkB,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACpI,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAkBpD,MAAM,OAAgB,WAAW;IACrB,SAAS,CAAS;IAClB,WAAW,CAAS;IAE9B,YAAY,OAAuB;QACjC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IASS,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,SAAiB;QAC9D,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAClE,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,QAAgB;QAC1D,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC9B,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;iBAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;gBAClC,4CAA4C;gBAC5C,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC3D,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,yCAAyC;gBACzC,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QAED,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAES,KAAK,CAAC,SAAS,CAAC,IAAY;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAES,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,iBAAyB;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmNpC,eAAO,MAAM,WAAW,SA6CpB,CAAC"}
|
package/dist/src/cli/init.js
CHANGED
|
@@ -4,17 +4,171 @@ import * as readline from 'node:readline/promises';
|
|
|
4
4
|
import { stdin, stdout } from 'node:process';
|
|
5
5
|
import { access, writeFile } from 'node:fs/promises';
|
|
6
6
|
import { join } from 'node:path';
|
|
7
|
-
import { bytesToHex } from '@noble/hashes/utils';
|
|
7
|
+
import { bytesToHex, hexToBytes } from '@noble/hashes/utils';
|
|
8
8
|
import { generateSalt, deriveMasterKey, deriveAuthKey, deriveVaultKey, encryptString, createAuthHash, } from '../crypto/index.js';
|
|
9
9
|
import { getConfigPath, getDefaultConfig, saveConfig, ensureDirectories, } from '../config.js';
|
|
10
|
-
async function
|
|
10
|
+
async function ask(prompt) {
|
|
11
11
|
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
12
12
|
const answer = await rl.question(prompt);
|
|
13
13
|
rl.close();
|
|
14
14
|
return answer;
|
|
15
15
|
}
|
|
16
|
+
async function setupDirectories() {
|
|
17
|
+
const config = getDefaultConfig();
|
|
18
|
+
await ensureDirectories(config);
|
|
19
|
+
await saveConfig(config);
|
|
20
|
+
return config;
|
|
21
|
+
}
|
|
22
|
+
function printSuccess(userId, serverUrl) {
|
|
23
|
+
console.log('');
|
|
24
|
+
console.log(chalk.green.bold('ContextMate is ready!'));
|
|
25
|
+
console.log('');
|
|
26
|
+
console.log(` ${chalk.bold('User ID:')} ${userId}`);
|
|
27
|
+
console.log(` ${chalk.bold('Server:')} ${serverUrl}`);
|
|
28
|
+
console.log('');
|
|
29
|
+
console.log(chalk.yellow.bold(' ⚠ Save your User ID and passphrase somewhere safe.'));
|
|
30
|
+
console.log(chalk.yellow(' You need both to log in on other devices.'));
|
|
31
|
+
console.log('');
|
|
32
|
+
console.log(chalk.bold('Next steps:'));
|
|
33
|
+
console.log(` ${chalk.cyan('contextmate adapter claude init')} Connect Claude Code`);
|
|
34
|
+
console.log(` ${chalk.cyan('contextmate adapter openclaw init')} Connect OpenClaw`);
|
|
35
|
+
console.log(` ${chalk.cyan('contextmate daemon start')} Begin syncing`);
|
|
36
|
+
console.log('');
|
|
37
|
+
}
|
|
38
|
+
async function createNewAccount() {
|
|
39
|
+
const passphrase = await ask(chalk.bold('Choose a passphrase: '));
|
|
40
|
+
if (!passphrase) {
|
|
41
|
+
console.error(chalk.red('Error: Passphrase cannot be empty.'));
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const confirmation = await ask(chalk.bold('Confirm passphrase: '));
|
|
45
|
+
if (passphrase !== confirmation) {
|
|
46
|
+
console.error(chalk.red('Error: Passphrases do not match.'));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
console.log(chalk.dim('Deriving encryption keys...'));
|
|
50
|
+
const salt = generateSalt();
|
|
51
|
+
const masterKey = await deriveMasterKey(passphrase, salt);
|
|
52
|
+
const authKey = deriveAuthKey(masterKey);
|
|
53
|
+
const vaultKey = deriveVaultKey(masterKey);
|
|
54
|
+
const config = await setupDirectories();
|
|
55
|
+
// Save credentials locally
|
|
56
|
+
const encryptedMasterKey = encryptString(bytesToHex(masterKey), vaultKey);
|
|
57
|
+
const credentials = {
|
|
58
|
+
salt: bytesToHex(salt),
|
|
59
|
+
encryptedMasterKey: bytesToHex(encryptedMasterKey),
|
|
60
|
+
};
|
|
61
|
+
await writeFile(join(config.data.path, 'credentials.json'), JSON.stringify(credentials, null, 2), { mode: 0o600 });
|
|
62
|
+
// Register with server
|
|
63
|
+
const authHash = createAuthHash(authKey);
|
|
64
|
+
const authPath = join(config.data.path, 'auth.json');
|
|
65
|
+
console.log(chalk.dim('Registering with server...'));
|
|
66
|
+
try {
|
|
67
|
+
const res = await fetch(`${config.server.url}/api/auth/register`, {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
headers: { 'Content-Type': 'application/json' },
|
|
70
|
+
body: JSON.stringify({
|
|
71
|
+
authKeyHash: authHash,
|
|
72
|
+
salt: bytesToHex(salt),
|
|
73
|
+
encryptedMasterKey: bytesToHex(encryptedMasterKey),
|
|
74
|
+
}),
|
|
75
|
+
});
|
|
76
|
+
if (res.ok) {
|
|
77
|
+
const { userId, token } = (await res.json());
|
|
78
|
+
await writeFile(authPath, JSON.stringify({ authHash, userId, token }, null, 2), { mode: 0o600 });
|
|
79
|
+
printSuccess(userId, config.server.url);
|
|
80
|
+
}
|
|
81
|
+
else if (res.status === 409) {
|
|
82
|
+
console.error(chalk.red('Error: An account with this passphrase already exists.'));
|
|
83
|
+
console.error(chalk.dim('If this is your account, choose "Log into existing account" instead.'));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
await writeFile(authPath, JSON.stringify({ authHash }, null, 2), { mode: 0o600 });
|
|
88
|
+
console.log('');
|
|
89
|
+
console.log(chalk.green('ContextMate initialized locally.'));
|
|
90
|
+
console.log(chalk.yellow('Warning: Server registration failed. Run "contextmate init" again later.'));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
await writeFile(authPath, JSON.stringify({ authHash }, null, 2), { mode: 0o600 });
|
|
95
|
+
console.log('');
|
|
96
|
+
console.log(chalk.green('ContextMate initialized locally.'));
|
|
97
|
+
console.log(chalk.yellow('Warning: Could not reach server. Run "contextmate init" again later.'));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function loginExistingAccount() {
|
|
101
|
+
const userId = await ask(chalk.bold('User ID: '));
|
|
102
|
+
if (!userId.trim()) {
|
|
103
|
+
console.error(chalk.red('Error: User ID cannot be empty.'));
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
const passphrase = await ask(chalk.bold('Passphrase: '));
|
|
107
|
+
if (!passphrase) {
|
|
108
|
+
console.error(chalk.red('Error: Passphrase cannot be empty.'));
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
const config = await setupDirectories();
|
|
112
|
+
// Fetch salt from server
|
|
113
|
+
console.log(chalk.dim('Connecting to server...'));
|
|
114
|
+
let salt;
|
|
115
|
+
try {
|
|
116
|
+
const res = await fetch(`${config.server.url}/api/auth/salt/${encodeURIComponent(userId.trim())}`);
|
|
117
|
+
if (res.status === 404) {
|
|
118
|
+
console.error(chalk.red('Error: User ID not found on server.'));
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
if (!res.ok) {
|
|
122
|
+
console.error(chalk.red(`Error: Server returned ${res.status}.`));
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
const data = (await res.json());
|
|
126
|
+
salt = hexToBytes(data.salt);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
console.error(chalk.red(`Error: Could not reach server (${err instanceof Error ? err.message : String(err)}).`));
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
// Derive keys with the server-provided salt
|
|
133
|
+
console.log(chalk.dim('Deriving encryption keys...'));
|
|
134
|
+
const masterKey = await deriveMasterKey(passphrase, salt);
|
|
135
|
+
const authKey = deriveAuthKey(masterKey);
|
|
136
|
+
const vaultKey = deriveVaultKey(masterKey);
|
|
137
|
+
const authHash = createAuthHash(authKey);
|
|
138
|
+
// Log in
|
|
139
|
+
console.log(chalk.dim('Authenticating...'));
|
|
140
|
+
try {
|
|
141
|
+
const res = await fetch(`${config.server.url}/api/auth/login`, {
|
|
142
|
+
method: 'POST',
|
|
143
|
+
headers: { 'Content-Type': 'application/json' },
|
|
144
|
+
body: JSON.stringify({ authKeyHash: authHash }),
|
|
145
|
+
});
|
|
146
|
+
if (res.status === 401) {
|
|
147
|
+
console.error(chalk.red('Error: Incorrect passphrase for this account.'));
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
if (!res.ok) {
|
|
151
|
+
console.error(chalk.red(`Error: Server returned ${res.status}.`));
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
const { token } = (await res.json());
|
|
155
|
+
// Save credentials locally
|
|
156
|
+
const encryptedMasterKey = encryptString(bytesToHex(masterKey), vaultKey);
|
|
157
|
+
const credentials = {
|
|
158
|
+
salt: bytesToHex(salt),
|
|
159
|
+
encryptedMasterKey: bytesToHex(encryptedMasterKey),
|
|
160
|
+
};
|
|
161
|
+
await writeFile(join(config.data.path, 'credentials.json'), JSON.stringify(credentials, null, 2), { mode: 0o600 });
|
|
162
|
+
await writeFile(join(config.data.path, 'auth.json'), JSON.stringify({ authHash, userId: userId.trim(), token }, null, 2), { mode: 0o600 });
|
|
163
|
+
printSuccess(userId.trim(), config.server.url);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
console.error(chalk.red(`Error: Could not reach server (${err instanceof Error ? err.message : String(err)}).`));
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
16
170
|
export const initCommand = new Command('init')
|
|
17
|
-
.description('
|
|
171
|
+
.description('Set up ContextMate — create a new account or log into an existing one')
|
|
18
172
|
.action(async () => {
|
|
19
173
|
try {
|
|
20
174
|
const configPath = getConfigPath();
|
|
@@ -28,113 +182,26 @@ export const initCommand = new Command('init')
|
|
|
28
182
|
// Not initialized
|
|
29
183
|
}
|
|
30
184
|
if (alreadyInitialized) {
|
|
31
|
-
const
|
|
32
|
-
const answer = await rl.question(chalk.yellow('ContextMate is already initialized. Re-initialize? (y/N): '));
|
|
33
|
-
rl.close();
|
|
185
|
+
const answer = await ask(chalk.yellow('ContextMate is already initialized. Re-initialize? (y/N): '));
|
|
34
186
|
if (answer.toLowerCase() !== 'y') {
|
|
35
187
|
console.log('Aborted.');
|
|
36
188
|
return;
|
|
37
189
|
}
|
|
38
190
|
}
|
|
39
|
-
// Prompt for passphrase
|
|
40
|
-
const passphrase = await readPassphrase(chalk.bold('Enter passphrase: '));
|
|
41
|
-
if (!passphrase) {
|
|
42
|
-
console.error(chalk.red('Error: Passphrase cannot be empty.'));
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
const confirmation = await readPassphrase(chalk.bold('Confirm passphrase: '));
|
|
46
|
-
if (passphrase !== confirmation) {
|
|
47
|
-
console.error(chalk.red('Error: Passphrases do not match.'));
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
// Generate salt and derive keys
|
|
51
|
-
console.log(chalk.dim('Deriving encryption keys...'));
|
|
52
|
-
const salt = generateSalt();
|
|
53
|
-
const masterKey = await deriveMasterKey(passphrase, salt);
|
|
54
|
-
const authKey = deriveAuthKey(masterKey);
|
|
55
|
-
const vaultKey = deriveVaultKey(masterKey);
|
|
56
|
-
// Create directory structure
|
|
57
|
-
const config = getDefaultConfig();
|
|
58
|
-
await ensureDirectories(config);
|
|
59
|
-
// Save config
|
|
60
|
-
await saveConfig(config);
|
|
61
|
-
// Save credentials (salt + encrypted master key)
|
|
62
|
-
const credentialsPath = join(config.data.path, 'credentials.json');
|
|
63
|
-
// Encrypt the master key with the vault key for storage
|
|
64
|
-
const encryptedMasterKey = encryptString(bytesToHex(masterKey), vaultKey);
|
|
65
|
-
const credentials = {
|
|
66
|
-
salt: bytesToHex(salt),
|
|
67
|
-
encryptedMasterKey: bytesToHex(encryptedMasterKey),
|
|
68
|
-
};
|
|
69
|
-
await writeFile(credentialsPath, JSON.stringify(credentials, null, 2), { mode: 0o600 });
|
|
70
|
-
// Create auth hash for server registration
|
|
71
|
-
const authHash = createAuthHash(authKey);
|
|
72
|
-
const authPath = join(config.data.path, 'auth.json');
|
|
73
|
-
// Register with the server
|
|
74
|
-
console.log(chalk.dim('Registering with server...'));
|
|
75
|
-
try {
|
|
76
|
-
const res = await fetch(`${config.server.url}/api/auth/register`, {
|
|
77
|
-
method: 'POST',
|
|
78
|
-
headers: { 'Content-Type': 'application/json' },
|
|
79
|
-
body: JSON.stringify({
|
|
80
|
-
authKeyHash: authHash,
|
|
81
|
-
salt: bytesToHex(salt),
|
|
82
|
-
encryptedMasterKey: bytesToHex(encryptedMasterKey),
|
|
83
|
-
}),
|
|
84
|
-
});
|
|
85
|
-
if (res.ok) {
|
|
86
|
-
const { userId, token } = (await res.json());
|
|
87
|
-
await writeFile(authPath, JSON.stringify({ authHash, userId, token }, null, 2), { mode: 0o600 });
|
|
88
|
-
console.log('');
|
|
89
|
-
console.log(chalk.green('ContextMate initialized successfully!'));
|
|
90
|
-
console.log('');
|
|
91
|
-
console.log(` ${chalk.bold('User ID:')} ${userId}`);
|
|
92
|
-
console.log(` ${chalk.bold('Server:')} ${config.server.url}`);
|
|
93
|
-
}
|
|
94
|
-
else if (res.status === 409) {
|
|
95
|
-
// User already exists on server — save auth hash locally and log in
|
|
96
|
-
console.log(chalk.dim('Account already exists on server, logging in...'));
|
|
97
|
-
const loginRes = await fetch(`${config.server.url}/api/auth/login`, {
|
|
98
|
-
method: 'POST',
|
|
99
|
-
headers: { 'Content-Type': 'application/json' },
|
|
100
|
-
body: JSON.stringify({ authKeyHash: authHash }),
|
|
101
|
-
});
|
|
102
|
-
if (loginRes.ok) {
|
|
103
|
-
const { userId, token } = (await loginRes.json());
|
|
104
|
-
await writeFile(authPath, JSON.stringify({ authHash, userId, token }, null, 2), { mode: 0o600 });
|
|
105
|
-
console.log('');
|
|
106
|
-
console.log(chalk.green('ContextMate initialized successfully!'));
|
|
107
|
-
console.log('');
|
|
108
|
-
console.log(` ${chalk.bold('User ID:')} ${userId}`);
|
|
109
|
-
console.log(` ${chalk.bold('Server:')} ${config.server.url}`);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
await writeFile(authPath, JSON.stringify({ authHash }, null, 2), { mode: 0o600 });
|
|
113
|
-
console.log('');
|
|
114
|
-
console.log(chalk.green('ContextMate initialized locally.'));
|
|
115
|
-
console.log(chalk.yellow('Warning: Could not log in to server.'));
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
await writeFile(authPath, JSON.stringify({ authHash }, null, 2), { mode: 0o600 });
|
|
120
|
-
console.log('');
|
|
121
|
-
console.log(chalk.green('ContextMate initialized locally.'));
|
|
122
|
-
console.log(chalk.yellow('Warning: Server registration failed. You can sync later.'));
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
catch {
|
|
126
|
-
// Server unreachable — still save locally
|
|
127
|
-
await writeFile(authPath, JSON.stringify({ authHash }, null, 2), { mode: 0o600 });
|
|
128
|
-
console.log('');
|
|
129
|
-
console.log(chalk.green('ContextMate initialized locally.'));
|
|
130
|
-
console.log(chalk.yellow('Warning: Could not reach server. You can sync later.'));
|
|
131
|
-
}
|
|
132
191
|
console.log('');
|
|
133
|
-
console.log(chalk.bold('
|
|
134
|
-
console.log(` ${chalk.cyan("contextmate adapter openclaw init")} Sync OpenClaw workspace`);
|
|
135
|
-
console.log(` ${chalk.cyan("contextmate adapter claude init")} Sync Claude Code skills`);
|
|
136
|
-
console.log(` ${chalk.cyan("contextmate daemon start")} Begin syncing`);
|
|
192
|
+
console.log(chalk.bold('ContextMate Setup'));
|
|
137
193
|
console.log('');
|
|
194
|
+
console.log(' 1. Create new account');
|
|
195
|
+
console.log(' 2. Log into existing account');
|
|
196
|
+
console.log('');
|
|
197
|
+
const choice = await ask(chalk.bold('Choose (1 or 2): '));
|
|
198
|
+
console.log('');
|
|
199
|
+
if (choice.trim() === '2') {
|
|
200
|
+
await loginExistingAccount();
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
await createNewAccount();
|
|
204
|
+
}
|
|
138
205
|
}
|
|
139
206
|
catch (err) {
|
|
140
207
|
console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
|
package/dist/src/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"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"}
|