@datachonk/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +200 -0
  2. package/dist/__tests__/cache.test.d.ts +2 -0
  3. package/dist/__tests__/cache.test.d.ts.map +1 -0
  4. package/dist/__tests__/cache.test.js +40 -0
  5. package/dist/__tests__/cache.test.js.map +1 -0
  6. package/dist/__tests__/config.test.d.ts +2 -0
  7. package/dist/__tests__/config.test.d.ts.map +1 -0
  8. package/dist/__tests__/config.test.js +113 -0
  9. package/dist/__tests__/config.test.js.map +1 -0
  10. package/dist/__tests__/templates.test.d.ts +2 -0
  11. package/dist/__tests__/templates.test.d.ts.map +1 -0
  12. package/dist/__tests__/templates.test.js +51 -0
  13. package/dist/__tests__/templates.test.js.map +1 -0
  14. package/dist/commands/analyze.d.ts +10 -0
  15. package/dist/commands/analyze.d.ts.map +1 -0
  16. package/dist/commands/analyze.js +156 -0
  17. package/dist/commands/analyze.js.map +1 -0
  18. package/dist/commands/chat.d.ts +3 -0
  19. package/dist/commands/chat.d.ts.map +1 -0
  20. package/dist/commands/chat.js +121 -0
  21. package/dist/commands/chat.js.map +1 -0
  22. package/dist/commands/config.d.ts +2 -0
  23. package/dist/commands/config.d.ts.map +1 -0
  24. package/dist/commands/config.js +287 -0
  25. package/dist/commands/config.js.map +1 -0
  26. package/dist/commands/docs.d.ts +7 -0
  27. package/dist/commands/docs.d.ts.map +1 -0
  28. package/dist/commands/docs.js +208 -0
  29. package/dist/commands/docs.js.map +1 -0
  30. package/dist/commands/generate.d.ts +9 -0
  31. package/dist/commands/generate.d.ts.map +1 -0
  32. package/dist/commands/generate.js +130 -0
  33. package/dist/commands/generate.js.map +1 -0
  34. package/dist/commands/init.d.ts +7 -0
  35. package/dist/commands/init.d.ts.map +1 -0
  36. package/dist/commands/init.js +149 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/lineage.d.ts +9 -0
  39. package/dist/commands/lineage.d.ts.map +1 -0
  40. package/dist/commands/lineage.js +186 -0
  41. package/dist/commands/lineage.js.map +1 -0
  42. package/dist/commands/migrate.d.ts +3 -0
  43. package/dist/commands/migrate.d.ts.map +1 -0
  44. package/dist/commands/migrate.js +213 -0
  45. package/dist/commands/migrate.js.map +1 -0
  46. package/dist/commands/review.d.ts +8 -0
  47. package/dist/commands/review.d.ts.map +1 -0
  48. package/dist/commands/review.js +215 -0
  49. package/dist/commands/review.js.map +1 -0
  50. package/dist/commands/scan.d.ts +18 -0
  51. package/dist/commands/scan.d.ts.map +1 -0
  52. package/dist/commands/scan.js +335 -0
  53. package/dist/commands/scan.js.map +1 -0
  54. package/dist/commands/test.d.ts +3 -0
  55. package/dist/commands/test.d.ts.map +1 -0
  56. package/dist/commands/test.js +244 -0
  57. package/dist/commands/test.js.map +1 -0
  58. package/dist/index.d.ts +3 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +232 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/utils/analyzer.d.ts +39 -0
  63. package/dist/utils/analyzer.d.ts.map +1 -0
  64. package/dist/utils/analyzer.js +310 -0
  65. package/dist/utils/analyzer.js.map +1 -0
  66. package/dist/utils/cache.d.ts +98 -0
  67. package/dist/utils/cache.d.ts.map +1 -0
  68. package/dist/utils/cache.js +253 -0
  69. package/dist/utils/cache.js.map +1 -0
  70. package/dist/utils/config.d.ts +56 -0
  71. package/dist/utils/config.d.ts.map +1 -0
  72. package/dist/utils/config.js +108 -0
  73. package/dist/utils/config.js.map +1 -0
  74. package/dist/utils/generators.d.ts +8 -0
  75. package/dist/utils/generators.d.ts.map +1 -0
  76. package/dist/utils/generators.js +265 -0
  77. package/dist/utils/generators.js.map +1 -0
  78. package/dist/utils/plugins.d.ts +94 -0
  79. package/dist/utils/plugins.d.ts.map +1 -0
  80. package/dist/utils/plugins.js +164 -0
  81. package/dist/utils/plugins.js.map +1 -0
  82. package/dist/utils/templates.d.ts +57 -0
  83. package/dist/utils/templates.d.ts.map +1 -0
  84. package/dist/utils/templates.js +458 -0
  85. package/dist/utils/templates.js.map +1 -0
  86. package/package.json +69 -0
