@invinite-org/invinite-data-cli 3.0.0 → 4.0.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.
Files changed (129) hide show
  1. package/README.md +341 -374
  2. package/claude-plugin/.claude-plugin/plugin.json +1 -1
  3. package/claude-plugin/agents/invinite-data.md +59 -28
  4. package/claude-plugin/commands/analyze-earnings-call.md +15 -14
  5. package/claude-plugin/commands/analyze-filing.md +8 -7
  6. package/claude-plugin/commands/compare-companies.md +5 -5
  7. package/claude-plugin/commands/financial-research.md +9 -9
  8. package/claude-plugin/commands/ownership-review.md +6 -6
  9. package/claude-plugin/skills/invinite-data-cli/SKILL.md +466 -570
  10. package/dist/bin/invd.js +11 -2
  11. package/dist/bin/invd.js.map +1 -1
  12. package/dist/src/cli.d.ts +2 -0
  13. package/dist/src/cli.js +48 -29
  14. package/dist/src/cli.js.map +1 -1
  15. package/dist/src/client/api-client.d.ts +24 -24
  16. package/dist/src/client/api-client.js +52 -70
  17. package/dist/src/client/api-client.js.map +1 -1
  18. package/dist/src/client/pagination.d.ts +12 -11
  19. package/dist/src/client/pagination.js +47 -56
  20. package/dist/src/client/pagination.js.map +1 -1
  21. package/dist/src/commands/agent-setup.d.ts +21 -0
  22. package/dist/src/commands/agent-setup.js +112 -0
  23. package/dist/src/commands/agent-setup.js.map +1 -0
  24. package/dist/src/commands/api.d.ts +27 -0
  25. package/dist/src/commands/api.js +180 -0
  26. package/dist/src/commands/api.js.map +1 -0
  27. package/dist/src/commands/auth.d.ts +37 -0
  28. package/dist/src/commands/auth.js +336 -0
  29. package/dist/src/commands/auth.js.map +1 -0
  30. package/dist/src/commands/completion.d.ts +7 -0
  31. package/dist/src/commands/completion.js +115 -0
  32. package/dist/src/commands/completion.js.map +1 -0
  33. package/dist/src/commands/config.d.ts +4 -0
  34. package/dist/src/commands/config.js +85 -48
  35. package/dist/src/commands/config.js.map +1 -1
  36. package/dist/src/commands/plugin.d.ts +8 -0
  37. package/dist/src/commands/plugin.js +8 -10
  38. package/dist/src/commands/plugin.js.map +1 -1
  39. package/dist/src/config/auth.d.ts +17 -1
  40. package/dist/src/config/auth.js +50 -36
  41. package/dist/src/config/auth.js.map +1 -1
  42. package/dist/src/config/config-manager.d.ts +56 -4
  43. package/dist/src/config/config-manager.js +173 -29
  44. package/dist/src/config/config-manager.js.map +1 -1
  45. package/dist/src/config/toml.d.ts +7 -0
  46. package/dist/src/config/toml.js +79 -0
  47. package/dist/src/config/toml.js.map +1 -0
  48. package/dist/src/examples.d.ts +22 -0
  49. package/dist/src/examples.js +56 -0
  50. package/dist/src/examples.js.map +1 -0
  51. package/dist/src/generated/cli-manifest.json +5573 -5140
  52. package/dist/src/hand-written-commands.d.ts +11 -41
  53. package/dist/src/hand-written-commands.js +7 -17
  54. package/dist/src/hand-written-commands.js.map +1 -1
  55. package/dist/src/output/jq.d.ts +15 -0
  56. package/dist/src/output/jq.js +234 -0
  57. package/dist/src/output/jq.js.map +1 -0
  58. package/dist/src/output/options.d.ts +29 -0
  59. package/dist/src/output/options.js +72 -0
  60. package/dist/src/output/options.js.map +1 -0
  61. package/dist/src/output/render.d.ts +54 -0
  62. package/dist/src/output/render.js +160 -0
  63. package/dist/src/output/render.js.map +1 -0
  64. package/dist/src/shared/errors.d.ts +59 -15
  65. package/dist/src/shared/errors.js +126 -38
  66. package/dist/src/shared/errors.js.map +1 -1
  67. package/dist/src/shared/prompt.d.ts +10 -0
  68. package/dist/src/shared/prompt.js +24 -0
  69. package/dist/src/shared/prompt.js.map +1 -0
  70. package/dist/src/shared/spinner.js +2 -1
  71. package/dist/src/shared/spinner.js.map +1 -1
  72. package/dist/src/spec-commands.d.ts +14 -6
  73. package/dist/src/spec-commands.js +454 -174
  74. package/dist/src/spec-commands.js.map +1 -1
  75. package/dist/src/spec-flags.d.ts +11 -6
  76. package/dist/src/spec-flags.js +14 -7
  77. package/dist/src/spec-flags.js.map +1 -1
  78. package/dist/src/spec-manifest.d.ts +416 -116
  79. package/dist/src/spec-manifest.js +44 -13
  80. package/dist/src/spec-manifest.js.map +1 -1
  81. package/dist/src/update-notifier.d.ts +9 -0
  82. package/dist/src/update-notifier.js +63 -0
  83. package/dist/src/update-notifier.js.map +1 -0
  84. package/package.json +2 -3
  85. package/dist/src/client/earnings-live.d.ts +0 -194
  86. package/dist/src/client/earnings-live.js +0 -300
  87. package/dist/src/client/earnings-live.js.map +0 -1
  88. package/dist/src/client/news-live.d.ts +0 -72
  89. package/dist/src/client/news-live.js +0 -120
  90. package/dist/src/client/news-live.js.map +0 -1
  91. package/dist/src/client/pdf.d.ts +0 -15
  92. package/dist/src/client/pdf.js +0 -15
  93. package/dist/src/client/pdf.js.map +0 -1
  94. package/dist/src/client/websocket-client.d.ts +0 -19
  95. package/dist/src/client/websocket-client.js +0 -174
  96. package/dist/src/client/websocket-client.js.map +0 -1
  97. package/dist/src/commands/earnings.d.ts +0 -16
  98. package/dist/src/commands/earnings.js +0 -464
  99. package/dist/src/commands/earnings.js.map +0 -1
  100. package/dist/src/commands/login.d.ts +0 -15
  101. package/dist/src/commands/login.js +0 -249
  102. package/dist/src/commands/login.js.map +0 -1
  103. package/dist/src/commands/news.d.ts +0 -2
  104. package/dist/src/commands/news.js +0 -69
  105. package/dist/src/commands/news.js.map +0 -1
  106. package/dist/src/commands/sec.d.ts +0 -47
  107. package/dist/src/commands/sec.js +0 -191
  108. package/dist/src/commands/sec.js.map +0 -1
  109. package/dist/src/commands/ws.d.ts +0 -33
  110. package/dist/src/commands/ws.js +0 -116
  111. package/dist/src/commands/ws.js.map +0 -1
  112. package/dist/src/formatters/json-formatter.d.ts +0 -1
  113. package/dist/src/formatters/json-formatter.js +0 -4
  114. package/dist/src/formatters/json-formatter.js.map +0 -1
  115. package/dist/src/formatters/table-formatter.d.ts +0 -4
  116. package/dist/src/formatters/table-formatter.js +0 -73
  117. package/dist/src/formatters/table-formatter.js.map +0 -1
  118. package/dist/src/formatters/time.d.ts +0 -2
  119. package/dist/src/formatters/time.js +0 -14
  120. package/dist/src/formatters/time.js.map +0 -1
  121. package/dist/src/shared/output.d.ts +0 -3
  122. package/dist/src/shared/output.js +0 -13
  123. package/dist/src/shared/output.js.map +0 -1
  124. package/dist/src/shared/readiness.d.ts +0 -4
  125. package/dist/src/shared/readiness.js +0 -60
  126. package/dist/src/shared/readiness.js.map +0 -1
  127. package/dist/src/shared/types.d.ts +0 -11
  128. package/dist/src/shared/types.js +0 -2
  129. package/dist/src/shared/types.js.map +0 -1
