@codemarc/blt 1.4.6 → 1.4.7
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 +90 -5
- package/dist/blt +2 -0
- package/dist/blt.d.ts.map +1 -1
- package/dist/blt.js.map +1 -1
- package/dist/commands/show/info.d.ts +7 -0
- package/dist/commands/show/info.d.ts.map +1 -0
- package/dist/commands/show/info.js +52 -0
- package/dist/commands/show/info.js.map +1 -0
- package/dist/commands/workflow.d.ts +6 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +291 -0
- package/dist/commands/workflow.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# @codemarc/blt
|
|
2
2
|
|
|
3
3
|
> BLT CLI — Command-line tools for image processing, PDF manipulation, storage, schema/data build and deploy, and version management.
|
|
4
|
+
>
|
|
5
|
+
> Part of the [bltcore-com/tools](https://github.com/bltcore-com/tools) repository (BLT Core tools monorepo).
|
|
4
6
|
|
|
5
7
|
## Features
|
|
6
8
|
|
|
@@ -10,6 +12,7 @@
|
|
|
10
12
|
- **Build**: Build schema from DDL files, build data from instance directory
|
|
11
13
|
- **Deploy**: Deploy schema/data from SQL files, run a single SQL file
|
|
12
14
|
- **Bucket**: Supabase storage — list buckets, list/upload/download files, get URLs
|
|
15
|
+
- **Workflow**: List, show, delete, reload, and deploy GitHub Actions workflows (requires `gh`)
|
|
13
16
|
- **Show**: Schema info, row counts, env vars, DB version, repo list
|
|
14
17
|
- **Cleanup**: Remove generated SQL/instance files, clean infrequently used YAML tags
|
|
15
18
|
|
|
@@ -56,6 +59,7 @@ blt deploy schema
|
|
|
56
59
|
| `blt version` | Update, string, sql |
|
|
57
60
|
| `blt build` | Schema (DDL), data (instance) |
|
|
58
61
|
| `blt deploy` | Schema, data, sql file |
|
|
62
|
+
| `blt workflow`| list, show, delete, reload, deploy |
|
|
59
63
|
| `blt bucket` | names, list, upload, download, url, clear |
|
|
60
64
|
| `blt show` | schema, counts, env, db, repo |
|
|
61
65
|
| `blt cleanup` | generated, tags |
|
|
@@ -315,6 +319,87 @@ blt deploy sql ./migrations/001_init.sql
|
|
|
315
319
|
|
|
316
320
|
---
|
|
317
321
|
|
|
322
|
+
## Workflow Commands (GitHub Actions)
|
|
323
|
+
|
|
324
|
+
Manage deploy GitHub Actions workflows in the `bltcore-com/deploy` repository. **Requires:** [GitHub CLI (`gh`)](https://cli.github.com/) installed and authenticated.
|
|
325
|
+
|
|
326
|
+
**Environments:** `bae`, `joanne`, `demo`, `test`
|
|
327
|
+
|
|
328
|
+
### `blt workflow list [env]`
|
|
329
|
+
|
|
330
|
+
List recent workflow runs. Omit `env` to list available environments.
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
blt workflow list # List environments
|
|
334
|
+
blt workflow list bae # List runs for bae
|
|
335
|
+
blt workflow list bae --limit 10 --status completed
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Options:**
|
|
339
|
+
|
|
340
|
+
- `--limit <n>` — Maximum runs to show (default: 20)
|
|
341
|
+
- `--status <status>` — Filter: `queued`, `completed`, `in_progress`, `success`, `failure`
|
|
342
|
+
- `--json` — Output as JSON
|
|
343
|
+
|
|
344
|
+
### `blt workflow show <env>`
|
|
345
|
+
|
|
346
|
+
Show the latest run and the `gh run view` command plus URL for opening in the browser.
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
blt workflow show bae
|
|
350
|
+
blt workflow show bae --type reload # Last reload run only
|
|
351
|
+
blt workflow show bae --type deploy # Last deploy run only
|
|
352
|
+
blt workflow show bae --web # Open in browser
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**Options:**
|
|
356
|
+
|
|
357
|
+
- `--type <reload|deploy>` — Show last reload or last deploy run (default: most recent of either)
|
|
358
|
+
- `--web` — Open the run in the browser
|
|
359
|
+
|
|
360
|
+
### `blt workflow delete <env>`
|
|
361
|
+
|
|
362
|
+
Delete old workflow runs, keeping the latest N per workflow.
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
blt workflow delete bae # Keep 5 runs per workflow (default)
|
|
366
|
+
blt workflow delete joanne --keep 10
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Options:**
|
|
370
|
+
|
|
371
|
+
- `--keep <n>` — Runs to keep per workflow (default: 5)
|
|
372
|
+
|
|
373
|
+
### `blt workflow reload <env>`
|
|
374
|
+
|
|
375
|
+
Load starter data to environment (deploy-initial-data-to-* workflow).
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
blt workflow reload bae
|
|
379
|
+
blt workflow reload bae --ref main --wait
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
**Options:**
|
|
383
|
+
|
|
384
|
+
- `--ref <branch>` — Git ref to run against (default: main)
|
|
385
|
+
- `--wait` — Block until workflow completes
|
|
386
|
+
|
|
387
|
+
### `blt workflow deploy <env>`
|
|
388
|
+
|
|
389
|
+
Deploy subdomain for environment (*.bltpos.com / *.bltcore.com).
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
blt workflow deploy bae
|
|
393
|
+
blt workflow deploy joanne --ref main --wait
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
**Options:**
|
|
397
|
+
|
|
398
|
+
- `--ref <branch>` — Git ref to run against (default: main)
|
|
399
|
+
- `--wait` — Block until workflow completes
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
318
403
|
## Bucket Commands (Supabase Storage)
|
|
319
404
|
|
|
320
405
|
### `blt bucket names`
|
|
@@ -524,13 +609,13 @@ Ensure `pdf-lib` is installed: `bun install` (or `npm install`). The CLI uses `p
|
|
|
524
609
|
|
|
525
610
|
## Development
|
|
526
611
|
|
|
527
|
-
Built with TypeScript and Bun.
|
|
612
|
+
Built with TypeScript and Bun. BLT CLI lives in the `cli/` directory of the tools repository.
|
|
528
613
|
|
|
529
614
|
### Build from source
|
|
530
615
|
|
|
531
616
|
```bash
|
|
532
|
-
git clone https://github.com/
|
|
533
|
-
cd
|
|
617
|
+
git clone https://github.com/bltcore-com/tools.git
|
|
618
|
+
cd tools/cli
|
|
534
619
|
bun install
|
|
535
620
|
bun run build
|
|
536
621
|
bun link
|
|
@@ -563,8 +648,8 @@ Marc J. Greenberg <marc@bltwai.com>
|
|
|
563
648
|
|
|
564
649
|
## Repository
|
|
565
650
|
|
|
566
|
-
https://github.com/
|
|
651
|
+
https://github.com/bltcore-com/tools (CLI is in `cli/`)
|
|
567
652
|
|
|
568
653
|
## Support
|
|
569
654
|
|
|
570
|
-
https://github.com/
|
|
655
|
+
https://github.com/bltcore-com/tools/issues
|
package/dist/blt
CHANGED
|
@@ -9,6 +9,7 @@ import pdfCommand from "./commands/pdf";
|
|
|
9
9
|
import versionCommand from "./commands/version";
|
|
10
10
|
import showCommand from "./commands/show";
|
|
11
11
|
import cleanupCommand from "./commands/cleanup";
|
|
12
|
+
import workflowCommand from "./commands/workflow";
|
|
12
13
|
import { join, dirname } from "node:path";
|
|
13
14
|
import { readFileSync } from "node:fs";
|
|
14
15
|
import { fileURLToPath } from "node:url";
|
|
@@ -31,6 +32,7 @@ deployCommand(program);
|
|
|
31
32
|
bucketCommand(program);
|
|
32
33
|
showCommand(program);
|
|
33
34
|
cleanupCommand(program);
|
|
35
|
+
workflowCommand(program);
|
|
34
36
|
// If no command is provided, show help
|
|
35
37
|
const args = process.argv.slice(2);
|
|
36
38
|
if (args.length === 0) {
|
package/dist/blt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blt.d.ts","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"blt.d.ts","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";AAqBA,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;
|
|
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;AAElD,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;AAE3B,uCAAuC;AACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACtB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AACD,OAAO,CAAC,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Logger } from "@caporal/core";
|
|
2
|
+
/**
|
|
3
|
+
* Fetch and display pos/data version strings for an environment (same format as login footer).
|
|
4
|
+
* Calls the info API at BLT_INFO_API_URL.
|
|
5
|
+
*/
|
|
6
|
+
export declare function showInfo(name: string, logger: Logger): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/commands/show/info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAU5C;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C1E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch and display pos/data version strings for an environment (same format as login footer).
|
|
3
|
+
* Calls the info API at BLT_INFO_API_URL.
|
|
4
|
+
*/
|
|
5
|
+
export async function showInfo(name, logger) {
|
|
6
|
+
const apiBase = process.env.BLT_INFO_API_URL?.trim();
|
|
7
|
+
if (!apiBase) {
|
|
8
|
+
logger.error("BLT_INFO_API_URL is not set.");
|
|
9
|
+
console.log("Set the info API base URL, e.g.:");
|
|
10
|
+
console.log(' export BLT_INFO_API_URL="https://<project-ref>.supabase.co/functions/v1/info"');
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const base = apiBase.replace(/\/$/, "");
|
|
14
|
+
const url = `${base}?name=${encodeURIComponent(name)}`;
|
|
15
|
+
try {
|
|
16
|
+
const res = await fetch(url);
|
|
17
|
+
if (!res.ok) {
|
|
18
|
+
const body = (await res.json().catch(() => ({})));
|
|
19
|
+
if (body.error) {
|
|
20
|
+
logger.error(body.error);
|
|
21
|
+
if (body.valid?.length) {
|
|
22
|
+
console.log(`Valid environments: ${body.valid.join(", ")}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
logger.error(`API returned ${res.status}: ${res.statusText}`);
|
|
27
|
+
}
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
const body = (await res.json());
|
|
31
|
+
if (body.lines?.length) {
|
|
32
|
+
for (const line of body.lines) {
|
|
33
|
+
console.log(line);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else if (body.pos || body.data) {
|
|
37
|
+
if (body.pos)
|
|
38
|
+
console.log(body.pos);
|
|
39
|
+
if (body.data)
|
|
40
|
+
console.log(body.data);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
logger.warn("No version data returned.");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
48
|
+
logger.error(`Failed to fetch info: ${message}`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/commands/show/info.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,MAAc;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAErD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;QAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,GAAG,IAAI,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAE7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAiB,CAAC;YAClE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzB,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;oBACvB,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiB,CAAC;QAEhD,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;IACH,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,yBAAyB,OAAO,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiC,MAAM,eAAe,CAAC;AAmD5E;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,OAAO,EAAE,OAAO,QAgWvD"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
const DEPLOY_REPO = "bltcore-com/deploy";
|
|
3
|
+
const RELOAD_WORKFLOWS = {
|
|
4
|
+
bae: "deploy-initial-data-to-bae.yml",
|
|
5
|
+
joanne: "deploy-initial-data-to-joanne.yml",
|
|
6
|
+
demo: "deploy-initial-data-to-demo.yml",
|
|
7
|
+
test: "deploy-initial-data-to-test.yml",
|
|
8
|
+
};
|
|
9
|
+
const DEPLOY_SUBDOMAIN_WORKFLOWS = {
|
|
10
|
+
bae: "deploy-bltpos-bae-instance.yml",
|
|
11
|
+
joanne: "deploy-bltpos-joanne-instance.yml",
|
|
12
|
+
demo: "deploy-bltcore-demo-instance.yml",
|
|
13
|
+
test: "deploy-bltcore-test-instance.yml",
|
|
14
|
+
};
|
|
15
|
+
const VALID_ENVS = ["bae", "joanne", "demo", "test"];
|
|
16
|
+
function ensureGhInstalled(logger) {
|
|
17
|
+
const result = spawnSync("gh", ["--version"], { encoding: "utf8" });
|
|
18
|
+
if (result.status !== 0) {
|
|
19
|
+
logger.error("GitHub CLI (gh) is required. Install: https://cli.github.com/");
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function runWorkflow(workflowFile, options) {
|
|
24
|
+
const args = ["workflow", "run", workflowFile, "--repo", DEPLOY_REPO];
|
|
25
|
+
if (options.ref) {
|
|
26
|
+
args.push("--ref", options.ref);
|
|
27
|
+
}
|
|
28
|
+
if (options.wait) {
|
|
29
|
+
args.push("--wait");
|
|
30
|
+
}
|
|
31
|
+
const result = spawnSync("gh", args, {
|
|
32
|
+
stdio: "inherit",
|
|
33
|
+
encoding: "utf8",
|
|
34
|
+
});
|
|
35
|
+
if (result.status !== 0) {
|
|
36
|
+
process.exit(result.status ?? 1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Register workflow commands with the CLI program
|
|
41
|
+
*/
|
|
42
|
+
export default function workflowCommand(program) {
|
|
43
|
+
const workflowHelpText = `
|
|
44
|
+
trigger deploy github actions
|
|
45
|
+
|
|
46
|
+
Usage:
|
|
47
|
+
blt workflow <operation> [env]
|
|
48
|
+
|
|
49
|
+
Available operations:
|
|
50
|
+
list List recent workflow runs (omit env to list available environments)
|
|
51
|
+
show Show the latest run and gh command to open its URL
|
|
52
|
+
delete Delete old workflow runs, keeping the latest N per workflow
|
|
53
|
+
reload Load starter data to environment (deploy-initial-data-to-*)
|
|
54
|
+
deploy Deploy subdomain for environment (*.bltpos.com / *.bltcore.com)
|
|
55
|
+
|
|
56
|
+
Environments: bae, joanne, demo, test
|
|
57
|
+
|
|
58
|
+
Run 'blt workflow <operation> <env> --help' for options.
|
|
59
|
+
`;
|
|
60
|
+
program
|
|
61
|
+
.command("workflow list", "List recent workflow runs")
|
|
62
|
+
.hide()
|
|
63
|
+
.argument("[env]", "Environment name (bae, joanne, demo, test). Omit to list available environments.")
|
|
64
|
+
.option("--limit <n>", "Maximum number of runs to show", {
|
|
65
|
+
default: 20,
|
|
66
|
+
validator: (v) => Number(v),
|
|
67
|
+
})
|
|
68
|
+
.option("--status <status>", "Filter by status (queued|completed|in_progress|success|failure)", {})
|
|
69
|
+
.option("--json", "Output as JSON", { default: false })
|
|
70
|
+
.action(async ({ args, options, logger, }) => {
|
|
71
|
+
const env = args.env?.toLowerCase();
|
|
72
|
+
if (!env || !VALID_ENVS.includes(env)) {
|
|
73
|
+
console.log("Available environments:");
|
|
74
|
+
for (const e of VALID_ENVS) {
|
|
75
|
+
console.log(` ${e}`);
|
|
76
|
+
}
|
|
77
|
+
console.log("\nUsage: blt workflow list <env> [OPTIONS...]");
|
|
78
|
+
if (env && !VALID_ENVS.includes(env)) {
|
|
79
|
+
logger.error(`Unknown environment '${args.env}'.`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
ensureGhInstalled(logger);
|
|
85
|
+
const limit = options.limit;
|
|
86
|
+
const status = options.status;
|
|
87
|
+
const asJson = options.json;
|
|
88
|
+
const repoArgs = ["--repo", DEPLOY_REPO];
|
|
89
|
+
const limitArgs = ["--limit", String(limit)];
|
|
90
|
+
function runList(workflowFile) {
|
|
91
|
+
const listArgs = ["run", "list", ...repoArgs, ...limitArgs, "--workflow", workflowFile];
|
|
92
|
+
if (status)
|
|
93
|
+
listArgs.push("--status", status);
|
|
94
|
+
if (asJson)
|
|
95
|
+
listArgs.push("--json", "databaseId,workflowName,displayTitle,status,conclusion,createdAt,url,headBranch");
|
|
96
|
+
return spawnSync("gh", listArgs, { encoding: "utf8" });
|
|
97
|
+
}
|
|
98
|
+
const reloadFile = RELOAD_WORKFLOWS[env];
|
|
99
|
+
const deployFile = DEPLOY_SUBDOMAIN_WORKFLOWS[env];
|
|
100
|
+
const r1 = runList(reloadFile);
|
|
101
|
+
const r2 = runList(deployFile);
|
|
102
|
+
if (r1.status !== 0)
|
|
103
|
+
process.exit(r1.status ?? 1);
|
|
104
|
+
if (r2.status !== 0)
|
|
105
|
+
process.exit(r2.status ?? 1);
|
|
106
|
+
if (asJson) {
|
|
107
|
+
const a = JSON.parse(String(r1.stdout || "[]"));
|
|
108
|
+
const b = JSON.parse(String(r2.stdout || "[]"));
|
|
109
|
+
const merged = [...a, ...b].sort((x, y) => new Date(y.createdAt).getTime() - new Date(x.createdAt).getTime());
|
|
110
|
+
console.log(JSON.stringify(merged.slice(0, limit), null, 2));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
console.log(`\n=== ${reloadFile} ===\n`);
|
|
114
|
+
process.stdout.write(r1.stdout || "");
|
|
115
|
+
console.log(`\n=== ${deployFile} ===\n`);
|
|
116
|
+
process.stdout.write(r2.stdout || "");
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
program
|
|
120
|
+
.command("workflow show", "Show the latest run and gh command to open its URL")
|
|
121
|
+
.hide()
|
|
122
|
+
.argument("<env>", "Environment name (bae, joanne, demo, test)")
|
|
123
|
+
.option("--type <reload|deploy>", "Show last reload run or last deploy run (default: most recent of either)", {
|
|
124
|
+
validator: ["reload", "deploy"],
|
|
125
|
+
})
|
|
126
|
+
.option("--web", "Open the run in the browser", { default: false })
|
|
127
|
+
.action(async ({ args, options, logger, }) => {
|
|
128
|
+
const env = args.env?.toLowerCase();
|
|
129
|
+
if (!VALID_ENVS.includes(env)) {
|
|
130
|
+
logger.error(`Unknown environment '${args.env}'. Valid: ${VALID_ENVS.join(", ")}`);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
ensureGhInstalled(logger);
|
|
134
|
+
const repoArgs = ["--repo", DEPLOY_REPO];
|
|
135
|
+
const typeFilter = options.type;
|
|
136
|
+
const reloadFile = RELOAD_WORKFLOWS[env];
|
|
137
|
+
const deployFile = DEPLOY_SUBDOMAIN_WORKFLOWS[env];
|
|
138
|
+
function getLatestRun(workflowFile) {
|
|
139
|
+
const listArgs = [
|
|
140
|
+
"run",
|
|
141
|
+
"list",
|
|
142
|
+
...repoArgs,
|
|
143
|
+
"--limit",
|
|
144
|
+
"1",
|
|
145
|
+
"--workflow",
|
|
146
|
+
workflowFile,
|
|
147
|
+
"--json",
|
|
148
|
+
"databaseId,url,displayTitle,createdAt",
|
|
149
|
+
];
|
|
150
|
+
const result = spawnSync("gh", listArgs, { encoding: "utf8" });
|
|
151
|
+
if (result.status !== 0)
|
|
152
|
+
return null;
|
|
153
|
+
const runs = JSON.parse(String(result.stdout || "[]"));
|
|
154
|
+
return runs[0] ?? null;
|
|
155
|
+
}
|
|
156
|
+
let latest;
|
|
157
|
+
if (typeFilter === "reload") {
|
|
158
|
+
latest = getLatestRun(reloadFile);
|
|
159
|
+
}
|
|
160
|
+
else if (typeFilter === "deploy") {
|
|
161
|
+
latest = getLatestRun(deployFile);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
const reloadRun = getLatestRun(reloadFile);
|
|
165
|
+
const deployRun = getLatestRun(deployFile);
|
|
166
|
+
const runs = [reloadRun, deployRun].filter(Boolean);
|
|
167
|
+
latest = runs.length > 0
|
|
168
|
+
? runs.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())[0]
|
|
169
|
+
: null;
|
|
170
|
+
}
|
|
171
|
+
if (!latest) {
|
|
172
|
+
const typeDesc = typeFilter ? ` (${typeFilter})` : "";
|
|
173
|
+
logger.error(`No workflow runs found for ${env}${typeDesc}`);
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
const viewCmd = `gh run view ${latest.databaseId} -R ${DEPLOY_REPO}`;
|
|
177
|
+
console.log(latest.displayTitle);
|
|
178
|
+
console.log(`\n${viewCmd}\n`);
|
|
179
|
+
console.log(latest.url);
|
|
180
|
+
if (options.web) {
|
|
181
|
+
spawnSync("gh", ["run", "view", String(latest.databaseId), ...repoArgs, "--web"], {
|
|
182
|
+
stdio: "inherit",
|
|
183
|
+
encoding: "utf8",
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
program
|
|
188
|
+
.command("workflow delete", "Delete old workflow runs, keeping the latest N")
|
|
189
|
+
.hide()
|
|
190
|
+
.argument("<env>", "Environment name (bae, joanne, demo, test)")
|
|
191
|
+
.option("--keep <n>", "Number of runs to keep per workflow", {
|
|
192
|
+
default: 5,
|
|
193
|
+
validator: (v) => {
|
|
194
|
+
const n = Number(v);
|
|
195
|
+
if (!Number.isInteger(n) || n < 1) {
|
|
196
|
+
throw new Error("--keep must be a positive integer");
|
|
197
|
+
}
|
|
198
|
+
return n;
|
|
199
|
+
},
|
|
200
|
+
})
|
|
201
|
+
.action(async ({ args, options, logger, }) => {
|
|
202
|
+
const env = args.env?.toLowerCase();
|
|
203
|
+
if (!VALID_ENVS.includes(env)) {
|
|
204
|
+
logger.error(`Unknown environment '${args.env}'. Valid: ${VALID_ENVS.join(", ")}`);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
ensureGhInstalled(logger);
|
|
208
|
+
const keep = options.keep;
|
|
209
|
+
const repoArgs = ["--repo", DEPLOY_REPO];
|
|
210
|
+
function deleteOldRuns(workflowFile) {
|
|
211
|
+
const listArgs = [
|
|
212
|
+
"run",
|
|
213
|
+
"list",
|
|
214
|
+
...repoArgs,
|
|
215
|
+
"--limit",
|
|
216
|
+
"100",
|
|
217
|
+
"--workflow",
|
|
218
|
+
workflowFile,
|
|
219
|
+
"--json",
|
|
220
|
+
"databaseId,createdAt",
|
|
221
|
+
];
|
|
222
|
+
const result = spawnSync("gh", listArgs, { encoding: "utf8" });
|
|
223
|
+
if (result.status !== 0) {
|
|
224
|
+
logger.error(`Failed to list runs for ${workflowFile}`);
|
|
225
|
+
process.exit(result.status ?? 1);
|
|
226
|
+
}
|
|
227
|
+
const runs = JSON.parse(String(result.stdout || "[]"));
|
|
228
|
+
const sorted = runs.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
229
|
+
const toDelete = sorted.slice(keep);
|
|
230
|
+
for (const run of toDelete) {
|
|
231
|
+
const deleteResult = spawnSync("gh", ["run", "delete", String(run.databaseId), ...repoArgs], { encoding: "utf8" });
|
|
232
|
+
if (deleteResult.status !== 0) {
|
|
233
|
+
logger.error(`Failed to delete run ${run.databaseId}`);
|
|
234
|
+
process.exit(deleteResult.status ?? 1);
|
|
235
|
+
}
|
|
236
|
+
logger.info(`Deleted run ${run.databaseId} (${workflowFile})`);
|
|
237
|
+
}
|
|
238
|
+
return toDelete.length;
|
|
239
|
+
}
|
|
240
|
+
const reloadFile = RELOAD_WORKFLOWS[env];
|
|
241
|
+
const deployFile = DEPLOY_SUBDOMAIN_WORKFLOWS[env];
|
|
242
|
+
const reloadDeleted = deleteOldRuns(reloadFile);
|
|
243
|
+
const deployDeleted = deleteOldRuns(deployFile);
|
|
244
|
+
logger.info(`Deleted ${reloadDeleted + deployDeleted} old runs (kept latest ${keep} per workflow)`);
|
|
245
|
+
});
|
|
246
|
+
program
|
|
247
|
+
.command("workflow reload", "Load starter data to environment")
|
|
248
|
+
.hide()
|
|
249
|
+
.argument("<env>", "Environment name (bae, joanne, demo, test)")
|
|
250
|
+
.option("--ref <branch>", "Git ref to run against", { default: "main" })
|
|
251
|
+
.option("--wait", "Block until workflow completes", { default: false })
|
|
252
|
+
.action(async ({ args, options, logger, }) => {
|
|
253
|
+
const env = args.env?.toLowerCase();
|
|
254
|
+
if (!VALID_ENVS.includes(env)) {
|
|
255
|
+
logger.error(`Unknown environment '${args.env}'. Valid: ${VALID_ENVS.join(", ")}`);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}
|
|
258
|
+
ensureGhInstalled(logger);
|
|
259
|
+
const workflowFile = RELOAD_WORKFLOWS[env];
|
|
260
|
+
runWorkflow(workflowFile, {
|
|
261
|
+
ref: options.ref,
|
|
262
|
+
wait: options.wait,
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
program
|
|
266
|
+
.command("workflow deploy", "Deploy subdomain for environment")
|
|
267
|
+
.hide()
|
|
268
|
+
.argument("<env>", "Environment name (bae, joanne, demo, test)")
|
|
269
|
+
.option("--ref <branch>", "Git ref to run against", { default: "main" })
|
|
270
|
+
.option("--wait", "Block until workflow completes", { default: false })
|
|
271
|
+
.action(async ({ args, options, logger, }) => {
|
|
272
|
+
const env = args.env?.toLowerCase();
|
|
273
|
+
if (!VALID_ENVS.includes(env)) {
|
|
274
|
+
logger.error(`Unknown environment '${args.env}'. Valid: ${VALID_ENVS.join(", ")}`);
|
|
275
|
+
process.exit(1);
|
|
276
|
+
}
|
|
277
|
+
ensureGhInstalled(logger);
|
|
278
|
+
const workflowFile = DEPLOY_SUBDOMAIN_WORKFLOWS[env];
|
|
279
|
+
runWorkflow(workflowFile, {
|
|
280
|
+
ref: options.ref,
|
|
281
|
+
wait: options.wait,
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
program
|
|
285
|
+
.command("workflow", "trigger deploy github actions workflow")
|
|
286
|
+
.help(workflowHelpText)
|
|
287
|
+
.action(() => {
|
|
288
|
+
console.log(workflowHelpText);
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":"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"}
|