@graphit/cli 0.2.82 → 0.2.94

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.
@@ -0,0 +1,231 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { apiClient } from "../api/client.js";
3
+ import { output, errorOutput } from "../output/format.js";
4
+ import { parseConstraintFlags, parseApplyOnFlags } from "./kb-constraints.js";
5
+ // Project #254 Phase 1: kb update verbs (metric/dimension/rule/template/table/
6
+ // domain/synonym/relationship/topic). Null fields are left unchanged server-side.
7
+ export function addKBUpdateCommands(kb) {
8
+ const update = kb.command("update").description("Update KB entities");
9
+ update
10
+ .command("metric <name>")
11
+ .description("Update a metric. --owner sets the accountable owner (email or user id); pass \"\" to clear.")
12
+ .option("--sql <expr>", "New SQL calculation")
13
+ .option("--table <table>", "New primary table")
14
+ .option("--description <desc>", "New description")
15
+ .option("--topics <topics>", "Comma-separated topic names (replaces existing)")
16
+ .option("--default-dimensions <dims>", "Comma-separated dimension names (replaces existing)")
17
+ .option("--secondary-tables <tables>", "Comma-separated secondary table names (replaces existing)")
18
+ .option("--parameters <json>", "JSON array of parameter definitions (replaces existing)")
19
+ .option("--parameters-file <path>", "Read parameters JSON from file")
20
+ .option("--owner <user>", "Accountable owner (email or user id); pass \"\" to clear")
21
+ .action(async function (name) {
22
+ try {
23
+ const opts = this.opts();
24
+ const topics = opts.topics !== undefined ? opts.topics.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
25
+ const defaultDimensions = opts.defaultDimensions !== undefined ? opts.defaultDimensions.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
26
+ const secondaryTables = opts.secondaryTables !== undefined ? opts.secondaryTables.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
27
+ let parameters;
28
+ if (opts.parametersFile) {
29
+ parameters = JSON.parse(await readFile(opts.parametersFile, "utf-8"));
30
+ }
31
+ else if (opts.parameters) {
32
+ parameters = JSON.parse(opts.parameters);
33
+ }
34
+ const resp = await apiClient.put(`/api/v1/cli/kb/metric/${encodeURIComponent(name)}`, {
35
+ calculation: opts.sql ?? null,
36
+ table: opts.table ?? null,
37
+ description: opts.description ?? null,
38
+ topics: topics ?? null,
39
+ default_dimensions: defaultDimensions ?? null,
40
+ secondary_tables: secondaryTables ?? null,
41
+ parameters: parameters ?? null,
42
+ owner: opts.owner ?? null,
43
+ });
44
+ output(this, resp.entity, { keyValue: true });
45
+ }
46
+ catch (err) {
47
+ errorOutput(err);
48
+ }
49
+ });
50
+ update
51
+ .command("dimension <name>")
52
+ .description("Update a dimension. --owner sets the accountable owner (email or user id); pass \"\" to clear.")
53
+ .option("--expr <expr>", "New SQL expression")
54
+ .option("--table <table>", "New primary table")
55
+ .option("--description <desc>", "New description")
56
+ .option("--topics <topics>", "Comma-separated topic names (replaces existing)")
57
+ .option("--secondary-tables <tables>", "Comma-separated secondary table names (replaces existing)")
58
+ .option("--owner <user>", "Accountable owner (email or user id); pass \"\" to clear")
59
+ .action(async function (name) {
60
+ try {
61
+ const opts = this.opts();
62
+ const topics = opts.topics !== undefined ? opts.topics.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
63
+ const secondaryTables = opts.secondaryTables !== undefined ? opts.secondaryTables.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
64
+ const resp = await apiClient.put(`/api/v1/cli/kb/dimension/${encodeURIComponent(name)}`, {
65
+ expression: opts.expr ?? null,
66
+ table: opts.table ?? null,
67
+ description: opts.description ?? null,
68
+ topics: topics ?? null,
69
+ secondary_tables: secondaryTables ?? null,
70
+ owner: opts.owner ?? null,
71
+ });
72
+ output(this, resp.entity, { keyValue: true });
73
+ }
74
+ catch (err) {
75
+ errorOutput(err);
76
+ }
77
+ });
78
+ update
79
+ .command("rule <name>")
80
+ .description("Update a rule. Broadening a verified rule's targeting requires org admin. --owner sets the accountable owner (email or user id); pass \"\" to clear.")
81
+ .option("--sql <expr>", "New rule content")
82
+ .option("--description <desc>", "New description")
83
+ .option("--topics <topics>", "Comma-separated topic names (replaces existing)")
84
+ .option("--constraint <spec...>", "Enforceable constraints (replaces existing)")
85
+ .option("--apply-on <targets...>", "What the rule governs (replaces existing). table:NAME governs whole table(s) and cascades to all their metrics/dimensions; metric:NAME / dimension:NAME governs only those assets. Cannot mix table + metric/dimension targets.")
86
+ .option("--override-policy <policy>", "Override policy: anyone|analyst_only|admin_only|never")
87
+ .option("--owner <user>", "Accountable owner (email or user id); pass \"\" to clear")
88
+ .action(async function (name) {
89
+ try {
90
+ const opts = this.opts();
91
+ const topics = opts.topics !== undefined ? opts.topics.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
92
+ const constraints = opts.constraint ? parseConstraintFlags(opts.constraint) : undefined;
93
+ const applyOn = opts.applyOn ? parseApplyOnFlags(opts.applyOn) : undefined;
94
+ const resp = await apiClient.put(`/api/v1/cli/kb/rule/${encodeURIComponent(name)}`, {
95
+ content: opts.sql ?? null,
96
+ description: opts.description ?? null,
97
+ topics: topics ?? null,
98
+ constraints: constraints ?? null,
99
+ apply_on: applyOn ?? null,
100
+ override_policy: opts.overridePolicy ?? null,
101
+ owner: opts.owner ?? null,
102
+ });
103
+ output(this, resp.entity, { keyValue: true });
104
+ }
105
+ catch (err) {
106
+ errorOutput(err);
107
+ }
108
+ });
109
+ update
110
+ .command("template <name>")
111
+ .description("Update a template")
112
+ .option("--render-code <code>", "New JS function body")
113
+ .option("--file <path>", "Read render code from a local file")
114
+ .option("--description <desc>", "New description")
115
+ .action(async function (name) {
116
+ try {
117
+ const opts = this.opts();
118
+ let renderCode = opts.renderCode ?? null;
119
+ if (opts.file) {
120
+ renderCode = await readFile(opts.file, "utf-8");
121
+ }
122
+ const resp = await apiClient.put(`/api/v1/cli/kb/template/${encodeURIComponent(name)}`, {
123
+ render_code: renderCode,
124
+ description: opts.description ?? null,
125
+ });
126
+ output(this, resp.entity, { keyValue: true });
127
+ }
128
+ catch (err) {
129
+ errorOutput(err);
130
+ }
131
+ });
132
+ update
133
+ .command("table <name>")
134
+ .description("Update a table's description or domain")
135
+ .option("--description <desc>", "New description")
136
+ .option("--domain <domain_id>", "New domain ID")
137
+ .action(async function (name) {
138
+ try {
139
+ const opts = this.opts();
140
+ const resp = await apiClient.put(`/api/v1/cli/kb/table/${encodeURIComponent(name)}`, {
141
+ description: opts.description ?? null,
142
+ domain_id: opts.domain ?? null,
143
+ });
144
+ output(this, resp.entity, { keyValue: true });
145
+ }
146
+ catch (err) {
147
+ errorOutput(err);
148
+ }
149
+ });
150
+ update
151
+ .command("domain <name>")
152
+ .description("Update a domain. --owner sets the governance owner (the person accountable for the domain and the fallback owner for its assets); pass an empty string to clear it.")
153
+ .option("--description <desc>", "New description")
154
+ .option("--color <hex>", "New hex color")
155
+ .option("--owner <user>", "Governance owner (email or user id); pass \"\" to clear")
156
+ .action(async function (name) {
157
+ try {
158
+ const opts = this.opts();
159
+ const resp = await apiClient.put(`/api/v1/cli/kb/domain/${encodeURIComponent(name)}`, {
160
+ description: opts.description ?? null,
161
+ color: opts.color ?? null,
162
+ owner: opts.owner ?? null,
163
+ });
164
+ output(this, resp.entity, { keyValue: true });
165
+ }
166
+ catch (err) {
167
+ errorOutput(err);
168
+ }
169
+ });
170
+ update
171
+ .command("synonym <term>")
172
+ .description("Update a synonym")
173
+ .option("--canonical <name>", "New canonical asset name")
174
+ .option("--type <type>", "New canonical type: metric, column, or table")
175
+ .option("--description <desc>", "New description")
176
+ .action(async function (term) {
177
+ try {
178
+ const opts = this.opts();
179
+ const resp = await apiClient.put(`/api/v1/cli/kb/synonym/${encodeURIComponent(term)}`, {
180
+ canonical: opts.canonical ?? null,
181
+ canonical_type: opts.type ?? null,
182
+ description: opts.description ?? null,
183
+ });
184
+ output(this, resp.entity, { keyValue: true });
185
+ }
186
+ catch (err) {
187
+ errorOutput(err);
188
+ }
189
+ });
190
+ update
191
+ .command("relationship <name>")
192
+ .description("Update a relationship")
193
+ .option("--description <desc>", "New description")
194
+ .option("--primary-table <table>", "New primary table")
195
+ .option("--primary-column <col>", "New primary column")
196
+ .option("--related-table <table>", "New related table")
197
+ .option("--related-column <col>", "New related column")
198
+ .action(async function (name) {
199
+ try {
200
+ const opts = this.opts();
201
+ const resp = await apiClient.put(`/api/v1/cli/kb/relationship/${encodeURIComponent(name)}`, {
202
+ description: opts.description ?? null,
203
+ primary_table: opts.primaryTable ?? null,
204
+ primary_column: opts.primaryColumn ?? null,
205
+ related_table: opts.relatedTable ?? null,
206
+ related_column: opts.relatedColumn ?? null,
207
+ });
208
+ output(this, resp.entity, { keyValue: true });
209
+ }
210
+ catch (err) {
211
+ errorOutput(err);
212
+ }
213
+ });
214
+ update
215
+ .command("topic <name>")
216
+ .description("Update a topic")
217
+ .option("--description <desc>", "New description")
218
+ .action(async function (name) {
219
+ try {
220
+ const opts = this.opts();
221
+ const resp = await apiClient.put(`/api/v1/cli/kb/topic/${encodeURIComponent(name)}`, {
222
+ description: opts.description ?? null,
223
+ });
224
+ output(this, resp.entity, { keyValue: true });
225
+ }
226
+ catch (err) {
227
+ errorOutput(err);
228
+ }
229
+ });
230
+ }
231
+ //# sourceMappingURL=kb-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb-update.js","sourceRoot":"","sources":["../../src/commands/kb-update.ts"],"names":[],"mappings":"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"}