@@ -2,54 +2,24 @@
2
2
  * The commands `invd` writes by hand, each with WHY it is not one REST call plus one view. Every other command is
3
3
  * generated from the manifest (`src/spec-commands.ts`); `tests/unit/command-roster.test.ts` fails on a hand-written
4
4
  * command missing here, on an entry that registers nothing, and on an entry that is also a manifest operation.
5
- * An entry is a top-level command (`group`, covering its subcommands) or one `group action`.
5
+ * An entry is a top-level command (covering its subcommands).
6
6
  */
7
7
  export declare const HAND_WRITTEN_COMMANDS: readonly [{
8
- readonly command: "login";
9
- readonly reason: "Clerk PKCE sign-in in the browser, then the local credential store";
8
+ readonly command: "api";
9
+ readonly reason: "raw access to any spec path (method, -F fields, --paginate, --jq): the escape hatch when the tree lags the spec";
10
10
  }, {
11
- readonly command: "logout";
12
- readonly reason: "clears the local credential store";
11
+ readonly command: "auth";
12
+ readonly reason: "browser sign-in (loopback or pasted redirect), the local key store, status / token / logout";
13
13
  }, {
14
14
  readonly command: "config";
15
- readonly reason: "local settings (API key, API host)";
15
+ readonly reason: "local settings in config.toml / ./.invd.toml";
16
16
  }, {
17
17
  readonly command: "plugin";
18
- readonly reason: "copies the bundled Claude plugin into agent config dirs";
18
+ readonly reason: "copies the bundled agent plugin (skill, agent, commands) into agent config dirs";
19
19
  }, {
20
- readonly command: "ws";
21
- readonly reason: "WebSocket stream (/v1/ws); --earnings is the live transcript (src/client/earnings-live.ts), --news the news.live channel (src/client/news-live.ts)";
20
+ readonly command: "agent-setup";
21
+ readonly reason: "writes the MCP connector config and installs the skill in one step";
22
22
  }, {
23
- readonly command: "earnings transcript";
24
- readonly reason: "renders the transcript as text and saves it with -o";
25
- }, {
26
- readonly command: "earnings press-release";
27
- readonly reason: "prints the release text with --body and saves it with -o";
28
- }, {
29
- readonly command: "earnings audio";
30
- readonly reason: "downloads the recording from its URL with -o";
31
- }, {
32
- readonly command: "earnings slides";
33
- readonly reason: "downloads the deck PDF with -o, prints page markdown with --markdown";
34
- }, {
35
- readonly command: "earnings documents";
36
- readonly reason: "downloads every document into a directory with -o";
37
- }, {
38
- readonly command: "earnings company-documents";
39
- readonly reason: "downloads every stored file into a directory with -o";
40
- }, {
41
- readonly command: "earnings document";
42
- readonly reason: "downloads the file, or fetches and renders its page text with --pages";
43
- }, {
44
- readonly command: "news get";
45
- readonly reason: "prints the item and saves its PDF with --pdf-out";
46
- }, {
47
- readonly command: "sec save";
48
- readonly reason: "saves a filing's originals from their permanent public URLs (manifest size + SHA-256 verified) and lists every document it cannot save";
49
- }, {
50
- readonly command: "sec save-figure";
51
- readonly reason: "saves a cited figure's image from its permanent public URL";
52
- }, {
53
- readonly command: "sec export-file";
54
- readonly reason: "streams the key-authorized .csv.gz of GET /v1/sec/exports/{export_id}/file to disk, SHA-256 verified (the spec excludes it: binary)";
23
+ readonly command: "completion";
24
+ readonly reason: "prints the bash / zsh / fish completion script generated from the command tree and spec paths";
55
25
  }];
