@duckcodeailabs/dql-cli 0.1.1 → 0.1.2

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 (49) hide show
  1. package/dist/assets/notebook-browser/app.js +537 -0
  2. package/dist/assets/notebook-browser/index.html +83 -0
  3. package/dist/assets/notebook-browser/styles.css +336 -0
  4. package/dist/assets/templates/ecommerce/README.md +27 -0
  5. package/dist/assets/templates/ecommerce/blocks/repeat_rate.dql +26 -0
  6. package/dist/assets/templates/ecommerce/blocks/revenue_by_segment.dql +24 -0
  7. package/dist/assets/templates/ecommerce/dashboards/revenue_command_center.dql +25 -0
  8. package/dist/assets/templates/ecommerce/data/customers.csv +11 -0
  9. package/dist/assets/templates/ecommerce/data/funnel.csv +6 -0
  10. package/dist/assets/templates/ecommerce/data/orders.csv +16 -0
  11. package/dist/assets/templates/ecommerce/dql.config.json +13 -0
  12. package/dist/assets/templates/ecommerce/semantic-layer/dimensions/channel.yaml +4 -0
  13. package/dist/assets/templates/ecommerce/semantic-layer/metrics/gmv.yaml +4 -0
  14. package/dist/assets/templates/ecommerce/workbooks/.gitkeep +1 -0
  15. package/dist/assets/templates/saas/README.md +20 -0
  16. package/dist/assets/templates/saas/blocks/churn_pressure.dql +25 -0
  17. package/dist/assets/templates/saas/blocks/revenue_by_segment.dql +25 -0
  18. package/dist/assets/templates/saas/dashboards/growth_scorecard.dql +25 -0
  19. package/dist/assets/templates/saas/data/cohorts.csv +7 -0
  20. package/dist/assets/templates/saas/data/subscriptions.csv +13 -0
  21. package/dist/assets/templates/saas/dql.config.json +13 -0
  22. package/dist/assets/templates/saas/semantic-layer/metrics/mrr.yaml +4 -0
  23. package/dist/assets/templates/saas/workbooks/.gitkeep +1 -0
  24. package/dist/assets/templates/starter/README.md +54 -0
  25. package/dist/assets/templates/starter/blocks/revenue_by_segment.dql +29 -0
  26. package/dist/assets/templates/starter/blocks/revenue_trend_query_only.dql +20 -0
  27. package/dist/assets/templates/starter/dashboards/.gitkeep +1 -0
  28. package/dist/assets/templates/starter/data/revenue.csv +13 -0
  29. package/dist/assets/templates/starter/dql.config.json +13 -0
  30. package/dist/assets/templates/starter/semantic-layer/blocks/revenue_by_segment.yaml +11 -0
  31. package/dist/assets/templates/starter/semantic-layer/dimensions/segment_tier.yaml +6 -0
  32. package/dist/assets/templates/starter/semantic-layer/hierarchies/revenue_time.yaml +12 -0
  33. package/dist/assets/templates/starter/semantic-layer/metrics/revenue.yaml +7 -0
  34. package/dist/assets/templates/starter/workbooks/.gitkeep +1 -0
  35. package/dist/assets/templates/taxi/README.md +19 -0
  36. package/dist/assets/templates/taxi/blocks/airport_mix.dql +25 -0
  37. package/dist/assets/templates/taxi/blocks/revenue_by_segment.dql +24 -0
  38. package/dist/assets/templates/taxi/dashboards/city_operations.dql +25 -0
  39. package/dist/assets/templates/taxi/data/trips.csv +13 -0
  40. package/dist/assets/templates/taxi/dql.config.json +13 -0
  41. package/dist/assets/templates/taxi/semantic-layer/.gitkeep +1 -0
  42. package/dist/assets/templates/taxi/workbooks/.gitkeep +1 -0
  43. package/dist/commands/init.d.ts.map +1 -1
  44. package/dist/commands/init.js +3 -1
  45. package/dist/commands/init.js.map +1 -1
  46. package/dist/commands/notebook.d.ts.map +1 -1
  47. package/dist/commands/notebook.js +4 -1
  48. package/dist/commands/notebook.js.map +1 -1
  49. package/package.json +8 -8
