@codemarc/blt 1.4.5 → 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 +107 -6
- package/dist/blt +2 -0
- package/dist/blt.d.ts.map +1 -1
- package/dist/blt.js.map +1 -1
- package/dist/commands/bucket/clear.d.ts +9 -0
- package/dist/commands/bucket/clear.d.ts.map +1 -0
- package/dist/commands/bucket/clear.js +105 -0
- package/dist/commands/bucket/clear.js.map +1 -0
- package/dist/commands/bucket.d.ts.map +1 -1
- package/dist/commands/bucket.js +21 -0
- package/dist/commands/bucket.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,7 +59,8 @@ 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 |
|
|
59
|
-
| `blt
|
|
62
|
+
| `blt workflow`| list, show, delete, reload, deploy |
|
|
63
|
+
| `blt bucket` | names, list, upload, download, url, clear |
|
|
60
64
|
| `blt show` | schema, counts, env, db, repo |
|
|
61
65
|
| `blt cleanup` | generated, tags |
|
|
62
66
|
|
|
@@ -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`
|
|
@@ -392,6 +477,22 @@ blt bucket url my-bucket docs/file.pdf --signed --expires-in 7200
|
|
|
392
477
|
- `--signed` — Generate signed URL (default: false)
|
|
393
478
|
- `--expires-in <seconds>` — Signed URL expiry (default: 3600).
|
|
394
479
|
|
|
480
|
+
### `blt bucket clear <bucket-name>`
|
|
481
|
+
|
|
482
|
+
Remove all files from a bucket. Requires `--yes` to confirm. Use `--dry-run` to preview.
|
|
483
|
+
|
|
484
|
+
```bash
|
|
485
|
+
blt bucket clear my-bucket --yes
|
|
486
|
+
blt bucket clear avatars --prefix bae/ --dry-run
|
|
487
|
+
blt bucket clear avatars --prefix bae/ --yes
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
**Options:**
|
|
491
|
+
|
|
492
|
+
- `-p, --prefix <prefix>` — Only clear files under this path prefix
|
|
493
|
+
- `--dry-run` — Show what would be deleted without deleting
|
|
494
|
+
- `-y, --yes` — Skip confirmation prompt (required to actually delete)
|
|
495
|
+
|
|
395
496
|
---
|
|
396
497
|
|
|
397
498
|
## Show Commands
|
|
@@ -508,13 +609,13 @@ Ensure `pdf-lib` is installed: `bun install` (or `npm install`). The CLI uses `p
|
|
|
508
609
|
|
|
509
610
|
## Development
|
|
510
611
|
|
|
511
|
-
Built with TypeScript and Bun.
|
|
612
|
+
Built with TypeScript and Bun. BLT CLI lives in the `cli/` directory of the tools repository.
|
|
512
613
|
|
|
513
614
|
### Build from source
|
|
514
615
|
|
|
515
616
|
```bash
|
|
516
|
-
git clone https://github.com/
|
|
517
|
-
cd
|
|
617
|
+
git clone https://github.com/bltcore-com/tools.git
|
|
618
|
+
cd tools/cli
|
|
518
619
|
bun install
|
|
519
620
|
bun run build
|
|
520
621
|
bun link
|
|
@@ -547,8 +648,8 @@ Marc J. Greenberg <marc@bltwai.com>
|
|
|
547
648
|
|
|
548
649
|
## Repository
|
|
549
650
|
|
|
550
|
-
https://github.com/
|
|
651
|
+
https://github.com/bltcore-com/tools (CLI is in `cli/`)
|
|
551
652
|
|
|
552
653
|
## Support
|
|
553
654
|
|
|
554
|
-
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 @@
|
|
|
1
|
+
{"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../../src/commands/bucket/clear.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAsD5C,wBAAsB,WAAW,CAChC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,EAC5B,OAAO,EAAE;IACR,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;CACb,EACD,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAyEf"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import debug from "debug";
|
|
2
|
+
import { getSupabaseClient } from "../../utils/supabase";
|
|
3
|
+
const log = debug("blt:bucket");
|
|
4
|
+
const REMOVE_BATCH_SIZE = 1000;
|
|
5
|
+
async function listAllFilePaths(bucketName, prefix) {
|
|
6
|
+
const supabase = getSupabaseClient();
|
|
7
|
+
const paths = [];
|
|
8
|
+
async function listAtPath(currentPrefix) {
|
|
9
|
+
let offset = 0;
|
|
10
|
+
const limit = 1000;
|
|
11
|
+
while (true) {
|
|
12
|
+
const { data, error } = await supabase.storage
|
|
13
|
+
.from(bucketName)
|
|
14
|
+
.list(currentPrefix, {
|
|
15
|
+
limit,
|
|
16
|
+
offset,
|
|
17
|
+
sortBy: { column: "name", order: "asc" },
|
|
18
|
+
});
|
|
19
|
+
if (error) {
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
if (!data?.length)
|
|
23
|
+
break;
|
|
24
|
+
for (const item of data) {
|
|
25
|
+
const itemPath = currentPrefix ? `${currentPrefix}/${item.name}` : item.name;
|
|
26
|
+
// Files have id; folder prefixes have id: null
|
|
27
|
+
if (item.id != null) {
|
|
28
|
+
paths.push(itemPath);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
await listAtPath(itemPath);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (data.length < limit)
|
|
35
|
+
break;
|
|
36
|
+
offset += limit;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
await listAtPath(prefix);
|
|
40
|
+
return paths;
|
|
41
|
+
}
|
|
42
|
+
export async function clearBucket(args, options, logger) {
|
|
43
|
+
try {
|
|
44
|
+
const bucketName = args.bucketName;
|
|
45
|
+
const prefix = options.prefix;
|
|
46
|
+
const dryRun = options.dryRun;
|
|
47
|
+
const yes = options.yes;
|
|
48
|
+
log("Clearing bucket: %s", bucketName);
|
|
49
|
+
const supabase = getSupabaseClient();
|
|
50
|
+
// Verify bucket exists
|
|
51
|
+
const { data: buckets, error: listError } = await supabase.storage.listBuckets();
|
|
52
|
+
if (listError) {
|
|
53
|
+
logger.error("Error listing buckets:", listError.message);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
if (!buckets?.some((b) => b.name === bucketName)) {
|
|
57
|
+
logger.error(`Bucket not found: ${bucketName}`);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
const filePaths = await listAllFilePaths(bucketName, prefix);
|
|
61
|
+
if (filePaths.length === 0) {
|
|
62
|
+
logger.info("No files to clear");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const scope = prefix ? `prefix "${prefix}"` : "entire bucket";
|
|
66
|
+
logger.info(`Found ${filePaths.length} file(s) in ${scope}`);
|
|
67
|
+
if (dryRun) {
|
|
68
|
+
logger.info("");
|
|
69
|
+
logger.info("DRY RUN - Files that would be deleted:");
|
|
70
|
+
for (const p of filePaths.slice(0, 20)) {
|
|
71
|
+
logger.info(` ${p}`);
|
|
72
|
+
}
|
|
73
|
+
if (filePaths.length > 20) {
|
|
74
|
+
logger.info(` ... and ${filePaths.length - 20} more`);
|
|
75
|
+
}
|
|
76
|
+
logger.info("");
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (!yes) {
|
|
80
|
+
logger.warn(`This will permanently delete ${filePaths.length} file(s).`);
|
|
81
|
+
logger.warn("Run with --yes to confirm.");
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
let deletedCount = 0;
|
|
85
|
+
for (let i = 0; i < filePaths.length; i += REMOVE_BATCH_SIZE) {
|
|
86
|
+
const batch = filePaths.slice(i, i + REMOVE_BATCH_SIZE);
|
|
87
|
+
const { error } = await supabase.storage
|
|
88
|
+
.from(bucketName)
|
|
89
|
+
.remove(batch);
|
|
90
|
+
if (error) {
|
|
91
|
+
logger.error(`Error deleting batch: ${error.message}`);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
deletedCount += batch.length;
|
|
95
|
+
logger.info(`Deleted ${deletedCount}/${filePaths.length}...`);
|
|
96
|
+
}
|
|
97
|
+
logger.info("");
|
|
98
|
+
logger.info(`Cleared ${deletedCount} file(s)`);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
logger.error("Error:", error.message);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=clear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/commands/bucket/clear.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bucket.d.ts","sourceRoot":"","sources":["../../src/commands/bucket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"bucket.d.ts","sourceRoot":"","sources":["../../src/commands/bucket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAS7C;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,EAAE,OAAO,QA4JrD"}
|
package/dist/commands/bucket.js
CHANGED
|
@@ -4,6 +4,7 @@ import { uploadFile } from "./bucket/upload";
|
|
|
4
4
|
import { uploadFolder } from "./bucket/upload-folder";
|
|
5
5
|
import { downloadFile } from "./bucket/download";
|
|
6
6
|
import { getFileUrl } from "./bucket/url";
|
|
7
|
+
import { clearBucket } from "./bucket/clear";
|
|
7
8
|
/**
|
|
8
9
|
* Register bucket commands with the CLI program
|
|
9
10
|
*/
|
|
@@ -22,6 +23,7 @@ Available operations:
|
|
|
22
23
|
upload-folder Upload all files in a folder to a bucket
|
|
23
24
|
download Download a file from a bucket
|
|
24
25
|
url Get public or signed URL for a file
|
|
26
|
+
clear Remove all files from a bucket (or prefix)
|
|
25
27
|
|
|
26
28
|
Run 'blt bucket <operation> --help' for more information on a specific command.
|
|
27
29
|
`;
|
|
@@ -109,6 +111,25 @@ Run 'blt bucket <operation> --help' for more information on a specific command.
|
|
|
109
111
|
.action(async ({ args, logger }) => {
|
|
110
112
|
await downloadFile({ bucketName: args.bucketName, remotePath: args.remotePath, localPath: args.localPath }, logger);
|
|
111
113
|
});
|
|
114
|
+
// Clear all files from a bucket
|
|
115
|
+
program
|
|
116
|
+
.command("bucket clear", "Remove all files from a bucket (or prefix)")
|
|
117
|
+
.hide()
|
|
118
|
+
.argument("<bucket-name>", "Name of the bucket")
|
|
119
|
+
.option("-p, --prefix <prefix>", "Only clear files under this path prefix", {
|
|
120
|
+
default: "",
|
|
121
|
+
})
|
|
122
|
+
.option("--dry-run", "Show what would be deleted without deleting", {
|
|
123
|
+
default: false,
|
|
124
|
+
})
|
|
125
|
+
.option("-y, --yes", "Skip confirmation prompt", { default: false })
|
|
126
|
+
.action(async ({ args, options, logger }) => {
|
|
127
|
+
await clearBucket({ bucketName: args.bucketName }, {
|
|
128
|
+
prefix: options.prefix,
|
|
129
|
+
dryRun: options.dryRun,
|
|
130
|
+
yes: options.yes,
|
|
131
|
+
}, logger);
|
|
132
|
+
});
|
|
112
133
|
// Get public URL for a file
|
|
113
134
|
program
|
|
114
135
|
.command("bucket url", "Get public URL for a file")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bucket.js","sourceRoot":"","sources":["../../src/commands/bucket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"bucket.js","sourceRoot":"","sources":["../../src/commands/bucket.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|