@codemarc/blt 1.10.2 → 1.10.5

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 CHANGED
@@ -615,22 +615,46 @@ Snapshots default under `data-snapshots/` from the **current working directory**
615
615
 
616
616
  ## Init Commands
617
617
 
618
+ ### `blt init root`
619
+
620
+ Clone the umbrella repository (`bltcore-com/blt`). Start here on a fresh machine.
621
+
622
+ ```bash
623
+ blt init root -s
624
+ cd blt
625
+ blt init -w -s
626
+ ./getblt.sh
627
+ ```
628
+
629
+ **Options:**
630
+
631
+ - `-d, --directory <name>` — Clone directory name (default: `blt`)
632
+ - `-p, --parent <path>` — Parent directory (default: `.`)
633
+ - `-s, --ssh` — Use SSH URL instead of HTTPS
634
+ - `-g, --gh` — Use GitHub CLI (`gh repo clone`)
635
+
618
636
  ### `blt init [options]`
619
637
 
620
- Create a shell script to clone or pull all BLT repositories.
638
+ Create a shell script to fast-forward sync sibling BLT repositories. Run the generated script from the **umbrella repo root** (`bltcore-com/blt`), not from a parent directory.
621
639
 
622
640
  ```bash
623
- blt init
624
- blt init -w -c
641
+ blt init root -s
642
+ cd blt
643
+ blt init -w -s
644
+ blt init -b -s # bundle: single-root workspace
625
645
  ./getblt.sh
626
646
  ```
627
647
 
628
648
  **Options:**
629
649
 
630
- - `-o, --output <path>` — Output path for the script (default: ./getblt.sh)
650
+ - `-o, --output <path>` — Output path for the script (default: `./getblt.sh`)
631
651
  - `-s, --ssh` — Use SSH URLs instead of HTTPS
632
- - `-w, --workspace` — Also generate blt.code-workspace with folder entries
633
- - `-c, --connections` — Add sqltools.connections from .env (requires -w)
652
+ - `-g, --gh` — Use GitHub CLI (`gh repo clone`) instead of `git clone`
653
+ - `-w, --workspace` — Generate `blt.code-workspace` (umbrella at `.` plus one folder per sibling repo)
654
+ - `-b, --bundle` — Sync umbrella into `.` when needed; single-root workspace (`blt` → `.`)
655
+ - `-c, --connections` — Add `sqltools.connections` from `.env` (requires `-w` or `-b`)
656
+
657
+ **Repository list:** `repositories.json` in the umbrella repo root (or `BLT_REPOSITORIES_PATH`). Re-run `blt init` after editing it to refresh `getblt.sh`.
634
658
 
635
659
  ---
636
660
 
