@graphit/cli 0.1.3 → 0.1.5

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 (54) hide show
  1. package/dist/api/client.d.ts +16 -0
  2. package/dist/api/client.js +67 -0
  3. package/dist/api/client.js.map +1 -0
  4. package/dist/auth/credentials.d.ts +15 -0
  5. package/dist/auth/credentials.js +34 -0
  6. package/dist/auth/credentials.js.map +1 -0
  7. package/dist/auth/login.d.ts +2 -0
  8. package/dist/auth/login.js +230 -0
  9. package/dist/auth/login.js.map +1 -0
  10. package/dist/auth/token.d.ts +5 -0
  11. package/dist/auth/token.js +42 -0
  12. package/dist/auth/token.js.map +1 -0
  13. package/dist/commands/auth.d.ts +2 -0
  14. package/dist/commands/auth.js +68 -0
  15. package/dist/commands/auth.js.map +1 -0
  16. package/dist/commands/connector.d.ts +2 -0
  17. package/dist/commands/connector.js +97 -0
  18. package/dist/commands/connector.js.map +1 -0
  19. package/dist/commands/dashboard.d.ts +2 -0
  20. package/dist/commands/dashboard.js +124 -0
  21. package/dist/commands/dashboard.js.map +1 -0
  22. package/dist/commands/ds.d.ts +2 -0
  23. package/dist/commands/ds.js +53 -0
  24. package/dist/commands/ds.js.map +1 -0
  25. package/dist/commands/kb.d.ts +2 -0
  26. package/dist/commands/kb.js +321 -0
  27. package/dist/commands/kb.js.map +1 -0
  28. package/dist/commands/query.d.ts +2 -0
  29. package/dist/commands/query.js +61 -0
  30. package/dist/commands/query.js.map +1 -0
  31. package/dist/commands/setup.d.ts +2 -0
  32. package/dist/commands/setup.js +173 -0
  33. package/dist/commands/setup.js.map +1 -0
  34. package/dist/config.d.ts +4 -0
  35. package/dist/config.js +9 -0
  36. package/dist/config.js.map +1 -0
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.js +27 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/output/format.d.ts +8 -0
  41. package/dist/output/format.js +30 -0
  42. package/dist/output/format.js.map +1 -0
  43. package/dist/output/json.d.ts +1 -0
  44. package/dist/output/json.js +4 -0
  45. package/dist/output/json.js.map +1 -0
  46. package/dist/output/table.d.ts +2 -0
  47. package/dist/output/table.js +17 -0
  48. package/dist/output/table.js.map +1 -0
  49. package/dist/update-check.d.ts +3 -0
  50. package/dist/update-check.js +78 -0
  51. package/dist/update-check.js.map +1 -0
  52. package/package.json +1 -1
  53. package/skills/graphit/SKILL.md +16 -2
  54. package/skills/graphit/references/chart-patterns.md +11 -0
