@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
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# @secr/cli
|
|
2
|
+
|
|
3
|
+
Command-line tool for [secr](https://secr.dev) — secrets management for teams.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Homebrew (macOS / Linux)
|
|
9
|
+
brew tap secr-dev/secr
|
|
10
|
+
brew install secr
|
|
11
|
+
|
|
12
|
+
# npm
|
|
13
|
+
npm install -g @secr/cli
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# Authenticate
|
|
20
|
+
secr login
|
|
21
|
+
|
|
22
|
+
# Create a project
|
|
23
|
+
secr init
|
|
24
|
+
|
|
25
|
+
# Add secrets
|
|
26
|
+
secr set DATABASE_URL=postgres://...
|
|
27
|
+
secr set --from-env .env
|
|
28
|
+
|
|
29
|
+
# Use secrets (zero-disk injection)
|
|
30
|
+
secr run "npm start"
|
|
31
|
+
|
|
32
|
+
# Pull secrets
|
|
33
|
+
secr pull --format dotenv > .env.local
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Commands
|
|
37
|
+
|
|
38
|
+
| Command | Description |
|
|
39
|
+
|---------|-------------|
|
|
40
|
+
| `secr login` | Authenticate with secr |
|
|
41
|
+
| `secr init` | Create a new project |
|
|
42
|
+
| `secr link` | Link to an existing project |
|
|
43
|
+
| `secr set` | Set one or more secrets |
|
|
44
|
+
| `secr pull` | Pull decrypted secrets |
|
|
45
|
+
| `secr run` | Run a command with secrets injected |
|
|
46
|
+
| `secr ls` | List secret keys |
|
|
47
|
+
| `secr delete` | Delete secrets |
|
|
48
|
+
| `secr diff` | Compare environments |
|
|
49
|
+
| `secr promote` | Copy secrets between environments |
|
|
50
|
+
| `secr template` | Manage required key templates |
|
|
51
|
+
| `secr scan` | Detect leaked secrets in your codebase |
|
|
52
|
+
| `secr guard` | Install pre-commit secret scanning hook |
|
|
53
|
+
| `secr env` | Manage environments |
|
|
54
|
+
| `secr rotate-key` | Rotate project encryption key |
|
|
55
|
+
| `secr log` | View audit log |
|
|
56
|
+
| `secr completion` | Shell completions (bash/zsh/fish) |
|
|
57
|
+
|
|
58
|
+
## Documentation
|
|
59
|
+
|
|
60
|
+
Full docs at [secr.dev/docs](https://secr.dev/docs).
|
|
61
|
+
|
|
62
|
+
## License
|
|
63
|
+
|
|
64
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,eAAO,MAAM,iBAAiB,SA4B1B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { dirname, join } from "path";
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
const SHELLS = {
|
|
8
|
+
bash: {
|
|
9
|
+
file: "bash.sh",
|
|
10
|
+
hint: 'Add to ~/.bashrc:\n eval "$(secr completion bash)"',
|
|
11
|
+
},
|
|
12
|
+
zsh: {
|
|
13
|
+
file: "zsh.sh",
|
|
14
|
+
hint: 'Add to ~/.zshrc:\n eval "$(secr completion zsh)"',
|
|
15
|
+
},
|
|
16
|
+
fish: {
|
|
17
|
+
file: "fish.fish",
|
|
18
|
+
hint: "Save to ~/.config/fish/completions/secr.fish:\n secr completion fish > ~/.config/fish/completions/secr.fish",
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
export const completionCommand = new Command("completion")
|
|
22
|
+
.description("Output shell completion script")
|
|
23
|
+
.argument("<shell>", "Shell type: bash, zsh, or fish")
|
|
24
|
+
.action((shell) => {
|
|
25
|
+
const config = SHELLS[shell];
|
|
26
|
+
if (!config) {
|
|
27
|
+
console.error(`Unknown shell: ${shell}. Supported: bash, zsh, fish`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const scriptPath = join(__dirname, "..", "completions", config.file);
|
|
31
|
+
try {
|
|
32
|
+
const script = readFileSync(scriptPath, "utf-8");
|
|
33
|
+
// Script to stdout, install hints to stderr so piping works
|
|
34
|
+
process.stdout.write(script);
|
|
35
|
+
process.stderr.write(`\n# Install:\n# ${config.hint}\n`);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Try from the same directory (when completions are next to commands in dist/)
|
|
39
|
+
const altPath = join(__dirname, "completions", config.file);
|
|
40
|
+
try {
|
|
41
|
+
const script = readFileSync(altPath, "utf-8");
|
|
42
|
+
process.stdout.write(script);
|
|
43
|
+
process.stderr.write(`\n# Install:\n# ${config.hint}\n`);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
console.error(`Completion script not found. Ensure the package is installed correctly.`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,MAAM,GAAmD;IAC7D,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,qDAAqD;KAC5D;IACD,GAAG,EAAE;QACH,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,mDAAmD;KAC1D;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,8GAA8G;KACrH;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;KACvD,WAAW,CAAC,gCAAgC,CAAC;KAC7C,QAAQ,CAAC,SAAS,EAAE,gCAAgC,CAAC;KACrD,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE;IACxB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,kBAAkB,KAAK,8BAA8B,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,4DAA4D;QAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,+EAA+E;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAC;YACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiEpC,eAAO,MAAM,aAAa,SAGE,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { requireProjectConfig } from "../lib/config.js";
|
|
6
|
+
import { resolveOrgId, apiExportProjectConfig, apiImportProjectConfig } from "../lib/api.js";
|
|
7
|
+
const exportCommand = new Command("export")
|
|
8
|
+
.description("Export project config (environments and templates)")
|
|
9
|
+
.option("-o, --output <file>", "Write config to a file instead of stdout")
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
const config = requireProjectConfig();
|
|
12
|
+
const spinner = ora("Exporting project config...").start();
|
|
13
|
+
try {
|
|
14
|
+
const orgId = await resolveOrgId(config.org);
|
|
15
|
+
const result = await apiExportProjectConfig(orgId, config.project);
|
|
16
|
+
const json = JSON.stringify(result, null, 2);
|
|
17
|
+
if (opts.output) {
|
|
18
|
+
writeFileSync(opts.output, json + "\n", "utf-8");
|
|
19
|
+
spinner.succeed(chalk.green(`Config written to ${chalk.bold(opts.output)}`));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
spinner.stop();
|
|
23
|
+
console.log(json);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
spinner.fail(chalk.red(err.message));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
const importCommand = new Command("import")
|
|
32
|
+
.description("Import project config (environments and templates)")
|
|
33
|
+
.argument("<file>", "JSON config file to import")
|
|
34
|
+
.action(async (file) => {
|
|
35
|
+
const projectConfig = requireProjectConfig();
|
|
36
|
+
const spinner = ora("Importing project config...").start();
|
|
37
|
+
try {
|
|
38
|
+
const raw = readFileSync(file, "utf-8");
|
|
39
|
+
const config = JSON.parse(raw);
|
|
40
|
+
const orgId = await resolveOrgId(projectConfig.org);
|
|
41
|
+
const result = await apiImportProjectConfig(orgId, projectConfig.project, config);
|
|
42
|
+
const parts = [];
|
|
43
|
+
if (result.environments.created > 0) {
|
|
44
|
+
parts.push(`${result.environments.created} environment${result.environments.created !== 1 ? "s" : ""} created`);
|
|
45
|
+
}
|
|
46
|
+
if (result.environments.skipped > 0) {
|
|
47
|
+
parts.push(`${result.environments.skipped} environment${result.environments.skipped !== 1 ? "s" : ""} skipped`);
|
|
48
|
+
}
|
|
49
|
+
if (result.templates.created > 0) {
|
|
50
|
+
parts.push(`${result.templates.created} template${result.templates.created !== 1 ? "s" : ""} created`);
|
|
51
|
+
}
|
|
52
|
+
if (result.templates.skipped > 0) {
|
|
53
|
+
parts.push(`${result.templates.skipped} template${result.templates.skipped !== 1 ? "s" : ""} skipped`);
|
|
54
|
+
}
|
|
55
|
+
spinner.succeed(chalk.green(parts.length > 0 ? parts.join(", ") : "Nothing to import"));
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
spinner.fail(chalk.red(err.message));
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
export const configCommand = new Command("config")
|
|
63
|
+
.description("Export and import project configuration")
|
|
64
|
+
.addCommand(exportCommand)
|
|
65
|
+
.addCommand(importCommand);
|
|
66
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,eAAO,MAAM,aAAa,SA0CtB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
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 { apiDeleteSecret, apiBulkDeleteSecrets } 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 deleteCommand = new Command("delete")
|
|
17
|
+
.description("Delete one or more secrets")
|
|
18
|
+
.argument("<keys...>", "Secret key(s) to delete")
|
|
19
|
+
.option("--env <environment>", "Override the default environment")
|
|
20
|
+
.option("--force", "Skip confirmation prompt")
|
|
21
|
+
.action(async (keys, opts) => {
|
|
22
|
+
const config = requireProjectConfig();
|
|
23
|
+
const env = opts.env || config.defaultEnvironment;
|
|
24
|
+
if (!opts.force) {
|
|
25
|
+
const keyList = keys.length === 1 ? chalk.bold(keys[0]) : keys.map((k) => chalk.bold(k)).join(", ");
|
|
26
|
+
const yes = await confirm(chalk.yellow(` Delete ${keyList} from ${config.project}/${env}? (y/N) `));
|
|
27
|
+
if (!yes) {
|
|
28
|
+
console.log(chalk.dim(" Cancelled."));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (keys.length === 1) {
|
|
33
|
+
const spinner = ora(`Deleting ${chalk.cyan(keys[0])}...`).start();
|
|
34
|
+
try {
|
|
35
|
+
await apiDeleteSecret(config.org, config.project, env, keys[0]);
|
|
36
|
+
spinner.succeed(chalk.green(`${chalk.bold(keys[0])} deleted from ${config.project}/${env}`));
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
spinner.fail(chalk.red(err.message));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const spinner = ora(`Deleting ${chalk.cyan(String(keys.length))} secrets...`).start();
|
|
45
|
+
try {
|
|
46
|
+
const result = await apiBulkDeleteSecrets(config.org, config.project, env, keys);
|
|
47
|
+
spinner.succeed(chalk.green(`${result.deleted} deleted from ${config.project}/${env}`));
|
|
48
|
+
if (result.notFound.length > 0) {
|
|
49
|
+
console.log(chalk.yellow(` Not found: ${result.notFound.join(", ")}`));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
spinner.fail(chalk.red(err.message));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SAgEpB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
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 diffCommand = new Command("diff")
|
|
7
|
+
.description("Compare secrets between two environments")
|
|
8
|
+
.requiredOption("--env <envs...>", "Two environments to compare (e.g., --env staging production)")
|
|
9
|
+
.option("--reveal", "Show actual values (default: redacted)")
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
if (!opts.env || opts.env.length !== 2) {
|
|
12
|
+
console.error(chalk.red("Provide exactly two environments: --env staging production"));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const config = requireProjectConfig();
|
|
16
|
+
const [envA, envB] = opts.env;
|
|
17
|
+
const spinner = ora(chalk.dim(`Comparing ${envA} <> ${envB}...`)).start();
|
|
18
|
+
try {
|
|
19
|
+
const [resultA, resultB] = await Promise.all([
|
|
20
|
+
apiPullSecrets(config.org, config.project, envA),
|
|
21
|
+
apiPullSecrets(config.org, config.project, envB),
|
|
22
|
+
]);
|
|
23
|
+
const mapA = new Map(resultA.secrets.map((s) => [s.key, s.value]));
|
|
24
|
+
const mapB = new Map(resultB.secrets.map((s) => [s.key, s.value]));
|
|
25
|
+
const allKeys = new Set([...mapA.keys(), ...mapB.keys()]);
|
|
26
|
+
spinner.stop();
|
|
27
|
+
console.log();
|
|
28
|
+
console.log(chalk.dim(` Comparing ${chalk.white(envA)} <> ${chalk.white(envB)} in ${config.project}`));
|
|
29
|
+
console.log();
|
|
30
|
+
let diffs = 0;
|
|
31
|
+
for (const key of [...allKeys].sort()) {
|
|
32
|
+
const inA = mapA.has(key);
|
|
33
|
+
const inB = mapB.has(key);
|
|
34
|
+
if (inA && !inB) {
|
|
35
|
+
console.log(chalk.red(` - ${key} (only in ${envA})`));
|
|
36
|
+
diffs++;
|
|
37
|
+
}
|
|
38
|
+
else if (!inA && inB) {
|
|
39
|
+
console.log(chalk.green(` + ${key} (only in ${envB})`));
|
|
40
|
+
diffs++;
|
|
41
|
+
}
|
|
42
|
+
else if (mapA.get(key) !== mapB.get(key)) {
|
|
43
|
+
if (opts.reveal) {
|
|
44
|
+
console.log(chalk.yellow(` ~ ${key}`));
|
|
45
|
+
console.log(chalk.dim(` ${envA}: ${mapA.get(key)}`));
|
|
46
|
+
console.log(chalk.dim(` ${envB}: ${mapB.get(key)}`));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log(chalk.yellow(` ~ ${key} (values differ)`));
|
|
50
|
+
}
|
|
51
|
+
diffs++;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (diffs === 0) {
|
|
55
|
+
console.log(chalk.green(" Environments are identical"));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.log();
|
|
59
|
+
console.log(chalk.dim(` ${diffs} difference${diffs !== 1 ? "s" : ""} found`));
|
|
60
|
+
}
|
|
61
|
+
console.log();
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
spinner.fail(chalk.red(err.message));
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,UAAU,SACc,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { requireProjectConfig } from "../lib/config.js";
|
|
5
|
+
import { resolveOrgId, apiGetProject, apiCreateEnvironment } from "../lib/api.js";
|
|
6
|
+
function toSlug(name) {
|
|
7
|
+
return name
|
|
8
|
+
.toLowerCase()
|
|
9
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
10
|
+
.replace(/^-|-$/g, "");
|
|
11
|
+
}
|
|
12
|
+
export const envCommand = new Command("env")
|
|
13
|
+
.description("Manage environments");
|
|
14
|
+
envCommand
|
|
15
|
+
.command("list")
|
|
16
|
+
.description("List environments for the linked project")
|
|
17
|
+
.action(async () => {
|
|
18
|
+
const config = requireProjectConfig();
|
|
19
|
+
const spinner = ora("Fetching environments...").start();
|
|
20
|
+
try {
|
|
21
|
+
const orgId = await resolveOrgId(config.org);
|
|
22
|
+
const project = await apiGetProject(orgId, config.project);
|
|
23
|
+
spinner.succeed(chalk.green(`Environments for ${chalk.bold(project.name)}`));
|
|
24
|
+
console.log();
|
|
25
|
+
for (const env of project.environments) {
|
|
26
|
+
const isCurrent = env.slug === config.defaultEnvironment;
|
|
27
|
+
const marker = isCurrent ? chalk.cyan(" (current)") : "";
|
|
28
|
+
console.log(chalk.dim(` ${chalk.white(env.name)} (${env.slug})${marker}`));
|
|
29
|
+
}
|
|
30
|
+
console.log();
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
spinner.fail(chalk.red(err.message));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
envCommand
|
|
38
|
+
.command("create")
|
|
39
|
+
.description("Create a new environment")
|
|
40
|
+
.argument("<name>", "Environment name")
|
|
41
|
+
.action(async (name) => {
|
|
42
|
+
const config = requireProjectConfig();
|
|
43
|
+
const slug = toSlug(name);
|
|
44
|
+
if (!slug || slug.length < 2) {
|
|
45
|
+
console.error(chalk.red(" Could not generate a valid slug from that name."));
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
const spinner = ora(`Creating environment ${chalk.cyan(name)}...`).start();
|
|
49
|
+
try {
|
|
50
|
+
const orgId = await resolveOrgId(config.org);
|
|
51
|
+
const env = await apiCreateEnvironment(orgId, config.project, { name, slug });
|
|
52
|
+
spinner.succeed(chalk.green(`Environment ${chalk.bold(env.name)} (${env.slug}) created`));
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
spinner.fail(chalk.red(err.message));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
//# 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":"guard.d.ts","sourceRoot":"","sources":["../../src/commands/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkHpC,eAAO,MAAM,YAAY,SAIG,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync, unlinkSync, chmodSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { execSync } from "node:child_process";
|
|
6
|
+
const HOOK_MARKER = "# secr-guard-hook";
|
|
7
|
+
const HOOK_SCRIPT = `#!/bin/sh
|
|
8
|
+
${HOOK_MARKER}
|
|
9
|
+
# Pre-commit hook installed by secr guard — scans staged files for leaked secrets.
|
|
10
|
+
|
|
11
|
+
# Prefer local install, fall back to npx
|
|
12
|
+
if [ -x "./node_modules/.bin/secr" ]; then
|
|
13
|
+
./node_modules/.bin/secr scan --pre-commit
|
|
14
|
+
elif command -v secr >/dev/null 2>&1; then
|
|
15
|
+
secr scan --pre-commit
|
|
16
|
+
else
|
|
17
|
+
npx --yes @secr/cli scan --pre-commit
|
|
18
|
+
fi
|
|
19
|
+
`;
|
|
20
|
+
function getGitDir() {
|
|
21
|
+
try {
|
|
22
|
+
return execSync("git rev-parse --git-dir", { encoding: "utf-8" }).trim();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function getHookPath() {
|
|
29
|
+
const gitDir = getGitDir();
|
|
30
|
+
if (!gitDir)
|
|
31
|
+
return null;
|
|
32
|
+
return join(gitDir, "hooks", "pre-commit");
|
|
33
|
+
}
|
|
34
|
+
function isSecrHook(content) {
|
|
35
|
+
return content.includes(HOOK_MARKER);
|
|
36
|
+
}
|
|
37
|
+
const installCommand = new Command("install")
|
|
38
|
+
.description("Install a pre-commit hook that runs secr scan")
|
|
39
|
+
.option("--force", "Overwrite existing pre-commit hook")
|
|
40
|
+
.action((opts) => {
|
|
41
|
+
const hookPath = getHookPath();
|
|
42
|
+
if (!hookPath) {
|
|
43
|
+
console.error(chalk.red(" ✗ Not a git repository. Run this command inside a git repo.\n"));
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
if (existsSync(hookPath)) {
|
|
47
|
+
const existing = readFileSync(hookPath, "utf-8");
|
|
48
|
+
if (isSecrHook(existing)) {
|
|
49
|
+
console.log(chalk.yellow(" ⚡ secr guard hook is already installed.\n"));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!opts.force) {
|
|
53
|
+
console.error(chalk.red(" ✗ A pre-commit hook already exists."));
|
|
54
|
+
console.error(chalk.dim(" Use --force to overwrite it.\n"));
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
writeFileSync(hookPath, HOOK_SCRIPT, { mode: 0o755 });
|
|
59
|
+
chmodSync(hookPath, 0o755);
|
|
60
|
+
console.log(chalk.green(" ✓ Pre-commit hook installed!"));
|
|
61
|
+
console.log(chalk.dim(` ${hookPath}\n`));
|
|
62
|
+
console.log(chalk.dim(" Staged files will be scanned for secrets before every commit.\n"));
|
|
63
|
+
});
|
|
64
|
+
const uninstallCommand = new Command("uninstall")
|
|
65
|
+
.description("Remove the secr pre-commit hook")
|
|
66
|
+
.action(() => {
|
|
67
|
+
const hookPath = getHookPath();
|
|
68
|
+
if (!hookPath || !existsSync(hookPath)) {
|
|
69
|
+
console.log(chalk.dim(" No pre-commit hook found.\n"));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const content = readFileSync(hookPath, "utf-8");
|
|
73
|
+
if (!isSecrHook(content)) {
|
|
74
|
+
console.log(chalk.yellow(" Pre-commit hook exists but was not installed by secr. Skipping.\n"));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
unlinkSync(hookPath);
|
|
78
|
+
console.log(chalk.green(" ✓ Pre-commit hook removed.\n"));
|
|
79
|
+
});
|
|
80
|
+
const statusCommand = new Command("status")
|
|
81
|
+
.description("Check if the secr pre-commit hook is installed")
|
|
82
|
+
.action(() => {
|
|
83
|
+
const hookPath = getHookPath();
|
|
84
|
+
if (!hookPath) {
|
|
85
|
+
console.log(chalk.dim(" Not a git repository.\n"));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (!existsSync(hookPath)) {
|
|
89
|
+
console.log(chalk.yellow(" ✗ No pre-commit hook installed."));
|
|
90
|
+
console.log(chalk.dim(" Run `secr guard install` to set one up.\n"));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const content = readFileSync(hookPath, "utf-8");
|
|
94
|
+
if (isSecrHook(content)) {
|
|
95
|
+
console.log(chalk.green(" ✓ secr guard hook is active."));
|
|
96
|
+
console.log(chalk.dim(` ${hookPath}\n`));
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
console.log(chalk.yellow(" ⚠ A pre-commit hook exists but it's not from secr."));
|
|
100
|
+
console.log(chalk.dim(` ${hookPath}\n`));
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
export const guardCommand = new Command("guard")
|
|
104
|
+
.description("Manage pre-commit hook for secret leak prevention")
|
|
105
|
+
.addCommand(installCommand)
|
|
106
|
+
.addCommand(uninstallCommand)
|
|
107
|
+
.addCommand(statusCommand);
|
|
108
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/commands/guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,eAAO,MAAM,WAAW,SA6FpB,CAAC"}
|