yamchart 0.10.1 → 0.10.3

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 (83) hide show
  1. package/dist/{advisor-5TJDNAY7.js → advisor-XTJQU7E4.js} +12 -12
  2. package/dist/{chunk-QUIDZO5G.js → chunk-2XJZJ6IA.js} +22 -6
  3. package/dist/chunk-2XJZJ6IA.js.map +1 -0
  4. package/dist/{chunk-UFDQ3C7Q.js → chunk-6ELSQNIH.js} +257 -257
  5. package/dist/chunk-6ELSQNIH.js.map +1 -0
  6. package/dist/{chunk-64CI3HSY.js → chunk-KDDO4UII.js} +70 -11
  7. package/dist/chunk-KDDO4UII.js.map +1 -0
  8. package/dist/{chunk-S2CH4HUZ.js → chunk-ODSPBOJW.js} +4 -4
  9. package/dist/chunk-OYBI433Z.js +1296 -0
  10. package/dist/chunk-OYBI433Z.js.map +1 -0
  11. package/dist/{chunk-ZBCQNWVN.js → chunk-PXFTWXSV.js} +5 -5
  12. package/dist/{chunk-5FHV22X2.js → chunk-XNMB25GT.js} +4 -4
  13. package/dist/{connection-utils-FEUWER5I.js → connection-utils-S7EFPTLY.js} +5 -5
  14. package/dist/{describe-MEP72B56.js → describe-TA2CTODC.js} +7 -7
  15. package/dist/{dev-H6SJZ5UA.js → dev-PHFYLJPJ.js} +2589 -1243
  16. package/dist/dev-PHFYLJPJ.js.map +1 -0
  17. package/dist/dev-supervisor-JXLVGEHP.js +43 -0
  18. package/dist/dev-supervisor-JXLVGEHP.js.map +1 -0
  19. package/dist/{dist-PPAD6KOM.js → dist-F6TVLP6C.js} +34 -4
  20. package/dist/{dist-XNCED7JW.js → dist-Q5ETETUU.js} +4 -4
  21. package/dist/{dist-5DQO6L2S.js → dist-YJOOH65Y.js} +9 -5
  22. package/dist/index.js +65 -42
  23. package/dist/index.js.map +1 -1
  24. package/dist/{init-SECXKD5G.js → init-TJJVKMEN.js} +24 -5
  25. package/dist/init-TJJVKMEN.js.map +1 -0
  26. package/dist/public/assets/DataView-V-E6oxy6.js +9 -0
  27. package/dist/public/assets/{EventManagement-BnmeJDQl.js → EventManagement-Do2xU5lV.js} +2 -2
  28. package/dist/public/assets/ExplorePage-Dg50mvGB.js +1 -0
  29. package/dist/public/assets/{LoginPage-CzaFkkjg.js → LoginPage-DmYGIXcu.js} +1 -1
  30. package/dist/public/assets/{PublicViewer-irjxqH6a.js → PublicViewer-CJTgc9OF.js} +1 -1
  31. package/dist/public/assets/{SetupWizard-ConWIcmy.js → SetupWizard-Bo-zmh43.js} +1 -1
  32. package/dist/public/assets/{ShareManagement-CP4wdwLR.js → ShareManagement-6Wp6b2Gp.js} +1 -1
  33. package/dist/public/assets/{SourceDetailView-DZS5518E.js → SourceDetailView-CTzSXhZc.js} +1 -1
  34. package/dist/public/assets/UserManagement-DQhB13T0.js +1 -0
  35. package/dist/public/assets/{index-jlfTO7f5.js → index-CY8xsfQH.js} +41 -41
  36. package/dist/public/assets/{index-C1X8RW4Z.css → index-Dkn-tJCT.css} +1 -1
  37. package/dist/public/assets/{index.es-CgnvEWi5.js → index.es-Bc3yys5L.js} +1 -1
  38. package/dist/public/assets/{jspdf.es.min-Cw5WefMt.js → jspdf.es.min-D94JEH-J.js} +3 -3
  39. package/dist/public/index.html +2 -2
  40. package/dist/{query-2H3YOPI2.js → query-AX4BOPMH.js} +5 -5
  41. package/dist/sample-4NUBJGIL.js +76 -0
  42. package/dist/sample-4NUBJGIL.js.map +1 -0
  43. package/dist/{search-IPE4ISFB.js → search-IBVVYN4I.js} +7 -7
  44. package/dist/{semantic-K3MYXXJI.js → semantic-33YIUMUV.js} +39 -4
  45. package/dist/semantic-33YIUMUV.js.map +1 -0
  46. package/dist/semantic-5WGVZ7HY.js +30 -0
  47. package/dist/{source-resolver-HZQLOODU.js → source-resolver-GYXIRIVK.js} +7 -7
  48. package/dist/source-resolver-GYXIRIVK.js.map +1 -0
  49. package/dist/{sync-warehouse-TUNULDUY.js → sync-warehouse-5NKENCOZ.js} +15 -11
  50. package/dist/sync-warehouse-5NKENCOZ.js.map +1 -0
  51. package/dist/{tables-K5NAN2WK.js → tables-QMZMYYV5.js} +7 -7
  52. package/dist/templates/default/docs/yamchart-reference.md +26 -0
  53. package/dist/{test-SRHVOXZB.js → test-6MCPGXJP.js} +19 -7
  54. package/dist/test-6MCPGXJP.js.map +1 -0
  55. package/package.json +2 -2
  56. package/dist/chunk-64CI3HSY.js.map +0 -1
  57. package/dist/chunk-QUIDZO5G.js.map +0 -1
  58. package/dist/chunk-UFDQ3C7Q.js.map +0 -1
  59. package/dist/chunk-ZIY22VO7.js +0 -1190
  60. package/dist/chunk-ZIY22VO7.js.map +0 -1
  61. package/dist/dev-H6SJZ5UA.js.map +0 -1
  62. package/dist/init-SECXKD5G.js.map +0 -1
  63. package/dist/public/assets/DataView-DUCz_96y.js +0 -9
  64. package/dist/public/assets/ExplorePage-kk4z9ldZ.js +0 -1
  65. package/dist/public/assets/UserManagement-AubGd9hl.js +0 -1
  66. package/dist/sample-ODUGGSFA.js +0 -42
  67. package/dist/sample-ODUGGSFA.js.map +0 -1
  68. package/dist/semantic-K3MYXXJI.js.map +0 -1
  69. package/dist/sync-warehouse-TUNULDUY.js.map +0 -1
  70. package/dist/test-SRHVOXZB.js.map +0 -1
  71. /package/dist/{advisor-5TJDNAY7.js.map → advisor-XTJQU7E4.js.map} +0 -0
  72. /package/dist/{chunk-S2CH4HUZ.js.map → chunk-ODSPBOJW.js.map} +0 -0
  73. /package/dist/{chunk-ZBCQNWVN.js.map → chunk-PXFTWXSV.js.map} +0 -0
  74. /package/dist/{chunk-5FHV22X2.js.map → chunk-XNMB25GT.js.map} +0 -0
  75. /package/dist/{connection-utils-FEUWER5I.js.map → connection-utils-S7EFPTLY.js.map} +0 -0
  76. /package/dist/{describe-MEP72B56.js.map → describe-TA2CTODC.js.map} +0 -0
  77. /package/dist/{dist-5DQO6L2S.js.map → dist-F6TVLP6C.js.map} +0 -0
  78. /package/dist/{dist-PPAD6KOM.js.map → dist-Q5ETETUU.js.map} +0 -0
  79. /package/dist/{dist-XNCED7JW.js.map → dist-YJOOH65Y.js.map} +0 -0
  80. /package/dist/{query-2H3YOPI2.js.map → query-AX4BOPMH.js.map} +0 -0
  81. /package/dist/{search-IPE4ISFB.js.map → search-IBVVYN4I.js.map} +0 -0
  82. /package/dist/{source-resolver-HZQLOODU.js.map → semantic-5WGVZ7HY.js.map} +0 -0
  83. /package/dist/{tables-K5NAN2WK.js.map → tables-QMZMYYV5.js.map} +0 -0