@@ -2,24 +2,14 @@
2
2
  * The commands `invd` writes by hand, each with WHY it is not one REST call plus one view. Every other command is
3
3
  * generated from the manifest (`src/spec-commands.ts`); `tests/unit/command-roster.test.ts` fails on a hand-written
4
4
  * command missing here, on an entry that registers nothing, and on an entry that is also a manifest operation.
5
- * An entry is a top-level command (`group`, covering its subcommands) or one `group action`.
5
+ * An entry is a top-level command (covering its subcommands).
6
6
  */
7
7
  export const HAND_WRITTEN_COMMANDS = [
8
- { command: 'login', reason: 'Clerk PKCE sign-in in the browser, then the local credential store' },
9
- { command: 'logout', reason: 'clears the local credential store' },
10
- { command: 'config', reason: 'local settings (API key, API host)' },
11
- { command: 'plugin', reason: 'copies the bundled Claude plugin into agent config dirs' },
12
- { command: 'ws', reason: 'WebSocket stream (/v1/ws); --earnings is the live transcript (src/client/earnings-live.ts), --news the news.live channel (src/client/news-live.ts)' },
13
- { command: 'earnings transcript', reason: 'renders the transcript as text and saves it with -o' },
14
- { command: 'earnings press-release', reason: 'prints the release text with --body and saves it with -o' },
15
- { command: 'earnings audio', reason: 'downloads the recording from its URL with -o' },
16
- { command: 'earnings slides', reason: 'downloads the deck PDF with -o, prints page markdown with --markdown' },
17
- { command: 'earnings documents', reason: 'downloads every document into a directory with -o' },
18
- { command: 'earnings company-documents', reason: 'downloads every stored file into a directory with -o' },
19
- { command: 'earnings document', reason: 'downloads the file, or fetches and renders its page text with --pages' },
20
- { command: 'news get', reason: 'prints the item and saves its PDF with --pdf-out' },
21
- { command: 'sec save', reason: "saves a filing's originals from their permanent public URLs (manifest size + SHA-256 verified) and lists every document it cannot save" },
22
- { command: 'sec save-figure', reason: "saves a cited figure's image from its permanent public URL" },
23
- { command: 'sec export-file', reason: 'streams the key-authorized .csv.gz of GET /v1/sec/exports/{export_id}/file to disk, SHA-256 verified (the spec excludes it: binary)' },
8
+ { command: 'api', reason: 'raw access to any spec path (method, -F fields, --paginate, --jq): the escape hatch when the tree lags the spec' },
9
+ { command: 'auth', reason: 'browser sign-in (loopback or pasted redirect), the local key store, status / token / logout' },
10
+ { command: 'config', reason: 'local settings in config.toml / ./.invd.toml' },
11
+ { command: 'plugin', reason: 'copies the bundled agent plugin (skill, agent, commands) into agent config dirs' },
12
+ { command: 'agent-setup', reason: 'writes the MCP connector config and installs the skill in one step' },
13
+ { command: 'completion', reason: 'prints the bash / zsh / fish completion script generated from the command tree and spec paths' },
24
14
  ];