@@ -0,0 +1,458 @@
1
+ import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from "fs";
2
+ import { join, dirname } from "path";
3
+ import chalk from "chalk";
4
+ // Template locations
5
+ const TEMPLATE_DIRS = {
6
+ builtIn: join(dirname(new URL(import.meta.url).pathname), "..", "templates"),
7
+ project: join(process.cwd(), ".datachonk", "templates"),
8
+ user: join(process.env.HOME || "~", ".datachonk", "templates"),
9
+ };
10
+ // Built-in templates
11
+ const BUILT_IN_TEMPLATES = [
12
+ // Staging model template
13
+ {
14
+ name: "staging-model",
15
+ version: "1.0.0",
16
+ description: "Standard staging model that cleans and renames source columns",
17
+ category: "staging",
18
+ variables: [
19
+ { name: "source_name", type: "string", required: true, description: "Name of the source" },
20
+ { name: "source_table", type: "string", required: true, description: "Source table name" },
21
+ { name: "columns", type: "array", required: false, description: "Columns to select" },
22
+ { name: "rename_columns", type: "object", required: false, description: "Column rename mapping" },
23
+ { name: "add_metadata", type: "boolean", required: false, default: true, description: "Add metadata columns" },
24
+ ],
25
+ content: `{{/*
26
+ Staging Model Template
27
+ Generated by DataChonk
28
+ */}}
29
+
30
+ with source as (
31
+ select * from {{ source('{{ source_name }}', '{{ source_table }}') }}
32
+ ),
33
+
34
+ renamed as (
35
+ select
36
+ {%- if columns %}
37
+ {%- for col in columns %}
38
+ {%- if rename_columns and col in rename_columns %}
39
+ {{ col }} as {{ rename_columns[col] }}{% if not loop.last %},{% endif %}
40
+ {%- else %}
41
+ {{ col }}{% if not loop.last %},{% endif %}
42
+ {%- endif %}
43
+ {%- endfor %}
44
+ {%- else %}
45
+ -- TODO: Add column selections
46
+ *
47
+ {%- endif %}
48
+
49
+ {%- if add_metadata %}
50
+ -- Metadata columns
51
+ , _loaded_at
52
+ , _source_file
53
+ {%- endif %}
54
+ from source
55
+ )
56
+
57
+ select * from renamed
58
+ `,
59
+ },
60
+ // Dimension model template
61
+ {
62
+ name: "dimension-model",
63
+ version: "1.0.0",
64
+ description: "Dimension table following Kimball methodology",
65
+ category: "mart",
66
+ variables: [
67
+ { name: "entity_name", type: "string", required: true, description: "Name of the entity" },
68
+ { name: "primary_key", type: "string", required: true, description: "Primary key column" },
69
+ { name: "source_model", type: "string", required: true, description: "Source staging model" },
70
+ { name: "scd_type", type: "string", required: false, default: "1", description: "SCD type (1 or 2)" },
71
+ { name: "business_keys", type: "array", required: false, description: "Business key columns" },
72
+ ],
73
+ content: `{{/*
74
+ Dimension Model Template - {{ entity_name }}
75
+ SCD Type: {{ scd_type | default: '1' }}
76
+ Generated by DataChonk
77
+ */}}
78
+
79
+ {{ config(
80
+ materialized='table',
81
+ unique_key='{{ primary_key }}'
82
+ ) }}
83
+
84
+ with source_data as (
85
+ select * from {{ ref('{{ source_model }}') }}
86
+ ),
87
+
88
+ {%- if scd_type == '2' %}
89
+ -- SCD Type 2: Track historical changes
90
+ with_row_hash as (
91
+ select
92
+ *,
93
+ {{ dbt_utils.generate_surrogate_key(business_keys) }} as row_hash
94
+ from source_data
95
+ ),
96
+
97
+ final as (
98
+ select
99
+ {{ dbt_utils.generate_surrogate_key([primary_key]) }} as {{ primary_key }}_sk,
100
+ *,
101
+ current_timestamp as valid_from,
102
+ null::timestamp as valid_to,
103
+ true as is_current
104
+ from with_row_hash
105
+ )
106
+ {%- else %}
107
+ -- SCD Type 1: Overwrite changes
108
+ final as (
109
+ select
110
+ {{ dbt_utils.generate_surrogate_key(['{{ primary_key }}']) }} as {{ primary_key }}_sk,
111
+ *,
112
+ current_timestamp as updated_at
113
+ from source_data
114
+ )
115
+ {%- endif %}
116
+
117
+ select * from final
118
+ `,
119
+ },
120
+ // Fact model template
121
+ {
122
+ name: "fact-model",
123
+ version: "1.0.0",
124
+ description: "Fact table following Kimball methodology",
125
+ category: "mart",
126
+ variables: [
127
+ { name: "fact_name", type: "string", required: true, description: "Name of the fact" },
128
+ { name: "grain", type: "string", required: true, description: "Description of the grain" },
129
+ { name: "source_model", type: "string", required: true, description: "Source staging model" },
130
+ { name: "dimension_refs", type: "array", required: false, description: "Dimension foreign keys" },
131
+ { name: "measures", type: "array", required: false, description: "Measure columns" },
132
+ ],
133
+ content: `{{/*
134
+ Fact Model Template - {{ fact_name }}
135
+ Grain: {{ grain }}
136
+ Generated by DataChonk
137
+ */}}
138
+
139
+ {{ config(
140
+ materialized='incremental',
141
+ unique_key='event_id',
142
+ incremental_strategy='merge'
143
+ ) }}
144
+
145
+ with source_data as (
146
+ select * from {{ ref('{{ source_model }}') }}
147
+ {% if is_incremental() %}
148
+ where _loaded_at > (select max(_loaded_at) from {{ this }})
149
+ {% endif %}
150
+ ),
151
+
152
+ {%- if dimension_refs %}
153
+ -- Join dimension keys
154
+ with_dimensions as (
155
+ select
156
+ src.*
157
+ {%- for dim in dimension_refs %}
158
+ , {{ dim.dimension }}.{{ dim.key }}_sk as {{ dim.key }}_fk
159
+ {%- endfor %}
160
+ from source_data src
161
+ {%- for dim in dimension_refs %}
162
+ left join {{ ref(dim.dimension) }} as {{ dim.dimension }}
163
+ on src.{{ dim.join_key }} = {{ dim.dimension }}.{{ dim.key }}
164
+ {%- endfor %}
165
+ ),
166
+ {%- endif %}
167
+
168
+ final as (
169
+ select
170
+ {{ dbt_utils.generate_surrogate_key(['event_id']) }} as fact_{{ fact_name }}_sk,
171
+
172
+ -- Dimension foreign keys
173
+ {%- if dimension_refs %}
174
+ {%- for dim in dimension_refs %}
175
+ {{ dim.key }}_fk,
176
+ {%- endfor %}
177
+ {%- endif %}
178
+
179
+ -- Degenerate dimensions / attributes
180
+ event_timestamp,
181
+
182
+ -- Measures
183
+ {%- if measures %}
184
+ {%- for measure in measures %}
185
+ {{ measure }}{% if not loop.last %},{% endif %}
186
+ {%- endfor %}
187
+ {%- else %}
188
+ -- TODO: Add measure columns
189
+ 1 as count_events
190
+ {%- endif %}
191
+
192
+ from {% if dimension_refs %}with_dimensions{% else %}source_data{% endif %}
193
+ )
194
+
195
+ select * from final
196
+ `,
197
+ },
198
+ // Test template
199
+ {
200
+ name: "generic-test",
201
+ version: "1.0.0",
202
+ description: "Generic data quality test",
203
+ category: "test",
204
+ variables: [
205
+ { name: "test_name", type: "string", required: true, description: "Name of the test" },
206
+ { name: "model", type: "string", required: true, description: "Model to test" },
207
+ { name: "column", type: "string", required: false, description: "Column to test" },
208
+ { name: "condition", type: "string", required: true, description: "Test condition" },
209
+ { name: "severity", type: "string", required: false, default: "error", description: "Test severity" },
210
+ ],
211
+ content: `{{/*
212
+ Custom Test: {{ test_name }}
213
+ Generated by DataChonk
214
+ */}}
215
+
216
+ {{ config(severity='{{ severity | default: "error" }}') }}
217
+
218
+ with validation as (
219
+ select
220
+ {%- if column %}
221
+ {{ column }},
222
+ {%- endif %}
223
+ *
224
+ from {{ ref('{{ model }}') }}
225
+ where not ({{ condition }})
226
+ )
227
+
228
+ select * from validation
229
+ `,
230
+ },
231
+ // Snapshot template
232
+ {
233
+ name: "snapshot-template",
234
+ version: "1.0.0",
235
+ description: "dbt snapshot for tracking changes over time",
236
+ category: "snapshot",
237
+ variables: [
238
+ { name: "snapshot_name", type: "string", required: true, description: "Snapshot name" },
239
+ { name: "source_model", type: "string", required: true, description: "Source model or table" },
240
+ { name: "unique_key", type: "string", required: true, description: "Unique key column" },
241
+ { name: "strategy", type: "string", required: false, default: "timestamp", description: "Snapshot strategy" },
242
+ { name: "updated_at", type: "string", required: false, default: "updated_at", description: "Updated at column" },
243
+ ],
244
+ content: `{{/*
245
+ Snapshot: {{ snapshot_name }}
246
+ Strategy: {{ strategy | default: 'timestamp' }}
247
+ Generated by DataChonk
248
+ */}}
249
+
250
+ {% snapshot {{ snapshot_name }} %}
251
+
252
+ {{ config(
253
+ target_schema='snapshots',
254
+ unique_key='{{ unique_key }}',
255
+ strategy='{{ strategy | default: "timestamp" }}',
256
+ {%- if strategy == 'check' %}
257
+ check_cols='all',
258
+ {%- else %}
259
+ updated_at='{{ updated_at | default: "updated_at" }}',
260
+ {%- endif %}
261
+ invalidate_hard_deletes=True
262
+ ) }}
263
+
264
+ select * from {{ ref('{{ source_model }}') }}
265
+
266
+ {% endsnapshot %}
267
+ `,
268
+ },
269
+ ];
270
+ // Template registry instance
271
+ let registry = null;
272
+ /**
273
+ * Initialize the template registry
274
+ */
275
+ export function initTemplates() {
276
+ if (registry)
277
+ return registry;
278
+ registry = {
279
+ templates: new Map(),
280
+ customDir: TEMPLATE_DIRS.project,
281
+ builtInDir: TEMPLATE_DIRS.builtIn,
282
+ };
283
+ // Load built-in templates
284
+ for (const template of BUILT_IN_TEMPLATES) {
285
+ registry.templates.set(template.name, template);
286
+ }
287
+ // Load custom templates from project directory
288
+ loadCustomTemplates(TEMPLATE_DIRS.project);
289
+ loadCustomTemplates(TEMPLATE_DIRS.user);
290
+ return registry;
291
+ }
292
+ /**
293
+ * Load custom templates from a directory
294
+ */
295
+ function loadCustomTemplates(dir) {
296
+ if (!existsSync(dir))
297
+ return;
298
+ const files = readdirSync(dir).filter((f) => f.endsWith(".json"));
299
+ for (const file of files) {
300
+ try {
301
+ const content = readFileSync(join(dir, file), "utf-8");
302
+ const template = JSON.parse(content);
303
+ if (isValidTemplate(template)) {
304
+ registry?.templates.set(template.name, template);
305
+ console.log(chalk.gray(`Loaded template: ${template.name}`));
306
+ }
307
+ }
308
+ catch {
309
+ console.warn(chalk.yellow(`Failed to load template: ${file}`));
310
+ }
311
+ }
312
+ }
313
+ /**
314
+ * Validate template structure
315
+ */
316
+ function isValidTemplate(obj) {
317
+ if (!obj || typeof obj !== "object")
318
+ return false;
319
+ const t = obj;
320
+ return (typeof t.name === "string" &&
321
+ typeof t.version === "string" &&
322
+ typeof t.content === "string" &&
323
+ typeof t.category === "string");
324
+ }
325
+ /**
326
+ * Get a template by name
327
+ */
328
+ export function getTemplate(name) {
329
+ if (!registry)
330
+ initTemplates();
331
+ return registry?.templates.get(name) || null;
332
+ }
333
+ /**
334
+ * List all available templates
335
+ */
336
+ export function listTemplates(category) {
337
+ if (!registry)
338
+ initTemplates();
339
+ const templates = Array.from(registry?.templates.values() || []);
340
+ if (category) {
341
+ return templates.filter((t) => t.category === category);
342
+ }
343
+ return templates;
344
+ }
345
+ /**
346
+ * Render a template with variables
347
+ */
348
+ export function renderTemplate(templateName, variables) {
349
+ const template = getTemplate(templateName);
350
+ if (!template) {
351
+ throw new Error(`Template not found: ${templateName}`);
352
+ }
353
+ // Simple variable substitution (for Jinja-like syntax)
354
+ let content = template.content;
355
+ // Replace {{ variable }} patterns
356
+ content = content.replace(/\{\{\s*(\w+)(?:\s*\|\s*default:\s*['"]([^'"]+)['"])?\s*\}\}/g, (match, varName, defaultValue) => {
357
+ const value = variables[varName];
358
+ if (value !== undefined) {
359
+ return String(value);
360
+ }
361
+ if (defaultValue !== undefined) {
362
+ return defaultValue;
363
+ }
364
+ // Check template variable defaults
365
+ const varDef = template.variables.find((v) => v.name === varName);
366
+ if (varDef?.default !== undefined) {
367
+ return String(varDef.default);
368
+ }
369
+ return match; // Keep original if no value
370
+ });
371
+ // Handle conditionals: {%- if condition %}...{%- endif %}
372
+ content = content.replace(/\{%-?\s*if\s+(\w+)\s*%\}([\s\S]*?)\{%-?\s*endif\s*%\}/g, (match, condition, body) => {
373
+ const value = variables[condition];
374
+ if (value && (Array.isArray(value) ? value.length > 0 : Boolean(value))) {
375
+ return body;
376
+ }
377
+ return "";
378
+ });
379
+ // Handle loops: {%- for item in array %}...{%- endfor %}
380
+ content = content.replace(/\{%-?\s*for\s+(\w+)\s+in\s+(\w+)\s*%\}([\s\S]*?)\{%-?\s*endfor\s*%\}/g, (match, itemName, arrayName, body) => {
381
+ const array = variables[arrayName];
382
+ if (!Array.isArray(array))
383
+ return "";
384
+ return array
385
+ .map((item, index) => {
386
+ let itemBody = body;
387
+ // Replace item references
388
+ if (typeof item === "string") {
389
+ itemBody = itemBody.replace(new RegExp(`\\{\\{\\s*${itemName}\\s*\\}\\}`, "g"), item);
390
+ }
391
+ else if (typeof item === "object" && item !== null) {
392
+ for (const [key, val] of Object.entries(item)) {
393
+ itemBody = itemBody.replace(new RegExp(`\\{\\{\\s*${itemName}\\.${key}\\s*\\}\\}`, "g"), String(val));
394
+ }
395
+ }
396
+ // Replace loop variables
397
+ itemBody = itemBody.replace(/\{\{\s*loop\.index\s*\}\}/g, String(index + 1));
398
+ itemBody = itemBody.replace(/\{\{\s*loop\.last\s*\}\}/g, String(index === array.length - 1));
399
+ return itemBody;
400
+ })
401
+ .join("");
402
+ });
403
+ return content;
404
+ }
405
+ /**
406
+ * Save a custom template
407
+ */
408
+ export function saveTemplate(template, location = "project") {
409
+ const dir = location === "project" ? TEMPLATE_DIRS.project : TEMPLATE_DIRS.user;
410
+ if (!existsSync(dir)) {
411
+ mkdirSync(dir, { recursive: true });
412
+ }
413
+ const path = join(dir, `${template.name}.json`);
414
+ writeFileSync(path, JSON.stringify(template, null, 2));
415
+ // Update registry
416
+ if (registry) {
417
+ registry.templates.set(template.name, template);
418
+ }
419
+ console.log(chalk.green(`Template saved: ${path}`));
420
+ }
421
+ /**
422
+ * Delete a custom template
423
+ */
424
+ export function deleteTemplate(name) {
425
+ for (const dir of [TEMPLATE_DIRS.project, TEMPLATE_DIRS.user]) {
426
+ const path = join(dir, `${name}.json`);
427
+ if (existsSync(path)) {
428
+ unlinkSync(path);
429
+ registry?.templates.delete(name);
430
+ return true;
431
+ }
432
+ }
433
+ return false;
434
+ }
435
+ /**
436
+ * Print available templates
437
+ */
438
+ export function printTemplates() {
439
+ if (!registry)
440
+ initTemplates();
441
+ const templates = listTemplates();
442
+ const categories = [...new Set(templates.map((t) => t.category))];
443
+ console.log(chalk.bold("\nAvailable Templates"));
444
+ console.log(chalk.gray("─".repeat(50)));
445
+ for (const category of categories) {
446
+ console.log(chalk.bold(`\n${category.charAt(0).toUpperCase() + category.slice(1)}:`));
447
+ const categoryTemplates = templates.filter((t) => t.category === category);
448
+ for (const template of categoryTemplates) {
449
+ console.log(` ${chalk.cyan(template.name)} - ${template.description}`);
450
+ }
451
+ }
452
+ }
453
+ // Helper to delete files (need to import)
454
+ function unlinkSync(path) {
455
+ const fs = require("fs");
456
+ fs.unlinkSync(path);
457
+ }
458
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@datachonk/cli",
3
+ "version": "0.1.0",
4
+ "description": "AI-powered dbt expert CLI - analyze, generate, and optimize your dbt projects",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "datachonk": "./dist/index.js",
9
+ "dchonk": "./dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsx src/index.ts",
18
+ "start": "node dist/index.js",
19
+ "test": "vitest run",
20
+ "test:watch": "vitest",
21
+ "test:coverage": "vitest run --coverage",
22
+ "lint": "eslint src/**/*.ts",
23
+ "prepublishOnly": "npm run build && npm run test"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "keywords": [
29
+ "dbt",
30
+ "data",
31
+ "analytics",
32
+ "sql",
33
+ "cli",
34
+ "ai",
35
+ "data-modeling",
36
+ "snowflake",
37
+ "bigquery",
38
+ "redshift",
39
+ "databricks"
40
+ ],
41
+ "author": "DataChonk",
42
+ "license": "MIT",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "https://github.com/datachonk/datachonk-cli"
46
+ },
47
+ "dependencies": {
48
+ "chalk": "^5.3.0",
49
+ "commander": "^12.1.0",
50
+ "conf": "^12.0.0",
51
+ "glob": "^10.3.10",
52
+ "inquirer": "^9.2.15",
53
+ "js-yaml": "^4.1.0",
54
+ "ora": "^8.0.1",
55
+ "sql-formatter": "^15.3.0",
56
+ "table": "^6.8.1"
57
+ },
58
+ "devDependencies": {
59
+ "@types/inquirer": "^9.0.7",
60
+ "@types/js-yaml": "^4.0.9",
61
+ "@types/node": "^20.11.24",
62
+ "tsx": "^4.7.1",
63
+ "typescript": "^5.3.3",
64
+ "vitest": "^4.0.18"
65
+ },
66
+ "engines": {
67
+ "node": ">=18.0.0"
68
+ }
69
+ }