@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.
Files changed (75) hide show
  1. package/LICENSE +133 -0
  2. package/README.md +215 -0
  3. package/dist/bin/1claw.d.ts +3 -0
  4. package/dist/bin/1claw.d.ts.map +1 -0
  5. package/dist/bin/1claw.js +8 -0
  6. package/dist/bin/1claw.js.map +1 -0
  7. package/dist/src/auth.d.ts +6 -0
  8. package/dist/src/auth.d.ts.map +1 -0
  9. package/dist/src/auth.js +151 -0
  10. package/dist/src/auth.js.map +1 -0
  11. package/dist/src/client.d.ts +18 -0
  12. package/dist/src/client.d.ts.map +1 -0
  13. package/dist/src/client.js +58 -0
  14. package/dist/src/client.js.map +1 -0
  15. package/dist/src/commands/agent.d.ts +3 -0
  16. package/dist/src/commands/agent.d.ts.map +1 -0
  17. package/dist/src/commands/agent.js +233 -0
  18. package/dist/src/commands/agent.js.map +1 -0
  19. package/dist/src/commands/audit.d.ts +3 -0
  20. package/dist/src/commands/audit.d.ts.map +1 -0
  21. package/dist/src/commands/audit.js +57 -0
  22. package/dist/src/commands/audit.js.map +1 -0
  23. package/dist/src/commands/billing.d.ts +3 -0
  24. package/dist/src/commands/billing.d.ts.map +1 -0
  25. package/dist/src/commands/billing.js +160 -0
  26. package/dist/src/commands/billing.js.map +1 -0
  27. package/dist/src/commands/config.d.ts +3 -0
  28. package/dist/src/commands/config.d.ts.map +1 -0
  29. package/dist/src/commands/config.js +65 -0
  30. package/dist/src/commands/config.js.map +1 -0
  31. package/dist/src/commands/env.d.ts +3 -0
  32. package/dist/src/commands/env.d.ts.map +1 -0
  33. package/dist/src/commands/env.js +164 -0
  34. package/dist/src/commands/env.js.map +1 -0
  35. package/dist/src/commands/login.d.ts +5 -0
  36. package/dist/src/commands/login.d.ts.map +1 -0
  37. package/dist/src/commands/login.js +88 -0
  38. package/dist/src/commands/login.js.map +1 -0
  39. package/dist/src/commands/mfa.d.ts +3 -0
  40. package/dist/src/commands/mfa.d.ts.map +1 -0
  41. package/dist/src/commands/mfa.js +123 -0
  42. package/dist/src/commands/mfa.js.map +1 -0
  43. package/dist/src/commands/policy.d.ts +3 -0
  44. package/dist/src/commands/policy.d.ts.map +1 -0
  45. package/dist/src/commands/policy.js +114 -0
  46. package/dist/src/commands/policy.js.map +1 -0
  47. package/dist/src/commands/secret.d.ts +3 -0
  48. package/dist/src/commands/secret.d.ts.map +1 -0
  49. package/dist/src/commands/secret.js +206 -0
  50. package/dist/src/commands/secret.js.map +1 -0
  51. package/dist/src/commands/share.d.ts +3 -0
  52. package/dist/src/commands/share.d.ts.map +1 -0
  53. package/dist/src/commands/share.js +145 -0
  54. package/dist/src/commands/share.js.map +1 -0
  55. package/dist/src/commands/vault.d.ts +3 -0
  56. package/dist/src/commands/vault.d.ts.map +1 -0
  57. package/dist/src/commands/vault.js +127 -0
  58. package/dist/src/commands/vault.js.map +1 -0
  59. package/dist/src/config.d.ts +25 -0
  60. package/dist/src/config.d.ts.map +1 -0
  61. package/dist/src/config.js +68 -0
  62. package/dist/src/config.js.map +1 -0
  63. package/dist/src/index.d.ts +3 -0
  64. package/dist/src/index.d.ts.map +1 -0
  65. package/dist/src/index.js +51 -0
  66. package/dist/src/index.js.map +1 -0
  67. package/dist/src/middleware.d.ts +6 -0
  68. package/dist/src/middleware.d.ts.map +1 -0
  69. package/dist/src/middleware.js +35 -0
  70. package/dist/src/middleware.js.map +1 -0
  71. package/dist/src/output.d.ts +12 -0
  72. package/dist/src/output.d.ts.map +1 -0
  73. package/dist/src/output.js +71 -0
  74. package/dist/src/output.js.map +1 -0
  75. 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,5 @@
1
+ import { Command } from "commander";
2
+ export declare const loginCommand: Command;
3
+ export declare const logoutCommand: Command;
4
+ export declare const whoamiCommand: Command;
5
+ //# sourceMappingURL=login.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare const mfaCommand: Command;
3
+ //# sourceMappingURL=mfa.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare const policyCommand: Command;
3
+ //# sourceMappingURL=policy.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare const secretCommand: Command;
3
+ //# sourceMappingURL=secret.d.ts.map
@@ -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"}