@1claw/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/LICENSE +133 -0
- package/README.md +215 -0
- package/dist/bin/1claw.d.ts +3 -0
- package/dist/bin/1claw.d.ts.map +1 -0
- package/dist/bin/1claw.js +8 -0
- package/dist/bin/1claw.js.map +1 -0
- package/dist/src/auth.d.ts +6 -0
- package/dist/src/auth.d.ts.map +1 -0
- package/dist/src/auth.js +151 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/client.d.ts +18 -0
- package/dist/src/client.d.ts.map +1 -0
- package/dist/src/client.js +58 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/commands/agent.d.ts +3 -0
- package/dist/src/commands/agent.d.ts.map +1 -0
- package/dist/src/commands/agent.js +233 -0
- package/dist/src/commands/agent.js.map +1 -0
- package/dist/src/commands/audit.d.ts +3 -0
- package/dist/src/commands/audit.d.ts.map +1 -0
- package/dist/src/commands/audit.js +57 -0
- package/dist/src/commands/audit.js.map +1 -0
- package/dist/src/commands/billing.d.ts +3 -0
- package/dist/src/commands/billing.d.ts.map +1 -0
- package/dist/src/commands/billing.js +160 -0
- package/dist/src/commands/billing.js.map +1 -0
- package/dist/src/commands/config.d.ts +3 -0
- package/dist/src/commands/config.d.ts.map +1 -0
- package/dist/src/commands/config.js +65 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/env.d.ts +3 -0
- package/dist/src/commands/env.d.ts.map +1 -0
- package/dist/src/commands/env.js +164 -0
- package/dist/src/commands/env.js.map +1 -0
- package/dist/src/commands/login.d.ts +5 -0
- package/dist/src/commands/login.d.ts.map +1 -0
- package/dist/src/commands/login.js +88 -0
- package/dist/src/commands/login.js.map +1 -0
- package/dist/src/commands/mfa.d.ts +3 -0
- package/dist/src/commands/mfa.d.ts.map +1 -0
- package/dist/src/commands/mfa.js +123 -0
- package/dist/src/commands/mfa.js.map +1 -0
- package/dist/src/commands/policy.d.ts +3 -0
- package/dist/src/commands/policy.d.ts.map +1 -0
- package/dist/src/commands/policy.js +114 -0
- package/dist/src/commands/policy.js.map +1 -0
- package/dist/src/commands/secret.d.ts +3 -0
- package/dist/src/commands/secret.d.ts.map +1 -0
- package/dist/src/commands/secret.js +206 -0
- package/dist/src/commands/secret.js.map +1 -0
- package/dist/src/commands/share.d.ts +3 -0
- package/dist/src/commands/share.d.ts.map +1 -0
- package/dist/src/commands/share.js +145 -0
- package/dist/src/commands/share.js.map +1 -0
- package/dist/src/commands/vault.d.ts +3 -0
- package/dist/src/commands/vault.d.ts.map +1 -0
- package/dist/src/commands/vault.js +127 -0
- package/dist/src/commands/vault.js.map +1 -0
- package/dist/src/config.d.ts +25 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +68 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +51 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/middleware.d.ts +6 -0
- package/dist/src/middleware.d.ts.map +1 -0
- package/dist/src/middleware.js +35 -0
- package/dist/src/middleware.js.map +1 -0
- package/dist/src/output.d.ts +12 -0
- package/dist/src/output.d.ts.map +1 -0
- package/dist/src/output.js +71 -0
- package/dist/src/output.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import ora from "ora";
|
|
6
|
+
import { api } from "../client.js";
|
|
7
|
+
import { requireToken, resolveVaultId, handleError } from "../middleware.js";
|
|
8
|
+
import { printSuccess } from "../output.js";
|
|
9
|
+
export const envCommand = new Command("env").description("Environment variable management for CI/CD");
|
|
10
|
+
envCommand
|
|
11
|
+
.command("pull")
|
|
12
|
+
.description("Pull secrets from a vault as environment variables")
|
|
13
|
+
.option("-v, --vault <id>", "Vault ID")
|
|
14
|
+
.option("--prefix <prefix>", "Only pull secrets under this path prefix")
|
|
15
|
+
.option("-f, --format <format>", "Output format: dotenv, json, shell", "dotenv")
|
|
16
|
+
.option("-o, --output <file>", "Write to file instead of stdout")
|
|
17
|
+
.action(async (opts) => {
|
|
18
|
+
try {
|
|
19
|
+
requireToken();
|
|
20
|
+
const vaultId = resolveVaultId(opts);
|
|
21
|
+
const spinner = ora("Fetching secrets…").start();
|
|
22
|
+
const query = {};
|
|
23
|
+
if (opts.prefix)
|
|
24
|
+
query.prefix = opts.prefix;
|
|
25
|
+
const secrets = await api(`/vaults/${vaultId}/secrets`, { query });
|
|
26
|
+
const envSecrets = secrets.filter((s) => s.secret_type === "env_bundle" ||
|
|
27
|
+
s.secret_type === "api_key" ||
|
|
28
|
+
s.secret_type === "password");
|
|
29
|
+
const values = {};
|
|
30
|
+
for (const s of envSecrets) {
|
|
31
|
+
const detail = await api(`/vaults/${vaultId}/secrets/${encodeURIComponent(s.path)}`);
|
|
32
|
+
if (s.secret_type === "env_bundle") {
|
|
33
|
+
for (const line of detail.value.split("\n")) {
|
|
34
|
+
const trimmed = line.trim();
|
|
35
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
36
|
+
continue;
|
|
37
|
+
const eqIdx = trimmed.indexOf("=");
|
|
38
|
+
if (eqIdx > 0) {
|
|
39
|
+
values[trimmed.slice(0, eqIdx).trim()] = trimmed
|
|
40
|
+
.slice(eqIdx + 1)
|
|
41
|
+
.trim()
|
|
42
|
+
.replace(/^["']|["']$/g, "");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const envKey = s.path.replace(/[/-]/g, "_").toUpperCase();
|
|
48
|
+
values[envKey] = detail.value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
spinner.stop();
|
|
52
|
+
let output;
|
|
53
|
+
switch (opts.format) {
|
|
54
|
+
case "json":
|
|
55
|
+
output = JSON.stringify(values, null, 2) + "\n";
|
|
56
|
+
break;
|
|
57
|
+
case "shell":
|
|
58
|
+
output =
|
|
59
|
+
Object.entries(values)
|
|
60
|
+
.map(([k, v]) => `export ${k}=${shellEscape(v)}`)
|
|
61
|
+
.join("\n") + "\n";
|
|
62
|
+
break;
|
|
63
|
+
case "dotenv":
|
|
64
|
+
default:
|
|
65
|
+
output =
|
|
66
|
+
Object.entries(values)
|
|
67
|
+
.map(([k, v]) => `${k}=${v.includes(" ") ? `"${v}"` : v}`)
|
|
68
|
+
.join("\n") + "\n";
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
if (opts.output) {
|
|
72
|
+
await writeFile(opts.output, output);
|
|
73
|
+
printSuccess(`Wrote ${Object.keys(values).length} variables to ${opts.output}`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
process.stdout.write(output);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
handleError(err);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
envCommand
|
|
84
|
+
.command("push <file>")
|
|
85
|
+
.description("Push a .env file to vault as an env_bundle secret")
|
|
86
|
+
.option("-v, --vault <id>", "Vault ID")
|
|
87
|
+
.option("-p, --path <path>", "Secret path in vault", "config/env")
|
|
88
|
+
.action(async (file, opts) => {
|
|
89
|
+
try {
|
|
90
|
+
requireToken();
|
|
91
|
+
const vaultId = resolveVaultId(opts);
|
|
92
|
+
const content = await readFile(file, "utf-8");
|
|
93
|
+
const lineCount = content
|
|
94
|
+
.split("\n")
|
|
95
|
+
.filter((l) => l.trim() && !l.trim().startsWith("#")).length;
|
|
96
|
+
await api(`/vaults/${vaultId}/secrets/${encodeURIComponent(opts.path)}`, {
|
|
97
|
+
method: "PUT",
|
|
98
|
+
body: { value: content, secret_type: "env_bundle" },
|
|
99
|
+
});
|
|
100
|
+
printSuccess(`Pushed ${lineCount} variables from ${chalk.bold(file)} to ${chalk.bold(opts.path)}`);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
handleError(err);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
envCommand
|
|
107
|
+
.command("run <command...>")
|
|
108
|
+
.description("Run a command with vault secrets injected as environment variables")
|
|
109
|
+
.option("-v, --vault <id>", "Vault ID")
|
|
110
|
+
.option("--prefix <prefix>", "Only inject secrets under this path prefix")
|
|
111
|
+
.action(async (commandParts, opts) => {
|
|
112
|
+
try {
|
|
113
|
+
requireToken();
|
|
114
|
+
const vaultId = resolveVaultId(opts);
|
|
115
|
+
const spinner = ora("Loading secrets…").start();
|
|
116
|
+
const query = {};
|
|
117
|
+
if (opts.prefix)
|
|
118
|
+
query.prefix = opts.prefix;
|
|
119
|
+
const secrets = await api(`/vaults/${vaultId}/secrets`, { query });
|
|
120
|
+
const envVars = {};
|
|
121
|
+
for (const s of secrets) {
|
|
122
|
+
if (!["env_bundle", "api_key", "password"].includes(s.secret_type))
|
|
123
|
+
continue;
|
|
124
|
+
const detail = await api(`/vaults/${vaultId}/secrets/${encodeURIComponent(s.path)}`);
|
|
125
|
+
if (s.secret_type === "env_bundle") {
|
|
126
|
+
for (const line of detail.value.split("\n")) {
|
|
127
|
+
const trimmed = line.trim();
|
|
128
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
129
|
+
continue;
|
|
130
|
+
const eqIdx = trimmed.indexOf("=");
|
|
131
|
+
if (eqIdx > 0) {
|
|
132
|
+
envVars[trimmed.slice(0, eqIdx).trim()] = trimmed
|
|
133
|
+
.slice(eqIdx + 1)
|
|
134
|
+
.trim()
|
|
135
|
+
.replace(/^["']|["']$/g, "");
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
envVars[s.path.replace(/[/-]/g, "_").toUpperCase()] =
|
|
141
|
+
detail.value;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
spinner.succeed(`Loaded ${Object.keys(envVars).length} secrets. Running command…`);
|
|
145
|
+
const [cmd, ...args] = commandParts;
|
|
146
|
+
const child = spawn(cmd, args, {
|
|
147
|
+
stdio: "inherit",
|
|
148
|
+
env: { ...process.env, ...envVars },
|
|
149
|
+
shell: true,
|
|
150
|
+
});
|
|
151
|
+
child.on("exit", (code) => {
|
|
152
|
+
process.exit(code ?? 1);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
handleError(err);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
function shellEscape(s) {
|
|
160
|
+
if (/^[a-zA-Z0-9._\-/:=@]+$/.test(s))
|
|
161
|
+
return s;
|
|
162
|
+
return `'${s.replace(/'/g, "'\\''")}'`;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/commands/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,eAAO,MAAM,YAAY,SAwDnB,CAAC;AAEP,eAAO,MAAM,aAAa,SAKpB,CAAC;AAEP,eAAO,MAAM,aAAa,SA2BpB,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import inquirer from "inquirer";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { loginWithDevice, loginWithCredentials, completeMfaLogin, } from "../auth.js";
|
|
5
|
+
import { getAuth, clearAuth, getConfigPath, setApiUrl } from "../config.js";
|
|
6
|
+
import { printSuccess, printError, printKeyValue, printInfo, } from "../output.js";
|
|
7
|
+
import { handleError } from "../middleware.js";
|
|
8
|
+
export const loginCommand = new Command("login")
|
|
9
|
+
.description("Authenticate with 1Claw")
|
|
10
|
+
.option("--email", "Use email/password instead of browser login")
|
|
11
|
+
.option("--api-url <url>", "Override the API URL")
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
try {
|
|
14
|
+
if (opts.apiUrl) {
|
|
15
|
+
setApiUrl(opts.apiUrl);
|
|
16
|
+
printInfo(`API URL set to ${opts.apiUrl}`);
|
|
17
|
+
}
|
|
18
|
+
if (opts.email) {
|
|
19
|
+
const answers = await inquirer.prompt([
|
|
20
|
+
{ type: "input", name: "email", message: "Email:" },
|
|
21
|
+
{
|
|
22
|
+
type: "password",
|
|
23
|
+
name: "password",
|
|
24
|
+
message: "Password:",
|
|
25
|
+
mask: "•",
|
|
26
|
+
},
|
|
27
|
+
]);
|
|
28
|
+
const result = await loginWithCredentials(answers.email, answers.password);
|
|
29
|
+
if (!result)
|
|
30
|
+
return;
|
|
31
|
+
if (result.mfaToken) {
|
|
32
|
+
const mfa = await inquirer.prompt([
|
|
33
|
+
{
|
|
34
|
+
type: "input",
|
|
35
|
+
name: "code",
|
|
36
|
+
message: "MFA code (from authenticator app):",
|
|
37
|
+
},
|
|
38
|
+
]);
|
|
39
|
+
const finalAuth = await completeMfaLogin(result.mfaToken, mfa.code);
|
|
40
|
+
if (!finalAuth)
|
|
41
|
+
return;
|
|
42
|
+
printSuccess(`Logged in as ${chalk.bold(finalAuth.email)}`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
printSuccess(`Logged in as ${chalk.bold(result.email)}`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const auth = await loginWithDevice();
|
|
49
|
+
if (auth) {
|
|
50
|
+
printSuccess(`Logged in as ${chalk.bold(auth.email)}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
handleError(err);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
export const logoutCommand = new Command("logout")
|
|
58
|
+
.description("Clear stored credentials")
|
|
59
|
+
.action(() => {
|
|
60
|
+
clearAuth();
|
|
61
|
+
printSuccess("Logged out. Credentials removed.");
|
|
62
|
+
});
|
|
63
|
+
export const whoamiCommand = new Command("whoami")
|
|
64
|
+
.description("Show current authenticated user")
|
|
65
|
+
.action(async () => {
|
|
66
|
+
try {
|
|
67
|
+
const auth = getAuth();
|
|
68
|
+
if (!auth) {
|
|
69
|
+
printError("Not authenticated. Run `1claw login` first.");
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
if (auth.email === "env") {
|
|
73
|
+
printInfo("Authenticated via ONECLAW_TOKEN environment variable.");
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
printKeyValue([
|
|
77
|
+
["Email", auth.email],
|
|
78
|
+
["User ID", auth.userId],
|
|
79
|
+
["Org ID", auth.orgId],
|
|
80
|
+
["Token expires", auth.expiresAt ?? "unknown"],
|
|
81
|
+
["Config", getConfigPath()],
|
|
82
|
+
]);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
handleError(err);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mfa.d.ts","sourceRoot":"","sources":["../../../src/commands/mfa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,UAAU,SAEtB,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import inquirer from "inquirer";
|
|
4
|
+
import { api } from "../client.js";
|
|
5
|
+
import { requireToken, handleError } from "../middleware.js";
|
|
6
|
+
import { printKeyValue, printSuccess, printInfo, } from "../output.js";
|
|
7
|
+
export const mfaCommand = new Command("mfa").description("Manage two-factor authentication");
|
|
8
|
+
mfaCommand
|
|
9
|
+
.command("status")
|
|
10
|
+
.description("Check MFA status")
|
|
11
|
+
.action(async () => {
|
|
12
|
+
try {
|
|
13
|
+
requireToken();
|
|
14
|
+
const status = await api("/auth/mfa/status");
|
|
15
|
+
printKeyValue([
|
|
16
|
+
[
|
|
17
|
+
"MFA",
|
|
18
|
+
status.enabled
|
|
19
|
+
? chalk.green("Enabled")
|
|
20
|
+
: chalk.yellow("Disabled"),
|
|
21
|
+
],
|
|
22
|
+
]);
|
|
23
|
+
if (!status.enabled) {
|
|
24
|
+
printInfo("Run `1claw mfa enable` to set up two-factor authentication.");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
handleError(err);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
mfaCommand
|
|
32
|
+
.command("enable")
|
|
33
|
+
.description("Enable TOTP two-factor authentication")
|
|
34
|
+
.action(async () => {
|
|
35
|
+
try {
|
|
36
|
+
requireToken();
|
|
37
|
+
const setup = await api("/auth/mfa/setup", { method: "POST" });
|
|
38
|
+
console.log();
|
|
39
|
+
console.log(chalk.bold(" Set up two-factor authentication"));
|
|
40
|
+
console.log();
|
|
41
|
+
console.log(" Add this account to your authenticator app:");
|
|
42
|
+
console.log();
|
|
43
|
+
console.log(` Secret key: ${chalk.cyan.bold(setup.secret)}`);
|
|
44
|
+
console.log();
|
|
45
|
+
console.log(chalk.dim(` URI: ${setup.otpauth_uri}`));
|
|
46
|
+
console.log();
|
|
47
|
+
const { code } = await inquirer.prompt([
|
|
48
|
+
{
|
|
49
|
+
type: "input",
|
|
50
|
+
name: "code",
|
|
51
|
+
message: "Enter the 6-digit code from your app to verify:",
|
|
52
|
+
validate: (v) => /^\d{6}$/.test(v) || "Enter a 6-digit code",
|
|
53
|
+
},
|
|
54
|
+
]);
|
|
55
|
+
const result = await api("/auth/mfa/verify-setup", { method: "POST", body: { code } });
|
|
56
|
+
printSuccess("Two-factor authentication enabled!");
|
|
57
|
+
console.log();
|
|
58
|
+
console.log(chalk.yellow.bold(" Save these recovery codes in a safe place:"));
|
|
59
|
+
console.log(chalk.yellow(" Each code can only be used once."));
|
|
60
|
+
console.log();
|
|
61
|
+
for (const rc of result.recovery_codes) {
|
|
62
|
+
console.log(` ${chalk.bold(rc)}`);
|
|
63
|
+
}
|
|
64
|
+
console.log();
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
handleError(err);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
mfaCommand
|
|
71
|
+
.command("disable")
|
|
72
|
+
.description("Disable two-factor authentication")
|
|
73
|
+
.action(async () => {
|
|
74
|
+
try {
|
|
75
|
+
requireToken();
|
|
76
|
+
const { method } = await inquirer.prompt([
|
|
77
|
+
{
|
|
78
|
+
type: "list",
|
|
79
|
+
name: "method",
|
|
80
|
+
message: "Confirm with:",
|
|
81
|
+
choices: [
|
|
82
|
+
{
|
|
83
|
+
name: "TOTP code from authenticator app",
|
|
84
|
+
value: "totp",
|
|
85
|
+
},
|
|
86
|
+
{ name: "Account password", value: "password" },
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
]);
|
|
90
|
+
const body = {};
|
|
91
|
+
if (method === "totp") {
|
|
92
|
+
const { code } = await inquirer.prompt([
|
|
93
|
+
{
|
|
94
|
+
type: "input",
|
|
95
|
+
name: "code",
|
|
96
|
+
message: "Enter your 6-digit TOTP code:",
|
|
97
|
+
validate: (v) => /^\d{6}$/.test(v) || "Enter a 6-digit code",
|
|
98
|
+
},
|
|
99
|
+
]);
|
|
100
|
+
body.code = code;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const { password } = await inquirer.prompt([
|
|
104
|
+
{
|
|
105
|
+
type: "password",
|
|
106
|
+
name: "password",
|
|
107
|
+
message: "Enter your account password:",
|
|
108
|
+
mask: "•",
|
|
109
|
+
},
|
|
110
|
+
]);
|
|
111
|
+
body.password = password;
|
|
112
|
+
}
|
|
113
|
+
await api("/auth/mfa", {
|
|
114
|
+
method: "DELETE",
|
|
115
|
+
body,
|
|
116
|
+
});
|
|
117
|
+
printSuccess("Two-factor authentication disabled.");
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
handleError(err);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=mfa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mfa.js","sourceRoot":"","sources":["../../../src/commands/mfa.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/commands/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,aAAa,SAEzB,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { api } from "../client.js";
|
|
4
|
+
import { requireToken, resolveVaultId, handleError } from "../middleware.js";
|
|
5
|
+
import { printTable, printKeyValue, printSuccess, printJson, } from "../output.js";
|
|
6
|
+
export const policyCommand = new Command("policy").description("Manage access policies");
|
|
7
|
+
policyCommand
|
|
8
|
+
.command("list")
|
|
9
|
+
.alias("ls")
|
|
10
|
+
.description("List policies for a vault")
|
|
11
|
+
.option("-v, --vault <id>", "Vault ID")
|
|
12
|
+
.option("--json", "Output as JSON")
|
|
13
|
+
.action(async (opts) => {
|
|
14
|
+
try {
|
|
15
|
+
requireToken();
|
|
16
|
+
const vaultId = resolveVaultId(opts);
|
|
17
|
+
const policies = await api(`/vaults/${vaultId}/policies`);
|
|
18
|
+
if (opts.json) {
|
|
19
|
+
printJson(policies);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
printTable(policies.map((p) => ({
|
|
23
|
+
...p,
|
|
24
|
+
permissions: p.permissions.join(", "),
|
|
25
|
+
principal: `${p.principal_type}:${p.principal_id.slice(0, 8)}…`,
|
|
26
|
+
expires: p.expires_at
|
|
27
|
+
? new Date(p.expires_at).toLocaleDateString()
|
|
28
|
+
: chalk.dim("never"),
|
|
29
|
+
})), [
|
|
30
|
+
{ key: "id", header: "ID", width: 36 },
|
|
31
|
+
{ key: "principal", header: "Principal", width: 20 },
|
|
32
|
+
{ key: "path_pattern", header: "Path pattern", width: 20 },
|
|
33
|
+
{ key: "permissions", header: "Permissions", width: 16 },
|
|
34
|
+
{ key: "expires", header: "Expires" },
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
handleError(err);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
policyCommand
|
|
42
|
+
.command("create")
|
|
43
|
+
.description("Create an access policy")
|
|
44
|
+
.option("-v, --vault <id>", "Vault ID")
|
|
45
|
+
.requiredOption("--principal-type <type>", "Principal type: agent or user")
|
|
46
|
+
.requiredOption("--principal-id <id>", "Principal UUID")
|
|
47
|
+
.requiredOption("--path <pattern>", "Path glob pattern (e.g. api-keys/*)")
|
|
48
|
+
.option("--permissions <perms>", "Comma-separated: read, write, delete", "read")
|
|
49
|
+
.option("--expires <date>", "Expiration date (ISO 8601)")
|
|
50
|
+
.action(async (opts) => {
|
|
51
|
+
try {
|
|
52
|
+
requireToken();
|
|
53
|
+
const vaultId = resolveVaultId(opts);
|
|
54
|
+
const body = {
|
|
55
|
+
principal_type: opts.principalType,
|
|
56
|
+
principal_id: opts.principalId,
|
|
57
|
+
path_pattern: opts.path,
|
|
58
|
+
permissions: opts.permissions
|
|
59
|
+
.split(",")
|
|
60
|
+
.map((s) => s.trim()),
|
|
61
|
+
};
|
|
62
|
+
if (opts.expires)
|
|
63
|
+
body.expires_at = opts.expires;
|
|
64
|
+
const policy = await api(`/vaults/${vaultId}/policies`, {
|
|
65
|
+
method: "POST",
|
|
66
|
+
body,
|
|
67
|
+
});
|
|
68
|
+
printSuccess(`Policy created: ${policy.id}`);
|
|
69
|
+
printKeyValue([
|
|
70
|
+
["ID", policy.id],
|
|
71
|
+
[
|
|
72
|
+
"Principal",
|
|
73
|
+
`${policy.principal_type}:${policy.principal_id}`,
|
|
74
|
+
],
|
|
75
|
+
["Path", policy.path_pattern],
|
|
76
|
+
["Permissions", policy.permissions.join(", ")],
|
|
77
|
+
]);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
handleError(err);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
policyCommand
|
|
84
|
+
.command("delete <id>")
|
|
85
|
+
.description("Delete a policy")
|
|
86
|
+
.option("-v, --vault <id>", "Vault ID")
|
|
87
|
+
.option("-y, --yes", "Skip confirmation")
|
|
88
|
+
.action(async (id, opts) => {
|
|
89
|
+
try {
|
|
90
|
+
requireToken();
|
|
91
|
+
const vaultId = resolveVaultId(opts);
|
|
92
|
+
if (!opts.yes) {
|
|
93
|
+
const inquirer = await import("inquirer");
|
|
94
|
+
const { confirm } = await inquirer.default.prompt([
|
|
95
|
+
{
|
|
96
|
+
type: "confirm",
|
|
97
|
+
name: "confirm",
|
|
98
|
+
message: `Delete policy ${id}?`,
|
|
99
|
+
default: false,
|
|
100
|
+
},
|
|
101
|
+
]);
|
|
102
|
+
if (!confirm)
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
await api(`/vaults/${vaultId}/policies/${id}`, {
|
|
106
|
+
method: "DELETE",
|
|
107
|
+
});
|
|
108
|
+
printSuccess("Policy deleted.");
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
handleError(err);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/commands/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EACH,UAAU,EACV,aAAa,EACb,YAAY,EACZ,SAAS,GACZ,MAAM,cAAc,CAAC;AAatB,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAC1D,wBAAwB,CAC3B,CAAC;AAEF,aAAa;KACR,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC;KACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACnB,IAAI,CAAC;QACD,YAAY,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAW,WAAW,OAAO,WAAW,CAAC,CAAC;QAEpE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,SAAS,CAAC,QAAQ,CAAC,CAAC;YACpB,OAAO;QACX,CAAC;QAED,UAAU,CACN,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjB,GAAG,CAAC;YACJ,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,SAAS,EAAE,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;YAC/D,OAAO,EAAE,CAAC,CAAC,UAAU;gBACjB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE;gBAC7C,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;SAC3B,CAAC,CAAC,EACH;YACI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YACtC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE;YACpD,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE;YAC1D,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE;YACxD,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE;SACxC,CACJ,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,WAAW,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,aAAa;KACR,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC;KACtC,cAAc,CAAC,yBAAyB,EAAE,+BAA+B,CAAC;KAC1E,cAAc,CAAC,qBAAqB,EAAE,gBAAgB,CAAC;KACvD,cAAc,CAAC,kBAAkB,EAAE,qCAAqC,CAAC;KACzE,MAAM,CACH,uBAAuB,EACvB,sCAAsC,EACtC,MAAM,CACT;KACA,MAAM,CAAC,kBAAkB,EAAE,4BAA4B,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACnB,IAAI,CAAC;QACD,YAAY,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAErC,MAAM,IAAI,GAA4B;YAClC,cAAc,EAAE,IAAI,CAAC,aAAa;YAClC,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,YAAY,EAAE,IAAI,CAAC,IAAI;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;iBACxB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpC,CAAC;QACF,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;QAEjD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAS,WAAW,OAAO,WAAW,EAAE;YAC5D,MAAM,EAAE,MAAM;YACd,IAAI;SACP,CAAC,CAAC;QAEH,YAAY,CAAC,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,aAAa,CAAC;YACV,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YACjB;gBACI,WAAW;gBACX,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,YAAY,EAAE;aACpD;YACD,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC;YAC7B,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACjD,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,WAAW,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,aAAa;KACR,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,iBAAiB,CAAC;KAC9B,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC;KACtC,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC;KACxC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IACvB,IAAI,CAAC;QACD,YAAY,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC9C;oBACI,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,iBAAiB,EAAE,GAAG;oBAC/B,OAAO,EAAE,KAAK;iBACjB;aACJ,CAAC,CAAC;YACH,IAAI,CAAC,OAAO;gBAAE,OAAO;QACzB,CAAC;QAED,MAAM,GAAG,CAAC,WAAW,OAAO,aAAa,EAAE,EAAE,EAAE;YAC3C,MAAM,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,YAAY,CAAC,iBAAiB,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,WAAW,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret.d.ts","sourceRoot":"","sources":["../../../src/commands/secret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BpC,eAAO,MAAM,aAAa,SAEzB,CAAC"}
|