@codemarc/blt 1.8.0 → 1.8.2

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 (55) hide show
  1. package/README.md +28 -0
  2. package/dist/blt +2 -0
  3. package/dist/blt.d.ts.map +1 -1
  4. package/dist/blt.js.map +1 -1
  5. package/dist/commands/app/data.d.ts +29 -0
  6. package/dist/commands/app/data.d.ts.map +1 -0
  7. package/dist/commands/app/data.js +70 -0
  8. package/dist/commands/app/data.js.map +1 -0
  9. package/dist/commands/app/env-check.d.ts +36 -0
  10. package/dist/commands/app/env-check.d.ts.map +1 -0
  11. package/dist/commands/app/env-check.js +110 -0
  12. package/dist/commands/app/env-check.js.map +1 -0
  13. package/dist/commands/app/paths.d.ts +6 -0
  14. package/dist/commands/app/paths.d.ts.map +1 -0
  15. package/dist/commands/app/paths.js +41 -0
  16. package/dist/commands/app/paths.js.map +1 -0
  17. package/dist/commands/app/pos.d.ts +8 -0
  18. package/dist/commands/app/pos.d.ts.map +1 -0
  19. package/dist/commands/app/pos.js +74 -0
  20. package/dist/commands/app/pos.js.map +1 -0
  21. package/dist/commands/app/shell.d.ts +9 -0
  22. package/dist/commands/app/shell.d.ts.map +1 -0
  23. package/dist/commands/app/shell.js +33 -0
  24. package/dist/commands/app/shell.js.map +1 -0
  25. package/dist/commands/app.d.ts +3 -0
  26. package/dist/commands/app.d.ts.map +1 -0
  27. package/dist/commands/app.js +139 -0
  28. package/dist/commands/app.js.map +1 -0
  29. package/dist/commands/data/apply.d.ts.map +1 -1
  30. package/dist/commands/data/apply.js +20 -3
  31. package/dist/commands/data/apply.js.map +1 -1
  32. package/dist/commands/data/helpers.d.ts +2 -2
  33. package/dist/commands/data/helpers.d.ts.map +1 -1
  34. package/dist/commands/data/helpers.js +10 -3
  35. package/dist/commands/data/helpers.js.map +1 -1
  36. package/dist/commands/data/pull.js +2 -2
  37. package/dist/commands/data/pull.js.map +1 -1
  38. package/dist/commands/env/get.d.ts.map +1 -1
  39. package/dist/commands/env/get.js +4 -2
  40. package/dist/commands/env/get.js.map +1 -1
  41. package/dist/commands/init/script.d.ts +1 -0
  42. package/dist/commands/init/script.d.ts.map +1 -1
  43. package/dist/commands/init/script.js +22 -3
  44. package/dist/commands/init/script.js.map +1 -1
  45. package/dist/commands/init.d.ts.map +1 -1
  46. package/dist/commands/init.js +8 -1
  47. package/dist/commands/init.js.map +1 -1
  48. package/dist/commands/spin/setup.d.ts.map +1 -1
  49. package/dist/commands/spin/setup.js +2 -1
  50. package/dist/commands/spin/setup.js.map +1 -1
  51. package/dist/lib/repositories.d.ts +2 -0
  52. package/dist/lib/repositories.d.ts.map +1 -1
  53. package/dist/lib/repositories.js +13 -0
  54. package/dist/lib/repositories.js.map +1 -1
  55. package/package.json +1 -1
package/README.md CHANGED
@@ -20,6 +20,7 @@
20
20
  - **Show**: Schema info, row counts, env vars, DB version, repo list
21
21
  - **Env**: Decrypt trailz `.trailz/env/.env.<name>.bin` to `.env` via smash (`blt env get`; requires `SMASH_KEY`)
22
22
  - **Spin**: Manage DigitalOcean droplets and DNS for BLT test environments
23
+ - **App**: Developer-triggered POS deployment and test data refresh workflows
23
24
  - **Cleanup**: Remove generated SQL/instance files, clean infrequently used YAML tags
24
25
 
25
26
  ## Installation
@@ -82,6 +83,7 @@ blt deploy schema
82
83
  | `blt bucket` | names, list, upload, download, url, clear |
83
84
  | `blt show` | schema, counts, env, db, repo |