@@ -0,0 +1,54 @@
1
+ # __PROJECT_NAME__
2
+
3
+ This starter gives you a local-first DQL project that is ready for parsing,
4
+ previewing, notebook exploration, and experimentation.
5
+
6
+ ```text
7
+ blocks/
8
+ dashboards/
9
+ data/
10
+ dql.config.json
11
+ notebooks/
12
+ workbooks/
13
+ semantic-layer/
14
+ metrics/
15
+ dimensions/
16
+ hierarchies/
17
+ blocks/
18
+ ```
19
+
20
+ ## Quick Start
21
+
22
+ ```bash
23
+ dql doctor
24
+ dql notebook
25
+ dql new block "Pipeline Health"
26
+ dql new semantic-block "ARR Growth"
27
+ dql new dashboard "Revenue Overview"
28
+ dql new workbook "Quarterly Review"
29
+ dql parse blocks/pipeline_health.dql
30
+ dql preview blocks/pipeline_health.dql --open
31
+ dql build blocks/pipeline_health.dql
32
+ dql serve dist/pipeline_health
33
+ ```
34
+
35
+ ## What's Included
36
+
37
+ - `blocks/` — example charted and query-only DQL blocks
38
+ - `dashboards/` — empty folder for dashboard scaffolds
39
+ - `data/` — sample revenue CSV for local DuckDB/file preview flows
40
+ - `dql.config.json` — starter project configuration
41
+ - `notebooks/welcome.dqlnb` — guided notebook walkthrough for the browser notebook
42
+ - `workbooks/` — empty folder for workbook scaffolds
43
+ - `semantic-layer/` — example metrics, dimensions, hierarchies, and companion metadata
44
+
45
+ ## Adopt the Starter Safely
46
+
47
+ - start in local file mode first
48
+ - keep sample datasets under `data/`
49
+ - run `dql doctor` before previewing if setup feels off
50
+ - add tests to every reusable block
51
+
52
+ ## Learn More
53
+
54
+ - See the main DQL documentation for `project-config` and `data-sources` guidance.
@@ -0,0 +1,29 @@
1
+ block "Revenue by Segment" {
2
+ domain = "revenue"
3
+ type = "custom"
4
+ description = "Starter block for segment revenue analysis using local CSV sample data"
5
+ tags = ["starter", "revenue"]
6
+ owner = "template"
7
+
8
+ params {
9
+ period = "current_quarter"
10
+ }
11
+
12
+ query = """
13
+ SELECT segment_tier AS segment, SUM(amount) AS revenue
14
+ FROM read_csv_auto('./data/revenue.csv')
15
+ WHERE fiscal_period = ${period}
16
+ GROUP BY segment_tier
17
+ ORDER BY revenue DESC
18
+ """
19
+
20
+ visualization {
21
+ chart = "bar"
22
+ x = segment
23
+ y = revenue
24
+ }
25
+
26
+ tests {
27
+ assert row_count > 0
28
+ }
29
+ }
@@ -0,0 +1,20 @@
1
+ block "Revenue Trend Query" {
2
+ domain = "revenue"
3
+ type = "custom"
4
+ description = "Starter query-only block for monthly revenue trends using local CSV sample data"
5
+ tags = ["starter", "revenue", "query-only"]
6
+ owner = "template"
7
+
8
+ query = """
9
+ SELECT
10
+ DATE_TRUNC('month', CAST(recognized_at AS DATE)) AS revenue_month,
11
+ SUM(amount) AS total_revenue
12
+ FROM read_csv_auto('./data/revenue.csv')
13
+ GROUP BY 1
14
+ ORDER BY 1
15
+ """
16
+
17
+ tests {
18
+ assert row_count > 0
19
+ }
20
+ }
@@ -0,0 +1,13 @@
1
+ recognized_at,segment_tier,amount,fiscal_period,fiscal_year,fiscal_quarter
2
+ 2025-01-03,Enterprise,185000,current_quarter,2025,Q1
3
+ 2025-01-14,Mid-Market,92000,current_quarter,2025,Q1
4
+ 2025-01-25,SMB,28000,current_quarter,2025,Q1
5
+ 2025-02-05,Enterprise,210000,current_quarter,2025,Q1
6
+ 2025-02-09,Mid-Market,101000,current_quarter,2025,Q1
7
+ 2025-02-18,SMB,31000,current_quarter,2025,Q1
8
+ 2025-03-02,Enterprise,223000,current_quarter,2025,Q1
9
+ 2025-03-11,Mid-Market,108000,current_quarter,2025,Q1
10
+ 2025-03-19,SMB,34000,current_quarter,2025,Q1
11
+ 2025-04-07,Enterprise,205000,next_quarter,2025,Q2
12
+ 2025-04-16,Mid-Market,99000,next_quarter,2025,Q2
13
+ 2025-04-23,SMB,29000,next_quarter,2025,Q2
@@ -0,0 +1,13 @@
1
+ {
2
+ "project": "__PROJECT_NAME__",
3
+ "defaultConnection": {
4
+ "driver": "file",
5
+ "filepath": ":memory:"
6
+ },
7
+ "dataDir": "./data",
8
+ "preview": {
9
+ "port": 3474,
10
+ "open": true,
11
+ "theme": "dark"
12
+ }
13
+ }
@@ -0,0 +1,11 @@
1
+ name: revenue_by_segment
2
+ block: revenue_by_segment
3
+ domain: revenue
4
+ description: Optional companion metadata for the starter block
5
+ tags:
6
+ - revenue
7
+ - starter
8
+ semanticMappings:
9
+ segment: segment_tier
10
+ revenue: total_revenue
11
+ reviewStatus: draft
@@ -0,0 +1,6 @@
1
+ name: segment_tier
2
+ label: Segment Tier
3
+ description: Customer segment tier
4
+ sql: segment_tier
5
+ type: string
6
+ table: fct_revenue
@@ -0,0 +1,12 @@
1
+ name: revenue_time
2
+ label: Revenue Time
3
+ description: Example fiscal calendar hierarchy
4
+ domain: revenue
5
+ levels:
6
+ - name: fiscal_year
7
+ dimension: fiscal_year
8
+ order: 1
9
+ - name: fiscal_quarter
10
+ dimension: fiscal_quarter
11
+ order: 2
12
+ defaultRollup: sum
@@ -0,0 +1,7 @@
1
+ name: total_revenue
2
+ label: Total Revenue
3
+ description: Sum of recognized revenue
4
+ domain: revenue
5
+ sql: SUM(amount)
6
+ type: sum
7
+ table: fct_revenue
@@ -0,0 +1,19 @@
1
+ # __PROJECT_NAME__
2
+
3
+ This template packages a city mobility analytics sandbox with taxi trip data.
4
+
5
+ ## Included assets
6
+
7
+ - `blocks/revenue_by_segment.dql` — trip volume by pickup borough
8
+ - `blocks/airport_mix.dql` — airport trip fare mix
9
+ - `dashboards/city_operations.dql` — operations dashboard with fares and trip counts
10
+ - `data/trips.csv` — local taxi trip sample dataset
11
+ - `notebooks/welcome.dqlnb` — browser notebook walkthrough
12
+
13
+ ## Quick start
14
+
15
+ ```bash
16
+ dql doctor
17
+ dql notebook
18
+ dql preview blocks/revenue_by_segment.dql --open
19
+ ```
@@ -0,0 +1,25 @@
1
+ block "Airport Fare Mix" {
2
+ domain = "mobility"
3
+ type = "custom"
4
+ description = "Average fare for airport versus non-airport trips"
5
+ tags = ["taxi", "airport"]
6
+ owner = "template"
7
+
8
+ query = """
9
+ SELECT CASE WHEN airport_flag THEN 'Airport' ELSE 'City' END AS trip_type,
10
+ ROUND(AVG(fare_amount), 2) AS avg_fare
11
+ FROM read_csv_auto('./data/trips.csv')
12
+ GROUP BY trip_type
13
+ ORDER BY avg_fare DESC
14
+ """
15
+
16
+ visualization {
17
+ chart = "bar"
18
+ x = trip_type
19
+ y = avg_fare
20
+ }
21
+
22
+ tests {
23
+ assert row_count > 0
24
+ }
25
+ }
@@ -0,0 +1,24 @@
1
+ block "Trips by Borough" {
2
+ domain = "mobility"
3
+ type = "custom"
4
+ description = "Trip count by pickup borough"
5
+ tags = ["taxi", "operations"]
6
+ owner = "template"
7
+
8
+ query = """
9
+ SELECT pickup_borough, COUNT(*) AS revenue
10
+ FROM read_csv_auto('./data/trips.csv')
11
+ GROUP BY pickup_borough
12
+ ORDER BY revenue DESC
13
+ """
14
+
15
+ visualization {
16
+ chart = "bar"
17
+ x = pickup_borough
18
+ y = revenue
19
+ }
20
+
21
+ tests {
22
+ assert row_count > 0
23
+ }
24
+ }
@@ -0,0 +1,25 @@
1
+ dashboard "City Operations" {
2
+ chart.kpi(
3
+ SELECT COUNT(*) AS total_trips
4
+ FROM read_csv_auto('./data/trips.csv'),
5
+ metrics = ["total_trips"],
6
+ title = "Total Trips"
7
+ )
8
+
9
+ chart.line(
10
+ SELECT pickup_hour, ROUND(AVG(fare_amount), 2) AS avg_fare
11
+ FROM read_csv_auto('./data/trips.csv')
12
+ GROUP BY pickup_hour
13
+ ORDER BY pickup_hour,
14
+ x = pickup_hour,
15
+ y = avg_fare,
16
+ title = "Average Fare by Hour"
17
+ )
18
+
19
+ chart.table(
20
+ SELECT pickup_date, pickup_borough, dropoff_borough, trip_miles, fare_amount, tip_amount
21
+ FROM read_csv_auto('./data/trips.csv')
22
+ ORDER BY fare_amount DESC,
23
+ title = "Highest Fare Trips"
24
+ )
25
+ }
@@ -0,0 +1,13 @@
1
+ trip_id,pickup_date,pickup_hour,pickup_borough,dropoff_borough,payment_type,fare_amount,tip_amount,trip_miles,airport_flag
2
+ T-001,2025-01-03,6,Manhattan,Queens,Card,32.5,6.2,8.4,true
3
+ T-002,2025-01-03,7,Brooklyn,Manhattan,Card,21.4,4.1,5.6,false
4
+ T-003,2025-01-04,8,Queens,Manhattan,Cash,27.8,0,7.1,true
5
+ T-004,2025-01-04,9,Manhattan,Brooklyn,Card,18.9,3.7,4.9,false
6
+ T-005,2025-01-05,11,Bronx,Manhattan,Card,25.7,5.1,6.8,false
7
+ T-006,2025-01-05,12,Manhattan,Queens,Card,34.2,6.8,8.9,true
8
+ T-007,2025-01-06,13,Queens,Brooklyn,Card,19.3,3.5,5.2,false
9
+ T-008,2025-01-06,15,Manhattan,Manhattan,Card,14.6,3.2,2.8,false
10
+ T-009,2025-01-07,17,Brooklyn,Queens,Cash,16.8,0,4.1,false
11
+ T-010,2025-01-07,18,Manhattan,Staten Island,Card,41.1,7.4,12.3,false
12
+ T-011,2025-01-08,19,Queens,Manhattan,Card,29.6,5.9,7.7,true
13
+ T-012,2025-01-08,21,Brooklyn,Manhattan,Card,22.1,4.6,5.9,false
@@ -0,0 +1,13 @@
1
+ {
2
+ "project": "__PROJECT_NAME__",
3
+ "defaultConnection": {
4
+ "driver": "file",
5
+ "filepath": ":memory:"
6
+ },
7
+ "dataDir": "./data",
8
+ "preview": {
9
+ "port": 3474,
10
+ "open": true,
11
+ "theme": "dark"
12
+ }
13
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAgB3C,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DtF"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAkB3C,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DtF"}
@@ -4,7 +4,9 @@ import { fileURLToPath } from 'node:url';
4
4
  import { createWelcomeNotebook, serializeNotebook } from '@duckcodeailabs/dql-notebook';
