terse-cli 0.1.75 → 0.2.0

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/cliUi.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- export declare function createSpinner(): import("@clack/prompts").SpinnerResult;
1
+ import { type SpinnerResult } from "@clack/prompts";
2
+ export declare function createSpinner(): SpinnerResult;
2
3
  export declare function interceptConsole(onLine: (line: string) => void): () => void;
3
4
  export declare function createRunIndicator(title: string): {
4
5
  start(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"cliUi.d.ts","sourceRoot":"","sources":["../src/cliUi.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,2CAI5B;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAS3E;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM;;kBAS1B,MAAM;mBAKL,MAAM;qBAIJ,MAAM;kBAIT,MAAM;EAK3B;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAIlD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAI,GAAG,MAAM,CAQvE"}
1
+ {"version":3,"file":"cliUi.d.ts","sourceRoot":"","sources":["../src/cliUi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,gBAAgB,CAAA;AAIjE,wBAAgB,aAAa,IAAI,aAAa,CAO7C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAS3E;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM;;kBAU1B,MAAM;mBAKL,MAAM;qBAIJ,MAAM;kBAIT,MAAM;EAK3B;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAIlD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAI,GAAG,MAAM,CAQvE"}
package/dist/cliUi.js CHANGED
@@ -2,9 +2,12 @@ import { log, spinner } from "@clack/prompts";
2
2
  import chalk from "chalk";
3
3
  import { format } from "node:util";
4
4
  export function createSpinner() {
5
- return spinner({
6
- styleFrame: frame => chalk.hex("#04AB62")(frame)
7
- });
5
+ if (isInteractiveOutput()) {
6
+ return spinner({
7
+ styleFrame: frame => chalk.hex("#04AB62")(frame)
8
+ });
9
+ }
10
+ return new StaticSpinner();
8
11
  }
9
12
  export function interceptConsole(onLine) {
10
13
  const levels = ["log", "info", "warn", "error"];
@@ -20,7 +23,8 @@ export function interceptConsole(onLine) {
20
23
  // Log lines print once and scroll naturally; the spinner lifts out of the way for
21
24
  // each one, so colored output never collides with clack's repaint.
22
25
  export function createRunIndicator(title) {
23
- const spin = spinner({ styleFrame: frame => chalk.hex("#04AB62")(frame), withGuide: false });
26
+ const interactive = isInteractiveOutput();
27
+ const spin = interactive ? spinner({ styleFrame: frame => chalk.hex("#04AB62")(frame), withGuide: false }) : new StaticSpinner();
24
28
  let live = false;
25
29
  return {
26
30
  start() {
@@ -28,11 +32,11 @@ export function createRunIndicator(title) {
28
32
  spin.start(title);
29
33
  },
30
34
  logLine(line) {
31
- if (live)
35
+ if (live && interactive)
32
36
  spin.clear();
33
37
  for (const l of line.split("\n"))
34
38
  log.message(l, { spacing: 0 });
35
- if (live)
39
+ if (live && interactive)
36
40
  spin.start(title);
37
41
  },
38
42
  pause(message) {
@@ -62,4 +66,29 @@ export function formatSummaryList(items, maxItems = 8) {
62
66
  const remaining = items.length - maxItems;
63
67
  return `${visible.join(", ")}, +${remaining} more`;
64
68
  }
69
+ function isInteractiveOutput() {
70
+ return Boolean(process.stdout.isTTY) && process.env.CI !== "true" && !process.env.TERSE_NO_SPINNER;
71
+ }
72
+ // Non-TTY drop-in for clack's spinner. A spinner is a human affordance; a captured
73
+ // stream just gets its animation frames as literal noise. So progress goes dark and
74
+ // only failures, the one thing an agent acts on, print a line.
75
+ class StaticSpinner {
76
+ cancelled = false;
77
+ start() { }
78
+ message() { }
79
+ stop() { }
80
+ error(message = "") {
81
+ if (message)
82
+ log.error(message);
83
+ }
84
+ cancel(message = "") {
85
+ this.cancelled = true;
86
+ if (message)
87
+ log.error(message);
88
+ }
89
+ clear() { }
90
+ get isCancelled() {
91
+ return this.cancelled;
92
+ }
93
+ }
65
94
  //# sourceMappingURL=cliUi.js.map
package/dist/cliUi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cliUi.js","sourceRoot":"","sources":["../src/cliUi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cliUi.js","sourceRoot":"","sources":["../src/cliUi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SerializedEvent } from "terse-types";
2
+ export declare function parseSerializedEventJson(raw: string, flagLabel: string): SerializedEvent;
3
+ //# sourceMappingURL=serializedEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializedEvent.d.ts","sourceRoot":"","sources":["../src/serializedEvent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAKlD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,CAExF"}
@@ -0,0 +1,40 @@
1
+ import { serializedEventSchema } from "terse-types";
2
+ import { z } from "zod";
3
+ import { CliError } from "./cliError.js";
4
+ export function parseSerializedEventJson(raw, flagLabel) {
5
+ return validateSerializedEvent(parseJson(raw, flagLabel));
6
+ }
7
+ function parseJson(raw, flagLabel) {
8
+ try {
9
+ return JSON.parse(raw);
10
+ }
11
+ catch (err) {
12
+ throw new CliError("invalid_event_json", `${flagLabel} must be valid JSON.`, {
13
+ detail: err instanceof Error ? err.message : String(err)
14
+ });
15
+ }
16
+ }
17
+ function validateSerializedEvent(parsed) {
18
+ const result = serializedEventSchema.safeParse(parsed);
19
+ if (result.success)
20
+ return result.data;
21
+ throw new CliError("invalid_event_shape", "Event JSON does not match the canonical Trigger schema.", {
22
+ detail: `${EXPECTED_ENVELOPE_HINT}\n\nValidation issues:\n${z.prettifyError(result.error)}`
23
+ });
24
+ }
25
+ const EXPECTED_ENVELOPE_HINT = `Expected envelope (webhook example):
26
+ {
27
+ "integrationType": "webhook",
28
+ "eventType": "webhook",
29
+ "formattedContent": "<any string>",
30
+ "debugLog": "<any string>",
31
+ "data": {
32
+ "integrationType": "webhook",
33
+ "eventType": "webhook",
34
+ "body": <your provider payload>,
35
+ "headers": { "content-type": "application/json" },
36
+ "method": "POST"
37
+ }
38
+ }
39
+ Tip: \`terse test show <id> --json\` prints a valid event.`;
40
+ //# sourceMappingURL=serializedEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializedEvent.js","sourceRoot":"","sources":["../src/serializedEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,UAAU,wBAAwB,CAAC,GAAW,EAAE,SAAiB;IACnE,OAAO,uBAAuB,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAA;AAC7D,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,SAAiB;IAC7C,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,GAAG,SAAS,sBAAsB,EAAE;YACzE,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAC3D,CAAC,CAAA;IACN,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAe;IAC5C,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtD,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,IAAI,CAAA;IACtC,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,yDAAyD,EAAE;QACjG,MAAM,EAAE,GAAG,sBAAsB,2BAA2B,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;KAC9F,CAAC,CAAA;AACN,CAAC;AAED,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;2DAc4B,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "terse-cli",
3
- "version": "0.1.75",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "repository": {
@@ -38,8 +38,8 @@
38
38
  "typescript": "^5.0.0",
39
39
  "workflow": "5.0.0-beta.19",
40
40
  "zod": "^4.3.6",
41
- "terse-types": "0.0.59",
42
- "terse-sdk": "0.1.64"
41
+ "terse-types": "0.0.61",
42
+ "terse-sdk": "0.2.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/luxon": "^3.7.1",