84
85
  | `blt spin` | up, down, list, status, ssh, dns, setup |
86
+ | `blt app` | POS deploy and test data refresh workflows |
85
87
  | `blt env` | get (decrypt trailz env to `.env`) |
86
88
  | `blt cleanup` | generated, tags |
87
89
 
@@ -423,6 +425,32 @@ blt deploy sql ./migrations/001_init.sql
423
425
 
424
426
  ---
425
427
 
428
+ ## App Commands
429
+
430
+ The `app` namespace wraps developer on-demand workflows for BLT test environments.
431
+
432
+ ### `blt app pos --branch <branch> --env <env> <target>`
433
+
434
+ Build and deploy POS to a configured test target.
435
+
436
+ ```bash
437
+ blt app pos --branch laf-test --env test-laf test1
438
+ ```
439
+
440
+ The first implementation uses the existing `deploy/sites/test1.bltcore.com` layout and deploys through SSH/SCP to the target alias.
441
+
442
+ ### `blt app data refresh --from <source-env> --to <target-env>`
443
+
444
+ Pull a data snapshot from one environment and apply it to another.
445
+
446
+ ```bash
447
+ blt app data refresh --from laf --to test-laf
448
+ ```
449
+
450
+ This command uses `.trailz/env/.env.<name>.bin` bundles in the **current working directory** (for example a deploy site checkout) and the existing `blt data pull` / `blt data apply` implementation. Snapshots default to `<cwd>/snapshots/` in **toon** format (override with `--out` / `--format`).
451
+
452
+ ---
453
+
426
454
  ## Data snapshots (`blt data`)
427
455
 