25
15
  //# sourceMappingURL=hand-written-commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hand-written-commands.js","sourceRoot":"","sources":["../../src/hand-written-commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,oEAAoE,EAAE;IAClG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,mCAAmC,EAAE;IAClE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,oCAAoC,EAAE;IACnE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,yDAAyD,EAAE;IACxF,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,oJAAoJ,EAAE;IAC/K,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,qDAAqD,EAAE;IACjG,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,0DAA0D,EAAE;IACzG,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,8CAA8C,EAAE;IACrF,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,sEAAsE,EAAE;IAC9G,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,mDAAmD,EAAE;IAC9F,EAAE,OAAO,EAAE,4BAA4B,EAAE,MAAM,EAAE,sDAAsD,EAAE;IACzG,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,uEAAuE,EAAE;IACjH,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,kDAAkD,EAAE;IACnF,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,wIAAwI,EAAE;IACzK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,4DAA4D,EAAE;IACpG,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,qIAAqI,EAAE;CACrK,CAAC"}
1
+ {"version":3,"file":"hand-written-commands.js","sourceRoot":"","sources":["../../src/hand-written-commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iHAAiH,EAAE;IAC7I,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,6FAA6F,EAAE;IAC1H,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,8CAA8C,EAAE;IAC7E,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,iFAAiF,EAAE;IAChH,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,oEAAoE,EAAE;IACxG,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,+FAA+F,EAAE;CAC1H,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { UsageError } from '../shared/errors.js';
2
+ /**
3
+ * `--jq <expr>` without a jq dependency: a built-in subset — paths (`.a.b`, `."a-b"`, `.[0]`, `.[]`, `.a?`), pipes,
4
+ * `,`, `length`, `keys`, `select(<path> == <literal>)` (also `!= < <= > >=`, or a bare path for truthiness) and
5
+ * literals. An expression outside it goes to a `jq` binary on PATH when there is one, else it is a usage error.
6
+ * Results print like `jq -r`: strings raw, everything else as compact JSON.
7
+ */
8
+ export declare class UnsupportedJqError extends UsageError {
9
+ }
10
+ /** The built-in evaluation; throws `UnsupportedJqError` outside the subset. */
11
+ export declare function evaluateJq(expr: string, input: unknown): unknown[];
12
+ /** One result as `jq -r` prints it. */
13
+ export declare const jqLine: (value: unknown) => string;
14
+ /** The output lines of `expr` over `input`: built-in, else a `jq` on PATH, else a usage error. */
15
+ export declare function runJq(expr: string, input: unknown): string[];
@@ -0,0 +1,234 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { UsageError } from '../shared/errors.js';
3
+ /**
4
+ * `--jq <expr>` without a jq dependency: a built-in subset — paths (`.a.b`, `."a-b"`, `.[0]`, `.[]`, `.a?`), pipes,
5
+ * `,`, `length`, `keys`, `select(<path> == <literal>)` (also `!= < <= > >=`, or a bare path for truthiness) and
6
+ * literals. An expression outside it goes to a `jq` binary on PATH when there is one, else it is a usage error.
7
+ * Results print like `jq -r`: strings raw, everything else as compact JSON.
8
+ */
9
+ export class UnsupportedJqError extends UsageError {
10
+ }
11
+ function tokenize(expr) {
12
+ const tokens = [];
13
+ let index = 0;
14
+ while (index < expr.length) {
15
+ const char = expr[index] ?? '';
16
+ if (/\s/.test(char)) {
17
+ index += 1;
18
+ continue;
19
+ }
20
+ const two = expr.slice(index, index + 2);
21
+ if (['==', '!=', '<=', '>='].includes(two)) {
22
+ tokens.push({ kind: 'op', value: two });
23
+ index += 2;
24
+ continue;
25
+ }
26
+ if ('.[]|,()?<>'.includes(char)) {
27
+ tokens.push({ kind: 'op', value: char });
28
+ index += 1;
29
+ continue;
30
+ }
31
+ if (char === '"') {
32
+ let end = index + 1;
33
+ let value = '';
34
+ while (end < expr.length && expr[end] !== '"') {
35
+ if (expr[end] === '\\')
36
+ end += 1;
37
+ value += expr[end] ?? '';
38
+ end += 1;
39
+ }
40
+ if (end >= expr.length)
41
+ throw new UnsupportedJqError('unterminated string');
42
+ tokens.push({ kind: 'string', value });
43
+ index = end + 1;
44
+ continue;
45
+ }
46
+ const number = /^-?\d+(\.\d+)?/.exec(expr.slice(index));
47
+ if (number) {
48
+ tokens.push({ kind: 'number', value: number[0] });
49
+ index += number[0].length;
50
+ continue;
51
+ }
52
+ const ident = /^[A-Za-z_][A-Za-z0-9_]*/.exec(expr.slice(index));
53
+ if (ident) {
54
+ tokens.push({ kind: 'ident', value: ident[0] });
55
+ index += ident[0].length;
56
+ continue;
57
+ }
58
+ throw new UnsupportedJqError(`unexpected ${char}`);
59
+ }
60
+ return tokens;
61
+ }
62
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
63
+ class Parser {
64
+ tokens;
65
+ index = 0;
66
+ constructor(tokens) {
67
+ this.tokens = tokens;
68
+ }
69
+ parse() {
70
+ const filter = this.pipe();
71
+ if (this.index < this.tokens.length)
72
+ throw new UnsupportedJqError(`unexpected ${this.tokens[this.index]?.value}`);
73
+ return filter;
74
+ }
75
+ peek(value) {
76
+ const token = this.tokens[this.index];
77
+ return token !== undefined && (value === undefined || (token.kind === 'op' && token.value === value));
78
+ }
79
+ take(value) {
80
+ if (!this.peek(value))
81
+ throw new UnsupportedJqError(`expected ${value}`);
82
+ this.index += 1;
83
+ }
84
+ pipe() {
85
+ let left = this.comma();
86
+ while (this.peek('|')) {
87
+ this.index += 1;
88
+ const first = left;
89
+ const right = this.comma();
90
+ left = input => first(input).flatMap(value => right(value));
91
+ }
92
+ return left;
93
+ }
94
+ comma() {
95
+ const parts = [this.term()];
96
+ while (this.peek(',')) {
97
+ this.index += 1;
98
+ parts.push(this.term());
99
+ }
100
+ return parts.length === 1 && parts[0] ? parts[0] : input => parts.flatMap(part => part(input));
101
+ }
102
+ literal() {
103
+ const token = this.tokens[this.index];
104
+ if (!token)
105
+ return NO_LITERAL;
106
+ if (token.kind === 'string') {
107
+ this.index += 1;
108
+ return token.value;
109
+ }
110
+ if (token.kind === 'number') {
111
+ this.index += 1;
112
+ return Number(token.value);
113
+ }
114
+ if (token.kind === 'ident' && ['true', 'false', 'null'].includes(token.value)) {
115
+ this.index += 1;
116
+ return token.value === 'null' ? null : token.value === 'true';
117
+ }
118
+ return NO_LITERAL;
119
+ }
120
+ term() {
121
+ const token = this.tokens[this.index];
122
+ if (!token)
123
+ throw new UnsupportedJqError('empty expression');
124
+ if (token.kind === 'op' && token.value === '.')
125
+ return this.path();
126
+ if (token.kind === 'ident' && token.value === 'length') {
127
+ this.index += 1;
128
+ return input => [Array.isArray(input) || typeof input === 'string' ? input.length : isRecord(input) ? Object.keys(input).length : 0];
129
+ }
130
+ if (token.kind === 'ident' && token.value === 'keys') {
131
+ this.index += 1;
132
+ return input => [isRecord(input) ? Object.keys(input).sort() : Array.isArray(input) ? input.map((_v, i) => i) : []];
133
+ }
134
+ if (token.kind === 'ident' && token.value === 'select') {
135
+ this.index += 1;
136
+ this.take('(');
137
+ const subject = this.path();
138
+ let compare;
139
+ const op = this.tokens[this.index];
140
+ if (op?.kind === 'op' && ['==', '!=', '<', '<=', '>', '>='].includes(op.value)) {
141
+ this.index += 1;
142
+ const expected = this.literal();
143
+ if (expected === NO_LITERAL)
144
+ throw new UnsupportedJqError('select compares a path with a literal only');
145
+ compare = value => COMPARE[op.value]?.(value, expected) ?? false;
146
+ }
147
+ this.take(')');
148
+ return input => (subject(input).some(value => (compare ? compare(value) : value !== null && value !== false && value !== undefined)) ? [input] : []);
149
+ }
150
+ const literal = this.literal();
151
+ if (literal !== NO_LITERAL)
152
+ return () => [literal];
153
+ throw new UnsupportedJqError(`unsupported ${token.value}`);
154
+ }
155
+ /** `.`, then any of `name`, `"name"`, `[]`, `[n]`, `["name"]`, each optionally `?`. */
156
+ path() {
157
+ this.take('.');
158
+ const steps = [];
159
+ const key = (name) => (value) => {
160
+ if (typeof name === 'number')
161
+ return Array.isArray(value) ? [value.at(name) ?? null] : [null];
162
+ return [isRecord(value) ? value[name] ?? null : null];
163
+ };
164
+ const first = this.tokens[this.index];
165
+ if (first?.kind === 'ident' || first?.kind === 'string') {
166
+ this.index += 1;
167
+ steps.push(key(first.value));
168
+ }
169
+ for (;;) {
170
+ if (this.peek('?')) {
171
+ this.index += 1;
172
+ continue;
173
+ }
174
+ if (this.peek('.')) {
175
+ const next = this.tokens[this.index + 1];
176
+ if (next?.kind !== 'ident' && next?.kind !== 'string')
177
+ break;
178
+ this.index += 2;
179
+ steps.push(key(next.value));
180
+ continue;
181
+ }
182
+ if (this.peek('[')) {
183
+ this.index += 1;
184
+ if (this.peek(']')) {
185
+ this.index += 1;
186
+ steps.push(value => (Array.isArray(value) ? value : isRecord(value) ? Object.values(value) : []));
187
+ continue;
188
+ }
189
+ const inner = this.tokens[this.index];
190
+ if (inner?.kind !== 'number' && inner?.kind !== 'string')
191
+ throw new UnsupportedJqError('unsupported index');
192
+ this.index += 1;
193
+ this.take(']');
194
+ steps.push(key(inner.kind === 'number' ? Number(inner.value) : inner.value));
195
+ continue;
196
+ }
197
+ break;
198
+ }
199
+ return input => steps.reduce((values, step) => values.flatMap(value => step(value)), [input]);
200
+ }
201
+ }
202
+ const NO_LITERAL = Symbol('no literal');
203
+ const COMPARE = {
204
+ '==': (a, b) => JSON.stringify(a) === JSON.stringify(b),
205
+ '!=': (a, b) => JSON.stringify(a) !== JSON.stringify(b),
206
+ '<': (a, b) => a < b,
207
+ '<=': (a, b) => a <= b,
208
+ '>': (a, b) => a > b,
209
+ '>=': (a, b) => a >= b,
210
+ };
211
+ /** The built-in evaluation; throws `UnsupportedJqError` outside the subset. */
212
+ export function evaluateJq(expr, input) {
213
+ return new Parser(tokenize(expr)).parse()(input);
214
+ }
215
+ /** One result as `jq -r` prints it. */
216
+ export const jqLine = (value) => (typeof value === 'string' ? value : JSON.stringify(value));
217
+ /** The output lines of `expr` over `input`: built-in, else a `jq` on PATH, else a usage error. */
218
+ export function runJq(expr, input) {
219
+ try {
220
+ return evaluateJq(expr, input).map(jqLine);
221
+ }
222
+ catch (error) {
223
+ if (!(error instanceof UnsupportedJqError))
224
+ throw error;
225
+ const result = spawnSync('jq', ['-r', expr], { input: JSON.stringify(input), encoding: 'utf8' });
226
+ if (result.error) {
227
+ throw new UnsupportedJqError(`--jq ${expr}: ${error.message}; the built-in subset covers paths, [], |, ",", length, keys and select(); install jq for the full language`);
228
+ }
229
+ if (result.status !== 0)
230
+ throw new UsageError(`--jq: ${result.stderr.trim()}`);
231
+ return result.stdout.split('\n').filter((line, index, all) => line !== '' || index < all.length - 1);
232
+ }
233
+ }
234
+ //# sourceMappingURL=jq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jq.js","sourceRoot":"","sources":["../../../src/output/jq.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { Command } from 'commander';
2
+ import { type OutputSettings } from './render.js';
3
+ /**
4
+ * The output / paging / metering flags every data command carries (the program uses positional options, so they are
5
+ * the command's own, never the root's): `--json [fields]`, `--output`, `--jq`, `--plain`, `--fields`, `--show-cost`,
6
+ * `--dry-run`, `--yes`, `--no-input`, and on a list `--all`.
7
+ */
8
+ export declare function addOutputOptions(command: Command, opts: {
9
+ list: boolean;
10
+ fieldsParam?: boolean;
11
+ }): Command;
12
+ export interface OutputFlags {
13
+ json?: boolean | string;
14
+ output?: string;
15
+ jq?: string;
16
+ plain?: boolean;
17
+ fields?: string;
18
+ all?: boolean;
19
+ dryRun?: boolean;
20
+ yes?: boolean;
21
+ input?: boolean;
22
+ showCost?: boolean;
23
+ }
24
+ /** The output settings a command's flags ask for; `knownFields` checks `--json a,b`. */
25
+ export declare function resolveOutput(flags: OutputFlags, opts?: {
26
+ knownFields?: readonly string[];
27
+ fieldsParam?: boolean;
28
+ list?: boolean;
29
+ }): OutputSettings;
@@ -0,0 +1,72 @@
1
+ import { Option } from 'commander';
2
+ import { splitList } from '../shared/options.js';
3
+ import { UsageError } from '../shared/errors.js';
4
+ import { setJsonMode } from '../shared/spinner.js';
5
+ import { checkFields, defaultFormat, OUTPUT_FORMATS } from './render.js';
6
+ /**
7
+ * The output / paging / metering flags every data command carries (the program uses positional options, so they are
8
+ * the command's own, never the root's): `--json [fields]`, `--output`, `--jq`, `--plain`, `--fields`, `--show-cost`,
9
+ * `--dry-run`, `--yes`, `--no-input`, and on a list `--all`.
10
+ */
11
+ export function addOutputOptions(command, opts) {
12
+ command
13
+ .option('--json [fields]', 'Print JSON; with a comma list, only those fields of each row (see Fields below)')
14
+ .addOption(new Option('--output <format>', 'Output format').choices([...OUTPUT_FORMATS]))
15
+ .option('--jq <expr>', 'Filter the JSON with a jq expression (strings print raw)')
16
+ .option('--plain', 'Tab-separated rows without colour or decoration (the default when piped)')
17
+ .option('--fields <list>', opts.fieldsParam
18
+ ? 'Only these root fields (sent as fields=, pruned by the API)'
19
+ : 'Only these fields of each row (pruned locally)');
20
+ if (opts.list)
21
+ command.option('--all', 'Fetch every page (streams JSONL, or CSV with --output csv)');
22
+ command
23
+ .option('--dry-run', 'Print the request plan and its credit estimate; send nothing')
24
+ .option('--yes', 'Do not ask before a costly --all walk or a delete')
25
+ .option('--no-input', 'Never prompt (a confirmation that is needed fails instead)')
26
+ .option('--show-cost', 'Print the credits this command cost to stderr (or set INVD_SHOW_COST=1)');
27
+ return command;
28
+ }
29
+ /** The output settings a command's flags ask for; `knownFields` checks `--json a,b`. */
30
+ export function resolveOutput(flags, opts = {}) {
31
+ const settings = { format: defaultFormat() };
32
+ if (flags.plain)
33
+ settings.format = 'plain';
34
+ if (flags.output)
35
+ settings.format = flags.output;
36
+ if (flags.json !== undefined && flags.json !== false) {
37
+ if (flags.output && flags.output !== 'json' && flags.output !== 'jsonl') {
38
+ throw new UsageError(`--json and --output ${flags.output} contradict each other`);
39
+ }
40
+ if (!flags.output)
41
+ settings.format = 'json';
42
+ if (typeof flags.json === 'string') {
43
+ const fields = splitList(flags.json);
44
+ if (fields.length === 0)
45
+ throw new UsageError('--json takes a comma list of fields, or nothing');
46
+ checkFields(fields, opts.knownFields ?? []);
47
+ settings.select = fields;
48
+ }
49
+ }
50
+ if (flags.jq !== undefined) {
51
+ if (settings.format !== 'json' && settings.format !== 'jsonl' && (flags.output || flags.plain)) {
52
+ throw new UsageError('--jq prints JSON; it cannot be combined with --output table|plain|csv');
53
+ }
54
+ settings.jq = flags.jq;
55
+ }
56
+ if (flags.fields !== undefined && opts.fieldsParam)
57
+ settings.order = splitList(flags.fields);
58
+ if (flags.fields !== undefined && !opts.fieldsParam) {
59
+ const fields = splitList(flags.fields);
60
+ checkFields(fields, opts.knownFields ?? [], '--fields');
61
+ settings.prune = fields;
62
+ }
63
+ // --all streams: JSON becomes one row per line.
64
+ if (flags.all && settings.format === 'json')
65
+ settings.format = 'jsonl';
66
+ if (flags.all && !flags.output && !flags.plain && flags.json === undefined && !flags.jq)
67
+ settings.format = 'jsonl';
68
+ if (settings.format === 'json' || settings.format === 'jsonl' || settings.format === 'csv' || settings.jq)
69
+ setJsonMode(true);
70
+ return settings;
71
+ }
72
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/output/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Every generated command prints through here: data to stdout (`table` on a terminal, `plain` tab-separated when
3
+ * piped, or `json` / `jsonl` / `csv` on request), progress / cost / coverage notes to stderr (callers), long human
4
+ * output through `INVD_PAGER` / `PAGER` on a terminal.
5
+ */
6
+ export declare const OUTPUT_FORMATS: readonly ["table", "plain", "json", "jsonl", "csv"];
7
+ export type OutputFormat = (typeof OUTPUT_FORMATS)[number];
8
+ export interface OutputSettings {
9
+ format: OutputFormat;
10
+ /** `--json a,b`: the fields each row (or the object) keeps. */
11
+ select?: string[];
12
+ /** `--fields a,b` on an operation without a `fields` parameter: pruned client-side like `select`. */
13
+ prune?: string[];
14
+ /** `--fields a,b` the API prunes (`fields=`): only the column order of table / plain / CSV output. */
15
+ order?: string[];
16
+ jq?: string;
17
+ }
18
+ export interface ShapeInfo {
19
+ list: boolean;
20
+ view: 'table' | 'keyValue' | 'json';
21
+ columns?: string[];
22
+ }
23
+ /** `NO_COLOR` turns colour off unless `FORCE_COLOR` asks for it (chalk reads `FORCE_COLOR` itself). */
24
+ export declare function applyColorEnv(env?: NodeJS.ProcessEnv): void;
25
+ /** A row reduced to `fields` (dotted paths kept as their dotted key). */
26
+ export declare function selectFields(row: unknown, fields: readonly string[]): Record<string, unknown>;
27
+ /** Fails on a `--json` field the operation's rows do not have, listing the ones they do. */
28
+ export declare function checkFields(fields: readonly string[], known: readonly string[], flag?: string): void;
29
+ /** The body with `select` / `prune` applied to its rows (a list keeps its envelope) or to the object. */
30
+ export declare function shapeBody(body: unknown, shape: ShapeInfo, settings: OutputSettings): unknown;
31
+ export declare function tableText(rows: Record<string, unknown>[], columns?: readonly string[]): string;
32
+ export declare function plainText(rows: Record<string, unknown>[], columns?: readonly string[]): string;
33
+ export declare function keyValueText(row: Record<string, unknown>): string;
34
+ /** The CSV columns of some rows: every key, first-seen order. */
35
+ export declare const csvColumns: (rows: unknown[]) => string[];
36
+ export declare const csvHeader: (columns: readonly string[]) => string;
37
+ export declare const csvRow: (row: unknown, columns: readonly string[]) => string;
38
+ /** The rows a body contributes to JSONL / CSV: a list's `data[]`, else the object itself. */
39
+ export declare const bodyRows: (body: unknown, shape: ShapeInfo) => unknown[];
40
+ /** The human view of one body: the operation's columns as a table / key-value list, else indented JSON. */
41
+ export declare function humanText(body: unknown, shape: ShapeInfo, settings: OutputSettings): string;
42
+ /** The whole text of one (non-streamed) body in the chosen format. */
43
+ export declare function renderBody(body: unknown, shape: ShapeInfo, settings: OutputSettings): string;
44
+ /** The pager command for human output: `INVD_PAGER` / config `pager`, else `PAGER`; `''` / `cat` = none. */
45
+ export declare function pagerCommand(env?: NodeJS.ProcessEnv): string | undefined;
46
+ /**
47
+ * Writes `text` to stdout; human output longer than the terminal goes through the pager when stdout is a
48
+ * terminal and a pager is set.
49
+ */
50
+ export declare function emit(text: string, opts?: {
51
+ human?: boolean;
52
+ }): void;
53
+ /** The format when none was asked for: the `output` setting, else `table` on a terminal and `plain` in a pipe. */
54
+ export declare function defaultFormat(): OutputFormat;