@@ -0,0 +1,124 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { apiClient } from "../api/client.js";
3
+ import { getFrontendUrl } from "../config.js";
4
+ import { output, errorOutput } from "../output/format.js";
5
+ function dashboardUrl(id) {
6
+ return `${getFrontendUrl()}/custom-dashboards/${id}`;
7
+ }
8
+ export function registerDashboardCommands(program) {
9
+ const dashboard = program.command("dashboard").description("Custom dashboard management");
10
+ dashboard
11
+ .command("list")
12
+ .description("List custom dashboards")
13
+ .action(async function () {
14
+ try {
15
+ const resp = await apiClient.get("/api/v1/cli/dashboards");
16
+ const withUrls = resp.dashboards.map((d) => ({
17
+ ...d,
18
+ url: dashboardUrl(d.id),
19
+ }));
20
+ output(this, withUrls, {
21
+ columns: ["id", "name", "has_content", "url"],
22
+ });
23
+ }
24
+ catch (err) {
25
+ errorOutput(err);
26
+ }
27
+ });
28
+ dashboard
29
+ .command("create")
30
+ .description("Create a new custom dashboard")
31
+ .requiredOption("--name <name>", "Dashboard name")
32
+ .action(async function () {
33
+ try {
34
+ const opts = this.opts();
35
+ const resp = await apiClient.post("/api/v1/cli/dashboards", {
36
+ name: opts.name,
37
+ });
38
+ output(this, { ...resp, url: dashboardUrl(resp.id) }, { keyValue: true });
39
+ }
40
+ catch (err) {
41
+ errorOutput(err);
42
+ }
43
+ });
44
+ dashboard
45
+ .command("get <id>")
46
+ .description("Get dashboard details")
47
+ .option("--html", "Include HTML content in output")
48
+ .action(async function (id) {
49
+ try {
50
+ const opts = this.opts();
51
+ const params = opts.html ? "?include_html=true" : "";
52
+ const resp = await apiClient.get(`/api/v1/cli/dashboards/${id}${params}`);
53
+ output(this, resp, { keyValue: true });
54
+ }
55
+ catch (err) {
56
+ errorOutput(err);
57
+ }
58
+ });
59
+ dashboard
60
+ .command("update-html <id>")
61
+ .description("Replace dashboard HTML content")
62
+ .option("--file <path>", "Read HTML from a local file")
63
+ .option("--stdin", "Read HTML from stdin")
64
+ .action(async function (id) {
65
+ try {
66
+ const opts = this.opts();
67
+ let html;
68
+ if (opts.file) {
69
+ html = await readFile(opts.file, "utf-8");
70
+ }
71
+ else if (opts.stdin) {
72
+ html = await readStdin();
73
+ }
74
+ else {
75
+ errorOutput(new Error("Specify --file <path> or --stdin"));
76
+ return;
77
+ }
78
+ const resp = await apiClient.put(`/api/v1/cli/dashboards/${id}/html`, { html });
79
+ output(this, { ...resp, url: dashboardUrl(resp.id) }, { keyValue: true });
80
+ }
81
+ catch (err) {
82
+ errorOutput(err);
83
+ }
84
+ });
85
+ dashboard
86
+ .command("get-html <id>")
87
+ .description("Get the current HTML content of a dashboard")
88
+ .action(async function (id) {
89
+ try {
90
+ const resp = await apiClient.get(`/api/v1/cli/dashboards/${id}?include_html=true`);
91
+ if (!resp.html) {
92
+ console.log("<!-- Canvas is empty - no HTML content yet -->");
93
+ }
94
+ else {
95
+ console.log(resp.html);
96
+ }
97
+ }
98
+ catch (err) {
99
+ errorOutput(err);
100
+ }
101
+ });
102
+ dashboard
103
+ .command("delete <id>")
104
+ .description("Delete a custom dashboard (requires --yes)")
105
+ .requiredOption("--yes", "Confirm deletion")
106
+ .action(async function (id) {
107
+ try {
108
+ await apiClient.delete(`/api/v1/cli/dashboards/${id}`);
109
+ console.log(JSON.stringify({ status: "deleted", id }));
110
+ }
111
+ catch (err) {
112
+ errorOutput(err);
113
+ }
114
+ });
115
+ }
116
+ function readStdin() {
117
+ return new Promise((resolve, reject) => {
118
+ const chunks = [];
119
+ process.stdin.on("data", (chunk) => chunks.push(chunk));
120
+ process.stdin.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
121
+ process.stdin.on("error", reject);
122
+ });
123
+ }
124
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerDSCommands(program: Command): void;
@@ -0,0 +1,53 @@
1
+ import { apiClient } from "../api/client.js";
2
+ import { output, errorOutput } from "../output/format.js";
3
+ export function registerDSCommands(program) {
4
+ const ds = program.command("ds").description("Data source management");
5
+ ds.command("list")
6
+ .description("List data sources")
7
+ .option("--limit <n>", "Max results", "50")
8
+ .action(async function () {
9
+ try {
10
+ const opts = this.opts();
11
+ const resp = await apiClient.get(`/api/v1/cli/ds?limit=${opts.limit}`);
12
+ output(this, resp.data_sources, {
13
+ columns: ["id", "name", "status", "row_count", "verified"],
14
+ });
15
+ }
16
+ catch (err) {
17
+ errorOutput(err);
18
+ }
19
+ });
20
+ ds.command("create")
21
+ .description("Create a data source from a SQL query")
22
+ .requiredOption("--sql <query>", "Source SQL query")
23
+ .requiredOption("--name <name>", "Data source name")
24
+ .option("--connection <id>", "Snowflake connection ID")
25
+ .option("--schema <name>", "Schema name")
26
+ .action(async function () {
27
+ try {
28
+ const opts = this.opts();
29
+ const resp = await apiClient.post("/api/v1/cli/ds", {
30
+ name: opts.name,
31
+ sql: opts.sql,
32
+ connection_id: opts.connection || null,
33
+ schema_name: opts.schema || null,
34
+ });
35
+ output(this, resp, { keyValue: true });
36
+ }
37
+ catch (err) {
38
+ errorOutput(err);
39
+ }
40
+ });
41
+ ds.command("refresh <id>")
42
+ .description("Trigger a data source refresh")
43
+ .action(async function (id) {
44
+ try {
45
+ const resp = await apiClient.post(`/api/v1/cli/ds/${id}/refresh`, {});
46
+ output(this, resp, { keyValue: true });
47
+ }
48
+ catch (err) {
49
+ errorOutput(err);
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=ds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ds.js","sourceRoot":"","sources":["../../src/commands/ds.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAEvE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;SAC1C,MAAM,CAAC,KAAK;QACX,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAC9B,wBAAwB,IAAI,CAAC,KAAK,EAAE,CACrC,CAAC;YACF,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE;gBAC9B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC;aAC3D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uCAAuC,CAAC;SACpD,cAAc,CAAC,eAAe,EAAE,kBAAkB,CAAC;SACnD,cAAc,CAAC,eAAe,EAAE,kBAAkB,CAAC;SACnD,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;SACxC,MAAM,CAAC,KAAK;QACX,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,CAA0B,gBAAgB,EAAE;gBAC3E,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,aAAa,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;gBACtC,WAAW,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;aACjC,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,WAA0B,EAAU;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,CAC/B,kBAAkB,EAAE,UAAU,EAC9B,EAAE,CACH,CAAC;YACF,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerKBCommands(program: Command): void;
@@ -0,0 +1,321 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { apiClient } from "../api/client.js";
3
+ import { output, errorOutput } from "../output/format.js";
4
+ const ENTITY_COLUMNS = {
5
+ metric: ["id", "name", "description", "calculation", "verified"],
6
+ dimension: ["id", "name", "description", "expression", "verified"],
7
+ table: ["id", "name", "description", "verified"],
8
+ rule: ["id", "name", "description", "verified"],
9
+ domain: ["id", "name", "description"],
10
+ synonym: ["id", "name", "target_name", "target_type"],
11
+ template: ["id", "name", "description", "chart_types"],
12
+ };
13
+ export function registerKBCommands(program) {
14
+ const kb = program.command("kb").description("Knowledge Base operations");
15
+ kb.command("list <type>")
16
+ .description("List KB entities (metric, dimension, table, rule, domain, synonym)")
17
+ .option("--limit <n>", "Max results", "50")
18
+ .option("--verified", "Only verified entities")
19
+ .option("--unverified", "Only unverified entities")
20
+ .action(async function (type) {
21
+ try {
22
+ const opts = this.opts();
23
+ const params = new URLSearchParams({ limit: opts.limit });
24
+ if (opts.verified)
25
+ params.set("verified", "true");
26
+ if (opts.unverified)
27
+ params.set("verified", "false");
28
+ const resp = await apiClient.get(`/api/v1/cli/kb/${type}?${params}`);
29
+ output(this, resp.entities, { columns: ENTITY_COLUMNS[type] });
30
+ }
31
+ catch (err) {
32
+ errorOutput(err);
33
+ }
34
+ });
35
+ kb.command("get <type> <name>")
36
+ .description("Get a KB entity by name")
37
+ .action(async function (type, name) {
38
+ try {
39
+ const resp = await apiClient.get(`/api/v1/cli/kb/${type}/by-name/${encodeURIComponent(name)}`);
40
+ output(this, resp.entity, { keyValue: true });
41
+ }
42
+ catch (err) {
43
+ errorOutput(err);
44
+ }
45
+ });
46
+ kb.command("search <query>")
47
+ .description("Search KB assets across all types")
48
+ .option("--type <type>", "Filter by entity type")
49
+ .option("--limit <n>", "Max results", "20")
50
+ .action(async function (query) {
51
+ try {
52
+ const opts = this.opts();
53
+ const params = new URLSearchParams({ q: query, limit: opts.limit });
54
+ if (opts.type)
55
+ params.set("type", opts.type);
56
+ const resp = await apiClient.get(`/api/v1/cli/kb/search?${params}`);
57
+ output(this, resp.results, { columns: ["type", "name", "description"] });
58
+ }
59
+ catch (err) {
60
+ errorOutput(err);
61
+ }
62
+ });
63
+ kb.command("explore <type> <name>")
64
+ .description("Traverse KB graph (metric -> tables -> dimensions)")
65
+ .action(async function (type, name) {
66
+ try {
67
+ const resp = await apiClient.get(`/api/v1/cli/kb/explore/${type}/${encodeURIComponent(name)}`);
68
+ output(this, resp, { keyValue: true });
69
+ }
70
+ catch (err) {
71
+ errorOutput(err);
72
+ }
73
+ });
74
+ // -- Create commands --
75
+ const create = kb.command("create").description("Create KB entities");
76
+ create
77
+ .command("metric")
78
+ .description("Create a new metric")
79
+ .requiredOption("--name <name>", "Metric name (UPPER_SNAKE_CASE)")
80
+ .requiredOption("--sql <expr>", "SQL calculation expression")
81
+ .requiredOption("--table <table>", "Primary table")
82
+ .option("--description <desc>", "Description", "")
83
+ .action(async function () {
84
+ try {
85
+ const opts = this.opts();
86
+ const resp = await apiClient.post("/api/v1/cli/kb/metric", {
87
+ name: opts.name,
88
+ calculation: opts.sql,
89
+ table: opts.table,
90
+ description: opts.description,
91
+ });
92
+ output(this, resp.entity, { keyValue: true });
93
+ }
94
+ catch (err) {
95
+ errorOutput(err);
96
+ }
97
+ });
98
+ create
99
+ .command("dimension")
100
+ .description("Create a new dimension")
101
+ .requiredOption("--name <name>", "Dimension name (UPPER_SNAKE_CASE)")
102
+ .requiredOption("--expr <expr>", "SQL expression")
103
+ .requiredOption("--table <table>", "Primary table")
104
+ .option("--type <type>", "Dimension type", "categorical")
105
+ .option("--description <desc>", "Description", "")
106
+ .action(async function () {
107
+ try {
108
+ const opts = this.opts();
109
+ const resp = await apiClient.post("/api/v1/cli/kb/dimension", {
110
+ name: opts.name,
111
+ expression: opts.expr,
112
+ table: opts.table,
113
+ type: opts.type,
114
+ description: opts.description,
115
+ });
116
+ output(this, resp.entity, { keyValue: true });
117
+ }
118
+ catch (err) {
119
+ errorOutput(err);
120
+ }
121
+ });
122
+ create
123
+ .command("rule")
124
+ .description("Create a new rule")
125
+ .requiredOption("--name <name>", "Rule name (UPPER_SNAKE_CASE)")
126
+ .requiredOption("--sql <expr>", "Rule content/SQL")
127
+ .requiredOption("--table <table>", "Referenced table")
128
+ .option("--description <desc>", "Description", "")
129
+ .action(async function () {
130
+ try {
131
+ const opts = this.opts();
132
+ const resp = await apiClient.post("/api/v1/cli/kb/rule", {
133
+ name: opts.name,
134
+ content: opts.sql,
135
+ table: opts.table,
136
+ description: opts.description,
137
+ });
138
+ output(this, resp.entity, { keyValue: true });
139
+ }
140
+ catch (err) {
141
+ errorOutput(err);
142
+ }
143
+ });
144
+ create
145
+ .command("table")
146
+ .description("Tables are created via data sources. Use `graphit ds create`.")
147
+ .action(function () {
148
+ console.error(JSON.stringify({
149
+ error: "Tables are created via data sources. Use `graphit ds create` instead.",
150
+ }));
151
+ process.exit(1);
152
+ });
153
+ create
154
+ .command("domain")
155
+ .description("Domains are managed via the web app.")
156
+ .action(function () {
157
+ console.error(JSON.stringify({
158
+ error: "Domains are managed via the Graphit web app.",
159
+ }));
160
+ process.exit(1);
161
+ });
162
+ create
163
+ .command("template")
164
+ .description("Create a reusable chart template")
165
+ .requiredOption("--name <name>", "Template name (UPPER_SNAKE_CASE)")
166
+ .option("--render-code <code>", "JS function body for rendering")
167
+ .option("--file <path>", "Read render code from a local file")
168
+ .option("--description <desc>", "Description", "")
169
+ .option("--chart-types <types>", "Related chart types (comma-separated)", "")
170
+ .action(async function () {
171
+ try {
172
+ const opts = this.opts();
173
+ let renderCode;
174
+ if (opts.file) {
175
+ renderCode = await readFile(opts.file, "utf-8");
176
+ }
177
+ else if (opts.renderCode) {
178
+ renderCode = opts.renderCode;
179
+ }
180
+ else {
181
+ console.error(JSON.stringify({ error: "Provide --render-code or --file" }));
182
+ process.exit(1);
183
+ }
184
+ const chartTypes = opts.chartTypes
185
+ ? opts.chartTypes.split(",").map((s) => s.trim()).filter(Boolean)
186
+ : [];
187
+ const resp = await apiClient.post("/api/v1/cli/kb/template", {
188
+ name: opts.name,
189
+ render_code: renderCode,
190
+ description: opts.description,
191
+ chart_types: chartTypes,
192
+ });
193
+ output(this, resp.entity, { keyValue: true });
194
+ }
195
+ catch (err) {
196
+ errorOutput(err);
197
+ }
198
+ });
199
+ // -- Update commands --
200
+ const update = kb.command("update").description("Update KB entities");
201
+ update
202
+ .command("metric <name>")
203
+ .description("Update a metric")
204
+ .option("--sql <expr>", "New SQL calculation")
205
+ .option("--table <table>", "New primary table")
206
+ .option("--description <desc>", "New description")
207
+ .action(async function (name) {
208
+ try {
209
+ const opts = this.opts();
210
+ const resp = await apiClient.put(`/api/v1/cli/kb/metric/${encodeURIComponent(name)}`, {
211
+ calculation: opts.sql ?? null,
212
+ table: opts.table ?? null,
213
+ description: opts.description ?? null,
214
+ });
215
+ output(this, resp.entity, { keyValue: true });
216
+ }
217
+ catch (err) {
218
+ errorOutput(err);
219
+ }
220
+ });
221
+ update
222
+ .command("dimension <name>")
223
+ .description("Update a dimension")
224
+ .option("--expr <expr>", "New SQL expression")
225
+ .option("--table <table>", "New primary table")
226
+ .option("--description <desc>", "New description")
227
+ .action(async function (name) {
228
+ try {
229
+ const opts = this.opts();
230
+ const resp = await apiClient.put(`/api/v1/cli/kb/dimension/${encodeURIComponent(name)}`, {
231
+ expression: opts.expr ?? null,
232
+ table: opts.table ?? null,
233
+ description: opts.description ?? null,
234
+ });
235
+ output(this, resp.entity, { keyValue: true });
236
+ }
237
+ catch (err) {
238
+ errorOutput(err);
239
+ }
240
+ });
241
+ update
242
+ .command("rule <name>")
243
+ .description("Update a rule")
244
+ .option("--sql <expr>", "New rule content")
245
+ .option("--description <desc>", "New description")
246
+ .action(async function (name) {
247
+ try {
248
+ const opts = this.opts();
249
+ const resp = await apiClient.put(`/api/v1/cli/kb/rule/${encodeURIComponent(name)}`, {
250
+ content: opts.sql ?? null,
251
+ description: opts.description ?? null,
252
+ });
253
+ output(this, resp.entity, { keyValue: true });
254
+ }
255
+ catch (err) {
256
+ errorOutput(err);
257
+ }
258
+ });
259
+ update
260
+ .command("template <name>")
261
+ .description("Update a template")
262
+ .option("--render-code <code>", "New JS function body")
263
+ .option("--file <path>", "Read render code from a local file")
264
+ .option("--description <desc>", "New description")
265
+ .action(async function (name) {
266
+ try {
267
+ const opts = this.opts();
268
+ let renderCode = opts.renderCode ?? null;
269
+ if (opts.file) {
270
+ renderCode = await readFile(opts.file, "utf-8");
271
+ }
272
+ const resp = await apiClient.put(`/api/v1/cli/kb/template/${encodeURIComponent(name)}`, {
273
+ render_code: renderCode,
274
+ description: opts.description ?? null,
275
+ });
276
+ output(this, resp.entity, { keyValue: true });
277
+ }
278
+ catch (err) {
279
+ errorOutput(err);
280
+ }
281
+ });
282
+ update
283
+ .command("table <name>")
284
+ .description("Update a table's description or domain")
285
+ .option("--description <desc>", "New description")
286
+ .option("--domain <domain_id>", "New domain ID")
287
+ .action(async function (name) {
288
+ try {
289
+ const opts = this.opts();
290
+ const resp = await apiClient.put(`/api/v1/cli/kb/table/${encodeURIComponent(name)}`, {
291
+ description: opts.description ?? null,
292
+ domain_id: opts.domain ?? null,
293
+ });
294
+ output(this, resp.entity, { keyValue: true });
295
+ }
296
+ catch (err) {
297
+ errorOutput(err);
298
+ }
299
+ });
300
+ // -- Delete command --
301
+ kb.command("delete <type> <name>")
302
+ .description("Delete a KB entity (requires --yes flag)")
303
+ .requiredOption("--yes", "Confirm deletion")
304
+ .action(async function (type, name) {
305
+ try {
306
+ const validTypes = ["metric", "dimension", "rule", "template"];
307
+ if (!validTypes.includes(type)) {
308
+ console.error(JSON.stringify({
309
+ error: `Delete not supported for '${type}'. Supported: ${validTypes.join(", ")}`,
310
+ }));
311
+ process.exit(1);
312
+ }
313
+ await apiClient.delete(`/api/v1/cli/kb/${type}/${encodeURIComponent(name)}`);
314
+ console.log(JSON.stringify({ status: "deleted", type, name: name.toUpperCase() }));
315
+ }
316
+ catch (err) {
317
+ errorOutput(err);
318
+ }
319
+ });
320
+ }
321
+ //# sourceMappingURL=kb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb.js","sourceRoot":"","sources":["../../src/commands/kb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerQueryCommands(program: Command): void;
@@ -0,0 +1,61 @@
1
+ import { apiClient } from "../api/client.js";
2
+ import { output, errorOutput } from "../output/format.js";
3
+ export function registerQueryCommands(program) {
4
+ program
5
+ .command("query <sql>")
6
+ .description("Run SQL against a cached data source or live Snowflake")
7
+ .option("--ds <id>", "Data source ID (cached, ~100ms)")
8
+ .option("--warehouse", "Query live Snowflake (~10s)")
9
+ .option("--connection <id>", "Snowflake connection ID (for --warehouse)")
10
+ .option("--limit <n>", "Max rows returned", "50")
11
+ .action(async function (sql) {
12
+ try {
13
+ const opts = this.opts();
14
+ const resp = await apiClient.post("/api/v1/cli/query", {
15
+ sql,
16
+ data_source_id: opts.ds || null,
17
+ warehouse: !!opts.warehouse,
18
+ connection_id: opts.connection || null,
19
+ limit: parseInt(opts.limit, 10),
20
+ });
21
+ output(this, resp);
22
+ }
23
+ catch (err) {
24
+ errorOutput(err);
25
+ }
26
+ });
27
+ const metadata = program.command("metadata").description("Snowflake metadata");
28
+ metadata
29
+ .command("schemas")
30
+ .description("List Snowflake schemas")
31
+ .requiredOption("--connection <id>", "Connection ID")
32
+ .action(async function () {
33
+ try {
34
+ const opts = this.opts();
35
+ const resp = await apiClient.get(`/api/v1/cli/metadata/schemas?connection_id=${opts.connection}`);
36
+ output(this, resp.schemas.map((s) => ({ schema: s })), { columns: ["schema"] });
37
+ }
38
+ catch (err) {
39
+ errorOutput(err);
40
+ }
41
+ });
42
+ metadata
43
+ .command("tables")
44
+ .description("List tables in a Snowflake schema")
45
+ .requiredOption("--connection <id>", "Connection ID")
46
+ .option("--schema <name>", "Schema name")
47
+ .action(async function () {
48
+ try {
49
+ const opts = this.opts();
50
+ const params = new URLSearchParams({ connection_id: opts.connection });
51
+ if (opts.schema)
52
+ params.set("schema", opts.schema);
53
+ const resp = await apiClient.get(`/api/v1/cli/metadata/tables?${params}`);
54
+ output(this, resp.tables.map((t) => ({ table: t })), { columns: ["table"] });
55
+ }
56
+ catch (err) {
57
+ errorOutput(err);
58
+ }
59
+ });
60
+ }
61
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function registerSetupCommand(program: Command): void;