@@ -0,0 +1,43 @@
1
+ import { createRequire as __yamchartCreateRequire } from 'module'; if (!globalThis.require) globalThis.require = __yamchartCreateRequire(import.meta.url);
2
+ import "./chunk-7D4SUZUM.js";
3
+
4
+ // src/commands/dev-supervisor.ts
5
+ import { spawn } from "child_process";
6
+ var RESTART_EXIT_CODE = 75;
7
+ function shouldRestart(code, signal) {
8
+ return signal === null && code === RESTART_EXIT_CODE;
9
+ }
10
+ function superviseDevServer(argv) {
11
+ let child = null;
12
+ let shuttingDown = false;
13
+ const start = () => {
14
+ child = spawn(process.execPath, [process.argv[1], ...argv], {
15
+ stdio: "inherit",
16
+ env: { ...process.env, YAMCHART_DEV_CHILD: "1" }
17
+ });
18
+ child.on("exit", (code, signal) => {
19
+ if (shuttingDown) {
20
+ process.exit(0);
21
+ }
22
+ if (shouldRestart(code, signal)) {
23
+ start();
24
+ } else {
25
+ process.exit(code ?? 0);
26
+ }
27
+ });
28
+ };
29
+ for (const sig of ["SIGINT", "SIGTERM"]) {
30
+ process.once(sig, () => {
31
+ shuttingDown = true;
32
+ if (child) child.kill(sig);
33
+ else process.exit(0);
34
+ });
35
+ }
36
+ start();
37
+ }
38
+ export {
39
+ RESTART_EXIT_CODE,
40
+ shouldRestart,
41
+ superviseDevServer
42
+ };
43
+ //# sourceMappingURL=dev-supervisor-JXLVGEHP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/dev-supervisor.ts"],"sourcesContent":["import { spawn, type ChildProcess } from 'node:child_process';\n\n/** The child requests a restart by exiting with this code (see server services/restart.ts). */\nexport const RESTART_EXIT_CODE = 75;\n\nexport function shouldRestart(code: number | null, signal: NodeJS.Signals | null): boolean {\n return signal === null && code === RESTART_EXIT_CODE;\n}\n\n/**\n * Run the dev server as a supervised child. Re-spawns it whenever it exits with\n * RESTART_EXIT_CODE (a UI-triggered \"apply changes\"); forwards SIGINT/SIGTERM; and\n * propagates any other exit code. Works locally and inside the Fly container\n * (CMD is `yamchart dev …`).\n */\nexport function superviseDevServer(argv: string[]): void {\n let child: ChildProcess | null = null;\n let shuttingDown = false;\n\n const start = () => {\n child = spawn(process.execPath, [process.argv[1]!, ...argv], {\n stdio: 'inherit',\n env: { ...process.env, YAMCHART_DEV_CHILD: '1' },\n });\n child.on('exit', (code, signal) => {\n if (shuttingDown) {\n // We were asked to shut down: exit only AFTER the child has closed\n // (so it can drain connections), then propagate a clean code.\n process.exit(0);\n }\n if (shouldRestart(code, signal)) {\n start(); // re-spawn for an applied config change\n } else {\n process.exit(code ?? 0);\n }\n });\n };\n\n for (const sig of ['SIGINT', 'SIGTERM'] as const) {\n process.once(sig, () => {\n shuttingDown = true;\n // Forward the signal; the child's 'exit' handler above triggers our exit.\n if (child) child.kill(sig);\n else process.exit(0);\n });\n }\n start();\n}\n"],"mappings":";;;AAAA,SAAS,aAAgC;AAGlC,IAAM,oBAAoB;AAE1B,SAAS,cAAc,MAAqB,QAAwC;AACzF,SAAO,WAAW,QAAQ,SAAS;AACrC;AAQO,SAAS,mBAAmB,MAAsB;AACvD,MAAI,QAA6B;AACjC,MAAI,eAAe;AAEnB,QAAM,QAAQ,MAAM;AAClB,YAAQ,MAAM,QAAQ,UAAU,CAAC,QAAQ,KAAK,CAAC,GAAI,GAAG,IAAI,GAAG;AAAA,MAC3D,OAAO;AAAA,MACP,KAAK,EAAE,GAAG,QAAQ,KAAK,oBAAoB,IAAI;AAAA,IACjD,CAAC;AACD,UAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AACjC,UAAI,cAAc;AAGhB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,cAAc,MAAM,MAAM,GAAG;AAC/B,cAAM;AAAA,MACR,OAAO;AACL,gBAAQ,KAAK,QAAQ,CAAC;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,OAAO,CAAC,UAAU,SAAS,GAAY;AAChD,YAAQ,KAAK,KAAK,MAAM;AACtB,qBAAe;AAEf,UAAI,MAAO,OAAM,KAAK,GAAG;AAAA,UACpB,SAAQ,KAAK,CAAC;AAAA,IACrB,CAAC;AAAA,EACH;AACA,QAAM;AACR;","names":[]}
@@ -2,18 +2,21 @@ import { createRequire as __yamchartCreateRequire } from 'module'; if (!globalTh
2
2
  import {
3
3
  AgentDefinitionSchema,
4
4
  AiConfigSchema,
5
+ BigQueryConfigSchema,
5
6
  BlindspotKindSchema,
6
7
  BlindspotSchema,
7
8
  BlindspotStatusSchema,
8
9
  ChartSchema,
9
10
  ColumnProfileSchema,
10
11
  ConnectionSchema,
12
+ ConnectionSecretsSchema,
11
13
  CuratedDimensionSchema,
12
14
  CuratedMetricSchema,
13
15
  CuratedSourceSchema,
14
16
  DashboardSchema,
15
17
  DimensionSchema,
16
18
  DimensionTypeSchema,
19
+ DuckDBConfigSchema,
17
20
  EventSchema,
18
21
  EventsFileSchema,
19
22
  HunchSampleSchema,
@@ -24,14 +27,23 @@ import {
24
27
  MeasureTypeSchema,
25
28
  ModelMetadataSchema,
26
29
  ModelSchema,
30
+ MySQLConfigSchema,
27
31
  NamedFilterSchema,
28
32
  NewBlindspotSchema,
29
33
  NewHunchSchema,
30
34
  NewKnowledgeDocSchema,
31
35
  ParameterSchema,
36
+ PoolConfigSchema,
37
+ PostgresConfigSchema,
32
38
  ProjectSchema,
33
39
  ProviderConfigSchema,
40
+ QueryConfigSchema,
41
+ RESERVED_SLUGS,
34
42
  RelationshipSchema,
43
+ RuntimeConfigSchema,
44
+ RuntimeConnectionSchema,
45
+ SLUG_REGEX,
46
+ SQLiteConfigSchema,
35
47
  ScheduleSchema,
36
48
  SemanticConfigSchema,
37
49
  SemanticDefinitionSchema,
@@ -40,29 +52,35 @@ import {
40
52
  SemanticFilterSchema,
41
53
  SemanticModelSchema,
42
54
  SemanticQuerySchema,
55
+ SnowflakeConfigSchema,
43
56
  SourceProfileSchema,
44
57
  SuggestedModelSchema,
45
58
  TableProfileSchema,
46
59
  VERSION,
47
60
  deepMerge,
48
- resolveProjectConfig
49
- } from "./chunk-ZIY22VO7.js";
61
+ deriveSlug,
62
+ resolveProjectConfig,
63
+ validateSlug
64
+ } from "./chunk-OYBI433Z.js";
50
65
  import "./chunk-7D4SUZUM.js";
51
66
  export {
52
67
  AgentDefinitionSchema,
53
68
  AiConfigSchema,
69
+ BigQueryConfigSchema,
54
70
  BlindspotKindSchema,
55
71
  BlindspotSchema,
56
72
  BlindspotStatusSchema,
57
73
  ChartSchema,
58
74
  ColumnProfileSchema,
59
75
  ConnectionSchema,
76
+ ConnectionSecretsSchema,
60
77
  CuratedDimensionSchema,
61
78
  CuratedMetricSchema,
62
79
  CuratedSourceSchema,
63
80
  DashboardSchema,
64
81
  DimensionSchema,
65
82
  DimensionTypeSchema,
83
+ DuckDBConfigSchema,
66
84
  EventSchema,
67
85
  EventsFileSchema,
68
86
  HunchSampleSchema,
@@ -73,14 +91,23 @@ export {
73
91
  MeasureTypeSchema,
74
92
  ModelMetadataSchema,
75
93
  ModelSchema,
94
+ MySQLConfigSchema,
76
95
  NamedFilterSchema,
77
96
  NewBlindspotSchema,
78
97
  NewHunchSchema,
79
98
  NewKnowledgeDocSchema,
80
99
  ParameterSchema,
100
+ PoolConfigSchema,
101
+ PostgresConfigSchema,
81
102
  ProjectSchema,
82
103
  ProviderConfigSchema,
104
+ QueryConfigSchema,
105
+ RESERVED_SLUGS,
83
106
  RelationshipSchema,
107
+ RuntimeConfigSchema,
108
+ RuntimeConnectionSchema,
109
+ SLUG_REGEX,
110
+ SQLiteConfigSchema,
84
111
  ScheduleSchema,
85
112
  SemanticConfigSchema,
86
113
  SemanticDefinitionSchema,
@@ -89,11 +116,14 @@ export {
89
116
  SemanticFilterSchema,
90
117
  SemanticModelSchema,
91
118
  SemanticQuerySchema,
119
+ SnowflakeConfigSchema,
92
120
  SourceProfileSchema,
93
121
  SuggestedModelSchema,
94
122
  TableProfileSchema,
95
123
  VERSION,
96
124
  deepMerge,
97
- resolveProjectConfig
125
+ deriveSlug,
126
+ resolveProjectConfig,
127
+ validateSlug
98
128
  };
99
- //# sourceMappingURL=dist-PPAD6KOM.js.map
129
+ //# sourceMappingURL=dist-F6TVLP6C.js.map
@@ -31,7 +31,7 @@ import {
31
31
  runModel,
32
32
  serializeDateValue,
33
33
  templateHasVariable
34
- } from "./chunk-QUIDZO5G.js";
34
+ } from "./chunk-2XJZJ6IA.js";
35
35
  import {
36
36
  DATE_PRESETS,
37
37
  SemanticModelBuilder,
@@ -53,8 +53,8 @@ import {
53
53
  isRelativeDateRange,
54
54
  loadSemanticDefinitions,
55
55
  validateSemanticQuery
56
- } from "./chunk-UFDQ3C7Q.js";
57
- import "./chunk-ZIY22VO7.js";
56
+ } from "./chunk-6ELSQNIH.js";
57
+ import "./chunk-OYBI433Z.js";
58
58
  import "./chunk-7D4SUZUM.js";
59
59
  export {
60
60
  BigQueryConnector,
@@ -109,4 +109,4 @@ export {
109
109
  templateHasVariable,
110
110
  validateSemanticQuery
111
111
  };
112
- //# sourceMappingURL=dist-XNCED7JW.js.map
112
+ //# sourceMappingURL=dist-Q5ETETUU.js.map
@@ -6,6 +6,7 @@ import {
6
6
  OpenAICompatibleProvider,
7
7
  SYSTEM_PROMPT,
8
8
  TOOL_DEFINITIONS,
9
+ buildMartFiles,
9
10
  buildModelPath,
10
11
  buildProvider,
11
12
  buildSchemaYmlEntry,
@@ -17,12 +18,13 @@ import {
17
18
  listDbtModels,
18
19
  loadKnowledge,
19
20
  readDbtModel,
21
+ scaffoldModelSql,
20
22
  updateSchemaYml,
21
23
  writeDbtModel
22
- } from "./chunk-64CI3HSY.js";
23
- import "./chunk-QUIDZO5G.js";
24
- import "./chunk-UFDQ3C7Q.js";
25
- import "./chunk-ZIY22VO7.js";
24
+ } from "./chunk-KDDO4UII.js";
25
+ import "./chunk-2XJZJ6IA.js";
26
+ import "./chunk-6ELSQNIH.js";
27
+ import "./chunk-OYBI433Z.js";
26
28
  import "./chunk-7D4SUZUM.js";
27
29
  export {
28
30
  AdvisorAgent,
@@ -31,6 +33,7 @@ export {
31
33
  OpenAICompatibleProvider,
32
34
  SYSTEM_PROMPT,
33
35
  TOOL_DEFINITIONS,
36
+ buildMartFiles,
34
37
  buildModelPath,
35
38
  buildProvider,
36
39
  buildSchemaYmlEntry,
@@ -42,7 +45,8 @@ export {
42
45
  listDbtModels,
43
46
  loadKnowledge,
44
47
  readDbtModel,
48
+ scaffoldModelSql,
45
49
  updateSchemaYml,
46
50
  writeDbtModel
47
51
  };
48
- //# sourceMappingURL=dist-5DQO6L2S.js.map
52
+ //# sourceMappingURL=dist-YJOOH65Y.js.map
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __yamchartCreateRequire } from 'module'; if (!globalThis.require) globalThis.require = __yamchartCreateRequire(import.meta.url);
3
- import {
4
- checkForUpdate
5
- } from "./chunk-TZKNU5TD.js";
6
3
  import {
7
4
  findProjectRoot,
8
5
  loadEnvFile,
9
6
  validateProject
10
- } from "./chunk-S2CH4HUZ.js";
7
+ } from "./chunk-ODSPBOJW.js";
8
+ import {
9
+ checkForUpdate
10
+ } from "./chunk-TZKNU5TD.js";
11
11
  import {
12
12
  detail,
13
13
  error,
@@ -18,9 +18,9 @@ import {
18
18
  success,
19
19
  warning
20
20
  } from "./chunk-HJVVHYVN.js";
21
- import "./chunk-QUIDZO5G.js";
22
- import "./chunk-UFDQ3C7Q.js";
23
- import "./chunk-ZIY22VO7.js";
21
+ import "./chunk-2XJZJ6IA.js";
22
+ import "./chunk-6ELSQNIH.js";
23
+ import "./chunk-OYBI433Z.js";
24
24
  import "./chunk-7D4SUZUM.js";
25
25
 
26
26
  // src/index.ts
@@ -98,6 +98,11 @@ program.command("validate").description("Validate configuration files").argument
98
98
  process.exit(result.success ? 0 : 1);
99
99
  });
100
100
  program.command("dev").description("Start development server with hot reload").argument("[path]", "Path to yamchart project", ".").option("-p, --port <number>", "Port to listen on", "3001").option("--api-only", "Only serve API, no web UI").option("--no-open", "Do not open browser automatically").action(async (path, options) => {
101
+ if (process.env.YAMCHART_DEV_CHILD !== "1") {
102
+ const { superviseDevServer } = await import("./dev-supervisor-JXLVGEHP.js");
103
+ superviseDevServer(process.argv.slice(2));
104
+ return;
105
+ }
101
106
  const startPath = resolve(path);
102
107
  const projectDir = await findProjectRoot(startPath);
103
108
  if (!projectDir) {
@@ -106,7 +111,7 @@ program.command("dev").description("Start development server with hot reload").a
106
111
  process.exit(2);
107
112
  }
108
113
  const globalOpts = program.opts();
109
- const { runDevServer } = await import("./dev-H6SJZ5UA.js");
114
+ const { runDevServer } = await import("./dev-PHFYLJPJ.js");
110
115
  await runDevServer(projectDir, {
111
116
  port: parseInt(options.port, 10),
112
117
  apiOnly: options.apiOnly ?? false,
@@ -116,7 +121,7 @@ program.command("dev").description("Start development server with hot reload").a
116
121
  });
117
122
  });
118
123
  program.command("init").description("Create a new yamchart project").argument("[directory]", "Target directory", ".").option("--example", "Create full example project with sample database").option("--empty", "Create only yamchart.yaml (no connections, models, or charts)").option("--force", "Overwrite existing files").action(async (directory, options) => {
119
- const { initProject } = await import("./init-SECXKD5G.js");
124
+ const { initProject } = await import("./init-TJJVKMEN.js");
120
125
  const targetDir = resolve(directory);
121
126
  const result = await initProject(targetDir, options);
122
127
  if (!result.success) {
@@ -180,7 +185,7 @@ program.command("sync-dbt").description("Sync dbt project metadata into AI-reada
180
185
  if (!options.targetDatabase) {
181
186
  try {
182
187
  const { readFile } = await import("fs/promises");
183
- const { resolveConnection } = await import("./connection-utils-FEUWER5I.js");
188
+ const { resolveConnection } = await import("./connection-utils-S7EFPTLY.js");
184
189
  const { detectDatabaseMismatch } = await import("./rewrite-database-BOA4QPUR.js");
185
190
  const catalogJsonStr = await readFile(join(projectDir, ".yamchart", "catalog.json"), "utf-8");
186
191
  const catalogData = JSON.parse(catalogJsonStr);
@@ -234,7 +239,7 @@ program.command("test").description("Run model tests (@returns schema checks and
234
239
  }
235
240
  loadEnvFile(projectDir);
236
241
  try {
237
- const { testProject, formatTestOutput } = await import("./test-SRHVOXZB.js");
242
+ const { testProject, formatTestOutput } = await import("./test-6MCPGXJP.js");
238
243
  const result = await testProject(projectDir, model, {
239
244
  connection: options.connection,
240
245
  json: options.json
@@ -283,7 +288,7 @@ program.command("tables").description("List tables and views in the connected da
283
288
  loadEnvFile(projectDir);
284
289
  try {
285
290
  if (options.compare) {
286
- const { resolveTablesSource } = await import("./source-resolver-HZQLOODU.js");
291
+ const { resolveTablesSource } = await import("./source-resolver-GYXIRIVK.js");
287
292
  const { compareTables, formatCompareTables } = await import("./compare-RQFCEZIK.js");
288
293
  let localResult;
289
294
  try {
@@ -314,7 +319,7 @@ program.command("tables").description("List tables and views in the connected da
314
319
  }
315
320
  return;
316
321
  }
317
- const { listTables } = await import("./tables-K5NAN2WK.js");
322
+ const { listTables } = await import("./tables-QMZMYYV5.js");
318
323
  const result = await listTables(projectDir, {
319
324
  ...options,
320
325
  source: options.source || "auto"
@@ -352,7 +357,7 @@ program.command("describe").description("Show columns and types for a table").ar
352
357
  loadEnvFile(projectDir);
353
358
  try {
354
359
  if (options.compare) {
355
- const { resolveDescribeSource } = await import("./source-resolver-HZQLOODU.js");
360
+ const { resolveDescribeSource } = await import("./source-resolver-GYXIRIVK.js");
356
361
  const { compareColumns, formatCompareColumns } = await import("./compare-RQFCEZIK.js");
357
362
  let localResult;
358
363
  try {
@@ -374,7 +379,7 @@ program.command("describe").description("Show columns and types for a table").ar
374
379
  }
375
380
  return;
376
381
  }
377
- const { describeTable } = await import("./describe-MEP72B56.js");
382
+ const { describeTable } = await import("./describe-TA2CTODC.js");
378
383
  const result = await describeTable(projectDir, table, {
379
384
  ...options,
380
385
  source: options.source || "auto"
@@ -413,8 +418,8 @@ program.command("query").description("Execute SQL against a connection").argumen
413
418
  }
414
419
  loadEnvFile(projectDir);
415
420
  try {
416
- const { executeQuery } = await import("./query-2H3YOPI2.js");
417
- const { formatTable, formatJSON } = await import("./connection-utils-FEUWER5I.js");
421
+ const { executeQuery } = await import("./query-AX4BOPMH.js");
422
+ const { formatTable, formatJSON } = await import("./connection-utils-S7EFPTLY.js");
418
423
  const limit = options.limit ? parseInt(options.limit, 10) : void 0;
419
424
  const result = await executeQuery(projectDir, sql, {
420
425
  connection: options.connection,
@@ -441,8 +446,8 @@ program.command("sample").description("Show sample rows from a table or dbt mode
441
446
  }
442
447
  loadEnvFile(projectDir);
443
448
  try {
444
- const { sampleTable } = await import("./sample-ODUGGSFA.js");
445
- const { formatTable, formatJSON } = await import("./connection-utils-FEUWER5I.js");
449
+ const { sampleTable } = await import("./sample-4NUBJGIL.js");
450
+ const { formatTable, formatJSON } = await import("./connection-utils-S7EFPTLY.js");
446
451
  const limit = options.limit ? parseInt(options.limit, 10) : void 0;
447
452
  const result = await sampleTable(projectDir, table, {
448
453
  connection: options.connection,
@@ -472,7 +477,7 @@ program.command("search").description("Search for tables and columns by keyword"
472
477
  }
473
478
  loadEnvFile(projectDir);
474
479
  try {
475
- const { searchDatabase } = await import("./search-IPE4ISFB.js");
480
+ const { searchDatabase } = await import("./search-IBVVYN4I.js");
476
481
  const result = await searchDatabase(projectDir, keyword, {
477
482
  ...options,
478
483
  source: options.source || "auto"
@@ -526,7 +531,7 @@ catalogCmd.command("tables").description("List tables from cached catalog").opti
526
531
  process.exit(2);
527
532
  }
528
533
  try {
529
- const { listTables } = await import("./tables-K5NAN2WK.js");
534
+ const { listTables } = await import("./tables-QMZMYYV5.js");
530
535
  const result = await listTables(projectDir, {
531
536
  source: "catalog",
532
537
  schema: options.schema
@@ -568,7 +573,7 @@ catalogCmd.command("describe").description("Show cached columns and types for a
568
573
  process.exit(2);
569
574
  }
570
575
  try {
571
- const { describeTable } = await import("./describe-MEP72B56.js");
576
+ const { describeTable } = await import("./describe-TA2CTODC.js");
572
577
  const result = await describeTable(projectDir, table, { source: "catalog" });
573
578
  if (options.json) {
574
579
  console.log(JSON.stringify(result.columns, null, 2));
@@ -610,7 +615,7 @@ catalogCmd.command("search").description("Search cached metadata for tables and
610
615
  process.exit(2);
611
616
  }
612
617
  try {
613
- const { searchDatabase } = await import("./search-IPE4ISFB.js");
618
+ const { searchDatabase } = await import("./search-IBVVYN4I.js");
614
619
  const result = await searchDatabase(projectDir, keyword, { source: "catalog" });
615
620
  if (options.json) {
616
621
  console.log(JSON.stringify(result.results, null, 2));
@@ -735,7 +740,7 @@ program.command("sync-warehouse").description("Sync warehouse table metadata int
735
740
  }
736
741
  loadEnvFile(projectDir);
737
742
  try {
738
- const { runSyncWarehouse } = await import("./sync-warehouse-TUNULDUY.js");
743
+ const { runSyncWarehouse } = await import("./sync-warehouse-5NKENCOZ.js");
739
744
  await runSyncWarehouse(projectDir, options);
740
745
  } catch (err) {
741
746
  error(err instanceof Error ? err.message : String(err));
@@ -786,7 +791,7 @@ program.command("advisor").description("AI-powered dbt model advisor \u2014 sugg
786
791
  process.exit(2);
787
792
  }
788
793
  loadEnvFile(projectDir);
789
- const { runAdvisor } = await import("./advisor-5TJDNAY7.js");
794
+ const { runAdvisor } = await import("./advisor-XTJQU7E4.js");
790
795
  await runAdvisor(projectDir, question, {
791
796
  top: options.top ? parseInt(options.top, 10) : 5,
792
797
  json: options.json,
@@ -794,7 +799,7 @@ program.command("advisor").description("AI-powered dbt model advisor \u2014 sugg
794
799
  connection: options.connection
795
800
  });
796
801
  });
797
- var semanticCmd = program.command("semantic").description("Explore the semantic layer \u2014 auto-generated measures and dimensions from your catalog").option("--json", "Output as JSON").action(async (options) => {
802
+ var semanticCmd = program.command("semantic").description("Explore the semantic layer \u2014 curated semantic/*.yaml definitions or auto-generated from catalog").option("--json", "Output as JSON").action(async (options) => {
798
803
  const startPath = resolve(".");
799
804
  const projectDir = await findProjectRoot(startPath);
800
805
  if (!projectDir) {
@@ -804,21 +809,31 @@ var semanticCmd = program.command("semantic").description("Explore the semantic
804
809
  }
805
810
  loadEnvFile(projectDir);
806
811
  try {
807
- const { readFile } = await import("fs/promises");
808
- const catalogPath = join(projectDir, ".yamchart", "catalog.json");
809
- const catalogJson = JSON.parse(await readFile(catalogPath, "utf-8"));
810
- const { listSemanticEntities } = await import("./semantic-K3MYXXJI.js");
811
- const result = listSemanticEntities(catalogJson);
812
+ const { loadSemanticDefinitions } = await import("./semantic-5WGVZ7HY.js");
813
+ const { listSemanticDefinitions, listSemanticEntities } = await import("./semantic-33YIUMUV.js");
814
+ const defs = loadSemanticDefinitions(projectDir);
815
+ let result;
816
+ let source;
817
+ if (defs.length > 0) {
818
+ result = listSemanticDefinitions(defs);
819
+ source = "curated";
820
+ } else {
821
+ const { readFile } = await import("fs/promises");
822
+ const catalogPath = join(projectDir, ".yamchart", "catalog.json");
823
+ const catalogJson = JSON.parse(await readFile(catalogPath, "utf-8"));
824
+ result = listSemanticEntities(catalogJson);
825
+ source = "catalog";
826
+ }
812
827
  if (options.json) {
813
828
  console.log(JSON.stringify(result.entities, null, 2));
814
829
  return;
815
830
  }
816
831
  if (result.entities.length === 0) {
817
832
  info("No semantic entities found.");
818
- detail("Run `yamchart sync-dbt` or `yamchart sync-warehouse` to populate the catalog.");
833
+ detail("Add YAML files to semantic/ or run `yamchart sync-dbt` / `yamchart sync-warehouse` to populate the catalog.");
819
834
  return;
820
835
  }
821
- header(`Semantic Layer \u2014 ${result.entities.length} entities`);
836
+ header(`Semantic Layer \u2014 ${result.entities.length} entities (${source === "curated" ? "semantic/*.yaml" : "catalog"})`);
822
837
  for (const entity of result.entities) {
823
838
  console.log(` ${pc.bold(entity.name)}`);
824
839
  console.log(` ${pc.dim(entity.source_table)}`);
@@ -835,7 +850,7 @@ var semanticCmd = program.command("semantic").description("Explore the semantic
835
850
  }
836
851
  } catch (err) {
837
852
  if (err instanceof Error && err.message.includes("ENOENT")) {
838
- error("No catalog found. Run `yamchart sync-dbt` or `yamchart sync-warehouse` first.");
853
+ error("No catalog found. Add semantic/*.yaml files or run `yamchart sync-dbt` / `yamchart sync-warehouse` first.");
839
854
  } else {
840
855
  error(err instanceof Error ? err.message : String(err));
841
856
  }
@@ -851,10 +866,8 @@ semanticCmd.command("query").description("Run a structured query against the sem
851
866
  }
852
867
  loadEnvFile(projectDir);
853
868
  try {
854
- const { readFile } = await import("fs/promises");
855
- const catalogPath = join(projectDir, ".yamchart", "catalog.json");
856
- const catalogJson = JSON.parse(await readFile(catalogPath, "utf-8"));
857
- const { querySemanticEntity } = await import("./semantic-K3MYXXJI.js");
869
+ const { loadSemanticDefinitions } = await import("./semantic-5WGVZ7HY.js");
870
+ const { querySemanticDefinition, querySemanticEntity } = await import("./semantic-33YIUMUV.js");
858
871
  const filters = (options.filter || []).map((f) => {
859
872
  const eqIdx = f.indexOf("=");
860
873
  if (eqIdx === -1) throw new Error(`Invalid filter format: "${f}". Use dimension=value`);
@@ -864,19 +877,29 @@ semanticCmd.command("query").description("Run a structured query against the sem
864
877
  value: f.slice(eqIdx + 1)
865
878
  };
866
879
  });
867
- const result = querySemanticEntity(catalogJson, {
880
+ const queryInput = {
868
881
  entity: options.entity,
869
882
  measures: options.measures.split(",").map((s) => s.trim()),
870
883
  dimensions: options.dimensions ? options.dimensions.split(",").map((s) => s.trim()) : [],
871
884
  filters,
872
885
  order_by: options.order ? { field: options.order, direction: options.desc ? "desc" : "asc" } : void 0,
873
886
  limit: options.limit ? parseInt(options.limit, 10) : 100
874
- });
887
+ };
888
+ const defs = loadSemanticDefinitions(projectDir);
889
+ let result;
890
+ if (defs.length > 0) {
891
+ result = querySemanticDefinition(defs, queryInput);
892
+ } else {
893
+ const { readFile } = await import("fs/promises");
894
+ const catalogPath = join(projectDir, ".yamchart", "catalog.json");
895
+ const catalogJson = JSON.parse(await readFile(catalogPath, "utf-8"));
896
+ result = querySemanticEntity(catalogJson, queryInput);
897
+ }
875
898
  if (options.sql) {
876
899
  console.log(result.sql);
877
900
  return;
878
901
  }
879
- const { resolveConnection, createConnector, formatTable, formatJSON } = await import("./connection-utils-FEUWER5I.js");
902
+ const { resolveConnection, createConnector, formatTable, formatJSON } = await import("./connection-utils-S7EFPTLY.js");
880
903
  const connection = await resolveConnection(projectDir, options.connection, program.opts().env);
881
904
  const connector = createConnector(connection, projectDir);
882
905
  const start = performance.now();
@@ -904,7 +927,7 @@ semanticCmd.command("query").description("Run a structured query against the sem
904
927
  }
905
928
  } catch (err) {
906
929
  if (err instanceof Error && err.message.includes("ENOENT")) {
907
- error("No catalog found. Run `yamchart sync-dbt` or `yamchart sync-warehouse` first.");
930
+ error("No catalog found. Add semantic/*.yaml files or run `yamchart sync-dbt` / `yamchart sync-warehouse` first.");
908
931
  } else {
909
932
  error(err instanceof Error ? err.message : String(err));
910
933
  }