@@ -0,0 +1,10 @@
1
+ import type { Logger } from "@caporal/core";
2
+ export interface InitRootOptions {
3
+ directory: string;
4
+ parent: string;
5
+ ssh: boolean;
6
+ gh: boolean;
7
+ }
8
+ /** Clone the umbrella BLT repository into parent/directory. */
9
+ export declare function cloneUmbrellaRoot(options: InitRootOptions, logger: Logger): Promise<void>;
10
+ //# sourceMappingURL=root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../../src/commands/init/root.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAO5C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;CACb;AAgBD,+DAA+D;AAC/D,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAkCf"}
@@ -0,0 +1,34 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ import { ensureGhReady, ghCloneTarget } from "../../lib/github";
5
+ import { getBundleRepository } from "../../lib/repositories";
6
+ function runOrExit(command, args, cwd, logger, label) {
7
+ const result = spawnSync(command, args, { cwd, stdio: "inherit" });
8
+ if (result.status !== 0) {
9
+ logger.error(`${label} failed`);
10
+ process.exit(result.status === null ? 1 : result.status);
11
+ }
12
+ }
13
+ /** Clone the umbrella BLT repository into parent/directory. */
14
+ export async function cloneUmbrellaRoot(options, logger) {
15
+ const parent = resolve(options.parent);
16
+ const target = join(parent, options.directory);
17
+ if (existsSync(target)) {
18
+ logger.error(`Target already exists: ${target}`);
19
+ process.exit(1);
20
+ }
21
+ const bundle = getBundleRepository();
22
+ if (options.gh) {
23
+ ensureGhReady(logger);
24
+ runOrExit("gh", ["repo", "clone", ghCloneTarget(bundle, options.ssh), options.directory], parent, logger, "gh repo clone");
25
+ }
26
+ else {
27
+ const url = options.ssh ? bundle.sshUrl : bundle.url;
28
+ runOrExit("git", ["clone", url, options.directory], parent, logger, "git clone");
29
+ }
30
+ logger.info(`Cloned umbrella repo to ${target}`);
31
+ logger.info(`cd ${options.directory}`);
32
+ logger.info("Then run: blt init -w -s # or blt init -b -s");
33
+ }
34
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../../../src/commands/init/root.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAS7D,SAAS,SAAS,CAChB,OAAe,EACf,IAAc,EACd,GAAW,EACX,MAAc,EACd,KAAa;IAEb,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAwB,EACxB,MAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IAErC,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;QACf,aAAa,CAAC,MAAM,CAAC,CAAC;QACtB,SAAS,CACP,IAAI,EACJ,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EACxE,MAAM,EACN,MAAM,EACN,eAAe,CAChB,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACrD,SAAS,CACP,KAAK,EACL,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,EACjC,MAAM,EACN,MAAM,EACN,WAAW,CACZ,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { Logger } from "@caporal/core";
2
- interface InitScriptOptions {
2
+ import { type Repository } from "../../lib/repositories";
3
+ export interface InitScriptOptions {
3
4
  output: string;
4
5
  ssh: boolean;
5
6
  gh: boolean;
@@ -7,6 +8,41 @@ interface InitScriptOptions {
7
8
  bundleWorkspace: boolean;
8
9
  connectionsFromEnv: boolean;
9
10
  }
11
+ interface WorkspaceFolder {
12
+ name?: string;
13
+ path: string;
14
+ }
15
+ interface SqlConnection {
16
+ ssh: string;
17
+ previewLimit: number;
18
+ server: string;
19
+ port: number;
20
+ driver: string;
21
+ name: string;
22
+ group: string;
23
+ database: string;
24
+ password: string;
25
+ username: string;
26
+ }
27
+ interface WorkspaceContent {
28
+ folders?: WorkspaceFolder[];
29
+ settings?: {
30
+ "sqltools.connections"?: SqlConnection[];
31
+ };
32
+ }
33
+ export declare function connectionFromSupabaseEnv(env: Record<string, string>): SqlConnection | null;
34
+ /** Bash lines to fast-forward sync an existing git checkout. */
35
+ export declare function gitPullFfOnlyLines(label: string, indent?: string): string[];
36
+ /** Bash lines to clone or fast-forward sync the umbrella repo at `.`. */
37
+ export declare function bundleUmbrellaSyncLines(gh: boolean, ssh: boolean): string[];
38
+ /** Bash lines to clone or fast-forward sync one sibling repository. */
39
+ export declare function subRepoSyncLines(repo: Repository, gh: boolean, ssh: boolean): string[];
40
+ /** Workspace folder entries for `-w` / `-b` modes. */
41
+ export declare function workspaceFoldersForInit(workspace: boolean, bundleWorkspace: boolean): WorkspaceFolder[] | undefined;
42
+ /** Build the getblt.sh script body (without writing files). */
43
+ export declare function buildInitScriptLines(options: InitScriptOptions): string[];
44
+ export declare function buildWorkspaceContent(options: InitScriptOptions, baseDir: string, logger: Logger): WorkspaceContent;
45
+ export declare function validateInitOptions(options: InitScriptOptions): string | null;
10
46
  /**
11
47
  * Generate a shell script that clones or pulls all BLT projects into the current directory
12
48
  */
@@ -1 +1 @@
1
- {"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../../src/commands/init/script.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAU5C,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAiED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CA6Hf"}
1
+ {"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../../src/commands/init/script.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAQ5C,OAAO,EAAwE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAE/H,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,gBAAgB;IACxB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE;QAAE,sBAAsB,CAAC,EAAE,aAAa,EAAE,CAAA;KAAE,CAAC;CACzD;AAuBD,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,aAAa,GAAG,IAAI,CAsBtB;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CAKvE;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAa3E;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,OAAO,GACX,MAAM,EAAE,CAoBV;AAED,sDAAsD;AACtD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,OAAO,EAClB,eAAe,EAAE,OAAO,GACvB,eAAe,EAAE,GAAG,SAAS,CAe/B;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,EAAE,CA+BzE;AAgCD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,gBAAgB,CAuBlB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAS7E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAiDf"}
@@ -1,7 +1,7 @@
1
1
  import { chmodSync, existsSync, readFileSync } from "node:fs";
2
2
  import { dirname, join, resolve } from "node:path";
3
3
  import { ensureGhReady, ghInitScriptPreamble, ghRepoCloneCommand, } from "../../lib/github";
4
- import { BUNDLE_REPOSITORY, REPOSITORIES } from "../../lib/repositories";
4
+ import { getBundleRepository, getRepositoryManifestSource, getSubRepositories } from "../../lib/repositories";
5
5
  function parseEnvFile(envPath) {
6
6
  const content = readFileSync(envPath, "utf-8");
7
7
  const out = {};
@@ -26,7 +26,7 @@ function parseEnvFile(envPath) {
26
26
  }
27
27
  return out;
28
28
  }
29
- function connectionFromSupabaseEnv(env) {
29
+ export function connectionFromSupabaseEnv(env) {
30
30
  const connectionString = env.SUPABASE_CONNECTION_STRING;
31
31
  if (!connectionString?.startsWith("postgresql://"))
32
32
  return null;
@@ -50,69 +50,159 @@ function connectionFromSupabaseEnv(env) {
50
50
  return null;
51
51
  }
52
52
  }
53
- /**
54
- * Generate a shell script that clones or pulls all BLT projects into the current directory
55
- */
56
- export async function generateInitScript(options, logger) {
57
- if (options.gh) {
58
- ensureGhReady(logger);
53
+ /** Bash lines to fast-forward sync an existing git checkout. */
54
+ export function gitPullFfOnlyLines(label, indent = "") {
55
+ return [
56
+ `${indent}git fetch origin`,
57
+ `${indent}git pull --ff-only || { echo "ERROR: ${label}: fast-forward pull failed; resolve locally and re-run." >&2; exit 1; }`,
58
+ ];
59
+ }
60
+ /** Bash lines to clone or fast-forward sync the umbrella repo at `.`. */
61
+ export function bundleUmbrellaSyncLines(gh, ssh) {
62
+ const bundle = getBundleRepository();
63
+ const bundleUrl = ssh ? bundle.sshUrl : bundle.url;
64
+ const lines = [`if [ -d ".git" ]; then`];
65
+ lines.push(...gitPullFfOnlyLines("umbrella repo", " "));
66
+ lines.push(`else`);
67
+ if (gh) {
68
+ lines.push(` ${ghRepoCloneCommand(bundle, ".", ssh)}`);
69
+ }
70
+ else {
71
+ lines.push(` git clone ${bundleUrl} .`);
72
+ }
73
+ lines.push(`fi`);
74
+ return lines;
75
+ }
76
+ /** Bash lines to clone or fast-forward sync one sibling repository. */
77
+ export function subRepoSyncLines(repo, gh, ssh) {
78
+ const lines = [
79
+ `# ${repo.description || repo.name}`,
80
+ `if [ -d "${repo.name}" ]; then`,
81
+ ` echo "Pulling ${repo.name}..."`,
82
+ ` (`,
83
+ ` cd ${repo.name}`,
84
+ ...gitPullFfOnlyLines(repo.name, " "),
85
+ ` )`,
86
+ `else`,
87
+ ` echo "Cloning ${repo.name}..."`,
88
+ ];
89
+ if (gh) {
90
+ lines.push(` ${ghRepoCloneCommand(repo, repo.name, ssh)}`);
91
+ }
92
+ else {
93
+ const url = ssh ? repo.sshUrl : repo.url;
94
+ lines.push(` git clone ${url} ${repo.name}`);
95
+ }
96
+ lines.push(`fi`, "");
97
+ return lines;
98
+ }
99
+ /** Workspace folder entries for `-w` / `-b` modes. */
100
+ export function workspaceFoldersForInit(workspace, bundleWorkspace) {
101
+ if (bundleWorkspace) {
102
+ return [{ name: getBundleRepository().name, path: "." }];
103
+ }
104
+ if (workspace) {
105
+ const bundle = getBundleRepository();
106
+ return [
107
+ { name: bundle.name, path: "." },
108
+ ...getSubRepositories().map((repo) => ({
109
+ name: repo.name,
110
+ path: repo.name,
111
+ })),
112
+ ];
59
113
  }
114
+ return undefined;
115
+ }
116
+ /** Build the getblt.sh script body (without writing files). */
117
+ export function buildInitScriptLines(options) {
60
118
  const lines = [
61
119
  "#!/usr/bin/env bash",
62
- "# BLT project init script - clones or pulls all projects into the current directory",
120
+ "# BLT project init script - clones or pulls sibling repos into the current directory",
63
121
  "# Generated by: blt init",
122
+ "# Run from the umbrella repo root (bltcore-com/blt), after: git clone …/blt.git && cd blt",
64
123
  "",
65
- 'set -e',
124
+ "set -e",
66
125
  "",
67
- "cd \"$(dirname \"$0\")\"",
126
+ 'cd "$(dirname "$0")"',
68
127
  "",
69
128
  ];
70
129
  if (options.gh) {
71
130
  lines.push(...ghInitScriptPreamble());
72
131
  }
73
132
  if (options.bundleWorkspace) {
74
- lines.push(`# ${BUNDLE_REPOSITORY.description}`);
75
- lines.push(`echo "Syncing ${BUNDLE_REPOSITORY.name} (umbrella)..."`);
76
- if (options.gh) {
77
- lines.push(`if [ -d ".git" ]; then`);
78
- lines.push(` git fetch origin`);
79
- lines.push(` git reset --hard origin/HEAD`);
80
- lines.push(`else`);
81
- lines.push(` ${ghRepoCloneCommand(BUNDLE_REPOSITORY, ".", options.ssh)}`);
82
- lines.push(`fi`);
83
- }
84
- else {
85
- const bundleUrl = options.ssh ? BUNDLE_REPOSITORY.sshUrl : BUNDLE_REPOSITORY.url;
86
- lines.push(`if [ ! -d ".git" ]; then`);
87
- lines.push(` git init`);
88
- lines.push(`fi`);
89
- lines.push(`if ! git remote get-url origin &>/dev/null; then`);
90
- lines.push(` git remote add origin ${bundleUrl}`);
91
- lines.push(`fi`);
92
- lines.push(`git fetch origin`);
93
- lines.push(`git reset --hard origin/HEAD`);
94
- }
133
+ const bundle = getBundleRepository();
134
+ lines.push(`# ${bundle.description}`);
135
+ lines.push(`echo "Syncing ${bundle.name} (umbrella)..."`);
136
+ lines.push(...bundleUmbrellaSyncLines(options.gh, options.ssh));
95
137
  lines.push("");
96
138
  }
97
- for (const repo of REPOSITORIES) {
98
- lines.push(`# ${repo.description || repo.name}`);
99
- lines.push(`if [ -d "${repo.name}" ]; then`);
100
- lines.push(` echo "Pulling ${repo.name}..."`);
101
- lines.push(` (cd ${repo.name} && git pull)`);
102
- lines.push(`else`);
103
- lines.push(` echo "Cloning ${repo.name}..."`);
104
- if (options.gh) {
105
- lines.push(` ${ghRepoCloneCommand(repo, repo.name, options.ssh)}`);
106
- }
107
- else {
108
- const url = options.ssh ? repo.sshUrl : repo.url;
109
- lines.push(` git clone ${url} ${repo.name}`);
139
+ for (const repo of getSubRepositories()) {
140
+ lines.push(...subRepoSyncLines(repo, options.gh, options.ssh));
141
+ }
142
+ lines.push('echo "Done! All projects are up to date."');
143
+ return lines;
144
+ }
145
+ function applyConnectionsFromEnv(workspaceContent, baseDir, logger) {
146
+ const envPath = join(baseDir, ".env");
147
+ if (!existsSync(envPath)) {
148
+ logger.warn(`No .env at ${envPath}; skipping SQLTools connections.`);
149
+ return;
150
+ }
151
+ const env = parseEnvFile(envPath);
152
+ const connection = connectionFromSupabaseEnv(env);
153
+ if (!connection) {
154
+ logger.warn(`SUPABASE_CONNECTION_STRING missing or invalid in ${envPath}; skipping SQLTools connections.`);
155
+ return;
156
+ }
157
+ workspaceContent.settings = {
158
+ ...(workspaceContent.settings ?? {}),
159
+ "sqltools.connections": [connection],
160
+ };
161
+ logger.warn("SQLTools connection includes database credentials in blt.code-workspace. " +
162
+ "Do not commit this file if it contains secrets; add blt.code-workspace to .gitignore or use user settings.");
163
+ }
164
+ export function buildWorkspaceContent(options, baseDir, logger) {
165
+ const workspaceContent = {};
166
+ const folders = workspaceFoldersForInit(options.workspace, options.bundleWorkspace);
167
+ if (folders) {
168
+ workspaceContent.folders = folders;
169
+ if (options.bundleWorkspace) {
170
+ workspaceContent.settings = {};
110
171
  }
111
- lines.push(`fi`);
112
- lines.push("");
113
172
  }
114
- lines.push("echo \"Done! All projects are up to date.\"");
115
- const script = lines.join("\n");
173
+ if (options.connectionsFromEnv) {
174
+ applyConnectionsFromEnv(workspaceContent, baseDir, logger);
175
+ }
176
+ if (!workspaceContent.folders) {
177
+ workspaceContent.folders = [];
178
+ }
179
+ return workspaceContent;
180
+ }
181
+ export function validateInitOptions(options) {
182
+ if (options.connectionsFromEnv &&
183
+ !options.workspace &&
184
+ !options.bundleWorkspace) {
185
+ return "-c requires -w or -b; SQLTools connections are written to blt.code-workspace";
186
+ }
187
+ return null;
188
+ }
189
+ /**
190
+ * Generate a shell script that clones or pulls all BLT projects into the current directory
191
+ */
192
+ export async function generateInitScript(options, logger) {
193
+ const validationError = validateInitOptions(options);
194
+ if (validationError) {
195
+ logger.error(validationError);
196
+ process.exit(1);
197
+ }
198
+ if (options.gh) {
199
+ ensureGhReady(logger);
200
+ }
201
+ const manifestSource = getRepositoryManifestSource();
202
+ if (manifestSource !== "bundled") {
203
+ logger.info(`Using repository manifest: ${manifestSource}`);
204
+ }
205
+ const script = buildInitScriptLines(options).join("\n");
116
206
  try {
117
207
  await Bun.write(options.output, script);
118
208
  // Make executable on Unix
@@ -123,37 +213,11 @@ export async function generateInitScript(options, logger) {
123
213
  // chmod may fail on Windows, ignore
124
214
  }
125
215
  logger.info(`Created init script: ${options.output}`);
126
- if (options.workspace || options.bundleWorkspace || options.connectionsFromEnv) {
216
+ logger.info("Re-run blt init after editing repositories.json to refresh getblt.sh");
217
+ if (options.workspace || options.bundleWorkspace) {
127
218
  const baseDir = resolve(dirname(options.output));
128
219
  const workspacePath = join(baseDir, "blt.code-workspace");
129
- const workspaceContent = {};
130
- if (options.bundleWorkspace) {
131
- workspaceContent.folders = [{ name: "blt", path: "." }];
132
- workspaceContent.settings = {};
133
- }
134
- else if (options.workspace) {
135
- workspaceContent.folders = REPOSITORIES.map((repo) => ({
136
- name: repo.name,
137
- path: repo.name,
138
- }));
139
- }
140
- if (options.connectionsFromEnv) {
141
- const envPath = join(baseDir, ".env");
142
- if (existsSync(envPath)) {
143
- const env = parseEnvFile(envPath);
144
- const connection = connectionFromSupabaseEnv(env);
145
- if (connection) {
146
- workspaceContent.settings = {
147
- ...(workspaceContent.settings ?? {}),
148
- "sqltools.connections": [connection],
149
- };
150
- }
151
- }
152
- }
153
- // Ensure we have at least folders so the file is valid
154
- if (!workspaceContent.folders) {
155
- workspaceContent.folders = [];
156
- }
220
+ const workspaceContent = buildWorkspaceContent(options, baseDir, logger);
157
221
  await Bun.write(workspacePath, JSON.stringify(workspaceContent, null, "\t") + "\n");
158
222
  logger.info(`Created workspace: ${workspacePath}`);
159
223
  }
@@ -1 +1 @@
1
- {"version":3,"file":"script.js","sourceRoot":"","sources":["../../../src/commands/init/script.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"script.js","sourceRoot":"","sources":["../../../src/commands/init/script.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,EAAE,OAAO,QAyDnD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,EAAE,OAAO,QA0GnD"}
@@ -1,30 +1,75 @@
1
1
  import { generateInitScript } from "./init/script";
2
+ import { cloneUmbrellaRoot } from "./init/root";
2
3
  /**
3
4
  * Register init command with the CLI program
4
5
  */
5
6
  export default function initCommand(program) {
7
+ const initRootHelpText = `
8
+ Clone the BLT umbrella repository (bltcore-com/blt)
9
+
10
+ Usage:
11
+ blt init root [options]
12
+
13
+ Equivalent to:
14
+ git clone git@github.com:bltcore-com/blt.git blt
15
+ cd blt
16
+
17
+ Then generate getblt.sh from inside the clone:
18
+ blt init -w -s
19
+
20
+ Example:
21
+ blt init root -s
22
+ cd blt
23
+ blt init -w -s
24
+ ./getblt.sh
25
+ `;
26
+ program
27
+ .command("init root", "clone umbrella blt repo")
28
+ .help(initRootHelpText)
29
+ .option("-d, --directory <name>", "Directory name for the clone", {
30
+ default: "blt",
31
+ })
32
+ .option("-p, --parent <path>", "Parent directory to clone into", {
33
+ default: ".",
34
+ })
35
+ .option("-s, --ssh", "Use SSH URL instead of HTTPS", { default: false })
36
+ .option("-g, --gh", "Use GitHub CLI (gh repo clone) instead of git clone", {
37
+ default: false,
38
+ })
39
+ .action(async ({ options, logger }) => {
40
+ await cloneUmbrellaRoot({
41
+ directory: options.directory,
42
+ parent: options.parent,
43
+ ssh: options.ssh,
44
+ gh: options.gh,
45
+ }, logger);
46
+ });
6
47
  const initHelpText = `
7
48
  Initialize a BLT workspace by creating a script to clone/pull all projects
8
49
 
9
50
  Usage:
10
51
  blt init [options]
11
52
 
12
- Creates a shell script that will clone all BLT repositories (if they don't exist)
13
- or pull the latest changes (if they do). Run the generated script in the
14
- directory where you want the projects to live.
53
+ Creates a shell script that clones or fast-forward pulls sibling BLT repositories
54
+ (tools, data, pos, ). Run the generated script from the umbrella repo root
55
+ (bltcore-com/blt), not from a parent directory.
15
56
 
16
- With -w, also creates blt.code-workspace with folder entries from the repository list.
17
- With -b, clones/pulls the umbrella repo (codemarc/blt) first, then sub-repos, and
18
- creates blt.code-workspace as a single-root workspace (name "blt", path ".").
19
- With -c, adds sqltools.connections from SUPABASE_* vars in .env if present.
57
+ With -w, also creates blt.code-workspace with the umbrella at "." plus one folder
58
+ per sibling repo.
59
+ With -b, clones/pulls the umbrella repo (bltcore-com/blt) into "." when needed,
60
+ then sub-repos, and creates blt.code-workspace as a single-root workspace
61
+ (name "blt", path ".").
62
+ With -c, adds sqltools.connections from SUPABASE_* vars in .env (requires -w or -b).
20
63
  With -g, use GitHub CLI (gh repo clone) instead of git clone. Requires gh auth login.
21
64
 
22
65
  Example:
23
- blt init
24
- blt init -w -c
25
- blt init -b
26
- blt init -g
66
+ blt init root -s
67
+ cd blt
68
+ blt init -w -s
27
69
  ./getblt.sh
70
+
71
+ Repository list: bundled src/lib/repositories.manifest.json, or override with
72
+ ./repositories.json in the current directory or BLT_REPOSITORIES_PATH.
28
73
  `;
29
74
  program
30
75
  .command("init", "clone repo script")
@@ -42,7 +87,7 @@ Example:
42
87
  .option("-b, --bundle", "Also generate blt.code-workspace as a single-root workspace (blt → .)", {
43
88
  default: false,
44
89
  })
45
- .option("-c, --connections", "Add sqltools.connections from .env if present", {
90
+ .option("-c, --connections", "Add sqltools.connections from .env (requires -w or -b)", {
46
91
  default: false,
47
92
  })
48
93
  .action(async ({ options, logger }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAgB;IACnD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBrB,CAAC;IAED,OAAO;SACL,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC;SACpC,IAAI,CAAC,YAAY,CAAC;SAClB,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,EAAE;QAC5D,OAAO,EAAE,aAAa;KACtB,CAAC;SACD,MAAM,CAAC,WAAW,EAAE,oCAAoC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SAC7E,MAAM,CAAC,UAAU,EAAE,qDAAqD,EAAE;QAC1E,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,iBAAiB,EAAE,iEAAiE,EAAE;QAC7F,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,cAAc,EAAE,uEAAuE,EAAE;QAChG,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,mBAAmB,EAAE,+CAA+C,EAAE;QAC7E,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QACrC,MAAM,kBAAkB,CACvB;YACC,MAAM,EAAE,OAAO,CAAC,MAAgB;YAChC,GAAG,EAAE,OAAO,CAAC,GAAc;YAC3B,EAAE,EAAE,OAAO,CAAC,EAAa;YACzB,SAAS,EAAE,OAAO,CAAC,SAAoB;YACvC,eAAe,EAAE,OAAO,CAAC,MAAiB;YAC1C,kBAAkB,EAAE,OAAO,CAAC,WAAsB;SAClD,EACD,MAAM,CACN,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAgB;IACnD,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;CAkBzB,CAAC;IAED,OAAO;SACL,OAAO,CAAC,WAAW,EAAE,yBAAyB,CAAC;SAC/C,IAAI,CAAC,gBAAgB,CAAC;SACtB,MAAM,CAAC,wBAAwB,EAAE,8BAA8B,EAAE;QACjE,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,qBAAqB,EAAE,gCAAgC,EAAE;QAChE,OAAO,EAAE,GAAG;KACZ,CAAC;SACD,MAAM,CAAC,WAAW,EAAE,8BAA8B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SACvE,MAAM,CAAC,UAAU,EAAE,qDAAqD,EAAE;QAC1E,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QACrC,MAAM,iBAAiB,CACtB;YACC,SAAS,EAAE,OAAO,CAAC,SAAmB;YACtC,MAAM,EAAE,OAAO,CAAC,MAAgB;YAChC,GAAG,EAAE,OAAO,CAAC,GAAc;YAC3B,EAAE,EAAE,OAAO,CAAC,EAAa;SACzB,EACD,MAAM,CACN,CAAC;IACH,CAAC,CAAC,CAAC;IAEJ,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BrB,CAAC;IAED,OAAO;SACL,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC;SACpC,IAAI,CAAC,YAAY,CAAC;SAClB,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,EAAE;QAC5D,OAAO,EAAE,aAAa;KACtB,CAAC;SACD,MAAM,CAAC,WAAW,EAAE,oCAAoC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SAC7E,MAAM,CAAC,UAAU,EAAE,qDAAqD,EAAE;QAC1E,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,iBAAiB,EAAE,iEAAiE,EAAE;QAC7F,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,cAAc,EAAE,uEAAuE,EAAE;QAChG,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,mBAAmB,EAAE,wDAAwD,EAAE;QACtF,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QACrC,MAAM,kBAAkB,CACvB;YACC,MAAM,EAAE,OAAO,CAAC,MAAgB;YAChC,GAAG,EAAE,OAAO,CAAC,GAAc;YAC3B,EAAE,EAAE,OAAO,CAAC,EAAa;YACzB,SAAS,EAAE,OAAO,CAAC,SAAoB;YACvC,eAAe,EAAE,OAAO,CAAC,MAAiB;YAC1C,kBAAkB,EAAE,OAAO,CAAC,WAAsB;SAClD,EACD,MAAM,CACN,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,4 +1,4 @@
1
- import { REPOSITORIES } from "../../lib/repositories";
1
+ import { getRepositories } from "../../lib/repositories";
2
2
  /**
3
3
  * Render a table row for ASCII table display
4
4
  */
@@ -19,7 +19,7 @@ export async function showRepo(options, logger) {
19
19
  console.log("\n📦 Current Repositories\n");
20
20
  const headers = ["Name", "Description", options.ssh ? "SSH URL" : "URL"];
21
21
  const tableRows = [headers];
22
- for (const repo of REPOSITORIES) {
22
+ for (const repo of getRepositories()) {
23
23
  tableRows.push([
24
24
  repo.name,
25
25
  repo.description || "",
@@ -36,7 +36,7 @@ export async function showRepo(options, logger) {
36
36
  }
37
37
  console.log("");
38
38
  // Print summary
39
- console.log(`Total repositories: ${REPOSITORIES.length}\n`);
39
+ console.log(`Total repositories: ${getRepositories().length}\n`);
40
40
  }
41
41
  catch (error) {
42
42
  const message = error instanceof Error ? error.message : String(error);
@@ -1 +1 @@
1
- {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../../src/commands/show/repo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAMtD;;GAEG;AACH,SAAS,SAAS,CAAC,GAAa,EAAE,SAAmB;IACnD,OAAO,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,SAAmB;IACxC,OAAO,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAoB,EAAE,MAAc;IACjE,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,SAAS,GAAe,CAAC,OAAO,CAAC,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,CAAC,IAAI;gBACT,IAAI,CAAC,WAAW,IAAI,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;aACrC,CAAC,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAC9D,CAAC;QAEF,cAAc;QACd,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../../src/commands/show/repo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAMzD;;GAEG;AACH,SAAS,SAAS,CAAC,GAAa,EAAE,SAAmB;IACnD,OAAO,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,SAAmB;IACxC,OAAO,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAoB,EAAE,MAAc;IACjE,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,SAAS,GAAe,CAAC,OAAO,CAAC,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,EAAE,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,CAAC,IAAI;gBACT,IAAI,CAAC,WAAW,IAAI,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;aACrC,CAAC,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAC9D,CAAC;QAEF,cAAc;QACd,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,gBAAgB;QAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -1,14 +1,30 @@
1
- export interface Repository {
1
+ export interface RepositoryManifestEntry {
2
2
  name: string;
3
3
  gh: string;
4
+ description?: string;
5
+ }
6
+ export interface RepositoryManifest {
7
+ umbrella: RepositoryManifestEntry;
8
+ repositories: RepositoryManifestEntry[];
9
+ }
10
+ export interface Repository extends RepositoryManifestEntry {
4
11
  url: string;
5
12
  sshUrl: string;
6
- description?: string;
7
13
  }
14
+ export declare function parseRepositoryManifest(raw: unknown, source: string): RepositoryManifest;
15
+ /** Clear cached manifest (for tests). */
16
+ export declare function resetRepositoryCache(): void;
17
+ /** Load the active repository manifest (override file or bundled default). */
18
+ export declare function getRepositoryManifest(): RepositoryManifest;
19
+ /** Where the active manifest was loaded from (`bundled`, a path, or `BLT_REPOSITORIES_PATH`). */
20
+ export declare function getRepositoryManifestSource(): string;
8
21
  /** Umbrella meta-repo used with `blt init -b` (single-root workspace). */
9
- export declare const BUNDLE_REPOSITORY: Repository;
22
+ export declare function getBundleRepository(): Repository;
10
23
  /**
11
- * Hardcoded list of valid repositories in the current working set
24
+ * Sibling repos cloned/pulled by getblt.sh (excludes the umbrella meta-repo).
25
+ * Run getblt.sh from the umbrella checkout root, not from a parent directory.
12
26
  */
13
- export declare const REPOSITORIES: Repository[];
27
+ export declare function getSubRepositories(): Repository[];
28
+ /** Full working set including the umbrella meta-repo (for display commands). */
29
+ export declare function getRepositories(): Repository[];
14
30
  //# sourceMappingURL=repositories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repositories.d.ts","sourceRoot":"","sources":["../../src/lib/repositories.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,EAAE,UAM/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,UAAU,EAwEpC,CAAC"}
1
+ {"version":3,"file":"repositories.d.ts","sourceRoot":"","sources":["../../src/lib/repositories.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,uBAAuB,CAAC;IAClC,YAAY,EAAE,uBAAuB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,UAAW,SAAQ,uBAAuB;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAoBxF;AAaD,yCAAyC;AACzC,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AAwBD,8EAA8E;AAC9E,wBAAgB,qBAAqB,IAAI,kBAAkB,CAe1D;AAED,iGAAiG;AACjG,wBAAgB,2BAA2B,IAAI,MAAM,CAGpD;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,IAAI,UAAU,CAEhD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,UAAU,EAAE,CAEjD;AAED,gFAAgF;AAChF,wBAAgB,eAAe,IAAI,UAAU,EAAE,CAM9C"}
@@ -1,84 +1,102 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import bundledManifest from "./repositories.manifest.json";
4
+ function isManifestEntry(value) {
5
+ if (!value || typeof value !== "object")
6
+ return false;
7
+ const entry = value;
8
+ return typeof entry.name === "string" && typeof entry.gh === "string";
9
+ }
10
+ export function parseRepositoryManifest(raw, source) {
11
+ if (!raw || typeof raw !== "object") {
12
+ throw new Error(`${source}: expected a JSON object`);
13
+ }
14
+ const manifest = raw;
15
+ if (!isManifestEntry(manifest.umbrella)) {
16
+ throw new Error(`${source}: missing or invalid "umbrella" entry`);
17
+ }
18
+ if (!Array.isArray(manifest.repositories)) {
19
+ throw new Error(`${source}: missing or invalid "repositories" array`);
20
+ }
21
+ for (const [index, entry] of manifest.repositories.entries()) {
22
+ if (!isManifestEntry(entry)) {
23
+ throw new Error(`${source}: invalid repository at index ${index}`);
24
+ }
25
+ }
26
+ return {
27
+ umbrella: manifest.umbrella,
28
+ repositories: manifest.repositories,
29
+ };
30
+ }
31
+ function enrichRepo(entry) {
32
+ return {
33
+ ...entry,
34
+ url: `https://github.com/${entry.gh}.git`,
35
+ sshUrl: `git@github.com:${entry.gh}.git`,
36
+ };
37
+ }
38
+ let cachedManifest = null;
39
+ let cachedSource = null;
40
+ /** Clear cached manifest (for tests). */
41
+ export function resetRepositoryCache() {
42
+ cachedManifest = null;
43
+ cachedSource = null;
44
+ }
45
+ function loadManifestFile(path) {
46
+ const raw = JSON.parse(readFileSync(path, "utf-8"));
47
+ return parseRepositoryManifest(raw, path);
48
+ }
49
+ function resolveManifestPath() {
50
+ const envPath = process.env.BLT_REPOSITORIES_PATH?.trim();
51
+ if (envPath) {
52
+ if (!existsSync(envPath)) {
53
+ throw new Error(`BLT_REPOSITORIES_PATH does not exist: ${envPath}`);
54
+ }
55
+ return envPath;
56
+ }
57
+ const cwdPath = join(process.cwd(), "repositories.json");
58
+ if (existsSync(cwdPath)) {
59
+ return cwdPath;
60
+ }
61
+ return null;
62
+ }
63
+ /** Load the active repository manifest (override file or bundled default). */
64
+ export function getRepositoryManifest() {
65
+ if (cachedManifest) {
66
+ return cachedManifest;
67
+ }
68
+ const overridePath = resolveManifestPath();
69
+ if (overridePath) {
70
+ cachedManifest = loadManifestFile(overridePath);
71
+ cachedSource = overridePath;
72
+ return cachedManifest;
73
+ }
74
+ cachedManifest = parseRepositoryManifest(bundledManifest, "bundled manifest");
75
+ cachedSource = "bundled";
76
+ return cachedManifest;
77
+ }
78
+ /** Where the active manifest was loaded from (`bundled`, a path, or `BLT_REPOSITORIES_PATH`). */
79
+ export function getRepositoryManifestSource() {
80
+ getRepositoryManifest();
81
+ return cachedSource ?? "bundled";
82
+ }
1
83
  /** Umbrella meta-repo used with `blt init -b` (single-root workspace). */
2
- export const BUNDLE_REPOSITORY = {
3
- name: "blt",
4
- gh: "bltcore-com/blt",
5
- url: "https://github.com/bltcore-com/blt.git",
6
- sshUrl: "git@github.com:bltcore-com/blt.git",
7
- description: "BLT umbrella workspace",
8
- };
84
+ export function getBundleRepository() {
85
+ return enrichRepo(getRepositoryManifest().umbrella);
86
+ }
9
87
  /**
10
- * Hardcoded list of valid repositories in the current working set
88
+ * Sibling repos cloned/pulled by getblt.sh (excludes the umbrella meta-repo).
89
+ * Run getblt.sh from the umbrella checkout root, not from a parent directory.
11
90
  */
12
- export const REPOSITORIES = [
13
- {
14
- name: "blt",
15
- gh: "bltcore-com/blt",
16
- url: "https://github.com/bltcore-com/blt.git",
17
- sshUrl: "git@github.com:bltcore-com/blt.git",
18
- description: "workspace root",
19
- },
20
- {
21
- name: "tools",
22
- gh: "bltcore-com/tools",
23
- url: "https://github.com/bltcore-com/tools.git",
24
- sshUrl: "git@github.com:bltcore-com/tools.git",
25
- description: "tools repository",
26
- },
27
- {
28
- name: "data",
29
- gh: "bltcore-com/blt-core-data",
30
- url: "https://github.com/bltcore-com/blt-core-data.git",
31
- sshUrl: "git@github.com:bltcore-com/blt-core-data.git",
32
- description: "data schema & sample data",
33
- },
34
- {
35
- name: "pos",
36
- gh: "bltcore-com/blt-core-pos",
37
- url: "https://github.com/bltcore-com/blt-core-pos.git",
38
- sshUrl: "git@github.com:bltcore-com/blt-core-pos.git",
39
- description: "core pos application",
40
- },
41
- {
42
- name: "kiosk",
43
- gh: "bltcore-com/blt-core-kiosk",
44
- url: "https://github.com/bltcore-com/blt-core-kiosk.git",
45
- sshUrl: "git@github.com:bltcore-com/blt-core-kiosk.git",
46
- description: "self-service kiosk application",
47
- },
48
- {
49
- name: "gateway",
50
- gh: "bltcore-com/blt-device-gateway",
51
- url: "https://github.com/bltcore-com/blt-device-gateway.git",
52
- sshUrl: "git@github.com:bltcore-com/blt-device-gateway.git",
53
- description: "device manager/gateway",
54
- },
55
- {
56
- name: "agents",
57
- gh: "bltcore-com/blt-core-agents",
58
- url: "https://github.com/bltcore-com/blt-core-agents.git",
59
- sshUrl: "git@github.com:bltcore-com/blt-core-agents.git",
60
- description: "hospitality agents repository",
61
- },
62
- {
63
- name: "deploy",
64
- gh: "bltcore-com/deploy",
65
- url: "https://github.com/bltcore-com/deploy.git",
66
- sshUrl: "git@github.com:bltcore-com/deploy.git",
67
- description: "deployment scripts",
68
- },
69
- {
70
- name: "customers",
71
- gh: "bltcore-com/customers",
72
- url: "https://github.com/bltcore-com/customers.git",
73
- sshUrl: "git@github.com:bltcore-com/customers.git",
74
- description: "customer repository",
75
- },
76
- {
77
- name: "website",
78
- gh: "bltcore-com/website",
79
- url: "https://github.com/bltcore-com/website.git",
80
- sshUrl: "git@github.com:bltcore-com/website.git",
81
- description: "BLTWAI homepage",
82
- },
83
- ];
91
+ export function getSubRepositories() {
92
+ return getRepositoryManifest().repositories.map(enrichRepo);
93
+ }
94
+ /** Full working set including the umbrella meta-repo (for display commands). */
95
+ export function getRepositories() {
96
+ const bundle = getBundleRepository();
97
+ return [
98
+ { ...bundle, description: bundle.description ?? "workspace root" },
99
+ ...getSubRepositories(),
100
+ ];
101
+ }
84
102
  //# sourceMappingURL=repositories.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repositories.js","sourceRoot":"","sources":["../../src/lib/repositories.ts"],"names":[],"mappings":"AAQA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,iBAAiB,GAAe;IAC3C,IAAI,EAAE,KAAK;IACX,EAAE,EAAE,iBAAiB;IACrB,GAAG,EAAE,wCAAwC;IAC7C,MAAM,EAAE,oCAAoC;IAC5C,WAAW,EAAE,wBAAwB;CACtC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC;QACE,IAAI,EAAE,KAAK;QACX,EAAE,EAAE,iBAAiB;QACrB,GAAG,EAAE,wCAAwC;QAC7C,MAAM,EAAE,oCAAoC;QAC5C,WAAW,EAAE,gBAAgB;KAC9B;IAED;QACE,IAAI,EAAE,OAAO;QACb,EAAE,EAAE,mBAAmB;QACvB,GAAG,EAAE,0CAA0C;QAC/C,MAAM,EAAE,sCAAsC;QAC9C,WAAW,EAAE,kBAAkB;KAChC;IACD;QACE,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,2BAA2B;QAC/B,GAAG,EAAE,kDAAkD;QACvD,MAAM,EAAE,8CAA8C;QACtD,WAAW,EAAE,2BAA2B;KACzC;IACD;QACE,IAAI,EAAE,KAAK;QACX,EAAE,EAAE,0BAA0B;QAC9B,GAAG,EAAE,iDAAiD;QACtD,MAAM,EAAE,6CAA6C;QACrD,WAAW,EAAE,sBAAsB;KACpC;IACD;QACE,IAAI,EAAE,OAAO;QACb,EAAE,EAAE,4BAA4B;QAChC,GAAG,EAAE,mDAAmD;QACxD,MAAM,EAAE,+CAA+C;QACvD,WAAW,EAAE,gCAAgC;KAC9C;IACD;QACE,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,gCAAgC;QACpC,GAAG,EAAE,uDAAuD;QAC5D,MAAM,EAAE,mDAAmD;QAC3D,WAAW,EAAE,wBAAwB;KACtC;IACD;QACE,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,6BAA6B;QACjC,GAAG,EAAE,oDAAoD;QACzD,MAAM,EAAE,gDAAgD;QACxD,WAAW,EAAE,+BAA+B;KAC7C;IACD;QACE,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,oBAAoB;QACxB,GAAG,EAAE,2CAA2C;QAChD,MAAM,EAAE,uCAAuC;QAC/C,WAAW,EAAE,oBAAoB;KAClC;IACD;QACE,IAAI,EAAE,WAAW;QACjB,EAAE,EAAE,uBAAuB;QAC3B,GAAG,EAAE,8CAA8C;QACnD,MAAM,EAAE,0CAA0C;QAClD,WAAW,EAAE,qBAAqB;KACnC;IACD;QACE,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,qBAAqB;QACzB,GAAG,EAAE,4CAA4C;QACjD,MAAM,EAAE,wCAAwC;QAChD,WAAW,EAAE,iBAAiB;KAC/B;CACF,CAAC"}
1
+ {"version":3,"file":"repositories.js","sourceRoot":"","sources":["../../src/lib/repositories.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ {
2
+ "umbrella": {
3
+ "name": "blt",
4
+ "gh": "bltcore-com/blt",
5
+ "description": "BLT umbrella workspace"
6
+ },
7
+ "repositories": [
8
+ {
9
+ "name": "tools",
10
+ "gh": "bltcore-com/tools",
11
+ "description": "tools repository"
12
+ },
13
+ {
14
+ "name": "data",
15
+ "gh": "bltcore-com/blt-core-data",
16
+ "description": "data schema & sample data"
17
+ },
18
+ {
19
+ "name": "pos",
20
+ "gh": "bltcore-com/blt-core-pos",
21
+ "description": "core pos application"
22
+ },
23
+ {
24
+ "name": "kiosk",
25
+ "gh": "bltcore-com/blt-core-kiosk",
26
+ "description": "self-service kiosk application"
27
+ },
28
+ {
29
+ "name": "gateway",
30
+ "gh": "bltcore-com/blt-device-gateway",
31
+ "description": "device manager/gateway"
32
+ },
33
+ {
34
+ "name": "agents",
35
+ "gh": "bltcore-com/blt-core-agents",
36
+ "description": "hospitality agents repository"
37
+ },
38
+ {
39
+ "name": "deploy",
40
+ "gh": "bltcore-com/deploy",
41
+ "description": "deployment scripts"
42
+ },
43
+ {
44
+ "name": "customers",
45
+ "gh": "bltcore-com/customers",
46
+ "description": "customer repository"
47
+ },
48
+ {
49
+ "name": "website",
50
+ "gh": "bltcore-com/website",
51
+ "description": "BLTWAI homepage"
52
+ }
53
+ ]
54
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemarc/blt",
3
- "version": "1.10.2",
3
+ "version": "1.10.5",
4
4
  "description": "blt cli",
5
5
  "type": "module",
6
6
  "main": "dist/blt",
@@ -10,11 +10,12 @@
10
10
  },
11
11
  "files": [
12
12
  "dist",
13
+ "repositories.json.example",
13
14
  "README.md",
14
15
  "LICENSE"
15
16
  ],
16
17
  "scripts": {
17
- "build": "bunx --bun tsc && mv dist/blt.js dist/blt && chmod +x dist/blt",
18
+ "build": "bunx --bun tsc && cp src/lib/repositories.manifest.json dist/lib/repositories.manifest.json && mv dist/blt.js dist/blt && chmod +x dist/blt",
18
19
  "postbuild": "bun run src/commands/version/update.ts",
19
20
  "dev": "bunx --bun tsc --watch",
20
21
  "start": "bun run src/blt.ts",
@@ -48,21 +49,21 @@
48
49
  },
49
50
  "dependencies": {
50
51
  "@caporal/core": "^2.0.7",
51
- "@supabase/supabase-js": "^2.106.1",
52
+ "@supabase/supabase-js": "^2.108.2",
52
53
  "@toon-format/toon": "2.2.0",
53
54
  "build-number-generator": "^3.1.0",
54
55
  "debug": "^4.4.3",
55
56
  "dotenv": "^17.4.2",
56
57
  "dotenv-expand": "^13.0.0",
57
58
  "file-type": "^17.1.6",
58
- "js-yaml": "^4.1.1",
59
+ "js-yaml": "^4.2.0",
59
60
  "pdf-lib": "^1.17.1",
60
- "pg": "^8.21.0"
61
+ "pg": "^8.22.0"
61
62
  },
62
63
  "devDependencies": {
63
64
  "@types/debug": "^4.1.13",
64
65
  "@types/js-yaml": "^4.0.9",
65
- "@types/node": "^20.19.41",
66
+ "@types/node": "^20.19.43",
66
67
  "@types/pg": "^8.20.0",
67
68
  "bun-types": "^1.3.14",
68
69
  "typescript": "^5.9.3"
@@ -0,0 +1,14 @@
1
+ {
2
+ "umbrella": {
3
+ "name": "blt",
4
+ "gh": "bltcore-com/blt",
5
+ "description": "BLT umbrella workspace"
6
+ },
7
+ "repositories": [
8
+ {
9
+ "name": "tools",
10
+ "gh": "bltcore-com/tools",
11
+ "description": "tools repository"
12
+ }
13
+ ]
14
+ }
@@ -1,37 +0,0 @@
1
- import type { Logger } from "@caporal/core";
2
- export type DbDiffOptions = {
3
- sourceEnv: string;
4
- targetEnv: string;
5
- schema: string;
6
- dir: string;
7
- cwd?: string;
8
- };
9
- export type DiffArtifactKey = "source.sql" | "target.sql" | "rollforward.sql" | "rollback.sql";
10
- export type DiffManifest = {
11
- generatedAt: string;
12
- source: {
13
- kind: "env" | "file";
14
- spec: string;
15
- };
16
- target: {
17
- kind: "env" | "file";
18
- spec: string;
19
- };
20
- schema: string;
21
- dir: string;
22
- connections: {
23
- source: string;
24
- target: string;
25
- };
26
- artifacts: Partial<Record<DiffArtifactKey, {
27
- path: string;
28
- bytes: number;
29
- }>>;
30
- notes: string[];
31
- };
32
- export declare function buildDiffPlan(sourceUrl: string, targetUrl: string, schema: string, outDir: string): {
33
- rollforward: string[];
34
- rollback: string[];
35
- };
36
- export declare function dbDiff(opts: DbDiffOptions, logger: Logger): Promise<void>;
37
- //# sourceMappingURL=diff.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/commands/db/diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAoB5C,MAAM,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,eAAe,GACxB,YAAY,GACZ,YAAY,GACZ,iBAAiB,GACjB,cAAc,CAAC;AAElB,MAAM,MAAM,YAAY,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,MAAM,EAAE;QAAE,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC7E,KAAK,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAEF,wBAAgB,aAAa,CAC5B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM;;;EAgBd;AA4CD,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgH/E"}
@@ -1,123 +0,0 @@
1
- import { writeFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { runCommand } from "../app/shell";
4
- import { redactedDbUrl } from "../data/helpers";
5
- import { materializeDumpArtifact, resolveDiffEndpoint, } from "./diff-endpoint";
6
- import { resolveSchemaUrlsForDiff } from "./schema-loader";
7
- import { buildSupabaseDiffArgs, ensureOutDir, fileBytes, prependHeader, requireSupabaseCli, resolveOutDir, runSchemaDump, sqlFileHeader, } from "./supabase-schema";
8
- export function buildDiffPlan(sourceUrl, targetUrl, schema, outDir) {
9
- return {
10
- rollforward: buildSupabaseDiffArgs(targetUrl, sourceUrl, schema, join(outDir, "rollforward.sql")),
11
- rollback: buildSupabaseDiffArgs(sourceUrl, targetUrl, schema, join(outDir, "rollback.sql")),
12
- };
13
- }
14
- function connectionLabel(endpoint) {
15
- return endpoint.kind === "env"
16
- ? redactedDbUrl(endpoint.dbUrl)
17
- : endpoint.path;
18
- }
19
- function prepareDumpArtifact(endpoint, artifactPath, otherSpec, opts, generatedAt, logger, cwd, side) {
20
- const header = sqlFileHeader({
21
- command: "diff",
22
- kind: "dump",
23
- env: endpoint.spec,
24
- otherEnv: otherSpec,
25
- schema: opts.schema,
26
- generatedAt,
27
- });
28
- if (endpoint.kind === "file") {
29
- materializeDumpArtifact(endpoint.path, artifactPath, logger);
30
- prependHeader(artifactPath, header);
31
- return;
32
- }
33
- runSchemaDump({
34
- dbUrl: endpoint.dbUrl,
35
- schema: opts.schema,
36
- outputFile: artifactPath,
37
- header,
38
- logger,
39
- cwd,
40
- label: side === "source" ? "Dumping source schema…" : "Dumping target schema…",
41
- });
42
- }
43
- export async function dbDiff(opts, logger) {
44
- const cwd = opts.cwd ?? process.cwd();
45
- const outDir = resolveOutDir(opts.dir, cwd);
46
- const generatedAt = new Date().toISOString();
47
- if (opts.sourceEnv === opts.targetEnv) {
48
- logger.error("Source and target must differ.");
49
- process.exit(1);
50
- }
51
- requireSupabaseCli(logger);
52
- ensureOutDir(outDir, logger);
53
- logger.info(`Schema: ${opts.schema}`);
54
- const source = resolveDiffEndpoint(opts.sourceEnv, logger, cwd);
55
- const target = resolveDiffEndpoint(opts.targetEnv, logger, cwd);
56
- const sourceArtifact = join(outDir, "source.sql");
57
- const targetArtifact = join(outDir, "target.sql");
58
- prepareDumpArtifact(source, sourceArtifact, opts.targetEnv, opts, generatedAt, logger, cwd, "source");
59
- prepareDumpArtifact(target, targetArtifact, opts.sourceEnv, opts, generatedAt, logger, cwd, "target");
60
- const { sourceUrl, targetUrl, cleanup } = resolveSchemaUrlsForDiff({
61
- source: source.kind === "env"
62
- ? { kind: "env", dbUrl: source.dbUrl }
63
- : { kind: "file", path: sourceArtifact },
64
- target: target.kind === "env"
65
- ? { kind: "env", dbUrl: target.dbUrl }
66
- : { kind: "file", path: targetArtifact },
67
- logger,
68
- });
69
- try {
70
- const plan = buildDiffPlan(sourceUrl, targetUrl, opts.schema, outDir);
71
- const diffHeader = (kind) => sqlFileHeader({
72
- command: "diff",
73
- kind,
74
- env: opts.sourceEnv,
75
- otherEnv: opts.targetEnv,
76
- schema: opts.schema,
77
- generatedAt,
78
- });
79
- logger.info("Generating roll-forward SQL (target → source)…");
80
- runCommand("supabase", plan.rollforward, logger, { cwd });
81
- prependHeader(join(outDir, "rollforward.sql"), diffHeader("rollforward"));
82
- logger.info("Generating rollback SQL (source → target)…");
83
- runCommand("supabase", plan.rollback, logger, { cwd });
84
- prependHeader(join(outDir, "rollback.sql"), diffHeader("rollback"));
85
- }
86
- finally {
87
- cleanup();
88
- }
89
- const artifacts = {};
90
- for (const key of [
91
- "source.sql",
92
- "target.sql",
93
- "rollforward.sql",
94
- "rollback.sql",
95
- ]) {
96
- const path = join(outDir, key);
97
- artifacts[key] = { path, bytes: fileBytes(path) };
98
- }
99
- const manifest = {
100
- generatedAt,
101
- source: { kind: source.kind, spec: source.spec },
102
- target: { kind: target.kind, spec: target.spec },
103
- schema: opts.schema,
104
- dir: outDir,
105
- connections: {
106
- source: connectionLabel(source),
107
- target: connectionLabel(target),
108
- },
109
- artifacts,
110
- notes: [
111
- "Review rollforward.sql before applying to the target database.",
112
- "Rollback SQL may include destructive DDL — review before use.",
113
- ".sql file endpoints skip re-dump; existing files are copied to source.sql / target.sql when needed.",
114
- "Docker is used to load .sql files for supabase db diff when a side is not a live env URL.",
115
- "Prefer direct Postgres URLs (port 5432) when pooler URLs cause dump/diff timeouts.",
116
- ],
117
- };
118
- const manifestPath = join(outDir, "manifest.json");
119
- writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
120
- logger.info(`Wrote ${manifestPath}`);
121
- logger.info("Done. Review rollforward.sql and rollback.sql before applying.");
122
- }
123
- //# sourceMappingURL=diff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/db/diff.ts"],"names":[],"mappings":"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"}