@secr/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/README.md +64 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +51 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +66 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +58 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/diff.d.ts +3 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +68 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/env.d.ts +3 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +59 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/guard.d.ts +3 -0
- package/dist/commands/guard.d.ts.map +1 -0
- package/dist/commands/guard.js +108 -0
- package/dist/commands/guard.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +107 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +3 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +34 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +42 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +101 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +10 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/ls.d.ts +3 -0
- package/dist/commands/ls.d.ts.map +1 -0
- package/dist/commands/ls.js +43 -0
- package/dist/commands/ls.js.map +1 -0
- package/dist/commands/org.d.ts +3 -0
- package/dist/commands/org.d.ts.map +1 -0
- package/dist/commands/org.js +67 -0
- package/dist/commands/org.js.map +1 -0
- package/dist/commands/promote.d.ts +3 -0
- package/dist/commands/promote.d.ts.map +1 -0
- package/dist/commands/promote.js +75 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/pull.d.ts +3 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +48 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/rotate-key.d.ts +3 -0
- package/dist/commands/rotate-key.d.ts.map +1 -0
- package/dist/commands/rotate-key.js +39 -0
- package/dist/commands/rotate-key.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +47 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +83 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/set.d.ts +3 -0
- package/dist/commands/set.d.ts.map +1 -0
- package/dist/commands/set.js +54 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/template.d.ts +3 -0
- package/dist/commands/template.d.ts.map +1 -0
- package/dist/commands/template.js +109 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +32 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/completions/bash.sh +49 -0
- package/dist/completions/fish.fish +62 -0
- package/dist/completions/zsh.sh +106 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +94 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +185 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +18 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +81 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/scanner.d.ts +29 -0
- package/dist/lib/scanner.d.ts.map +1 -0
- package/dist/lib/scanner.js +211 -0
- package/dist/lib/scanner.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { requireProjectConfig } from "../lib/config.js";
|
|
5
|
+
import { apiPullSecrets } from "../lib/api.js";
|
|
6
|
+
export const pullCommand = new Command("pull")
|
|
7
|
+
.description("Pull secrets for the linked project and environment")
|
|
8
|
+
.option("--env <environment>", "Override the default environment")
|
|
9
|
+
.option("--json", "Output as JSON (alias for --format json)")
|
|
10
|
+
.option("--format <format>", "Output format: table, dotenv, json", "table")
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
const config = requireProjectConfig();
|
|
13
|
+
const env = opts.env || config.defaultEnvironment;
|
|
14
|
+
const format = opts.json ? "json" : opts.format;
|
|
15
|
+
const spinner = ora(`Pulling secrets for ${chalk.cyan(config.project)}/${chalk.cyan(env)}...`).start();
|
|
16
|
+
try {
|
|
17
|
+
const { secrets } = await apiPullSecrets(config.org, config.project, env);
|
|
18
|
+
spinner.succeed(chalk.green(`Pulled ${chalk.bold(secrets.length)} secrets`));
|
|
19
|
+
if (format === "json") {
|
|
20
|
+
const envObj = {};
|
|
21
|
+
for (const s of secrets)
|
|
22
|
+
envObj[s.key] = s.value;
|
|
23
|
+
console.log(JSON.stringify(envObj, null, 2));
|
|
24
|
+
}
|
|
25
|
+
else if (format === "dotenv") {
|
|
26
|
+
for (const s of secrets) {
|
|
27
|
+
// Quote values that contain spaces, newlines, or special characters
|
|
28
|
+
const needsQuotes = /[\s#"'\\$`!]/.test(s.value);
|
|
29
|
+
const escaped = needsQuotes ? `"${s.value.replace(/["\\$`]/g, "\\$&")}"` : s.value;
|
|
30
|
+
console.log(`${s.key}=${escaped}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.log();
|
|
35
|
+
for (const s of secrets) {
|
|
36
|
+
console.log(chalk.dim(` ${chalk.white(s.key)}=${chalk.dim("••••••••")}`));
|
|
37
|
+
}
|
|
38
|
+
console.log();
|
|
39
|
+
console.log(chalk.dim(` Use ${chalk.cyan('secr run "your-command"')} to inject these as environment variables.`));
|
|
40
|
+
console.log();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
spinner.fail(chalk.red(err.message));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=pull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotate-key.d.ts","sourceRoot":"","sources":["../../src/commands/rotate-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,eAAO,MAAM,gBAAgB,SA6BzB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import readline from "node:readline";
|
|
5
|
+
import { requireProjectConfig } from "../lib/config.js";
|
|
6
|
+
import { resolveOrgId, apiRotateKey } from "../lib/api.js";
|
|
7
|
+
function confirm(question) {
|
|
8
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
9
|
+
return new Promise((resolve) => {
|
|
10
|
+
rl.question(question, (answer) => {
|
|
11
|
+
rl.close();
|
|
12
|
+
resolve(answer.trim().toLowerCase() === "y");
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export const rotateKeyCommand = new Command("rotate-key")
|
|
17
|
+
.description("Rotate the encryption key for the linked project")
|
|
18
|
+
.option("--force", "Skip confirmation prompt")
|
|
19
|
+
.action(async (opts) => {
|
|
20
|
+
const config = requireProjectConfig();
|
|
21
|
+
if (!opts.force) {
|
|
22
|
+
const yes = await confirm(chalk.yellow(` Rotate encryption key for ${chalk.bold(config.project)}? All secrets will be re-encrypted. (y/N) `));
|
|
23
|
+
if (!yes) {
|
|
24
|
+
console.log(chalk.dim(" Cancelled."));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const spinner = ora("Rotating encryption key...").start();
|
|
29
|
+
try {
|
|
30
|
+
const orgId = await resolveOrgId(config.org);
|
|
31
|
+
const result = await apiRotateKey(orgId, config.project);
|
|
32
|
+
spinner.succeed(chalk.green(`Key rotated to v${chalk.bold(result.keyVersion)} — ${chalk.bold(result.secretsReEncrypted)} secret${result.secretsReEncrypted !== 1 ? "s" : ""} re-encrypted`));
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
spinner.fail(chalk.red(err.message));
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=rotate-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotate-key.js","sourceRoot":"","sources":["../../src/commands/rotate-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE3D,SAAS,OAAO,CAAC,QAAgB;IAC/B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;KACtD,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;IAEtC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,KAAK,CAAC,MAAM,CAAC,+BAA+B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,4CAA4C,CAAC,CACpH,CAAC;QACF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACzD,OAAO,CAAC,OAAO,CACb,KAAK,CAAC,KAAK,CACT,mBAAmB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,MAAM,CAAC,kBAAkB,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,CAC/J,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,UAAU,SAgDnB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import { requireProjectConfig } from "../lib/config.js";
|
|
6
|
+
import { apiPullSecrets } from "../lib/api.js";
|
|
7
|
+
export const runCommand = new Command("run")
|
|
8
|
+
.description("Run a command with secrets injected as environment variables")
|
|
9
|
+
.argument("<command>", "The command to run (wrap in quotes)")
|
|
10
|
+
.option("--env <environment>", "Override the default environment")
|
|
11
|
+
.action(async (cmd, opts) => {
|
|
12
|
+
const config = requireProjectConfig();
|
|
13
|
+
const env = opts.env || config.defaultEnvironment;
|
|
14
|
+
const spinner = ora(chalk.dim("Injecting secrets...")).start();
|
|
15
|
+
try {
|
|
16
|
+
const { secrets } = await apiPullSecrets(config.org, config.project, env);
|
|
17
|
+
// Build environment with secrets injected
|
|
18
|
+
const secretEnv = {};
|
|
19
|
+
for (const s of secrets) {
|
|
20
|
+
secretEnv[s.key] = s.value;
|
|
21
|
+
}
|
|
22
|
+
spinner.succeed(chalk.green(`${chalk.bold(secrets.length)} secrets loaded → running ${chalk.cyan(cmd)}`));
|
|
23
|
+
console.log();
|
|
24
|
+
// Parse the command string
|
|
25
|
+
const parts = cmd.match(/(?:[^\s"]+|"[^"]*")+/g) || [cmd];
|
|
26
|
+
const command = parts[0].replace(/"/g, "");
|
|
27
|
+
const args = parts.slice(1).map((a) => a.replace(/"/g, ""));
|
|
28
|
+
// Spawn the child process with secrets + existing env vars
|
|
29
|
+
const child = spawn(command, args, {
|
|
30
|
+
env: { ...process.env, ...secretEnv },
|
|
31
|
+
stdio: "inherit",
|
|
32
|
+
shell: true,
|
|
33
|
+
});
|
|
34
|
+
child.on("exit", (code) => {
|
|
35
|
+
process.exit(code || 0);
|
|
36
|
+
});
|
|
37
|
+
child.on("error", (err) => {
|
|
38
|
+
console.error(chalk.red(`\n✗ Failed to start process: ${err.message}`));
|
|
39
|
+
process.exit(1);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
spinner.fail(chalk.red(err.message));
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,8DAA8D,CAAC;KAC3E,QAAQ,CAAC,WAAW,EAAE,qCAAqC,CAAC;KAC5D,MAAM,CAAC,qBAAqB,EAAE,kCAAkC,CAAC;KACjE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IAC1B,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,kBAAkB,CAAC;IAElD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE1E,0CAA0C;QAC1C,MAAM,SAAS,GAA2B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAC7B,CAAC;QAED,OAAO,CAAC,OAAO,CACb,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,6BAA6B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CACzF,CAAC;QACF,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,2BAA2B;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAEpE,2DAA2D;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE;YACrC,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,WAAW,SAuFpB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { scanDirectory, scanStagedFiles, checkGitignoreForEnv, SECRET_PATTERNS } from "../lib/scanner.js";
|
|
5
|
+
const SEVERITY_COLORS = {
|
|
6
|
+
high: chalk.red,
|
|
7
|
+
medium: chalk.yellow,
|
|
8
|
+
low: chalk.dim,
|
|
9
|
+
};
|
|
10
|
+
export const scanCommand = new Command("scan")
|
|
11
|
+
.description("Scan for leaked secrets in your codebase")
|
|
12
|
+
.argument("[directory]", "Directory to scan", ".")
|
|
13
|
+
.option("--pre-commit", "Scan only git staged files")
|
|
14
|
+
.option("--json", "Output results as JSON")
|
|
15
|
+
.option("--list-patterns", "List all detection patterns")
|
|
16
|
+
.option("--exclude <paths...>", "Additional paths to skip")
|
|
17
|
+
.action(async (directory, opts) => {
|
|
18
|
+
if (opts.listPatterns) {
|
|
19
|
+
console.log(chalk.bold("\nSecret Detection Patterns:\n"));
|
|
20
|
+
for (const p of SECRET_PATTERNS) {
|
|
21
|
+
const color = SEVERITY_COLORS[p.severity] || chalk.white;
|
|
22
|
+
console.log(` ${color(`[${p.severity.toUpperCase()}]`)} ${chalk.bold(p.name)}`);
|
|
23
|
+
console.log(` ${chalk.dim(p.description)}\n`);
|
|
24
|
+
}
|
|
25
|
+
console.log(` ${SECRET_PATTERNS.length} patterns total\n`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const spinner = ora("Scanning for secrets...").start();
|
|
29
|
+
let result;
|
|
30
|
+
if (opts.preCommit) {
|
|
31
|
+
result = scanStagedFiles();
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
result = scanDirectory({ directory, exclude: opts.exclude });
|
|
35
|
+
}
|
|
36
|
+
// Also check .gitignore
|
|
37
|
+
const gitignoreFindings = opts.preCommit ? [] : checkGitignoreForEnv(directory);
|
|
38
|
+
const allFindings = [...result.findings, ...gitignoreFindings];
|
|
39
|
+
spinner.stop();
|
|
40
|
+
if (opts.json) {
|
|
41
|
+
console.log(JSON.stringify({
|
|
42
|
+
findings: allFindings,
|
|
43
|
+
filesScanned: result.filesScanned,
|
|
44
|
+
duration: result.duration,
|
|
45
|
+
clean: allFindings.length === 0,
|
|
46
|
+
}, null, 2));
|
|
47
|
+
if (allFindings.length > 0)
|
|
48
|
+
process.exit(1);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
console.log();
|
|
52
|
+
if (allFindings.length === 0) {
|
|
53
|
+
console.log(chalk.green(" ✓ No secrets found!"));
|
|
54
|
+
console.log(chalk.dim(` Scanned ${result.filesScanned} files in ${result.duration}ms\n`));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Group by file
|
|
58
|
+
const byFile = new Map();
|
|
59
|
+
for (const f of allFindings) {
|
|
60
|
+
const existing = byFile.get(f.file) || [];
|
|
61
|
+
existing.push(f);
|
|
62
|
+
byFile.set(f.file, existing);
|
|
63
|
+
}
|
|
64
|
+
const highCount = allFindings.filter((f) => f.severity === "high").length;
|
|
65
|
+
const medCount = allFindings.filter((f) => f.severity === "medium").length;
|
|
66
|
+
const lowCount = allFindings.filter((f) => f.severity === "low").length;
|
|
67
|
+
console.log(chalk.red.bold(` ✗ Found ${allFindings.length} potential secret(s)\n`));
|
|
68
|
+
for (const [file, findings] of byFile) {
|
|
69
|
+
console.log(chalk.underline(` ${file}`));
|
|
70
|
+
for (const f of findings) {
|
|
71
|
+
const color = SEVERITY_COLORS[f.severity] || chalk.white;
|
|
72
|
+
const loc = f.line > 0 ? `L${f.line}:${f.column}` : "";
|
|
73
|
+
console.log(` ${color(`[${f.severity.toUpperCase()}]`)} ${f.patternName} ${chalk.dim(loc)}`);
|
|
74
|
+
console.log(` ${chalk.dim(f.redactedMatch)}`);
|
|
75
|
+
}
|
|
76
|
+
console.log();
|
|
77
|
+
}
|
|
78
|
+
console.log(chalk.dim(` ${highCount} high, ${medCount} medium, ${lowCount} low | ${result.filesScanned} files scanned in ${result.duration}ms`));
|
|
79
|
+
console.log();
|
|
80
|
+
console.log(chalk.cyan(" Tip: Run `secr guard install` to prevent committing secrets.\n"));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../src/commands/set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,UAAU,SAyDnB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { requireProjectConfig, parseEnvFile } from "../lib/config.js";
|
|
5
|
+
import { apiSetSecret, apiBulkSetSecrets } from "../lib/api.js";
|
|
6
|
+
export const setCommand = new Command("set")
|
|
7
|
+
.description("Set a secret (KEY=value) or import from .env file")
|
|
8
|
+
.argument("[keyvalue]", "Secret in KEY=value format")
|
|
9
|
+
.option("--from-env <path>", "Import secrets from a .env file")
|
|
10
|
+
.option("--env <environment>", "Override the default environment")
|
|
11
|
+
.action(async (keyvalue, opts) => {
|
|
12
|
+
const config = requireProjectConfig();
|
|
13
|
+
const env = opts.env || config.defaultEnvironment;
|
|
14
|
+
// Bulk import from .env file
|
|
15
|
+
if (opts.fromEnv) {
|
|
16
|
+
const spinner = ora(`Importing from ${opts.fromEnv}...`).start();
|
|
17
|
+
try {
|
|
18
|
+
const secrets = parseEnvFile(opts.fromEnv);
|
|
19
|
+
if (secrets.length === 0) {
|
|
20
|
+
spinner.warn(chalk.yellow("No secrets found in the file"));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const result = await apiBulkSetSecrets(config.org, config.project, env, secrets);
|
|
24
|
+
spinner.succeed(chalk.green(`Imported ${chalk.bold(result.total)} secrets (${result.created} new, ${result.updated} updated)`));
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
spinner.fail(chalk.red(err.message));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Single secret set
|
|
33
|
+
if (!keyvalue) {
|
|
34
|
+
console.error(chalk.red("✗ Provide a KEY=value pair or use --from-env <path>"));
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
const eqIndex = keyvalue.indexOf("=");
|
|
38
|
+
if (eqIndex === -1) {
|
|
39
|
+
console.error(chalk.red("✗ Invalid format. Use KEY=value"));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const key = keyvalue.slice(0, eqIndex);
|
|
43
|
+
const value = keyvalue.slice(eqIndex + 1);
|
|
44
|
+
const spinner = ora(`Setting ${chalk.cyan(key)}...`).start();
|
|
45
|
+
try {
|
|
46
|
+
const result = await apiSetSecret(config.org, config.project, env, key, value);
|
|
47
|
+
spinner.succeed(chalk.green(`${chalk.bold(key)} set (v${result.version}) in ${config.project}/${env}`));
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
spinner.fail(chalk.red(err.message));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../src/commands/set.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/commands/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,eAAe,SAC6B,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { requireProjectConfig } from "../lib/config.js";
|
|
5
|
+
import { apiListTemplates, apiAddTemplate, apiRemoveTemplate, apiValidateTemplate, } from "../lib/api.js";
|
|
6
|
+
export const templateCommand = new Command("template")
|
|
7
|
+
.description("Manage secret templates (required keys)");
|
|
8
|
+
templateCommand
|
|
9
|
+
.command("list")
|
|
10
|
+
.description("List template keys for the current project")
|
|
11
|
+
.action(async () => {
|
|
12
|
+
const config = requireProjectConfig();
|
|
13
|
+
const spinner = ora("Fetching templates...").start();
|
|
14
|
+
try {
|
|
15
|
+
const { templates } = await apiListTemplates(config.org, config.project);
|
|
16
|
+
spinner.stop();
|
|
17
|
+
if (templates.length === 0) {
|
|
18
|
+
console.log(chalk.dim("\n No templates defined. Use `secr template add <key>` to add one.\n"));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
console.log(chalk.bold(`\n Templates for ${config.project}\n`));
|
|
22
|
+
for (const t of templates) {
|
|
23
|
+
const req = t.required ? chalk.green("required") : chalk.dim("optional");
|
|
24
|
+
const desc = t.description ? chalk.dim(` — ${t.description}`) : "";
|
|
25
|
+
console.log(` ${chalk.white(t.key)} (${req})${desc}`);
|
|
26
|
+
}
|
|
27
|
+
console.log();
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
spinner.fail(chalk.red(err.message));
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
templateCommand
|
|
35
|
+
.command("add")
|
|
36
|
+
.description("Add a required key to the template")
|
|
37
|
+
.argument("<key>", "Secret key name (e.g. DATABASE_URL)")
|
|
38
|
+
.option("--description <desc>", "Description of what this key is for")
|
|
39
|
+
.option("--optional", "Mark as optional instead of required", false)
|
|
40
|
+
.action(async (key, opts) => {
|
|
41
|
+
const config = requireProjectConfig();
|
|
42
|
+
const spinner = ora(`Adding template key ${chalk.cyan(key)}...`).start();
|
|
43
|
+
try {
|
|
44
|
+
await apiAddTemplate(config.org, config.project, {
|
|
45
|
+
key,
|
|
46
|
+
description: opts.description,
|
|
47
|
+
required: !opts.optional,
|
|
48
|
+
});
|
|
49
|
+
spinner.succeed(chalk.green(`Template key ${chalk.bold(key)} added`));
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
spinner.fail(chalk.red(err.message));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
templateCommand
|
|
57
|
+
.command("remove")
|
|
58
|
+
.description("Remove a key from the template")
|
|
59
|
+
.argument("<key>", "Secret key name to remove")
|
|
60
|
+
.action(async (key) => {
|
|
61
|
+
const config = requireProjectConfig();
|
|
62
|
+
const spinner = ora(`Removing template key ${chalk.cyan(key)}...`).start();
|
|
63
|
+
try {
|
|
64
|
+
await apiRemoveTemplate(config.org, config.project, key);
|
|
65
|
+
spinner.succeed(chalk.green(`Template key ${chalk.bold(key)} removed`));
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
spinner.fail(chalk.red(err.message));
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
templateCommand
|
|
73
|
+
.command("validate")
|
|
74
|
+
.description("Check if an environment has all required template keys")
|
|
75
|
+
.option("--env <environment>", "Environment to validate (default: from .secr.json)")
|
|
76
|
+
.action(async (opts) => {
|
|
77
|
+
const config = requireProjectConfig();
|
|
78
|
+
const env = opts.env || config.defaultEnvironment;
|
|
79
|
+
const spinner = ora(`Validating ${chalk.cyan(env)} against template...`).start();
|
|
80
|
+
try {
|
|
81
|
+
const result = await apiValidateTemplate(config.org, config.project, env);
|
|
82
|
+
spinner.stop();
|
|
83
|
+
if (result.valid) {
|
|
84
|
+
console.log(chalk.green(`\n ✓ ${env} has all required template keys\n`));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.log(chalk.red(`\n ✗ ${env} is missing required keys:\n`));
|
|
88
|
+
for (const key of result.missing) {
|
|
89
|
+
console.log(chalk.red(` - ${key}`));
|
|
90
|
+
}
|
|
91
|
+
console.log();
|
|
92
|
+
}
|
|
93
|
+
if (result.extra.length > 0) {
|
|
94
|
+
console.log(chalk.dim(` Extra keys (not in template):`));
|
|
95
|
+
for (const key of result.extra) {
|
|
96
|
+
console.log(chalk.dim(` + ${key}`));
|
|
97
|
+
}
|
|
98
|
+
console.log();
|
|
99
|
+
}
|
|
100
|
+
if (!result.valid) {
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
spinner.fail(chalk.red(err.message));
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/commands/template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SA2BtB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { requireProjectConfig, loadCredentials } from "../lib/config.js";
|
|
5
|
+
import { apiGetMe } from "../lib/api.js";
|
|
6
|
+
export const whoamiCommand = new Command("whoami")
|
|
7
|
+
.description("Show current user, org, and linked project")
|
|
8
|
+
.action(async () => {
|
|
9
|
+
const creds = loadCredentials();
|
|
10
|
+
if (!creds?.token) {
|
|
11
|
+
console.log(chalk.red("\n Not authenticated. Run `secr login` first.\n"));
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const spinner = ora(chalk.dim("Loading...")).start();
|
|
15
|
+
try {
|
|
16
|
+
const me = await apiGetMe();
|
|
17
|
+
spinner.stop();
|
|
18
|
+
const config = requireProjectConfig();
|
|
19
|
+
console.log();
|
|
20
|
+
console.log(chalk.dim(" User: ") + chalk.white(me.email));
|
|
21
|
+
console.log(chalk.dim(" Name: ") + chalk.white(me.name));
|
|
22
|
+
console.log(chalk.dim(" Org: ") + chalk.white(config.org));
|
|
23
|
+
console.log(chalk.dim(" Project: ") + chalk.white(config.project));
|
|
24
|
+
console.log(chalk.dim(" Environment: ") + chalk.white(config.defaultEnvironment));
|
|
25
|
+
console.log();
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
spinner.fail(chalk.red(err.message));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;QAEtC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# secr bash completion
|
|
3
|
+
|
|
4
|
+
_secr_completions() {
|
|
5
|
+
local cur prev commands
|
|
6
|
+
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
7
|
+
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
8
|
+
|
|
9
|
+
commands="login logout whoami init link pull run set delete ls log diff env rotate-key promote template scan guard completion"
|
|
10
|
+
|
|
11
|
+
case "${prev}" in
|
|
12
|
+
secr)
|
|
13
|
+
COMPREPLY=($(compgen -W "${commands}" -- "${cur}"))
|
|
14
|
+
return 0
|
|
15
|
+
;;
|
|
16
|
+
env)
|
|
17
|
+
COMPREPLY=($(compgen -W "list create" -- "${cur}"))
|
|
18
|
+
return 0
|
|
19
|
+
;;
|
|
20
|
+
template)
|
|
21
|
+
COMPREPLY=($(compgen -W "list add remove validate" -- "${cur}"))
|
|
22
|
+
return 0
|
|
23
|
+
;;
|
|
24
|
+
guard)
|
|
25
|
+
COMPREPLY=($(compgen -W "install uninstall status" -- "${cur}"))
|
|
26
|
+
return 0
|
|
27
|
+
;;
|
|
28
|
+
completion)
|
|
29
|
+
COMPREPLY=($(compgen -W "bash zsh fish" -- "${cur}"))
|
|
30
|
+
return 0
|
|
31
|
+
;;
|
|
32
|
+
--env)
|
|
33
|
+
COMPREPLY=($(compgen -W "development staging production" -- "${cur}"))
|
|
34
|
+
return 0
|
|
35
|
+
;;
|
|
36
|
+
--format)
|
|
37
|
+
COMPREPLY=($(compgen -W "dotenv json table" -- "${cur}"))
|
|
38
|
+
return 0
|
|
39
|
+
;;
|
|
40
|
+
esac
|
|
41
|
+
|
|
42
|
+
if [[ "${cur}" == -* ]]; then
|
|
43
|
+
local flags="--env --format --force --from --to --dry-run --overwrite --keys --description --help --version --json --pre-commit --list-patterns --from-env --token --limit --reveal"
|
|
44
|
+
COMPREPLY=($(compgen -W "${flags}" -- "${cur}"))
|
|
45
|
+
return 0
|
|
46
|
+
fi
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
complete -F _secr_completions secr
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# secr fish completion
|
|
2
|
+
|
|
3
|
+
# Disable file completions by default
|
|
4
|
+
complete -c secr -f
|
|
5
|
+
|
|
6
|
+
# Top-level commands
|
|
7
|
+
complete -c secr -n '__fish_use_subcommand' -a login -d 'Authenticate with the secr platform'
|
|
8
|
+
complete -c secr -n '__fish_use_subcommand' -a logout -d 'Clear saved credentials'
|
|
9
|
+
complete -c secr -n '__fish_use_subcommand' -a whoami -d 'Show current user and linked project'
|
|
10
|
+
complete -c secr -n '__fish_use_subcommand' -a init -d 'Create a new project interactively'
|
|
11
|
+
complete -c secr -n '__fish_use_subcommand' -a link -d 'Link current directory to a project'
|
|
12
|
+
complete -c secr -n '__fish_use_subcommand' -a pull -d 'Pull decrypted secrets'
|
|
13
|
+
complete -c secr -n '__fish_use_subcommand' -a run -d 'Run a command with secrets injected'
|
|
14
|
+
complete -c secr -n '__fish_use_subcommand' -a set -d 'Set one or more secrets'
|
|
15
|
+
complete -c secr -n '__fish_use_subcommand' -a delete -d 'Delete a secret'
|
|
16
|
+
complete -c secr -n '__fish_use_subcommand' -a ls -d 'List secret keys'
|
|
17
|
+
complete -c secr -n '__fish_use_subcommand' -a log -d 'View audit log entries'
|
|
18
|
+
complete -c secr -n '__fish_use_subcommand' -a diff -d 'Compare secrets between environments'
|
|
19
|
+
complete -c secr -n '__fish_use_subcommand' -a env -d 'Manage environments'
|
|
20
|
+
complete -c secr -n '__fish_use_subcommand' -a rotate-key -d 'Rotate the project encryption key'
|
|
21
|
+
complete -c secr -n '__fish_use_subcommand' -a promote -d 'Promote secrets between environments'
|
|
22
|
+
complete -c secr -n '__fish_use_subcommand' -a template -d 'Manage secret templates'
|
|
23
|
+
complete -c secr -n '__fish_use_subcommand' -a scan -d 'Scan for leaked secrets'
|
|
24
|
+
complete -c secr -n '__fish_use_subcommand' -a guard -d 'Manage pre-commit hook'
|
|
25
|
+
complete -c secr -n '__fish_use_subcommand' -a completion -d 'Output shell completion script'
|
|
26
|
+
|
|
27
|
+
# env subcommands
|
|
28
|
+
complete -c secr -n '__fish_seen_subcommand_from env' -a list -d 'List environments'
|
|
29
|
+
complete -c secr -n '__fish_seen_subcommand_from env' -a create -d 'Create an environment'
|
|
30
|
+
|
|
31
|
+
# template subcommands
|
|
32
|
+
complete -c secr -n '__fish_seen_subcommand_from template' -a list -d 'List template keys'
|
|
33
|
+
complete -c secr -n '__fish_seen_subcommand_from template' -a add -d 'Add a template key'
|
|
34
|
+
complete -c secr -n '__fish_seen_subcommand_from template' -a remove -d 'Remove a template key'
|
|
35
|
+
complete -c secr -n '__fish_seen_subcommand_from template' -a validate -d 'Validate env against template'
|
|
36
|
+
|
|
37
|
+
# guard subcommands
|
|
38
|
+
complete -c secr -n '__fish_seen_subcommand_from guard' -a install -d 'Install pre-commit hook'
|
|
39
|
+
complete -c secr -n '__fish_seen_subcommand_from guard' -a uninstall -d 'Remove pre-commit hook'
|
|
40
|
+
complete -c secr -n '__fish_seen_subcommand_from guard' -a status -d 'Check hook status'
|
|
41
|
+
|
|
42
|
+
# completion subcommands
|
|
43
|
+
complete -c secr -n '__fish_seen_subcommand_from completion' -a bash -d 'Bash completion'
|
|
44
|
+
complete -c secr -n '__fish_seen_subcommand_from completion' -a zsh -d 'Zsh completion'
|
|
45
|
+
complete -c secr -n '__fish_seen_subcommand_from completion' -a fish -d 'Fish completion'
|
|
46
|
+
|
|
47
|
+
# Common flags
|
|
48
|
+
complete -c secr -n '__fish_seen_subcommand_from pull set delete ls run log diff' -l env -d 'Environment' -xa 'development staging production'
|
|
49
|
+
complete -c secr -n '__fish_seen_subcommand_from pull' -l format -d 'Output format' -xa 'dotenv json table'
|
|
50
|
+
complete -c secr -n '__fish_seen_subcommand_from delete' -l force -d 'Skip confirmation'
|
|
51
|
+
complete -c secr -n '__fish_seen_subcommand_from set' -l from-env -d 'Import from .env file' -rF
|
|
52
|
+
complete -c secr -n '__fish_seen_subcommand_from login' -l token -d 'Token for CI/headless login'
|
|
53
|
+
complete -c secr -n '__fish_seen_subcommand_from diff' -l reveal -d 'Show actual values'
|
|
54
|
+
complete -c secr -n '__fish_seen_subcommand_from promote' -l from -d 'Source environment' -xa 'development staging production'
|
|
55
|
+
complete -c secr -n '__fish_seen_subcommand_from promote' -l to -d 'Target environment' -xa 'development staging production'
|
|
56
|
+
complete -c secr -n '__fish_seen_subcommand_from promote' -l dry-run -d 'Preview without changes'
|
|
57
|
+
complete -c secr -n '__fish_seen_subcommand_from promote' -l overwrite -d 'Overwrite existing'
|
|
58
|
+
complete -c secr -n '__fish_seen_subcommand_from promote' -l keys -d 'Specific keys to promote'
|
|
59
|
+
complete -c secr -n '__fish_seen_subcommand_from scan' -l pre-commit -d 'Scan staged files only'
|
|
60
|
+
complete -c secr -n '__fish_seen_subcommand_from scan' -l json -d 'JSON output'
|
|
61
|
+
complete -c secr -n '__fish_seen_subcommand_from scan' -l list-patterns -d 'Show detection patterns'
|
|
62
|
+
complete -c secr -n '__fish_seen_subcommand_from log' -l limit -d 'Max entries to show'
|