@codemarc/blt 1.8.6 → 1.8.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/dist/blt CHANGED
@@ -9,6 +9,7 @@ import deployCommand from "./commands/deploy";
9
9
  import envCommand from "./commands/env";
10
10
  import imageCommand from "./commands/image";
11
11
  import initCommand from "./commands/init";
12
+ import notifyCommand from "./commands/notify";
12
13
  import pdfCommand from "./commands/pdf";
13
14
  import showCommand from "./commands/show";
14
15
  import spinCommand from "./commands/spin";
@@ -38,6 +39,7 @@ deployCommand(program);
38
39
  envCommand(program);
39
40
  imageCommand(program);
40
41
  initCommand(program);
42
+ notifyCommand(program);
41
43
  pdfCommand(program);
42
44
  showCommand(program);
43
45
  spinCommand(program);
package/dist/blt.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"blt.d.ts","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";AA2BA,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C"}
1
+ {"version":3,"file":"blt.d.ts","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";AA4BA,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,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,6CAA6C;AAC7C,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,eAAe,MAAM,qBAAqB,CAAC;AAClD,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,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,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,wBAAwB;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,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"}
1
+ {"version":3,"file":"blt.js","sourceRoot":"","sources":["../src/blt.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,6CAA6C;AAC7C,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,eAAe,MAAM,qBAAqB,CAAC;AAClD,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAChD,OAAO,UAAU,MAAM,gBAAgB,CAAC;AACxC,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,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,wBAAwB;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,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,18 @@
1
+ import type { Logger } from "@caporal/core";
2
+ export declare const DEFAULT_GOOGLE_CHAT_WEBHOOK_KEY = "GOOGLE_CHAT_WEBHOOK";
3
+ export declare const DEFAULT_GOOGLE_CHAT_TITLE = "Notification";
4
+ export type NotifyStatus = "success" | "failure";
5
+ export type GoogleChatNotifyOptions = {
6
+ message?: string;
7
+ status?: NotifyStatus;
8
+ env?: string;
9
+ branch?: string;
10
+ title?: string;
11
+ webhookKey?: string;
12
+ webhookUrl?: string;
13
+ siteUrl?: string;
14
+ };
15
+ export declare function formatGoogleChatMessage(opts: GoogleChatNotifyOptions): string;
16
+ export declare function resolveGoogleChatWebhookUrl(opts: GoogleChatNotifyOptions): string | undefined;
17
+ export declare function notifyGoogleChat(opts: GoogleChatNotifyOptions, logger: Logger): Promise<boolean>;
18
+ //# sourceMappingURL=google-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-chat.d.ts","sourceRoot":"","sources":["../../../src/commands/notify/google-chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,eAAO,MAAM,+BAA+B,wBAAwB,CAAC;AACrE,eAAO,MAAM,yBAAyB,iBAAiB,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjD,MAAM,MAAM,uBAAuB,GAAG;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAe7E;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,GAAG,SAAS,CAM7F;AAED,wBAAsB,gBAAgB,CACrC,IAAI,EAAE,uBAAuB,EAC7B,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
@@ -0,0 +1,43 @@
1
+ import { readTrailzKey } from "./keys";
2
+ export const DEFAULT_GOOGLE_CHAT_WEBHOOK_KEY = "GOOGLE_CHAT_WEBHOOK";
3
+ export const DEFAULT_GOOGLE_CHAT_TITLE = "Notification";
4
+ export function formatGoogleChatMessage(opts) {
5
+ const title = opts.title ?? DEFAULT_GOOGLE_CHAT_TITLE;
6
+ if (opts.message) {
7
+ return `*${title}*\n${opts.message}\n`;
8
+ }
9
+ if (!opts.env || !opts.status) {
10
+ throw new Error("Deploy template requires --env and --status (or pass --message).");
11
+ }
12
+ const branch = opts.branch ?? "unknown";
13
+ const siteUrl = opts.siteUrl ?? `https://${opts.env}.bltcore.com`;
14
+ return `*${opts.env}* — ${title}\nBranch: ${branch}\nStatus: ${opts.status}\n${siteUrl}`;
15
+ }
16
+ export function resolveGoogleChatWebhookUrl(opts) {
17
+ if (opts.webhookUrl) {
18
+ return opts.webhookUrl;
19
+ }
20
+ return readTrailzKey(opts.webhookKey ?? DEFAULT_GOOGLE_CHAT_WEBHOOK_KEY);
21
+ }
22
+ export async function notifyGoogleChat(opts, logger) {
23
+ const webhookUrl = resolveGoogleChatWebhookUrl(opts);
24
+ if (!webhookUrl) {
25
+ logger.info("No Google Chat webhook configured; skipping notification.");
26
+ return false;
27
+ }
28
+ const message = formatGoogleChatMessage(opts);
29
+ const label = opts.message ? "custom message" : `${opts.env} (${opts.status})`;
30
+ logger.info(`Sending Google Chat notification: ${label}`);
31
+ const response = await fetch(webhookUrl, {
32
+ method: "POST",
33
+ headers: { "Content-Type": "application/json" },
34
+ body: JSON.stringify({ text: message }),
35
+ });
36
+ if (!response.ok) {
37
+ const body = await response.text().catch(() => "");
38
+ throw new Error(`Google Chat notification failed (${response.status})${body ? `: ${body.trim()}` : ""}`);
39
+ }
40
+ logger.info("Google Chat notification sent.");
41
+ return true;
42
+ }
43
+ //# sourceMappingURL=google-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-chat.js","sourceRoot":"","sources":["../../../src/commands/notify/google-chat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,CAAC,MAAM,+BAA+B,GAAG,qBAAqB,CAAC;AACrE,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAexD,MAAM,UAAU,uBAAuB,CAAC,IAA6B;IACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,yBAAyB,CAAC;IAEtD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,IAAI,KAAK,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,WAAW,IAAI,CAAC,GAAG,cAAc,CAAC;IAElE,OAAO,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,aAAa,MAAM,aAAa,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAA6B;IACxE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,OAAO,aAAa,CAAC,IAAI,CAAC,UAAU,IAAI,+BAA+B,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,IAA6B,EAC7B,MAAc;IAEd,MAAM,UAAU,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;IAC/E,MAAM,CAAC,IAAI,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;QACxC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;KACvC,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CACd,oCAAoC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACvF,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC;AACb,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function resolveTrailzKeysBase(workspaceRoot?: string): string;
2
+ export declare function parseEnvLineValue(line: string): string | undefined;
3
+ /** Read a single key from the workspace `.trailz/keys/keys` smash bundle. */
4
+ export declare function readTrailzKey(keyName: string, options?: {
5
+ workspaceRoot?: string;
6
+ cwd?: string;
7
+ }): string | undefined;
8
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/commands/notify/keys.ts"],"names":[],"mappings":"AAIA,wBAAgB,qBAAqB,CAAC,aAAa,SAAsB,GAAG,MAAM,CAEjF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMlE;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,MAAM,GAAG,SAAS,CAsBpB"}
@@ -0,0 +1,36 @@
1
+ import { join } from "node:path";
2
+ import { findWorkspaceRoot } from "../app/paths";
3
+ import { decryptTrailzEnvBase } from "../app/env-decrypt";
4
+ export function resolveTrailzKeysBase(workspaceRoot = findWorkspaceRoot()) {
5
+ return join(workspaceRoot, ".trailz", "keys", "keys");
6
+ }
7
+ export function parseEnvLineValue(line) {
8
+ const eq = line.indexOf("=");
9
+ if (eq <= 0) {
10
+ return undefined;
11
+ }
12
+ return line.slice(eq + 1);
13
+ }
14
+ /** Read a single key from the workspace `.trailz/keys/keys` smash bundle. */
15
+ export function readTrailzKey(keyName, options = {}) {
16
+ const workspaceRoot = options.workspaceRoot ?? findWorkspaceRoot(options.cwd);
17
+ const keysBase = resolveTrailzKeysBase(workspaceRoot);
18
+ let content;
19
+ try {
20
+ content = decryptTrailzEnvBase(keysBase, { cwd: workspaceRoot, expand: false });
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ for (const line of content.split("\n")) {
26
+ const trimmed = line.trim();
27
+ if (!trimmed || trimmed.startsWith("#")) {
28
+ continue;
29
+ }
30
+ if (trimmed.startsWith(`${keyName}=`)) {
31
+ return parseEnvLineValue(trimmed);
32
+ }
33
+ }
34
+ return undefined;
35
+ }
36
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/commands/notify/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,aAAa,GAAG,iBAAiB,EAAE;IACxE,OAAO,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAC5B,OAAe,EACf,UAAoD,EAAE;IAEtD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAEtD,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACJ,OAAO,GAAG,oBAAoB,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,SAAS;QACV,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Program } from "@caporal/core";
2
+ export default function notifyCommand(program: Program): void;
3
+ //# sourceMappingURL=notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/commands/notify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,OAAO,EAAE,MAAM,eAAe,CAAC;AAuB5E,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,OAAO,EAAE,OAAO,QAiErD"}
@@ -0,0 +1,63 @@
1
+ import { DEFAULT_GOOGLE_CHAT_TITLE, DEFAULT_GOOGLE_CHAT_WEBHOOK_KEY, notifyGoogleChat, } from "./notify/google-chat";
2
+ const notifyHelpText = `
3
+ Send deployment notifications to chat providers
4
+
5
+ Usage:
6
+ blt notify <provider>
7
+
8
+ Available providers:
9
+ google-chat Post a status message to a Google Chat webhook
10
+
11
+ Examples:
12
+ blt notify google-chat --status success --env test2 --branch laf-test
13
+ blt notify google-chat --status failure --env demo --title "Data reload"
14
+ blt notify google-chat --message "Schema migration finished on test2"
15
+ `;
16
+ export default function notifyCommand(program) {
17
+ program
18
+ .command("notify", "Send deployment notifications")
19
+ .help(notifyHelpText)
20
+ .action(() => {
21
+ console.log(notifyHelpText);
22
+ });
23
+ program
24
+ .command("notify google-chat", "Post a status message to Google Chat")
25
+ .hide()
26
+ .option("--message <text>", "Send this text verbatim (skips deploy template; --status/--env not required)")
27
+ .option("--status <status>", "Deploy result: success or failure", {
28
+ validator: ["success", "failure"],
29
+ })
30
+ .option("--env <env>", "Environment name shown in the deploy template message")
31
+ .option("--branch <branch>", "Git branch shown in the deploy template message")
32
+ .option("--title <title>", "Notification title", {
33
+ default: DEFAULT_GOOGLE_CHAT_TITLE,
34
+ })
35
+ .option("--webhook-key <key>", "Trailz keys entry for the webhook URL", {
36
+ default: DEFAULT_GOOGLE_CHAT_WEBHOOK_KEY,
37
+ })
38
+ .option("--webhook-url <url>", "Webhook URL (skips trailz keys lookup)")
39
+ .option("--site-url <url>", "Site URL shown in the message")
40
+ .action(async ({ options, logger, }) => {
41
+ try {
42
+ const message = options.message ? String(options.message) : undefined;
43
+ if (!message && (!options.status || !options.env)) {
44
+ throw new Error("Provide --message for a custom notification, or --status and --env for the deploy template.");
45
+ }
46
+ await notifyGoogleChat({
47
+ message,
48
+ status: options.status ? String(options.status) : undefined,
49
+ env: options.env ? String(options.env) : undefined,
50
+ branch: options.branch ? String(options.branch) : undefined,
51
+ title: options.title ? String(options.title) : undefined,
52
+ webhookKey: options.webhookKey ? String(options.webhookKey) : undefined,
53
+ webhookUrl: options.webhookUrl ? String(options.webhookUrl) : undefined,
54
+ siteUrl: options.siteUrl ? String(options.siteUrl) : undefined,
55
+ }, logger);
56
+ }
57
+ catch (error) {
58
+ logger.error(`notify google-chat failed: ${error instanceof Error ? error.message : String(error)}`);
59
+ process.exit(1);
60
+ }
61
+ });
62
+ }
63
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/commands/notify.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemarc/blt",
3
- "version": "1.8.6",
3
+ "version": "1.8.7",
4
4
  "description": "blt cli",
5
5
  "type": "module",
6
6
  "main": "dist/blt",
@@ -19,7 +19,7 @@
19
19
  "dev": "bunx --bun tsc --watch",
20
20
  "start": "bun run src/blt.ts",
21
21
  "prepublishOnly": "bun run build",
22
- "test": "bun test src/commands/app/env-check.test.ts src/commands/env/get.test.ts"
22
+ "test": "bun test src/commands/app/env-check.test.ts src/commands/env/get.test.ts src/commands/notify/google-chat.test.ts"
23
23
  },
24
24
  "keywords": [
25
25
  "blt",