@graphit/cli 0.1.5 → 0.1.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.
@@ -6,9 +6,11 @@ const ENTITY_COLUMNS = {
6
6
  dimension: ["id", "name", "description", "expression", "verified"],
7
7
  table: ["id", "name", "description", "verified"],
8
8
  rule: ["id", "name", "description", "verified"],
9
- domain: ["id", "name", "description"],
10
- synonym: ["id", "name", "target_name", "target_type"],
9
+ domain: ["id", "name", "description", "color"],
10
+ synonym: ["id", "term", "canonical", "canonical_type", "description"],
11
11
  template: ["id", "name", "description", "chart_types"],
12
+ relationship: ["id", "name", "primary_table", "primary_column", "description"],
13
+ topic: ["id", "name", "description", "verified"],
12
14
  };
13
15
  export function registerKBCommands(program) {
14
16
  const kb = program.command("kb").description("Knowledge Base operations");
@@ -80,14 +82,27 @@ export function registerKBCommands(program) {
80
82
  .requiredOption("--sql <expr>", "SQL calculation expression")
81
83
  .requiredOption("--table <table>", "Primary table")
82
84
  .option("--description <desc>", "Description", "")
85
+ .option("--topics <topics>", "Comma-separated topic names")
86
+ .option("--parameters <json>", "JSON array of parameter definitions")
87
+ .option("--parameters-file <path>", "Read parameters JSON from file")
83
88
  .action(async function () {
84
89
  try {
85
90
  const opts = this.opts();
91
+ const topics = opts.topics ? opts.topics.split(",").map((s) => s.trim()).filter(Boolean) : [];
92
+ let parameters = [];
93
+ if (opts.parametersFile) {
94
+ parameters = JSON.parse(await readFile(opts.parametersFile, "utf-8"));
95
+ }
96
+ else if (opts.parameters) {
97
+ parameters = JSON.parse(opts.parameters);
98
+ }
86
99
  const resp = await apiClient.post("/api/v1/cli/kb/metric", {
87
100
  name: opts.name,
88
101
  calculation: opts.sql,
89
102
  table: opts.table,
90
103
  description: opts.description,
104
+ topics,
105
+ parameters,
91
106
  });
92
107
  output(this, resp.entity, { keyValue: true });
93
108
  }
@@ -103,15 +118,18 @@ export function registerKBCommands(program) {
103
118
  .requiredOption("--table <table>", "Primary table")
104
119
  .option("--type <type>", "Dimension type", "categorical")
105
120
  .option("--description <desc>", "Description", "")
121
+ .option("--topics <topics>", "Comma-separated topic names")
106
122
  .action(async function () {
107
123
  try {
108
124
  const opts = this.opts();
125
+ const topics = opts.topics ? opts.topics.split(",").map((s) => s.trim()).filter(Boolean) : [];
109
126
  const resp = await apiClient.post("/api/v1/cli/kb/dimension", {
110
127
  name: opts.name,
111
128
  expression: opts.expr,
112
129
  table: opts.table,
113
130
  type: opts.type,
114
131
  description: opts.description,
132
+ topics,
115
133
  });
116
134
  output(this, resp.entity, { keyValue: true });
117
135
  }
@@ -126,14 +144,17 @@ export function registerKBCommands(program) {
126
144
  .requiredOption("--sql <expr>", "Rule content/SQL")
127
145
  .requiredOption("--table <table>", "Referenced table")
128
146
  .option("--description <desc>", "Description", "")
147
+ .option("--topics <topics>", "Comma-separated topic names")
129
148
  .action(async function () {
130
149
  try {
131
150
  const opts = this.opts();
151
+ const topics = opts.topics ? opts.topics.split(",").map((s) => s.trim()).filter(Boolean) : [];
132
152
  const resp = await apiClient.post("/api/v1/cli/kb/rule", {
133
153
  name: opts.name,
134
154
  content: opts.sql,
135
155
  table: opts.table,
136
156
  description: opts.description,
157
+ topics,
137
158
  });
138
159
  output(this, resp.entity, { keyValue: true });
139
160
  }
@@ -152,12 +173,89 @@ export function registerKBCommands(program) {
152
173
  });
153
174
  create
154
175
  .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);
176
+ .description("Create a new domain")
177
+ .requiredOption("--name <name>", "Domain name (UPPER_SNAKE_CASE)")
178
+ .option("--description <desc>", "Description", "")
179
+ .option("--color <hex>", "Hex color for UI", "#4DB6AC")
180
+ .action(async function () {
181
+ try {
182
+ const opts = this.opts();
183
+ const resp = await apiClient.post("/api/v1/cli/kb/domain", {
184
+ name: opts.name,
185
+ description: opts.description,
186
+ color: opts.color,
187
+ });
188
+ output(this, resp.entity, { keyValue: true });
189
+ }
190
+ catch (err) {
191
+ errorOutput(err);
192
+ }
193
+ });
194
+ create
195
+ .command("synonym")
196
+ .description("Create a new synonym")
197
+ .requiredOption("--term <term>", "Synonym term (e.g., GMV)")
198
+ .requiredOption("--canonical <name>", "Canonical asset name (e.g., TOTAL_REVENUE)")
199
+ .requiredOption("--type <type>", "Canonical type: metric, column, or table")
200
+ .option("--description <desc>", "Description", "")
201
+ .action(async function () {
202
+ try {
203
+ const opts = this.opts();
204
+ const resp = await apiClient.post("/api/v1/cli/kb/synonym", {
205
+ term: opts.term,
206
+ canonical: opts.canonical,
207
+ canonical_type: opts.type,
208
+ description: opts.description,
209
+ });
210
+ output(this, resp.entity, { keyValue: true });
211
+ }
212
+ catch (err) {
213
+ errorOutput(err);
214
+ }
215
+ });
216
+ create
217
+ .command("relationship")
218
+ .description("Create a new relationship (JOIN between tables)")
219
+ .requiredOption("--name <name>", "Relationship name (e.g., ORDERS_TO_CUSTOMERS)")
220
+ .requiredOption("--primary-table <table>", "Primary table")
221
+ .requiredOption("--primary-column <col>", "Primary column")
222
+ .requiredOption("--related-table <table>", "Related table")
223
+ .requiredOption("--related-column <col>", "Related column")
224
+ .option("--description <desc>", "Description", "")
225
+ .action(async function () {
226
+ try {
227
+ const opts = this.opts();
228
+ const resp = await apiClient.post("/api/v1/cli/kb/relationship", {
229
+ name: opts.name,
230
+ primary_table: opts.primaryTable,
231
+ primary_column: opts.primaryColumn,
232
+ related_table: opts.relatedTable,
233
+ related_column: opts.relatedColumn,
234
+ description: opts.description,
235
+ });
236
+ output(this, resp.entity, { keyValue: true });
237
+ }
238
+ catch (err) {
239
+ errorOutput(err);
240
+ }
241
+ });
242
+ create
243
+ .command("topic")
244
+ .description("Create a new topic (business-concept tag)")
245
+ .requiredOption("--name <name>", "Topic name (UPPER_SNAKE_CASE)")
246
+ .option("--description <desc>", "Description", "")
247
+ .action(async function () {
248
+ try {
249
+ const opts = this.opts();
250
+ const resp = await apiClient.post("/api/v1/cli/kb/topic", {
251
+ name: opts.name,
252
+ description: opts.description,
253
+ });
254
+ output(this, resp.entity, { keyValue: true });
255
+ }
256
+ catch (err) {
257
+ errorOutput(err);
258
+ }
161
259
  });
162
260
  create
163
261
  .command("template")
@@ -204,13 +302,29 @@ export function registerKBCommands(program) {
204
302
  .option("--sql <expr>", "New SQL calculation")
205
303
  .option("--table <table>", "New primary table")
206
304
  .option("--description <desc>", "New description")
305
+ .option("--topics <topics>", "Comma-separated topic names (replaces existing)")
306
+ .option("--secondary-tables <tables>", "Comma-separated secondary table names (replaces existing)")
307
+ .option("--parameters <json>", "JSON array of parameter definitions (replaces existing)")
308
+ .option("--parameters-file <path>", "Read parameters JSON from file")
207
309
  .action(async function (name) {
208
310
  try {
209
311
  const opts = this.opts();
312
+ const topics = opts.topics ? opts.topics.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
313
+ const secondaryTables = opts.secondaryTables ? opts.secondaryTables.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
314
+ let parameters;
315
+ if (opts.parametersFile) {
316
+ parameters = JSON.parse(await readFile(opts.parametersFile, "utf-8"));
317
+ }
318
+ else if (opts.parameters) {
319
+ parameters = JSON.parse(opts.parameters);
320
+ }
210
321
  const resp = await apiClient.put(`/api/v1/cli/kb/metric/${encodeURIComponent(name)}`, {
211
322
  calculation: opts.sql ?? null,
212
323
  table: opts.table ?? null,
213
324
  description: opts.description ?? null,
325
+ topics: topics ?? null,
326
+ secondary_tables: secondaryTables ?? null,
327
+ parameters: parameters ?? null,
214
328
  });
215
329
  output(this, resp.entity, { keyValue: true });
216
330
  }
@@ -224,13 +338,19 @@ export function registerKBCommands(program) {
224
338
  .option("--expr <expr>", "New SQL expression")
225
339
  .option("--table <table>", "New primary table")
226
340
  .option("--description <desc>", "New description")
341
+ .option("--topics <topics>", "Comma-separated topic names (replaces existing)")
342
+ .option("--secondary-tables <tables>", "Comma-separated secondary table names (replaces existing)")
227
343
  .action(async function (name) {
228
344
  try {
229
345
  const opts = this.opts();
346
+ const topics = opts.topics ? opts.topics.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
347
+ const secondaryTables = opts.secondaryTables ? opts.secondaryTables.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
230
348
  const resp = await apiClient.put(`/api/v1/cli/kb/dimension/${encodeURIComponent(name)}`, {
231
349
  expression: opts.expr ?? null,
232
350
  table: opts.table ?? null,
233
351
  description: opts.description ?? null,
352
+ topics: topics ?? null,
353
+ secondary_tables: secondaryTables ?? null,
234
354
  });
235
355
  output(this, resp.entity, { keyValue: true });
236
356
  }
@@ -243,12 +363,18 @@ export function registerKBCommands(program) {
243
363
  .description("Update a rule")
244
364
  .option("--sql <expr>", "New rule content")
245
365
  .option("--description <desc>", "New description")
366
+ .option("--topics <topics>", "Comma-separated topic names (replaces existing)")
367
+ .option("--secondary-tables <tables>", "Comma-separated secondary table names (replaces existing)")
246
368
  .action(async function (name) {
247
369
  try {
248
370
  const opts = this.opts();
371
+ const topics = opts.topics ? opts.topics.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
372
+ const secondaryTables = opts.secondaryTables ? opts.secondaryTables.split(",").map((s) => s.trim()).filter(Boolean) : undefined;
249
373
  const resp = await apiClient.put(`/api/v1/cli/kb/rule/${encodeURIComponent(name)}`, {
250
374
  content: opts.sql ?? null,
251
375
  description: opts.description ?? null,
376
+ topics: topics ?? null,
377
+ secondary_tables: secondaryTables ?? null,
252
378
  });
253
379
  output(this, resp.entity, { keyValue: true });
254
380
  }
@@ -297,13 +423,91 @@ export function registerKBCommands(program) {
297
423
  errorOutput(err);
298
424
  }
299
425
  });
426
+ update
427
+ .command("domain <name>")
428
+ .description("Update a domain")
429
+ .option("--description <desc>", "New description")
430
+ .option("--color <hex>", "New hex color")
431
+ .action(async function (name) {
432
+ try {
433
+ const opts = this.opts();
434
+ const resp = await apiClient.put(`/api/v1/cli/kb/domain/${encodeURIComponent(name)}`, {
435
+ description: opts.description ?? null,
436
+ color: opts.color ?? null,
437
+ });
438
+ output(this, resp.entity, { keyValue: true });
439
+ }
440
+ catch (err) {
441
+ errorOutput(err);
442
+ }
443
+ });
444
+ update
445
+ .command("synonym <term>")
446
+ .description("Update a synonym")
447
+ .option("--canonical <name>", "New canonical asset name")
448
+ .option("--type <type>", "New canonical type: metric, column, or table")
449
+ .option("--description <desc>", "New description")
450
+ .action(async function (term) {
451
+ try {
452
+ const opts = this.opts();
453
+ const resp = await apiClient.put(`/api/v1/cli/kb/synonym/${encodeURIComponent(term)}`, {
454
+ canonical: opts.canonical ?? null,
455
+ canonical_type: opts.type ?? null,
456
+ description: opts.description ?? null,
457
+ });
458
+ output(this, resp.entity, { keyValue: true });
459
+ }
460
+ catch (err) {
461
+ errorOutput(err);
462
+ }
463
+ });
464
+ update
465
+ .command("relationship <name>")
466
+ .description("Update a relationship")
467
+ .option("--description <desc>", "New description")
468
+ .option("--primary-table <table>", "New primary table")
469
+ .option("--primary-column <col>", "New primary column")
470
+ .option("--related-table <table>", "New related table")
471
+ .option("--related-column <col>", "New related column")
472
+ .action(async function (name) {
473
+ try {
474
+ const opts = this.opts();
475
+ const resp = await apiClient.put(`/api/v1/cli/kb/relationship/${encodeURIComponent(name)}`, {
476
+ description: opts.description ?? null,
477
+ primary_table: opts.primaryTable ?? null,
478
+ primary_column: opts.primaryColumn ?? null,
479
+ related_table: opts.relatedTable ?? null,
480
+ related_column: opts.relatedColumn ?? null,
481
+ });
482
+ output(this, resp.entity, { keyValue: true });
483
+ }
484
+ catch (err) {
485
+ errorOutput(err);
486
+ }
487
+ });
488
+ update
489
+ .command("topic <name>")
490
+ .description("Update a topic")
491
+ .option("--description <desc>", "New description")
492
+ .action(async function (name) {
493
+ try {
494
+ const opts = this.opts();
495
+ const resp = await apiClient.put(`/api/v1/cli/kb/topic/${encodeURIComponent(name)}`, {
496
+ description: opts.description ?? null,
497
+ });
498
+ output(this, resp.entity, { keyValue: true });
499
+ }
500
+ catch (err) {
501
+ errorOutput(err);
502
+ }
503
+ });
300
504
  // -- Delete command --
301
505
  kb.command("delete <type> <name>")
302
506
  .description("Delete a KB entity (requires --yes flag)")
303
507
  .requiredOption("--yes", "Confirm deletion")
304
508
  .action(async function (type, name) {
305
509
  try {
306
- const validTypes = ["metric", "dimension", "rule", "template"];
510
+ const validTypes = ["metric", "dimension", "rule", "template", "synonym", "domain", "relationship", "topic"];
307
511
  if (!validTypes.includes(type)) {
308
512
  console.error(JSON.stringify({
309
513
  error: `Delete not supported for '${type}'. Supported: ${validTypes.join(", ")}`,
@@ -1 +1 @@
1
- {"version":3,"file":"kb.js","sourceRoot":"","sources":["../../src/commands/kb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kb.js","sourceRoot":"","sources":["../../src/commands/kb.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphit/cli",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Graphit CLI - Build custom dashboards from any AI coding assistant",
5
5
  "type": "module",
6
6
  "bin": {
@@ -88,27 +88,97 @@ NEVER embed query results as static JS variables. The dashboard iframe provides
88
88
 
89
89
  ---
90
90
 
91
- ## Workflow
91
+ ## Workflow: Dashboard Build
92
92
 
93
93
  1. **Ask the user** what dashboard they want. Don't start querying until you know what they need.
94
- 2. **Explore KB** to understand available metrics, dimensions, tables, and rules.
94
+ 2. **Explore KB** - use `graphit kb list domains` then `graphit kb explore domain <NAME>` to traverse existing assets. Search by concept with `graphit kb search "revenue"`. See `kb-exploration.md` for KB-first discovery, `kb-traversal.md` for tool selection.
95
95
  3. **Find a data source** (`graphit ds list`) - prefer cached data sources (~100ms) over live warehouse (~10s).
96
96
  4. **Query data to validate** - run queries via the CLI to verify SQL and preview results. Show the user what you found.
97
97
  5. **Build HTML** - write `graphit.resolve()` calls for live data + `graphit.chart/table/kpi` for rendering. All CSS in `<style>`, all JS in `<script>`. Write to a local `.html` file.
98
98
  6. **Save** with `graphit dashboard update-html <id> --file <path>`.
99
99
  7. Give the user the dashboard URL so they can open it.
100
100
 
101
+ ## Workflow: KB Build / Onboarding
102
+
103
+ When the user wants to build or populate their KB (from files, schema descriptions, or scratch). Consult `kb-graph-structure.md` for the full graph model, `kb-traversal.md` for tool selection, `kb-actions.md` for the CLI command matrix, `kb-awareness.md` for when to propose asset creation, and `parameterized-metrics.md` for template metrics.
104
+
105
+ **Step 1: Audit current KB state.** Before proposing anything, traverse the existing KB:
106
+
107
+ 1. `graphit kb list domains` - get all domains (with asset counts)
108
+ 2. For each domain: `graphit kb explore domain <NAME>` - returns all tables and assets in that domain in one traversal (see `kb-traversal.md` depth guidelines)
109
+ 3. `graphit kb list synonyms` and `graphit kb list relationships` - global assets not scoped to domains
110
+
111
+ Present a tree summary of what already exists, following the Domain > Table > Topic > Asset hierarchy from `kb-graph-structure.md`.
112
+
113
+ **Step 2: Analyze input.** Read the user's files, schema, or description. Classify every concept by asset type. Use `kb-explanation.md` for asset type definitions (what is a metric vs dimension vs rule). Use `kb-awareness.md` for signals (aggregation = metric, derived grouping = dimension, business constraint = rule, colloquial term = synonym).
114
+
115
+ **Step 3: Present a tree-structured plan.** Show what will be created, organized by the KB hierarchy. Mark existing assets with (exists) so the user sees what's new vs what's already there:
116
+
117
+ ```
118
+ KB Plan:
119
+
120
+ MARKETING (domain) (exists)
121
+ MARKETING_UA (table) (exists)
122
+ ACQUISITION (topic) (exists)
123
+ - TOTAL_SPEND (metric) = SUM(APPSFLYER_COST) **NEW**
124
+ - CPI (metric) (exists)
125
+ - MEDIA_SOURCE (dimension) (exists)
126
+ - CAMPAIGN_NAME (dimension) **NEW**
127
+ ATTRIBUTION (topic) **NEW**
128
+ - ROAS_D7 (metric) = SUM(revenue_d7) / NULLIF(SUM(cost), 0) **NEW**
129
+ - ATTRIBUTION_WINDOW (dimension) **NEW**
130
+ Rules:
131
+ - EXCLUDE_ORGANIC (rule) (exists)
132
+ - ACTIVE_CAMPAIGNS_ONLY (rule) = "WHERE status = 'active'" **NEW**
133
+ MARKETING_UA_6MO (table) (exists)
134
+ (reference TOTAL_SPEND, CPI from MARKETING_UA via secondary_tables)
135
+
136
+ PRODUCT (domain) **NEW**
137
+ EVENTS (table) (exists)
138
+ RETENTION (topic) **NEW**
139
+ - DAU (metric) = COUNT(DISTINCT user_id) **NEW**
140
+ - RETENTION_D7 (metric) **NEW**
141
+
142
+ Global:
143
+ - Synonyms: GMV -> TOTAL_REVENUE (metric) **NEW**
144
+ - Relationships: MARKETING_UA.USER_ID -> EVENTS.USER_ID **NEW**
145
+
146
+ Summary: 5 new metrics, 2 new dimensions, 1 new rule, 1 new domain, 2 new topics, 1 synonym, 1 relationship
147
+ ```
148
+
149
+ For metrics with natural variant axes (D7/D30/D90, gross/net), propose parameterized templates instead of standalone metrics (see `parameterized-metrics.md`).
150
+
151
+ **Step 4: Wait for user approval.** Do not create anything until the user confirms the plan.
152
+
153
+ **Step 5: Execute top-down.** Create in dependency order (see `kb-actions.md` for full CLI command reference):
154
+ 1. Domains (`graphit kb create domain --name X`)
155
+ 2. Topics (`graphit kb create topic --name X`)
156
+ 3. Metrics and dimensions (`graphit kb create metric/dimension ... --topics "A,B"`)
157
+ 4. Rules (`graphit kb create rule`)
158
+ 5. Synonyms (`graphit kb create synonym --term X --canonical Y --type metric`)
159
+ 6. Relationships (`graphit kb create relationship`)
160
+ 7. Attachments: assign domains to tables (`graphit kb update table X --domain Y`), add secondary_tables for cross-table references (`graphit kb update metric X --secondary-tables "T1,T2"`)
161
+
162
+ **Step 6: Verify.** Re-traverse: `graphit kb explore domain <NAME>` for each domain. Show the user the final tree and confirm counts match the plan.
163
+
101
164
  ## Commands
102
165
 
103
166
  | Command | Description |
104
167
  |---------|-------------|
105
- | `graphit kb list <type>` | List metrics, dimensions, tables, rules, domains, synonyms, templates |
168
+ | `graphit kb list <type>` | List entities: metric, dimension, table, rule, domain, synonym, template, relationship, topic |
106
169
  | `graphit kb get <type> <name>` | Full entity details by name |
107
- | `graphit kb search <query>` | Search across all KB types |
170
+ | `graphit kb search <query>` | Search across all KB types (optional `--type` filter) |
108
171
  | `graphit kb explore metric <name>` | Metric -> tables -> dimensions graph |
109
- | `graphit kb create template --name X --file template.html --description "..."` | Save a reusable chart template (--file or --render-code) |
110
- | `graphit kb update template <name> --file template.html --description "..."` | Update a template (--file or --render-code) |
111
- | `graphit kb delete template <name> --yes` | Delete a template |
172
+ | `graphit kb create metric --name X --sql "..." --table T` | Create a metric |
173
+ | `graphit kb create dimension --name X --expr "..." --table T` | Create a dimension (optional `--type categorical`) |
174
+ | `graphit kb create rule --name X --sql "..." --table T` | Create a rule |
175
+ | `graphit kb create synonym --term X --canonical Y --type metric` | Create a synonym (type: metric, column, table) |
176
+ | `graphit kb create domain --name X` | Create a domain (optional `--color "#hex"`) |
177
+ | `graphit kb create relationship --name X --primary-table T --primary-column C --related-table T2 --related-column C2` | Create a JOIN relationship |
178
+ | `graphit kb create topic --name X` | Create a topic (business-concept tag) |
179
+ | `graphit kb create template --name X --file template.html` | Save a reusable chart template (--file or --render-code) |
180
+ | `graphit kb update <type> <name> --field value` | Update any entity (fields vary by type) |
181
+ | `graphit kb delete <type> <name> --yes` | Delete any entity (all types supported) |
112
182
  | `graphit ds list` | List cached data sources (use these for fast queries) |
113
183
  | `graphit query "<sql>" --ds <id>` | Query cached data source (~100ms) |
114
184
  | `graphit query "<sql>" --warehouse --connection <id>` | Query live Snowflake (~10s) |
@@ -230,7 +300,13 @@ Detailed knowledge lives in `references/`. Consult the relevant file when you ne
230
300
  |------|-------------|
231
301
  | `dashboard-planning.md` | Building a multi-chart dashboard. Covers framing the question, picking archetype, mandatory rules, metric contracts, anti-patterns. |
232
302
  | `chart-selection.md` | Choosing chart types. Full dimension/measure defaults, perception ranking, cardinality guards, hard caps. |
233
- | `kb-exploration.md` | Starting a build. KB-first discovery, metric vs dimension, naming conventions, reuse patterns, formula syntax. |
303
+ | `kb-exploration.md` | Starting a build. KB-first discovery, metric vs dimension, naming conventions, formula syntax. |
304
+ | `kb-awareness.md` | KB-first planning. When to propose KB asset creation, reuse over reinvention, cross-table referencing, topic assignment. |
305
+ | `kb-graph-structure.md` | KB graph model. 9 node types, 5 edge types, multi-membership semantics, domain cascade, tree rendering order. |
306
+ | `kb-explanation.md` | Structural Q&A. What are domains, topics, tables, relationships, memory. Why assets appear where they do. |
307
+ | `kb-traversal.md` | Graph queries. Tool selection guide (search vs explore vs read), common query patterns, depth guidelines. |
308
+ | `kb-actions.md` | Full CRUD matrix. Asset create/edit/delete, topic management, domain assignment cascade, navigation and discovery. |
309
+ | `parameterized-metrics.md` | Metric templates. ${PARAM:NAME} tokens, child variant auto-generation, editing templates, using variants in queries. |
234
310
  | `sql-reference.md` | Writing queries. DuckDB/Snowflake translation, formatting standards, gap-filling, JSON access, data source routing. |
235
311
  | `domain-lenses.md` | Data matches a business domain. Marketing, finance, product/growth, ops, sales - signals, key metrics, must-have charts, anti-patterns. |
236
312
  | `graphit-style.md` | Building the HTML. Design principles, typography scale, color system with usage rules, layout patterns (page structure, KPI cards, data tables). |
@@ -0,0 +1,101 @@
1
+ ---
2
+ alwaysApply: false
3
+ description: "Graphit: Every KB action has a CLI equivalent. The tool syntax below maps to CLI commands:"
4
+ globs: []
5
+ ---
6
+
7
+ # KB Actions - CLI Parity Matrix
8
+
9
+ Every KB action has a CLI equivalent. The tool syntax below maps to CLI commands:
10
+
11
+ | Agent Tool Syntax | CLI Command |
12
+ |---|---|
13
+ | `create(entity_type="metric", name=..., calculation=...)` | `graphit kb create metric --name X --sql "..." --table T` |
14
+ | `create(entity_type="dimension", name=..., expression=...)` | `graphit kb create dimension --name X --expr "..." --table T` |
15
+ | `create(entity_type="rule", name=..., rule_text=...)` | `graphit kb create rule --name X --sql "..." --table T` |
16
+ | `create(entity_type="synonym", term=..., canonical=...)` | `graphit kb create synonym --term X --canonical Y --type metric` |
17
+ | `create(entity_type="domain", name=...)` | `graphit kb create domain --name X --description "..."` |
18
+ | `create(entity_type="relationship", ...)` | `graphit kb create relationship --name X --primary-table T --primary-column C --related-table T2 --related-column C2` |
19
+ | `create(entity_type="topic_metadata", name=...)` | `graphit kb create topic --name X --description "..."` |
20
+ | `edit(entity_type=..., id=..., field=value)` | `graphit kb update <type> NAME --field value` |
21
+ | `edit(entity_type="table", id=..., domain_id=...)` | `graphit kb update table NAME --domain DOMAIN` |
22
+ | `delete(entity_type=..., id=...)` | `graphit kb delete <type> NAME --yes` |
23
+ | `search(query="...")` | `graphit kb search "query"` |
24
+ | `list(entity_type="domain")` | `graphit kb list domains` |
25
+ | `read(entity_type="metric", name=...)` | `graphit kb get metric NAME` |
26
+ | `kb_explore(entity_type="table", entity_name="X")` | `graphit kb explore table X` |
27
+
28
+ Full CRUD parity: all agent actions have CLI equivalents.
29
+
30
+ ## Asset CRUD
31
+
32
+ | UI Action | Agent Tool Path |
33
+ |-----------|----------------|
34
+ | Create metric | `create(entity_type="metric", name=..., calculation=..., dependencies=...)` |
35
+ | Create dimension | `create(entity_type="dimension", name=..., table_name=..., expression=...)` |
36
+ | Create rule | `create(entity_type="rule", name=..., rule_text=...)` |
37
+ | Create synonym | `create(entity_type="synonym", term=..., canonical=..., canonical_type=...)` |
38
+ | Create relationship | `create(entity_type="relationship", primary_table=..., primary_column=..., related_table=..., related_column=...)` |
39
+ | Edit any asset | `edit(entity_type=..., id=..., field=new_value)` |
40
+ | Delete any asset | `delete(entity_type=..., id=...)` |
41
+ | Toggle verified | `edit(entity_type=..., id=..., verified=true/false)` |
42
+
43
+ ## Topic Management
44
+
45
+ | UI Action | Agent Tool Path |
46
+ |-----------|----------------|
47
+ | Create topic | `create(entity_type="topic_metadata", name=..., description=...)` |
48
+ | Edit topic description | `edit(entity_type="topic_metadata", id=..., description=...)` |
49
+ | Delete topic metadata | `delete(entity_type="topic_metadata", id=...)` |
50
+ | Toggle topic verified | `edit(entity_type="topic_metadata", id=..., verified=true/false)` |
51
+ | Add topic to asset | `edit(entity_type="metric", id=..., topics=[...existing, "NEW_TOPIC"])` - append to existing list |
52
+ | Remove topic from asset | `edit(entity_type="metric", id=..., topics=[...without removed])` - filter out the topic |
53
+ | Move asset between topics | `edit(entity_type="metric", id=..., topics=["NEW_TOPIC"])` - replace the list |
54
+ | Rename topic (cascade) | `edit(entity_type="topic_metadata", id=..., name=...)` then batch `edit` on each asset that references the old name |
55
+ | Bulk reassign topics | Present plan via `ask_user`, then execute N `edit` calls on approval |
56
+
57
+ ## Domain Management
58
+
59
+ | UI Action | Agent Tool Path |
60
+ |-----------|----------------|
61
+ | Create domain | `create(entity_type="domain", name=..., description=..., color=...)` |
62
+ | Edit domain | `edit(entity_type="domain", id=..., description=..., color=...)` |
63
+ | Delete domain | `delete(entity_type="domain", id=...)` |
64
+
65
+ ## Domain Assignment (Cascade Model)
66
+
67
+ Domain is a single **home** set on the table; every asset on that table inherits it. Assets never store their own home domain - set it on the table, not the asset.
68
+
69
+ | UI Action | Agent Tool Path |
70
+ |-----------|----------------|
71
+ | Set a table's home domain | `edit(entity_type="table", id=..., domain_id="MARKETING")` - cascades to every asset on that table |
72
+ | Clear a table's home domain | `edit(entity_type="table", id=..., domain_id=None)` - its assets fall back to Uncategorized |
73
+ | Reference asset onto another table | `edit(entity_type="metric", id=..., secondary_tables=["OTHER_TABLE"])` - appears under the target table as a read-only pointer (marked with `*`). Metrics/dimensions require identical columns; rules require only target existence. |
74
+ | Remove a table reference | `edit(entity_type="metric", id=..., secondary_tables=[...without removed])` |
75
+ | Mark a synonym cross-cutting to extra domains | `edit(entity_type="synonym", id=..., extra_domain_ids=["FINANCE"])` - adds badges + filter match, does NOT move it in the tree |
76
+ | Remove cross-cutting domains from synonym | `edit(entity_type="synonym", id=..., extra_domain_ids=[])` |
77
+
78
+ A table-backed asset's (metric, dimension, rule) domain is derived from its dependency tables plus any `secondary_tables`. A synonym can also carry `extra_domain_ids` for cross-cutting relevance. To re-home a whole table of assets, change `domain_id` on the table once - do not edit assets individually.
79
+
80
+ ## Navigation and Discovery
81
+
82
+ | UI Action | Agent Tool Path |
83
+ |-----------|----------------|
84
+ | Search KB | `search(query="...", types=[...])` |
85
+ | Filter by topic | `search(query="...", topics=["REVENUE"])` |
86
+ | Filter by domain | `search(query="...", domain="MARKETING")` - matches assets whose dependency or secondary tables are in the MARKETING domain. Synonyms also match via `extra_domain_ids`. |
87
+ | List all domains | `list(entity_type="domain")` - returns every domain with name, description, color, and asset_count; includes an "Uncategorized" entry when tables with no domain exist. Report every domain it returns; do not drop ones with asset_count=0, and do not use `search` or `kb_explore` |
88
+ | List all tables | `list(entity_type="table")` - returns every table with name, domain_id (null if uncategorized), and verified status. Use to see which tables are assigned to which domain, or to find uncategorized tables |
89
+ | Browse by table | `search(query="...", types=["metric", "dimension"])` then filter results by table |
90
+ | What depends on X? | `kb_explore(entity_type="table", entity_name="X", edge_types=["depends_on"])` |
91
+ | What joins with table? | `kb_explore(entity_type="table", entity_name="X", edge_types=["joins"])` |
92
+ | What's in topic X? | `kb_explore(entity_type="topic", entity_name="X", edge_types=["tagged_with"])` |
93
+ | What's in domain X? | `kb_explore(entity_type="domain", entity_name="X")` |
94
+
95
+ ## View Controls (UI-Only, No Agent Parity Needed)
96
+
97
+ These actions are purely UI navigation state and have no agent equivalent:
98
+ - Switch view mode (Tree / By Topic / By Table / Flat)
99
+ - Filter dropdowns (domain, table, topic, type, verified-only)
100
+ - Expand/collapse tree nodes
101
+ - Drag-drop asset onto topic (maps to "Add topic to asset" above)