@1claw/cli 0.34.1 → 0.34.2
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/README.md +63 -1
- package/dist/src/commands/daemon.d.ts +3 -0
- package/dist/src/commands/daemon.d.ts.map +1 -0
- package/dist/src/commands/daemon.js +347 -0
- package/dist/src/commands/daemon.js.map +1 -0
- package/dist/src/commands/local.d.ts +3 -0
- package/dist/src/commands/local.d.ts.map +1 -0
- package/dist/src/commands/local.js +505 -0
- package/dist/src/commands/local.js.map +1 -0
- package/dist/src/commands/setup.d.ts.map +1 -1
- package/dist/src/commands/setup.js +88 -1
- package/dist/src/commands/setup.js.map +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/local-policy.d.ts +39 -0
- package/dist/src/local-policy.d.ts.map +1 -0
- package/dist/src/local-policy.js +123 -0
- package/dist/src/local-policy.js.map +1 -0
- package/dist/src/local-vault.d.ts +39 -0
- package/dist/src/local-vault.d.ts.map +1 -0
- package/dist/src/local-vault.js +166 -0
- package/dist/src/local-vault.js.map +1 -0
- package/dist/src/secret-proxy.d.ts +27 -0
- package/dist/src/secret-proxy.d.ts.map +1 -0
- package/dist/src/secret-proxy.js +73 -0
- package/dist/src/secret-proxy.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import inquirer from "inquirer";
|
|
5
|
+
import ora from "ora";
|
|
6
|
+
import { api } from "../client.js";
|
|
7
|
+
import { requireToken, resolveVaultId, handleError } from "../middleware.js";
|
|
8
|
+
import { printSuccess, printError, printWarning, printInfo, printTable, printKeyValue, } from "../output.js";
|
|
9
|
+
import { vaultExists, createVault, loadVault, saveVault, addSecret, removeSecret, getSecret, listSecrets, markSynced, getVaultPath, getVaultInfo, deleteVault, exportAsEnv, fingerprintPassphrase, } from "../local-vault.js";
|
|
10
|
+
const MIN_PASSPHRASE_LENGTH = 8;
|
|
11
|
+
async function promptPassphrase(confirm = false) {
|
|
12
|
+
const { passphrase } = await inquirer.prompt([
|
|
13
|
+
{
|
|
14
|
+
type: "password",
|
|
15
|
+
name: "passphrase",
|
|
16
|
+
message: "Vault passphrase:",
|
|
17
|
+
mask: "*",
|
|
18
|
+
validate: (v) => v.length >= MIN_PASSPHRASE_LENGTH
|
|
19
|
+
? true
|
|
20
|
+
: `Passphrase must be at least ${MIN_PASSPHRASE_LENGTH} characters`,
|
|
21
|
+
},
|
|
22
|
+
]);
|
|
23
|
+
if (confirm) {
|
|
24
|
+
const { confirmed } = await inquirer.prompt([
|
|
25
|
+
{
|
|
26
|
+
type: "password",
|
|
27
|
+
name: "confirmed",
|
|
28
|
+
message: "Confirm passphrase:",
|
|
29
|
+
mask: "*",
|
|
30
|
+
},
|
|
31
|
+
]);
|
|
32
|
+
if (passphrase !== confirmed) {
|
|
33
|
+
printError("Passphrases do not match.");
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return passphrase;
|
|
38
|
+
}
|
|
39
|
+
async function promptUnlock() {
|
|
40
|
+
const passphrase = await promptPassphrase();
|
|
41
|
+
try {
|
|
42
|
+
const vault = loadVault(passphrase);
|
|
43
|
+
return { vault, passphrase };
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
if (err instanceof Error &&
|
|
47
|
+
(err.message.includes("Unsupported") || err.message.includes("bad decrypt") ||
|
|
48
|
+
err.message.includes("unable to authenticate") || err.message.includes("auth"))) {
|
|
49
|
+
printError("Wrong passphrase or corrupted vault file.");
|
|
50
|
+
}
|
|
51
|
+
else if (err instanceof Error) {
|
|
52
|
+
printError(err.message);
|
|
53
|
+
}
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function maskValue(value) {
|
|
58
|
+
if (value.length <= 4)
|
|
59
|
+
return "****";
|
|
60
|
+
if (value.length <= 8)
|
|
61
|
+
return value.slice(0, 2) + "****";
|
|
62
|
+
return value.slice(0, 4) + "****" + value.slice(-2);
|
|
63
|
+
}
|
|
64
|
+
export const localCommand = new Command("local").description("Local encrypted vault — store secrets offline, optionally sync to cloud");
|
|
65
|
+
// ── init ─────────────────────────────────────────────────
|
|
66
|
+
localCommand
|
|
67
|
+
.command("init")
|
|
68
|
+
.description("Create a new local encrypted vault")
|
|
69
|
+
.option("--force", "Overwrite existing vault")
|
|
70
|
+
.action(async (opts) => {
|
|
71
|
+
try {
|
|
72
|
+
if (vaultExists() && !opts.force) {
|
|
73
|
+
printWarning("Local vault already exists. Use --force to reinitialize (destroys existing secrets).");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
console.log();
|
|
77
|
+
printInfo("Creating a new local vault.");
|
|
78
|
+
printInfo("Choose a strong passphrase — it encrypts your secrets at rest.");
|
|
79
|
+
console.log();
|
|
80
|
+
const passphrase = await promptPassphrase(true);
|
|
81
|
+
createVault(passphrase);
|
|
82
|
+
const fp = fingerprintPassphrase(passphrase);
|
|
83
|
+
printSuccess(`Local vault created at ${chalk.dim(getVaultPath())}`);
|
|
84
|
+
printInfo(`Passphrase fingerprint: ${chalk.cyan(fp)}`);
|
|
85
|
+
printInfo("Store your passphrase safely — it cannot be recovered.");
|
|
86
|
+
console.log();
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (err instanceof Error)
|
|
90
|
+
printError(err.message);
|
|
91
|
+
else
|
|
92
|
+
printError(String(err));
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// ── add ──────────────────────────────────────────────────
|
|
97
|
+
localCommand
|
|
98
|
+
.command("add <name>")
|
|
99
|
+
.description("Add or update a secret in the local vault")
|
|
100
|
+
.option("-t, --type <type>", "Secret type", "api_key")
|
|
101
|
+
.action(async (name, opts) => {
|
|
102
|
+
try {
|
|
103
|
+
if (!vaultExists()) {
|
|
104
|
+
printError("No local vault. Run `1claw local init` first.");
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
const { vault, passphrase } = await promptUnlock();
|
|
108
|
+
const { value } = await inquirer.prompt([
|
|
109
|
+
{
|
|
110
|
+
type: "password",
|
|
111
|
+
name: "value",
|
|
112
|
+
message: `Value for ${chalk.bold(name)}:`,
|
|
113
|
+
mask: "*",
|
|
114
|
+
validate: (v) => (v.length > 0 ? true : "Value cannot be empty"),
|
|
115
|
+
},
|
|
116
|
+
]);
|
|
117
|
+
const existed = !!vault.secrets[name];
|
|
118
|
+
addSecret(vault, name, value, opts.type);
|
|
119
|
+
saveVault(vault, passphrase);
|
|
120
|
+
printSuccess(existed
|
|
121
|
+
? `Updated ${chalk.bold(name)} in local vault.`
|
|
122
|
+
: `Added ${chalk.bold(name)} to local vault.`);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
handleError(err);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
// ── list ─────────────────────────────────────────────────
|
|
129
|
+
localCommand
|
|
130
|
+
.command("list")
|
|
131
|
+
.alias("ls")
|
|
132
|
+
.description("List secrets in the local vault (names only)")
|
|
133
|
+
.action(async () => {
|
|
134
|
+
try {
|
|
135
|
+
if (!vaultExists()) {
|
|
136
|
+
printError("No local vault. Run `1claw local init` first.");
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
const { vault } = await promptUnlock();
|
|
140
|
+
const secrets = listSecrets(vault);
|
|
141
|
+
if (secrets.length === 0) {
|
|
142
|
+
printInfo("Local vault is empty. Add secrets with `1claw local add <name>`.");
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
printTable(secrets.map((s) => ({
|
|
146
|
+
name: s.name,
|
|
147
|
+
type: s.type,
|
|
148
|
+
synced: s.synced ? chalk.green("yes") : chalk.dim("no"),
|
|
149
|
+
updated: s.updated_at.slice(0, 19).replace("T", " "),
|
|
150
|
+
})), [
|
|
151
|
+
{ key: "name", header: "Name" },
|
|
152
|
+
{ key: "type", header: "Type" },
|
|
153
|
+
{ key: "synced", header: "Synced" },
|
|
154
|
+
{ key: "updated", header: "Updated" },
|
|
155
|
+
]);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
handleError(err);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
// ── get ──────────────────────────────────────────────────
|
|
162
|
+
localCommand
|
|
163
|
+
.command("get <name>")
|
|
164
|
+
.description("Retrieve a secret value from the local vault")
|
|
165
|
+
.option("--masked", "Show masked value instead of raw")
|
|
166
|
+
.action(async (name, opts) => {
|
|
167
|
+
try {
|
|
168
|
+
if (!vaultExists()) {
|
|
169
|
+
printError("No local vault. Run `1claw local init` first.");
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
const { vault } = await promptUnlock();
|
|
173
|
+
const secret = getSecret(vault, name);
|
|
174
|
+
if (!secret) {
|
|
175
|
+
printError(`Secret "${name}" not found in local vault.`);
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
if (opts.masked) {
|
|
179
|
+
console.log(maskValue(secret.value));
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
process.stdout.write(secret.value);
|
|
183
|
+
if (process.stdout.isTTY)
|
|
184
|
+
process.stdout.write("\n");
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
handleError(err);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
// ── rm ───────────────────────────────────────────────────
|
|
192
|
+
localCommand
|
|
193
|
+
.command("rm <name>")
|
|
194
|
+
.alias("remove")
|
|
195
|
+
.description("Remove a secret from the local vault")
|
|
196
|
+
.action(async (name) => {
|
|
197
|
+
try {
|
|
198
|
+
if (!vaultExists()) {
|
|
199
|
+
printError("No local vault. Run `1claw local init` first.");
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
const { vault, passphrase } = await promptUnlock();
|
|
203
|
+
const removed = removeSecret(vault, name);
|
|
204
|
+
if (!removed) {
|
|
205
|
+
printWarning(`Secret "${name}" not found.`);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
saveVault(vault, passphrase);
|
|
209
|
+
printSuccess(`Removed ${chalk.bold(name)} from local vault.`);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
handleError(err);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
// ── import ───────────────────────────────────────────────
|
|
216
|
+
localCommand
|
|
217
|
+
.command("import <file>")
|
|
218
|
+
.description("Import secrets from a .env file into the local vault")
|
|
219
|
+
.option("-t, --type <type>", "Secret type for imported entries", "api_key")
|
|
220
|
+
.option("--force", "Overwrite existing secrets")
|
|
221
|
+
.option("--dry-run", "Show what would be imported without writing")
|
|
222
|
+
.action(async (file, opts) => {
|
|
223
|
+
try {
|
|
224
|
+
let content;
|
|
225
|
+
try {
|
|
226
|
+
content = readFileSync(file, "utf-8");
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
printError(`Cannot read file: ${file}`);
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
const entries = parseEnvFile(content);
|
|
233
|
+
if (entries.length === 0) {
|
|
234
|
+
printWarning(`No valid environment variables found in ${file}`);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
printInfo(`Found ${chalk.bold(String(entries.length))} variable${entries.length > 1 ? "s" : ""} in ${chalk.bold(file)}`);
|
|
238
|
+
printTable(entries.map((e) => ({
|
|
239
|
+
key: e.key,
|
|
240
|
+
preview: maskValue(e.value),
|
|
241
|
+
})), [
|
|
242
|
+
{ key: "key", header: "Variable" },
|
|
243
|
+
{ key: "preview", header: "Value Preview" },
|
|
244
|
+
]);
|
|
245
|
+
console.log();
|
|
246
|
+
if (opts.dryRun) {
|
|
247
|
+
printInfo("Dry run — no secrets were written.");
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if (!vaultExists()) {
|
|
251
|
+
printInfo("No local vault found — creating one now.");
|
|
252
|
+
const passphrase = await promptPassphrase(true);
|
|
253
|
+
createVault(passphrase);
|
|
254
|
+
const vault = loadVault(passphrase);
|
|
255
|
+
let imported = 0;
|
|
256
|
+
let skipped = 0;
|
|
257
|
+
for (const e of entries) {
|
|
258
|
+
if (vault.secrets[e.key] && !opts.force) {
|
|
259
|
+
skipped++;
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
addSecret(vault, e.key, e.value, opts.type);
|
|
263
|
+
imported++;
|
|
264
|
+
}
|
|
265
|
+
saveVault(vault, passphrase);
|
|
266
|
+
printSuccess(`Imported ${imported} secret${imported > 1 ? "s" : ""} to local vault.`);
|
|
267
|
+
if (skipped > 0) {
|
|
268
|
+
printWarning(`Skipped ${skipped} existing (use --force to overwrite).`);
|
|
269
|
+
}
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const { vault, passphrase } = await promptUnlock();
|
|
273
|
+
let imported = 0;
|
|
274
|
+
let skipped = 0;
|
|
275
|
+
for (const e of entries) {
|
|
276
|
+
if (vault.secrets[e.key] && !opts.force) {
|
|
277
|
+
skipped++;
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
addSecret(vault, e.key, e.value, opts.type);
|
|
281
|
+
imported++;
|
|
282
|
+
}
|
|
283
|
+
saveVault(vault, passphrase);
|
|
284
|
+
printSuccess(`Imported ${imported} secret${imported > 1 ? "s" : ""} to local vault.`);
|
|
285
|
+
if (skipped > 0) {
|
|
286
|
+
printWarning(`Skipped ${skipped} existing (use --force to overwrite).`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
handleError(err);
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
// ── export ───────────────────────────────────────────────
|
|
294
|
+
localCommand
|
|
295
|
+
.command("export")
|
|
296
|
+
.description("Export local vault secrets as .env format")
|
|
297
|
+
.option("-o, --output <file>", "Write to file instead of stdout")
|
|
298
|
+
.action(async (opts) => {
|
|
299
|
+
try {
|
|
300
|
+
if (!vaultExists()) {
|
|
301
|
+
printError("No local vault. Run `1claw local init` first.");
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
const { vault } = await promptUnlock();
|
|
305
|
+
const output = exportAsEnv(vault);
|
|
306
|
+
if (opts.output) {
|
|
307
|
+
const { writeFileSync: wfs } = await import("node:fs");
|
|
308
|
+
wfs(opts.output, output);
|
|
309
|
+
printSuccess(`Exported ${Object.keys(vault.secrets).length} secrets to ${opts.output}`);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
process.stdout.write(output);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
catch (err) {
|
|
316
|
+
handleError(err);
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
// ── sync ─────────────────────────────────────────────────
|
|
320
|
+
localCommand
|
|
321
|
+
.command("sync")
|
|
322
|
+
.description("Sync local secrets to/from a cloud vault")
|
|
323
|
+
.option("-v, --vault <id>", "Cloud vault ID")
|
|
324
|
+
.option("--pull", "Pull cloud secrets into local vault (default: push)")
|
|
325
|
+
.option("--force", "Overwrite on conflict instead of skipping")
|
|
326
|
+
.action(async (opts) => {
|
|
327
|
+
try {
|
|
328
|
+
requireToken();
|
|
329
|
+
if (!vaultExists()) {
|
|
330
|
+
printError("No local vault. Run `1claw local init` first.");
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
const { vault, passphrase } = await promptUnlock();
|
|
334
|
+
const vaultId = resolveVaultId(opts);
|
|
335
|
+
if (opts.pull) {
|
|
336
|
+
await syncPull(vault, passphrase, vaultId, !!opts.force);
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
await syncPush(vault, passphrase, vaultId, !!opts.force);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
handleError(err);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
async function syncPush(vault, passphrase, cloudVaultId, force) {
|
|
347
|
+
const secrets = Object.entries(vault.secrets);
|
|
348
|
+
if (secrets.length === 0) {
|
|
349
|
+
printInfo("Local vault is empty — nothing to push.");
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
const toPush = force
|
|
353
|
+
? secrets
|
|
354
|
+
: secrets.filter(([, s]) => !s.synced_to_cloud);
|
|
355
|
+
if (toPush.length === 0) {
|
|
356
|
+
printInfo("All local secrets are already synced.");
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
const spinner = ora(`Pushing ${toPush.length} secret(s) to cloud...`).start();
|
|
360
|
+
let pushed = 0;
|
|
361
|
+
let failed = 0;
|
|
362
|
+
for (const [name, secret] of toPush) {
|
|
363
|
+
try {
|
|
364
|
+
await api(`/vaults/${cloudVaultId}/secrets/${encodeURIComponent(name)}`, {
|
|
365
|
+
method: "PUT",
|
|
366
|
+
body: { value: secret.value, secret_type: secret.type },
|
|
367
|
+
});
|
|
368
|
+
markSynced(vault, name, cloudVaultId, name);
|
|
369
|
+
pushed++;
|
|
370
|
+
}
|
|
371
|
+
catch (err) {
|
|
372
|
+
failed++;
|
|
373
|
+
spinner.stop();
|
|
374
|
+
printError(`Failed to push ${name}: ${err.message}`);
|
|
375
|
+
spinner.start();
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
saveVault(vault, passphrase);
|
|
379
|
+
spinner.stop();
|
|
380
|
+
if (pushed > 0) {
|
|
381
|
+
printSuccess(`Pushed ${pushed} secret(s) to vault ${chalk.dim(cloudVaultId)}`);
|
|
382
|
+
}
|
|
383
|
+
if (failed > 0) {
|
|
384
|
+
printWarning(`${failed} secret(s) failed to push.`);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
async function syncPull(vault, passphrase, cloudVaultId, force) {
|
|
388
|
+
const spinner = ora("Fetching secrets from cloud...").start();
|
|
389
|
+
const cloudSecrets = await api(`/vaults/${cloudVaultId}/secrets`);
|
|
390
|
+
let pulled = 0;
|
|
391
|
+
let skipped = 0;
|
|
392
|
+
for (const cs of cloudSecrets) {
|
|
393
|
+
if (vault.secrets[cs.path] && !force) {
|
|
394
|
+
skipped++;
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
const detail = await api(`/vaults/${cloudVaultId}/secrets/${encodeURIComponent(cs.path)}`);
|
|
398
|
+
addSecret(vault, cs.path, detail.value, cs.secret_type);
|
|
399
|
+
markSynced(vault, cs.path, cloudVaultId, cs.path);
|
|
400
|
+
pulled++;
|
|
401
|
+
}
|
|
402
|
+
saveVault(vault, passphrase);
|
|
403
|
+
spinner.stop();
|
|
404
|
+
if (pulled > 0) {
|
|
405
|
+
printSuccess(`Pulled ${pulled} secret(s) from cloud.`);
|
|
406
|
+
}
|
|
407
|
+
if (skipped > 0) {
|
|
408
|
+
printInfo(`Skipped ${skipped} existing local secret(s) (use --force to overwrite).`);
|
|
409
|
+
}
|
|
410
|
+
if (pulled === 0 && skipped === 0) {
|
|
411
|
+
printInfo("Cloud vault is empty.");
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// ── status ───────────────────────────────────────────────
|
|
415
|
+
localCommand
|
|
416
|
+
.command("status")
|
|
417
|
+
.description("Show local vault status")
|
|
418
|
+
.action(async () => {
|
|
419
|
+
try {
|
|
420
|
+
const info = getVaultInfo();
|
|
421
|
+
if (!info.exists) {
|
|
422
|
+
printInfo("No local vault. Run `1claw local init` to create one.");
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
const { vault } = await promptUnlock();
|
|
426
|
+
const secrets = listSecrets(vault);
|
|
427
|
+
const synced = secrets.filter((s) => s.synced).length;
|
|
428
|
+
printKeyValue([
|
|
429
|
+
["Vault file", info.path],
|
|
430
|
+
["File size", info.sizeBytes ? `${info.sizeBytes} bytes` : "unknown"],
|
|
431
|
+
["Created", vault.created_at.slice(0, 19).replace("T", " ")],
|
|
432
|
+
["Updated", vault.updated_at.slice(0, 19).replace("T", " ")],
|
|
433
|
+
["Secrets", String(secrets.length)],
|
|
434
|
+
[
|
|
435
|
+
"Synced to cloud",
|
|
436
|
+
synced > 0
|
|
437
|
+
? chalk.green(`${synced}/${secrets.length}`)
|
|
438
|
+
: chalk.dim("0"),
|
|
439
|
+
],
|
|
440
|
+
]);
|
|
441
|
+
}
|
|
442
|
+
catch (err) {
|
|
443
|
+
handleError(err);
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
// ── destroy ──────────────────────────────────────────────
|
|
447
|
+
localCommand
|
|
448
|
+
.command("destroy")
|
|
449
|
+
.description("Permanently delete the local vault")
|
|
450
|
+
.action(async () => {
|
|
451
|
+
try {
|
|
452
|
+
if (!vaultExists()) {
|
|
453
|
+
printInfo("No local vault to destroy.");
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
const { confirm } = await inquirer.prompt([
|
|
457
|
+
{
|
|
458
|
+
type: "confirm",
|
|
459
|
+
name: "confirm",
|
|
460
|
+
message: chalk.red("This will permanently delete your local vault and all secrets. Continue?"),
|
|
461
|
+
default: false,
|
|
462
|
+
},
|
|
463
|
+
]);
|
|
464
|
+
if (!confirm) {
|
|
465
|
+
printInfo("Cancelled.");
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
deleteVault();
|
|
469
|
+
printSuccess("Local vault destroyed.");
|
|
470
|
+
}
|
|
471
|
+
catch (err) {
|
|
472
|
+
if (err instanceof Error)
|
|
473
|
+
printError(err.message);
|
|
474
|
+
else
|
|
475
|
+
printError(String(err));
|
|
476
|
+
process.exit(1);
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
function parseEnvFile(content) {
|
|
480
|
+
const entries = [];
|
|
481
|
+
const lines = content.split("\n");
|
|
482
|
+
for (const rawLine of lines) {
|
|
483
|
+
const raw = rawLine.trim();
|
|
484
|
+
if (!raw || raw.startsWith("#"))
|
|
485
|
+
continue;
|
|
486
|
+
let line = raw;
|
|
487
|
+
if (line.startsWith("export ")) {
|
|
488
|
+
line = line.slice(7).trim();
|
|
489
|
+
}
|
|
490
|
+
const eqIdx = line.indexOf("=");
|
|
491
|
+
if (eqIdx <= 0)
|
|
492
|
+
continue;
|
|
493
|
+
const key = line.slice(0, eqIdx).trim();
|
|
494
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
|
|
495
|
+
continue;
|
|
496
|
+
let value = line.slice(eqIdx + 1).trim();
|
|
497
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
498
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
499
|
+
value = value.slice(1, -1);
|
|
500
|
+
}
|
|
501
|
+
entries.push({ key, value });
|
|
502
|
+
}
|
|
503
|
+
return entries;
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/commands/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,eAAO,MAAM,YAAY,SAqBnB,CAAC"}
|
|
@@ -14,6 +14,7 @@ export const setupCommand = new Command("setup")
|
|
|
14
14
|
.option("--client <name>", "Configure only a specific client (e.g. cursor, claude-desktop)")
|
|
15
15
|
.option("--agent-key <key>", "Use a specific agent API key instead of prompting")
|
|
16
16
|
.option("--skip-auth", "Skip authentication check (use existing credentials)")
|
|
17
|
+
.option("--local", "Configure MCP to use the local daemon instead of cloud API")
|
|
17
18
|
.action(async (opts) => {
|
|
18
19
|
try {
|
|
19
20
|
await runSetup(opts);
|
|
@@ -31,8 +32,15 @@ export const setupCommand = new Command("setup")
|
|
|
31
32
|
async function runSetup(opts) {
|
|
32
33
|
console.log();
|
|
33
34
|
console.log(chalk.bold(" 1Claw Setup"));
|
|
34
|
-
console.log(chalk.dim(
|
|
35
|
+
console.log(chalk.dim(opts.local
|
|
36
|
+
? " Configure AI clients for local daemon mode (offline, secrets never leave machine)"
|
|
37
|
+
: " Auto-configure your AI clients for secret management"));
|
|
35
38
|
console.log();
|
|
39
|
+
// Local daemon mode — no auth needed, just configure MCP to point at daemon socket
|
|
40
|
+
if (opts.local) {
|
|
41
|
+
await runLocalSetup(opts);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
36
44
|
// Step 1: Ensure authentication
|
|
37
45
|
let agentApiKey = opts.agentKey || "";
|
|
38
46
|
if (!agentApiKey && !opts.skipAuth) {
|
|
@@ -214,4 +222,83 @@ async function resolveAgentKey() {
|
|
|
214
222
|
throw err;
|
|
215
223
|
}
|
|
216
224
|
}
|
|
225
|
+
async function runLocalSetup(opts) {
|
|
226
|
+
const { vaultExists } = await import("../local-vault.js");
|
|
227
|
+
const { homedir } = await import("node:os");
|
|
228
|
+
const { join } = await import("node:path");
|
|
229
|
+
if (!vaultExists()) {
|
|
230
|
+
printWarning("No local vault found.");
|
|
231
|
+
printInfo("Run `1claw local init` to create one, then try `1claw setup --local` again.");
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const configDir = process.env.ONECLAW_CONFIG_DIR || join(homedir(), ".config", "1claw");
|
|
235
|
+
const socketPath = process.env.ONECLAW_DAEMON_SOCKET || join(configDir, "daemon.sock");
|
|
236
|
+
// Detect AI clients
|
|
237
|
+
const spinner = ora("Detecting installed AI clients...").start();
|
|
238
|
+
const allClients = detectAiClients();
|
|
239
|
+
spinner.stop();
|
|
240
|
+
let candidates;
|
|
241
|
+
if (opts.client) {
|
|
242
|
+
const match = allClients.find((c) => c.slug === opts.client || c.name.toLowerCase() === opts.client.toLowerCase());
|
|
243
|
+
if (!match) {
|
|
244
|
+
printError(`Unknown client: ${opts.client}. Available: ${allClients.map((c) => c.slug).join(", ")}`);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
candidates = [match];
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
const detected = allClients.filter((c) => c.detected);
|
|
251
|
+
if (detected.length === 0) {
|
|
252
|
+
printWarning("No AI clients detected.");
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
console.log(chalk.bold(" Detected AI clients:"));
|
|
256
|
+
for (const c of detected) {
|
|
257
|
+
console.log(` ${chalk.green("●")} ${c.name}`);
|
|
258
|
+
}
|
|
259
|
+
console.log();
|
|
260
|
+
const { selected } = await inquirer.prompt([
|
|
261
|
+
{
|
|
262
|
+
type: "checkbox",
|
|
263
|
+
name: "selected",
|
|
264
|
+
message: "Which clients to configure for local daemon mode?",
|
|
265
|
+
choices: detected.map((c) => ({
|
|
266
|
+
name: c.name,
|
|
267
|
+
value: c.slug,
|
|
268
|
+
checked: true,
|
|
269
|
+
})),
|
|
270
|
+
},
|
|
271
|
+
]);
|
|
272
|
+
candidates = detected.filter((c) => selected.includes(c.slug));
|
|
273
|
+
}
|
|
274
|
+
if (candidates.length === 0) {
|
|
275
|
+
printInfo("No clients selected.");
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const envVars = {
|
|
279
|
+
ONECLAW_DAEMON_SOCKET: socketPath,
|
|
280
|
+
ONECLAW_LOCAL_VAULT: "true",
|
|
281
|
+
};
|
|
282
|
+
const entry = buildMcpEntry(envVars);
|
|
283
|
+
console.log();
|
|
284
|
+
let successCount = 0;
|
|
285
|
+
for (const client of candidates) {
|
|
286
|
+
const result = configureClient(client, entry);
|
|
287
|
+
if (result.success) {
|
|
288
|
+
printSuccess(result.message);
|
|
289
|
+
successCount++;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
printError(result.message);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
console.log();
|
|
296
|
+
if (successCount > 0) {
|
|
297
|
+
printSuccess(`Configured ${successCount} client${successCount > 1 ? "s" : ""} for local daemon mode.`);
|
|
298
|
+
console.log();
|
|
299
|
+
printInfo("Start the daemon: `1claw daemon start`");
|
|
300
|
+
printInfo("Then restart your AI client to activate local MCP.");
|
|
301
|
+
}
|
|
302
|
+
console.log();
|
|
303
|
+
}
|
|
217
304
|
//# sourceMappingURL=setup.js.map
|