428
456
  Export **instance-shaped** rows from Postgres into portable **JSON**, **YAML**, or **TOON** ([Token-Oriented Object Notation](https://toonformat.dev)) payloads that mirror `data/schema/instances/<instance>/yaml/`: `table:` / `procedure:` / `function:` targets plus `{ row }[]`. TOON yields smaller prompts for LLM workflows; `blt data apply` accepts `.toon` snapshots the same as JSON/YAML.
package/dist/blt CHANGED
@@ -15,6 +15,7 @@ import templateCommand from "./commands/template";
15
15
  import envCommand from "./commands/env";
16
16
  import dataCommand from "./commands/data";
17
17
  import spinCommand from "./commands/spin";
18
+ import appCommand from "./commands/app";
18
19
  import { join, dirname } from "node:path";
19
20
  import { readFileSync } from "node:fs";
20
21
  import { fileURLToPath } from "node:url";
@@ -43,6 +44,7 @@ templateCommand(program);
43
44
  envCommand(program);
44
45
  dataCommand(program);
45
46
  spinCommand(program);
47
+ appCommand(program);
46
48
  // If no command is provided, show help
47
49
  const args = process.argv.slice(2);
48
50
  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":";AA0BA,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C"}
1
+ {"version":3,"file":"blt.d.ts","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";AA2BA,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;AAClD,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAE1C,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;AACpB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AAEvB,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"}
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;AACxC,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,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;AACpB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,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,29 @@
1
+ import type { Logger } from "@caporal/core";
2
+ type DataFormat = "json" | "yaml" | "toon";
3
+ /** Default `--out` segment; resolved under the invocation cwd (not the data repo). */
4
+ export declare const APP_DATA_DEFAULT_OUT = "data-snapshots";
5
+ export declare const APP_DATA_DEFAULT_FORMAT: DataFormat;
6
+ /** Absolute snapshot base dir anchored to where the user ran the command. */
7
+ export declare function resolveAppSnapshotOutDir(out: string, invocationCwd?: string): string;
8
+ export type AppDataPullOptions = {
9
+ env: string;
10
+ out: string;
11
+ format: DataFormat;
12
+ };
13
+ export type AppDataApplyOptions = {
14
+ env: string;
15
+ snapshotDir: string;
16
+ out: string;
17
+ dryRun: boolean;
18
+ };
19
+ export type AppDataRefreshOptions = {
20
+ from: string;
21
+ to: string;
22
+ out: string;
23
+ format: DataFormat;
24
+ };
25
+ export declare function appDataPull(opts: AppDataPullOptions, logger: Logger): Promise<void>;
26
+ export declare function appDataApply(opts: AppDataApplyOptions, logger: Logger): Promise<void>;
27
+ export declare function appDataRefresh(opts: AppDataRefreshOptions, logger: Logger): Promise<void>;
28
+ export {};
29
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/commands/app/data.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAO5C,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3C,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AAErD,eAAO,MAAM,uBAAuB,EAAE,UAAmB,CAAC;AAE1D,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,SAAgB,GAAG,MAAM,CAE3F;AAED,MAAM,MAAM,kBAAkB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,UAAU,CAAC;CACnB,CAAC;AAsBF,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzF;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB3F;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/F"}
@@ -0,0 +1,70 @@
1
+ import { isAbsolute, resolve } from "node:path";
2
+ import { dataPull } from "../data/pull";
3
+ import { dataApply } from "../data/apply";
4
+ import { resolveLatestSnapshot } from "../data/helpers";
5
+ import { ensureAppEnv, parseDotEnvContent, trailzEnvBasePath } from "./env-check";
6
+ import { readCommand } from "./shell";
7
+ /** Default `--out` segment; resolved under the invocation cwd (not the data repo). */
8
+ export const APP_DATA_DEFAULT_OUT = "data-snapshots";
9
+ export const APP_DATA_DEFAULT_FORMAT = "toon";
10
+ /** Absolute snapshot base dir anchored to where the user ran the command. */
11
+ export function resolveAppSnapshotOutDir(out, invocationCwd = process.cwd()) {
12
+ return isAbsolute(out) ? out : resolve(invocationCwd, out);
13
+ }
14
+ function loadDataEnv(envName, logger) {
15
+ const cwd = process.cwd();
16
+ const availability = ensureAppEnv({ envName, cwd, logger, trailzOnly: true });
17
+ const envPath = trailzEnvBasePath(cwd, envName);
18
+ const content = readCommand("smash", ["-n", envPath], logger, { cwd });
19
+ if (!content.trim()) {
20
+ throw new Error(`Env bundle produced no output: ${availability.bundlePath}`);
21
+ }
22
+ return parseDotEnvContent(content);
23
+ }
24
+ function withTemporaryEnv(env, run) {
25
+ const previous = process.env;
26
+ process.env = env;
27
+ return run().finally(() => {
28
+ process.env = previous;
29
+ });
30
+ }
31
+ export async function appDataPull(opts, logger) {
32
+ const invocationCwd = process.cwd();
33
+ const outDir = resolveAppSnapshotOutDir(opts.out, invocationCwd);
34
+ const env = loadDataEnv(opts.env, logger);
35
+ logger.info(`Snapshots base: ${outDir}`);
36
+ await withTemporaryEnv(env, async () => {
37
+ await dataPull(opts.env, {
38
+ outBaseDir: outDir,
39
+ format: opts.format,
40
+ includeUsers: true,
41
+ includeSecrets: false,
42
+ includeExtraTables: true,
43
+ }, logger);
44
+ });
45
+ }
46
+ export async function appDataApply(opts, logger) {
47
+ const invocationCwd = process.cwd();
48
+ const outDir = resolveAppSnapshotOutDir(opts.out, invocationCwd);
49
+ const env = loadDataEnv(opts.env, logger);
50
+ await withTemporaryEnv(env, async () => {
51
+ let snapshotDir = opts.snapshotDir;
52
+ if (snapshotDir === "latest") {
53
+ const resolved = resolveLatestSnapshot(outDir);
54
+ if (!resolved) {
55
+ throw new Error(`No snapshots found under ${outDir}/`);
56
+ }
57
+ snapshotDir = resolved;
58
+ logger.info(`Resolved latest -> ${snapshotDir}`);
59
+ }
60
+ else if (!isAbsolute(snapshotDir)) {
61
+ snapshotDir = resolve(invocationCwd, snapshotDir);
62
+ }
63
+ await dataApply(snapshotDir, { dryRun: opts.dryRun }, logger);
64
+ });
65
+ }
66
+ export async function appDataRefresh(opts, logger) {
67
+ await appDataPull({ env: opts.from, out: opts.out, format: opts.format }, logger);
68
+ await appDataApply({ env: opts.to, snapshotDir: "latest", out: opts.out, dryRun: false }, logger);
69
+ }
70
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/commands/app/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { Logger } from "@caporal/core";
2
+ /** Canonical tag written by `blt env get` and recognized on preflight. */
3
+ export declare const BLT_ENV_NAME_KEY = "BLT_ENV_NAME";
4
+ /** Legacy / human-readable header (still parsed for older `.env` files). */
5
+ export declare const ENV_FROM_COMMENT_RE: RegExp;
6
+ export type AppEnvSource = "local-dotenv" | "trailz-bundle";
7
+ export type AppEnvAvailability = {
8
+ envName: string;
9
+ source: AppEnvSource;
10
+ cwd: string;
11
+ dotEnvPath: string;
12
+ bundlePath: string;
13
+ };
14
+ export declare function trailzEnvBasePath(cwd: string, envName: string): string;
15
+ export declare function trailzEnvBundlePath(cwd: string, envName: string): string;
16
+ /** Device-manager bundle name paired with a site env (e.g. test1 → test1-dm). */
17
+ export declare function siteDmEnvName(siteEnvName: string): string;
18
+ export declare function appDmEnvPath(cwd: string): string;
19
+ export declare function dotEnvPathFor(cwd: string): string;
20
+ /** Header prepended when decrypting trailz env bundles to `.env`. */
21
+ export declare function formatEnvFileHeader(envName: string): string;
22
+ /** Parse `BLT_ENV_NAME` or `# from .trailz/env/.env.<name>.bin` from a `.env` body. */
23
+ export declare function parseEnvNameFromDotEnv(content: string): string | null;
24
+ export declare function parseDotEnvContent(content: string, baseEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
25
+ /**
26
+ * Fail fast when the requested env is not available in `cwd`.
27
+ * Accepts a loaded, tagged `.env` or a trailz ciphertext bundle (+ SMASH_KEY).
28
+ */
29
+ export declare function ensureAppEnv(opts: {
30
+ envName: string;
31
+ cwd: string;
32
+ logger?: Logger;
33
+ /** When true, skip cwd `.env` and require `.trailz/env/.env.<name>.bin` (app data workflows). */
34
+ trailzOnly?: boolean;
35
+ }): AppEnvAvailability;
36
+ //# sourceMappingURL=env-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-check.d.ts","sourceRoot":"","sources":["../../../src/commands/app/env-check.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,QAA6E,CAAC;AAE9G,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,eAAe,CAAC;AAE5D,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,UAAU,CAe/G;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,kBAAkB,CAsDrB"}
@@ -0,0 +1,110 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ /** Canonical tag written by `blt env get` and recognized on preflight. */
4
+ export const BLT_ENV_NAME_KEY = "BLT_ENV_NAME";
5
+ /** Legacy / human-readable header (still parsed for older `.env` files). */
6
+ export const ENV_FROM_COMMENT_RE = /^#\s*from\s+\.trailz\/env\/\.env\.([a-zA-Z0-9][a-zA-Z0-9._-]*)\.bin\s*$/m;
7
+ export function trailzEnvBasePath(cwd, envName) {
8
+ return join(cwd, ".trailz", "env", `.env.${envName}`);
9
+ }
10
+ export function trailzEnvBundlePath(cwd, envName) {
11
+ return `${trailzEnvBasePath(cwd, envName)}.bin`;
12
+ }
13
+ /** Device-manager bundle name paired with a site env (e.g. test1 → test1-dm). */
14
+ export function siteDmEnvName(siteEnvName) {
15
+ return `${siteEnvName}-dm`;
16
+ }
17
+ export function appDmEnvPath(cwd) {
18
+ return join(cwd, "app", ".dm.env");
19
+ }
20
+ export function dotEnvPathFor(cwd) {
21
+ return join(cwd, ".env");
22
+ }
23
+ /** Header prepended when decrypting trailz env bundles to `.env`. */
24
+ export function formatEnvFileHeader(envName) {
25
+ return [
26
+ `# BLT environment: ${envName}`,
27
+ `# from .trailz/env/.env.${envName}.bin`,
28
+ `${BLT_ENV_NAME_KEY}=${envName}`,
29
+ "",
30
+ ].join("\n");
31
+ }
32
+ /** Parse `BLT_ENV_NAME` or `# from .trailz/env/.env.<name>.bin` from a `.env` body. */
33
+ export function parseEnvNameFromDotEnv(content) {
34
+ for (const rawLine of content.split("\n")) {
35
+ const line = rawLine.trim();
36
+ if (!line || line.startsWith("#"))
37
+ continue;
38
+ if (line.startsWith(`${BLT_ENV_NAME_KEY}=`)) {
39
+ const value = line.slice(BLT_ENV_NAME_KEY.length + 1).trim();
40
+ return value.length > 0 ? value : null;
41
+ }
42
+ }
43
+ const commentMatch = ENV_FROM_COMMENT_RE.exec(content);
44
+ return commentMatch?.[1] ?? null;
45
+ }
46
+ export function parseDotEnvContent(content, baseEnv = process.env) {
47
+ const nextEnv = { ...baseEnv };
48
+ for (const rawLine of content.split("\n")) {
49
+ const line = rawLine.trim();
50
+ if (!line || line.startsWith("#"))
51
+ continue;
52
+ if (line.startsWith(`${BLT_ENV_NAME_KEY}=`))
53
+ continue;
54
+ const eq = line.indexOf("=");
55
+ if (eq <= 0)
56
+ continue;
57
+ const key = line.slice(0, eq).trim();
58
+ const value = line.slice(eq + 1).trim();
59
+ nextEnv[key] = value;
60
+ }
61
+ return nextEnv;
62
+ }
63
+ /**
64
+ * Fail fast when the requested env is not available in `cwd`.
65
+ * Accepts a loaded, tagged `.env` or a trailz ciphertext bundle (+ SMASH_KEY).
66
+ */
67
+ export function ensureAppEnv(opts) {
68
+ const bundlePath = trailzEnvBundlePath(opts.cwd, opts.envName);
69
+ const dotEnvPath = dotEnvPathFor(opts.cwd);
70
+ if (!opts.trailzOnly && existsSync(dotEnvPath)) {
71
+ const content = readFileSync(dotEnvPath, "utf8");
72
+ if (content.trim()) {
73
+ const loadedName = parseEnvNameFromDotEnv(content);
74
+ if (loadedName === opts.envName) {
75
+ opts.logger?.info(`Environment "${opts.envName}" loaded in ${dotEnvPath}`);
76
+ return {
77
+ envName: opts.envName,
78
+ source: "local-dotenv",
79
+ cwd: opts.cwd,
80
+ dotEnvPath,
81
+ bundlePath,
82
+ };
83
+ }
84
+ if (loadedName) {
85
+ throw new Error(`Local .env is tagged for "${loadedName}", but this command requires "${opts.envName}".\n` +
86
+ ` cd ${opts.cwd} && blt env get ${opts.envName}`);
87
+ }
88
+ opts.logger?.info(`Local .env exists in ${opts.cwd} but is not tagged with ${BLT_ENV_NAME_KEY}; checking trailz bundle`);
89
+ }
90
+ }
91
+ if (!existsSync(bundlePath)) {
92
+ throw new Error(`Environment "${opts.envName}" is not available in ${opts.cwd}.\n` +
93
+ ` Expected tagged .env (${BLT_ENV_NAME_KEY}=${opts.envName}) or ciphertext at:\n` +
94
+ ` ${bundlePath}\n` +
95
+ ` Load with: cd ${opts.cwd} && blt env get ${opts.envName}`);
96
+ }
97
+ if (!process.env.SMASH_KEY) {
98
+ throw new Error(`Trailz env bundle found for "${opts.envName}" but SMASH_KEY is not set.\n` +
99
+ ` export SMASH_KEY=... or load a tagged .env with: blt env get ${opts.envName}`);
100
+ }
101
+ opts.logger?.info(`Environment "${opts.envName}" available via ${bundlePath}`);
102
+ return {
103
+ envName: opts.envName,
104
+ source: "trailz-bundle",
105
+ cwd: opts.cwd,
106
+ dotEnvPath,
107
+ bundlePath,
108
+ };
109
+ }
110
+ //# sourceMappingURL=env-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-check.js","sourceRoot":"","sources":["../../../src/commands/app/env-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function findWorkspaceRoot(startDir?: string): string;
2
+ export declare function resolveDeploySiteDir(target: string, workspaceRoot?: string): string;
3
+ export declare function resolveDataRepoDir(workspaceRoot?: string): string;
4
+ export declare function resolveDataEnvBundle(envName: string, dataDir?: string): string;
5
+ export { trailzEnvBasePath, trailzEnvBundlePath } from "./env-check";
6
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/commands/app/paths.ts"],"names":[],"mappings":"AAIA,wBAAgB,iBAAiB,CAAC,QAAQ,SAAgB,GAAG,MAAM,CAmBlE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,SAAsB,GAAG,MAAM,CAMhG;AAED,wBAAgB,kBAAkB,CAAC,aAAa,SAAsB,GAAG,MAAM,CAM9E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,SAAuB,GAAG,MAAM,CAM5F;AAED,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { trailzEnvBundlePath } from "./env-check";
4
+ export function findWorkspaceRoot(startDir = process.cwd()) {
5
+ let current = resolve(startDir);
6
+ for (;;) {
7
+ if (existsSync(join(current, "tools", "cli")) &&
8
+ existsSync(join(current, "deploy")) &&
9
+ existsSync(join(current, "data"))) {
10
+ return current;
11
+ }
12
+ const parent = dirname(current);
13
+ if (parent === current) {
14
+ throw new Error("Could not find BLT workspace root. Run from inside the BLT workspace or a subrepo checkout.");
15
+ }
16
+ current = parent;
17
+ }
18
+ }
19
+ export function resolveDeploySiteDir(target, workspaceRoot = findWorkspaceRoot()) {
20
+ const siteDir = join(workspaceRoot, "deploy", "sites", `${target}.bltcore.com`);
21
+ if (!existsSync(siteDir)) {
22
+ throw new Error(`Deploy site directory not found: ${siteDir}`);
23
+ }
24
+ return siteDir;
25
+ }
26
+ export function resolveDataRepoDir(workspaceRoot = findWorkspaceRoot()) {
27
+ const dataDir = join(workspaceRoot, "data");
28
+ if (!existsSync(dataDir)) {
29
+ throw new Error(`Data repo directory not found: ${dataDir}`);
30
+ }
31
+ return dataDir;
32
+ }
33
+ export function resolveDataEnvBundle(envName, dataDir = resolveDataRepoDir()) {
34
+ const bundlePath = trailzEnvBundlePath(dataDir, envName);
35
+ if (!existsSync(bundlePath)) {
36
+ throw new Error(`Data env bundle not found: ${bundlePath}`);
37
+ }
38
+ return bundlePath;
39
+ }
40
+ export { trailzEnvBasePath, trailzEnvBundlePath } from "./env-check";
41
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/commands/app/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,UAAU,iBAAiB,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;IACzD,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,SAAS,CAAC;QACT,IACC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YACzC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACnC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAChC,CAAC;YACF,OAAO,OAAO,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACd,6FAA6F,CAC7F,CAAC;QACH,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IAClB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,aAAa,GAAG,iBAAiB,EAAE;IACvF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,CAAC;IAChF,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,aAAa,GAAG,iBAAiB,EAAE;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,OAAO,GAAG,kBAAkB,EAAE;IACnF,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Logger } from "@caporal/core";
2
+ export type DeployPosAppOptions = {
3
+ target: string;
4
+ branch: string;
5
+ env: string;
6
+ };
7
+ export declare function deployPosApp(opts: DeployPosAppOptions, logger: Logger): Promise<void>;
8
+ //# sourceMappingURL=pos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pos.d.ts","sourceRoot":"","sources":["../../../src/commands/app/pos.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAK5C,MAAM,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC;AAQF,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmF3F"}
@@ -0,0 +1,74 @@
1
+ import { existsSync, rmSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { findWorkspaceRoot, resolveDeploySiteDir } from "./paths";
4
+ import { appDmEnvPath, ensureAppEnv, siteDmEnvName, trailzEnvBundlePath } from "./env-check";
5
+ import { runCommand } from "./shell";
6
+ function removeIfExists(path) {
7
+ if (existsSync(path)) {
8
+ rmSync(path, { recursive: true, force: true });
9
+ }
10
+ }
11
+ export async function deployPosApp(opts, logger) {
12
+ const workspaceRoot = findWorkspaceRoot();
13
+ const siteDir = resolveDeploySiteDir(opts.target, workspaceRoot);
14
+ const envPlain = join(siteDir, ".env");
15
+ const appZip = join(siteDir, "app.zip");
16
+ const siteEnvRel = `.trailz/env/.env.${opts.env}`;
17
+ ensureAppEnv({ envName: opts.env, cwd: siteDir, logger });
18
+ logger.info(`Deploying POS branch "${opts.branch}" with env "${opts.env}" to "${opts.target}"`);
19
+ logger.info(`Site directory: ${siteDir}`);
20
+ runCommand("bash", ["-lc", `smash -n ../../../.trailz/keys | grep GITHUB_TOKEN > .env`], logger, {
21
+ cwd: siteDir,
22
+ });
23
+ runCommand("bash", ["-lc", `printf '\\nTZ=America/New_York\\n' >> .env`], logger, {
24
+ cwd: siteDir,
25
+ });
26
+ runCommand("docker", ["build", "-f", "Dockerfile", "-t", "blt-core-pos", "."], logger, {
27
+ cwd: siteDir,
28
+ });
29
+ runCommand("bash", ["-lc", `smash -n ${siteEnvRel} >> .env`], logger, {
30
+ cwd: siteDir,
31
+ });
32
+ runCommand("docker", [
33
+ "run",
34
+ "-it",
35
+ "--rm",
36
+ "--env-file",
37
+ ".env",
38
+ "-e",
39
+ `BRANCH=${opts.branch}`,
40
+ "-v",
41
+ "./app/laf:/home/blt/laf",
42
+ "blt-core-pos",
43
+ "/home/blt/buildcore.sh",
44
+ ], logger, { cwd: siteDir });
45
+ const dmEnvName = siteDmEnvName(opts.env);
46
+ const dmBundlePath = trailzEnvBundlePath(siteDir, dmEnvName);
47
+ const dmEnvOut = appDmEnvPath(siteDir);
48
+ const dmSiteEnvRel = `.trailz/env/.env.${dmEnvName}`;
49
+ if (existsSync(dmBundlePath)) {
50
+ logger.info(`Writing gateway env from .trailz/env/.env.${dmEnvName}.bin → app/.dm.env`);
51
+ runCommand("bash", ["-lc", `smash -n ${dmSiteEnvRel} > app/.dm.env`], logger, {
52
+ cwd: siteDir,
53
+ });
54
+ }
55
+ else {
56
+ logger.info(`No DM env bundle at ${dmBundlePath}; skipping app/.dm.env`);
57
+ if (existsSync(dmEnvOut)) {
58
+ rmSync(dmEnvOut, { force: true });
59
+ }
60
+ }
61
+ removeIfExists(appZip);
62
+ runCommand("zip", ["-9r", "app.zip", "app/"], logger, { cwd: siteDir });
63
+ runCommand("bash", ["-lc", `smash -n ${siteEnvRel} > .env`], logger, {
64
+ cwd: siteDir,
65
+ });
66
+ runCommand("scp", [envPlain, `${opts.target}:`], logger, { cwd: siteDir });
67
+ runCommand("scp", [appZip, `${opts.target}:`], logger, { cwd: siteDir });
68
+ runCommand("ssh", [
69
+ opts.target,
70
+ "rm -rf app.last && mv app app.last && unzip app.zip && cd app && docker compose restart",
71
+ ], logger, { cwd: siteDir });
72
+ logger.info("POS deploy complete.");
73
+ }
74
+ //# sourceMappingURL=pos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pos.js","sourceRoot":"","sources":["../../../src/commands/app/pos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAQrC,SAAS,cAAc,CAAC,IAAY;IACnC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB,EAAE,MAAc;IAC3E,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,oBAAoB,IAAI,CAAC,GAAG,EAAE,CAAC;IAElD,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAE1D,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,MAAM,eAAe,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAChG,MAAM,CAAC,IAAI,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;IAE1C,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,2DAA2D,CAAC,EAAE,MAAM,EAAE;QAChG,GAAG,EAAE,OAAO;KACZ,CAAC,CAAC;IACH,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,4CAA4C,CAAC,EAAE,MAAM,EAAE;QACjF,GAAG,EAAE,OAAO;KACZ,CAAC,CAAC;IAEH,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE;QACtF,GAAG,EAAE,OAAO;KACZ,CAAC,CAAC;IAEH,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,YAAY,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE;QACrE,GAAG,EAAE,OAAO;KACZ,CAAC,CAAC;IAEH,UAAU,CACT,QAAQ,EACR;QACC,KAAK;QACL,KAAK;QACL,MAAM;QACN,YAAY;QACZ,MAAM;QACN,IAAI;QACJ,UAAU,IAAI,CAAC,MAAM,EAAE;QACvB,IAAI;QACJ,yBAAyB;QACzB,cAAc;QACd,wBAAwB;KACxB,EACD,MAAM,EACN,EAAE,GAAG,EAAE,OAAO,EAAE,CAChB,CAAC;IAEF,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,oBAAoB,SAAS,EAAE,CAAC;IAErD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,6CAA6C,SAAS,oBAAoB,CAAC,CAAC;QACxF,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,YAAY,YAAY,gBAAgB,CAAC,EAAE,MAAM,EAAE;YAC7E,GAAG,EAAE,OAAO;SACZ,CAAC,CAAC;IACJ,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,uBAAuB,YAAY,wBAAwB,CAAC,CAAC;QACzE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IAED,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAExE,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,YAAY,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE;QACpE,GAAG,EAAE,OAAO;KACZ,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,UAAU,CACT,KAAK,EACL;QACC,IAAI,CAAC,MAAM;QACX,yFAAyF;KACzF,EACD,MAAM,EACN,EAAE,GAAG,EAAE,OAAO,EAAE,CAChB,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Logger } from "@caporal/core";
2
+ export type RunCommandOptions = {
3
+ cwd?: string;
4
+ env?: NodeJS.ProcessEnv;
5
+ stdio?: "inherit" | "pipe";
6
+ };
7
+ export declare function runCommand(command: string, args: string[], logger: Logger, options?: RunCommandOptions): void;
8
+ export declare function readCommand(command: string, args: string[], logger: Logger, options?: Omit<RunCommandOptions, "stdio">): string;
9
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/commands/app/shell.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,MAAM,iBAAiB,GAAG;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,UAAU,CACzB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC7B,IAAI,CAgBN;AAED,wBAAgB,WAAW,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAM,GAC5C,MAAM,CAkBR"}
@@ -0,0 +1,33 @@
1
+ import { spawnSync } from "node:child_process";
2
+ export function runCommand(command, args, logger, options = {}) {
3
+ logger.info(`$ ${[command, ...args].join(" ")}`);
4
+ const result = spawnSync(command, args, {
5
+ cwd: options.cwd,
6
+ env: options.env ?? process.env,
7
+ stdio: options.stdio ?? "inherit",
8
+ encoding: "utf8",
9
+ });
10
+ if (result.error) {
11
+ throw result.error;
12
+ }
13
+ if ((result.status ?? 0) !== 0) {
14
+ throw new Error(`${command} exited with code ${result.status}`);
15
+ }
16
+ }
17
+ export function readCommand(command, args, logger, options = {}) {
18
+ logger.info(`$ ${[command, ...args].join(" ")}`);
19
+ const result = spawnSync(command, args, {
20
+ cwd: options.cwd,
21
+ env: options.env ?? process.env,
22
+ stdio: "pipe",
23
+ encoding: "utf8",
24
+ });
25
+ if (result.error) {
26
+ throw result.error;
27
+ }
28
+ if ((result.status ?? 0) !== 0) {
29
+ throw new Error(`${command} exited with code ${result.status}: ${result.stderr}`);
30
+ }
31
+ return result.stdout;
32
+ }
33
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/commands/app/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAS/C,MAAM,UAAU,UAAU,CACzB,OAAe,EACf,IAAc,EACd,MAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;QACvC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;QAC/B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;QACjC,QAAQ,EAAE,MAAM;KAChB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;AACF,CAAC;AAED,MAAM,UAAU,WAAW,CAC1B,OAAe,EACf,IAAc,EACd,MAAc,EACd,UAA4C,EAAE;IAE9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;QACvC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;QAC/B,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;KAChB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,qBAAqB,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Program } from "@caporal/core";
2
+ export default function appCommand(program: Program): void;
3
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/commands/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,eAAe,CAAC;AAyC5E,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,OAAO,EAAE,OAAO,QA2IlD"}