@codemarc/blt 1.6.2 → 1.6.4
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 +17 -1
- package/dist/blt +2 -0
- package/dist/blt.d.ts.map +1 -1
- package/dist/blt.js.map +1 -1
- package/dist/commands/env/get.d.ts +7 -0
- package/dist/commands/env/get.d.ts.map +1 -0
- package/dist/commands/env/get.js +55 -0
- package/dist/commands/env/get.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 +37 -0
- package/dist/commands/env.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
- **Bucket**: Supabase storage — list buckets, list/upload/download files, get URLs
|
|
18
18
|
- **Workflow**: List, show, delete, reload, and deploy GitHub Actions workflows (requires `gh`)
|
|
19
19
|
- **Show**: Schema info, row counts, env vars, DB version, repo list
|
|
20
|
+
- **Env**: Decrypt trailz `.trailz/env/.env.<name>.bin` to `.env` via smash (`blt env get`; requires `SMASH_KEY`)
|
|
20
21
|
- **Cleanup**: Remove generated SQL/instance files, clean infrequently used YAML tags
|
|
21
22
|
|
|
22
23
|
## Installation
|
|
@@ -74,6 +75,7 @@ blt deploy schema
|
|
|
74
75
|
| `blt workflow`| list, show, delete, reload, deploy |
|
|
75
76
|
| `blt bucket` | names, list, upload, download, url, clear |
|
|
76
77
|
| `blt show` | schema, counts, env, db, repo |
|
|
78
|
+
| `blt env` | get (decrypt trailz env to `.env`) |
|
|
77
79
|
| `blt cleanup` | generated, tags |
|
|
78
80
|
|
|
79
81
|
Run `blt <command>` with no subcommand for help (e.g. `blt image`, `blt pdf`).
|
|
@@ -733,6 +735,20 @@ blt show repo --ssh
|
|
|
733
735
|
|
|
734
736
|
---
|
|
735
737
|
|
|
738
|
+
## Env Commands
|
|
739
|
+
|
|
740
|
+
### `blt env get <name>`
|
|
741
|
+
|
|
742
|
+
Decrypt using `smash -n`. Ciphertext must be at `.trailz/env/.env.<name>.bin`; the CLI invokes smash with **`.env.<name>` (no `.bin`)** — that matches `@codemarc/smashdata`, which reads `${path}.bin` for decrypt. Set **`SMASH_KEY`** in your environment (same as when you encrypted). Writes plaintext to `.env` in the current directory.
|
|
743
|
+
|
|
744
|
+
```bash
|
|
745
|
+
blt env get laf
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
Equivalent to `smash -n .trailz/env/.env.laf >.env` from the project root when `.trailz/env/.env.laf.bin` exists.
|
|
749
|
+
|
|
750
|
+
---
|
|
751
|
+
|
|
736
752
|
## Cleanup Commands
|
|
737
753
|
|
|
738
754
|
### `blt cleanup generated`
|
|
@@ -768,7 +784,7 @@ blt cleanup tags joanne --min-count 2 --dry-run
|
|
|
768
784
|
|
|
769
785
|
## Environment Variables
|
|
770
786
|
|
|
771
|
-
Bucket and database operations typically use Supabase configuration (e.g. from `.env`). The `blt show env` command displays BLT core environment variables.
|
|
787
|
+
Bucket and database operations typically use Supabase configuration (e.g. from `.env`). The `blt show env` command displays BLT core environment variables. To materialize `.env` from a committed encrypted file under `.trailz/env/`, use `blt env get <name>`.
|
|
772
788
|
|
|
773
789
|
---
|
|
774
790
|
|
package/dist/blt
CHANGED
|
@@ -12,6 +12,7 @@ import cleanupCommand from "./commands/cleanup";
|
|
|
12
12
|
import workflowCommand from "./commands/workflow";
|
|
13
13
|
import waiCommand from "./commands/wai";
|
|
14
14
|
import templateCommand from "./commands/template";
|
|
15
|
+
import envCommand from "./commands/env";
|
|
15
16
|
import { join, dirname } from "node:path";
|
|
16
17
|
import { readFileSync } from "node:fs";
|
|
17
18
|
import { fileURLToPath } from "node:url";
|
|
@@ -37,6 +38,7 @@ cleanupCommand(program);
|
|
|
37
38
|
workflowCommand(program);
|
|
38
39
|
waiCommand(program);
|
|
39
40
|
templateCommand(program);
|
|
41
|
+
envCommand(program);
|
|
40
42
|
// If no command is provided, show help
|
|
41
43
|
const args = process.argv.slice(2);
|
|
42
44
|
if (args.length === 0) {
|
package/dist/blt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blt.d.ts","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"blt.d.ts","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";AAwBA,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C"}
|
package/dist/blt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blt.js","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,OAAO,eAAe,MAAM,qBAAqB,CAAC;AAClD,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,eAAe,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"blt.js","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,OAAO,eAAe,MAAM,qBAAqB,CAAC;AAClD,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,eAAe,MAAM,qBAAqB,CAAC;AAClD,OAAO,UAAU,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAG,IAAI,EAAE,cAAc,CAAC,CAAC;AAE/D,MAAM,UAAU,iBAAiB;IAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,OAAO,WAAW,CAAC,OAAO,CAAC;AAC7B,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;KACjB,OAAO,CAAC,iBAAiB,EAAE,CAAC;KAC5B,WAAW,CAAC,cAAc,CAAC,CAAC;AAE5B,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,UAAU,CAAC,OAAO,CAAC,CAAC;AAEtB,uCAAuC;AACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACtB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AACD,OAAO,CAAC,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Logger } from "@caporal/core";
|
|
2
|
+
/**
|
|
3
|
+
* Decrypt `.trailz/env/.env.<name>.bin` with smash (`-n`) and write plaintext to `.env`.
|
|
4
|
+
* Invokes smash with path `.trailz/env/.env.<name>` (no `.bin`) so smash reads `${path}.bin`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function envGet(name: string, logger: Logger): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=get.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/env/get.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAwB5C;;;GAGG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCxE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
/** Single path segment for `.env.<name>` under `.trailz/env/`. */
|
|
4
|
+
const NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;
|
|
5
|
+
/**
|
|
6
|
+
* `@codemarc/smashdata` `smash` expects the **plaintext path** `tf` (e.g. `.env.laf`).
|
|
7
|
+
* Ciphertext must live at `${tf}.bin`. If you pass `tf` = `.env.laf.bin`, that file
|
|
8
|
+
* exists as `tf`, so smash treats it as plaintext and **re-encrypts** — output is garbage.
|
|
9
|
+
*/
|
|
10
|
+
function resolveSmashCommand(cwd) {
|
|
11
|
+
const binSmash = join(cwd, "node_modules", ".bin", "smash");
|
|
12
|
+
const script = join(cwd, "node_modules", "@codemarc", "smashdata", "smash");
|
|
13
|
+
if (existsSync(binSmash)) {
|
|
14
|
+
return [binSmash];
|
|
15
|
+
}
|
|
16
|
+
if (existsSync(script)) {
|
|
17
|
+
return ["node", script];
|
|
18
|
+
}
|
|
19
|
+
return ["bunx", "@codemarc/smashdata"];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Decrypt `.trailz/env/.env.<name>.bin` with smash (`-n`) and write plaintext to `.env`.
|
|
23
|
+
* Invokes smash with path `.trailz/env/.env.<name>` (no `.bin`) so smash reads `${path}.bin`.
|
|
24
|
+
*/
|
|
25
|
+
export async function envGet(name, logger) {
|
|
26
|
+
if (!NAME_RE.test(name)) {
|
|
27
|
+
logger.error("Invalid environment name: use one segment (letters, numbers, . _ -).");
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const cwd = process.cwd();
|
|
31
|
+
const dir = join(cwd, ".trailz", "env");
|
|
32
|
+
/** Plaintext path smash expects; ciphertext is `${basePath}.bin`. */
|
|
33
|
+
const basePath = join(dir, `.env.${name}`);
|
|
34
|
+
const binPath = `${basePath}.bin`;
|
|
35
|
+
if (!existsSync(binPath)) {
|
|
36
|
+
logger.error(`Encrypted env not found (need ciphertext at):\n ${binPath}\n` +
|
|
37
|
+
`Smash stores secrets in .env.<name>.bin; the argument to smash is .env.<name> without .bin.`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const smashCmd = resolveSmashCommand(cwd);
|
|
41
|
+
const proc = Bun.spawnSync({
|
|
42
|
+
cmd: [...smashCmd, "-n", basePath],
|
|
43
|
+
cwd,
|
|
44
|
+
env: process.env,
|
|
45
|
+
stdout: "pipe",
|
|
46
|
+
stderr: "inherit",
|
|
47
|
+
});
|
|
48
|
+
if (proc.exitCode !== 0) {
|
|
49
|
+
process.exit(proc.exitCode ?? 1);
|
|
50
|
+
}
|
|
51
|
+
const outPath = join(cwd, ".env");
|
|
52
|
+
await Bun.write(outPath, proc.stdout);
|
|
53
|
+
logger.info(`Wrote ${outPath}`);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/env/get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,kEAAkE;AAClE,MAAM,OAAO,GAAG,8BAA8B,CAAC;AAE/C;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,GAAW;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5E,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,MAAc;IACxD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CACX,sEAAsE,CACtE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACxC,qEAAqE;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,QAAQ,MAAM,CAAC;IAElC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CACX,oDAAoD,OAAO,IAAI;YAC9D,6FAA6F,CAC9F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC;QAC1B,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC;QAClC,GAAG;QACH,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,OAAO,EAAE,MAAM,eAAe,CAAC;AAG5E,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAO,EAAE,OAAO,QA2ClD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { envGet } from "./env/get";
|
|
2
|
+
export default function envCommand(program) {
|
|
3
|
+
const envHelpText = `
|
|
4
|
+
env utilities (trailz / smash)
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
blt env <operation>
|
|
8
|
+
|
|
9
|
+
Available operations:
|
|
10
|
+
get <name> Decrypt .trailz/env/.env.<name>.bin with smash and write .env (invokes smash with .env.<name> path; see @codemarc/smashdata)
|
|
11
|
+
|
|
12
|
+
Requires: SMASH_KEY, ciphertext at .trailz/env/.env.<name>.bin, and smash (@codemarc/smashdata) via node_modules or bunx.
|
|
13
|
+
|
|
14
|
+
Run 'blt env get --help' for more information.
|
|
15
|
+
`;
|
|
16
|
+
program
|
|
17
|
+
.command("env", "decrypt trailz env to .env")
|
|
18
|
+
.help(envHelpText)
|
|
19
|
+
.action(() => {
|
|
20
|
+
console.log(envHelpText);
|
|
21
|
+
});
|
|
22
|
+
program
|
|
23
|
+
.command("env get", "Decrypt named trailz env to .env")
|
|
24
|
+
.hide()
|
|
25
|
+
.argument("<name>", "Environment name (ciphertext: .trailz/env/.env.<name>.bin)")
|
|
26
|
+
.action(async ({ args, logger, }) => {
|
|
27
|
+
try {
|
|
28
|
+
await envGet(args.name, logger);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
32
|
+
logger.error(message);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAgB;IAClD,MAAM,WAAW,GAAG;;;;;;;;;;;;CAYpB,CAAC;IAED,OAAO;SACL,OAAO,CAAC,KAAK,EAAE,4BAA4B,CAAC;SAC5C,IAAI,CAAC,WAAW,CAAC;SACjB,MAAM,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,SAAS,EAAE,kCAAkC,CAAC;SACtD,IAAI,EAAE;SACN,QAAQ,CAAC,QAAQ,EAAE,4DAA4D,CAAC;SAChF,MAAM,CACN,KAAK,EAAE,EACN,IAAI,EACJ,MAAM,GAIN,EAAE,EAAE;QACJ,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,IAAI,CAAC,IAAc,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CACD,CAAC;AACJ,CAAC"}
|