5
5
  import { runNotebook } from './notebook.js';
6
6
  const COMMAND_DIR = dirname(fileURLToPath(import.meta.url));
7
- const TEMPLATE_ROOT = resolve(COMMAND_DIR, '../../../../templates');
7
+ const PACKAGED_TEMPLATE_ROOT = resolve(COMMAND_DIR, '../assets/templates');
8
+ const REPO_TEMPLATE_ROOT = resolve(COMMAND_DIR, '../../../../templates');
9
+ const TEMPLATE_ROOT = existsSync(PACKAGED_TEMPLATE_ROOT) ? PACKAGED_TEMPLATE_ROOT : REPO_TEMPLATE_ROOT;
8
10
  const TEXT_FILE_EXTENSIONS = new Set([
9
11
  '.json',
10
12
  '.md',
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"notebook.d.ts","sourceRoot":"","sources":["../../src/commands/notebook.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAY3C,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB1F"}
1
+ {"version":3,"file":"notebook.d.ts","sourceRoot":"","sources":["../../src/commands/notebook.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAc3C,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB1F"}
@@ -1,10 +1,13 @@
1
+ import { existsSync } from 'node:fs';
1
2
  import { dirname, resolve } from 'node:path';
2
3
  import { fileURLToPath } from 'node:url';
3
4
  import { QueryExecutor } from '@duckcodeailabs/dql-connectors';
4
5
  import { assertLocalQueryRuntimeReady, findProjectRoot, loadProjectConfig, startLocalServer, } from '../local-runtime.js';
5
6
  import { maybeOpenBrowser } from '../open-browser.js';
6
7
  const COMMAND_DIR = dirname(fileURLToPath(import.meta.url));
7
- const NOTEBOOK_APP_DIR = resolve(COMMAND_DIR, '../../../../apps/notebook-browser');
8
+ const PACKAGED_NOTEBOOK_APP_DIR = resolve(COMMAND_DIR, '../assets/notebook-browser');
9
+ const REPO_NOTEBOOK_APP_DIR = resolve(COMMAND_DIR, '../../../../apps/notebook-browser');
10
+ const NOTEBOOK_APP_DIR = existsSync(PACKAGED_NOTEBOOK_APP_DIR) ? PACKAGED_NOTEBOOK_APP_DIR : REPO_NOTEBOOK_APP_DIR;
8
11
  export async function runNotebook(targetArg, flags) {
9
12
  const baseDir = resolve(targetArg ?? '.');
10
13
  const projectRoot = findProjectRoot(baseDir);
@@ -1 +1 @@
1
- {"version":3,"file":"notebook.js","sourceRoot":"","sources":["../../src/commands/notebook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EACL,4BAA4B,EAC5B,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,mCAAmC,CAAC,CAAC;AAEnF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAwB,EAAE,KAAe;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE,MAAM,EAAE,MAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEjG,MAAM,4BAA4B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;QAClC,OAAO,EAAE,gBAAgB;QACzB,WAAW;QACX,QAAQ;QACR,UAAU;QACV,aAAa,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;KAC1D,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IACvC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"notebook.js","sourceRoot":"","sources":["../../src/commands/notebook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EACL,4BAA4B,EAC5B,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,MAAM,yBAAyB,GAAG,OAAO,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;AACrF,MAAM,qBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,mCAAmC,CAAC,CAAC;AACxF,MAAM,gBAAgB,GAAG,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,qBAAqB,CAAC;AAEnH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAwB,EAAE,KAAe;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE,MAAM,EAAE,MAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEjG,MAAM,4BAA4B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;QAClC,OAAO,EAAE,gBAAgB;QACzB,WAAW;QACX,QAAQ;QACR,UAAU;QACV,aAAa,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;KAC1D,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IACvC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duckcodeailabs/dql-cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Public CLI for parsing, formatting, testing, and certifying DQL blocks",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -19,12 +19,12 @@
19
19
  "directory": "apps/cli"
20
20
  },
21
21
  "dependencies": {
22
- "@duckcodeailabs/dql-connectors": "0.1.1",
23
- "@duckcodeailabs/dql-core": "0.1.1",
24
- "@duckcodeailabs/dql-governance": "0.1.1",
25
- "@duckcodeailabs/dql-compiler": "0.1.1",
26
- "@duckcodeailabs/dql-project": "0.1.1",
27
- "@duckcodeailabs/dql-notebook": "0.1.1"
22
+ "@duckcodeailabs/dql-connectors": "0.1.2",
23
+ "@duckcodeailabs/dql-compiler": "0.1.2",
24
+ "@duckcodeailabs/dql-core": "0.1.2",
25
+ "@duckcodeailabs/dql-governance": "0.1.2",
26
+ "@duckcodeailabs/dql-project": "0.1.2",
27
+ "@duckcodeailabs/dql-notebook": "0.1.2"
28
28
  },
29
29
  "devDependencies": {
30
30
  "typescript": "^5.7.0",
@@ -35,7 +35,7 @@
35
35
  "node": ">=18.0.0"
36
36
  },
37
37
  "scripts": {
38
- "build": "rm -rf dist tsconfig.tsbuildinfo && tsc -b",
38
+ "build": "rm -rf dist tsconfig.tsbuildinfo && tsc -b && node ./scripts/copy-runtime-assets.mjs",
39
39
  "dev": "tsx src/index.ts",
40
40
  "test": "vitest run --passWithNoTests",
41
41
  "clean": "rm -rf dist tsconfig.tsbuildinfo"