@duckcodeailabs/dql-cli 1.0.3 → 1.2.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.
- package/dist/args.d.ts +1 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +4 -0
- package/dist/args.js.map +1 -1
- package/dist/assets/dql-notebook/assets/index-Cscl1A2H.js +628 -0
- package/dist/assets/dql-notebook/index.html +1 -1
- package/dist/commands/app.d.ts +3 -0
- package/dist/commands/app.d.ts.map +1 -0
- package/dist/commands/app.js +191 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +30 -2
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/diff.d.ts +1 -1
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +38 -9
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/fmt.d.ts.map +1 -1
- package/dist/commands/fmt.js +27 -8
- package/dist/commands/fmt.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp.d.ts +7 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +16 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/migrate.d.ts +1 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +86 -0
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/schedule.d.ts +3 -0
- package/dist/commands/schedule.d.ts.map +1 -0
- package/dist/commands/schedule.js +132 -0
- package/dist/commands/schedule.js.map +1 -0
- package/dist/digest.d.ts +10 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +83 -0
- package/dist/digest.js.map +1 -0
- package/dist/git-service.d.ts +17 -0
- package/dist/git-service.d.ts.map +1 -0
- package/dist/git-service.js +54 -0
- package/dist/git-service.js.map +1 -0
- package/dist/index.js +20 -3
- package/dist/index.js.map +1 -1
- package/dist/llm/claude-agent-sdk.d.ts +3 -0
- package/dist/llm/claude-agent-sdk.d.ts.map +1 -0
- package/dist/llm/claude-agent-sdk.js +174 -0
- package/dist/llm/claude-agent-sdk.js.map +1 -0
- package/dist/llm/claude-code.d.ts +8 -0
- package/dist/llm/claude-code.d.ts.map +1 -0
- package/dist/llm/claude-code.js +171 -0
- package/dist/llm/claude-code.js.map +1 -0
- package/dist/llm/index.d.ts +4 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +10 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/tools.d.ts +9 -0
- package/dist/llm/tools.d.ts.map +1 -0
- package/dist/llm/tools.js +112 -0
- package/dist/llm/tools.js.map +1 -0
- package/dist/llm/types.d.ts +64 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/local-runtime.d.ts +6 -0
- package/dist/local-runtime.d.ts.map +1 -1
- package/dist/local-runtime.js +124 -8
- package/dist/local-runtime.js.map +1 -1
- package/dist/schedule/alerts.d.ts +5 -0
- package/dist/schedule/alerts.d.ts.map +1 -0
- package/dist/schedule/alerts.js +54 -0
- package/dist/schedule/alerts.js.map +1 -0
- package/dist/schedule/discovery.d.ts +4 -0
- package/dist/schedule/discovery.d.ts.map +1 -0
- package/dist/schedule/discovery.js +36 -0
- package/dist/schedule/discovery.js.map +1 -0
- package/dist/schedule/notifiers/email.d.ts +3 -0
- package/dist/schedule/notifiers/email.d.ts.map +1 -0
- package/dist/schedule/notifiers/email.js +76 -0
- package/dist/schedule/notifiers/email.js.map +1 -0
- package/dist/schedule/notifiers/file.d.ts +3 -0
- package/dist/schedule/notifiers/file.d.ts.map +1 -0
- package/dist/schedule/notifiers/file.js +50 -0
- package/dist/schedule/notifiers/file.js.map +1 -0
- package/dist/schedule/notifiers/index.d.ts +10 -0
- package/dist/schedule/notifiers/index.d.ts.map +1 -0
- package/dist/schedule/notifiers/index.js +33 -0
- package/dist/schedule/notifiers/index.js.map +1 -0
- package/dist/schedule/notifiers/slack.d.ts +3 -0
- package/dist/schedule/notifiers/slack.d.ts.map +1 -0
- package/dist/schedule/notifiers/slack.js +58 -0
- package/dist/schedule/notifiers/slack.js.map +1 -0
- package/dist/schedule/runner.d.ts +11 -0
- package/dist/schedule/runner.d.ts.map +1 -0
- package/dist/schedule/runner.js +109 -0
- package/dist/schedule/runner.js.map +1 -0
- package/dist/schedule/runs.d.ts +5 -0
- package/dist/schedule/runs.d.ts.map +1 -0
- package/dist/schedule/runs.js +40 -0
- package/dist/schedule/runs.js.map +1 -0
- package/dist/schedule/service.d.ts +12 -0
- package/dist/schedule/service.d.ts.map +1 -0
- package/dist/schedule/service.js +49 -0
- package/dist/schedule/service.js.map +1 -0
- package/dist/schedule/types.d.ts +64 -0
- package/dist/schedule/types.d.ts.map +1 -0
- package/dist/schedule/types.js +2 -0
- package/dist/schedule/types.js.map +1 -0
- package/package.json +17 -10
- package/dist/assets/dql-notebook/assets/index-BJbWzCsK.js +0 -622
package/dist/commands/migrate.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
import { canonicalize, canonicalizeNotebook } from '@duckcodeailabs/dql-core';
|
|
1
4
|
/**
|
|
2
5
|
* Generate a DQL block skeleton from a source tool definition.
|
|
3
6
|
*/
|
|
@@ -27,12 +30,17 @@ function generateBlockDQL(opts) {
|
|
|
27
30
|
`;
|
|
28
31
|
}
|
|
29
32
|
export async function runMigrate(file, flags) {
|
|
33
|
+
if (file === 'format') {
|
|
34
|
+
await runFormatMigrate(flags.input || '.', flags);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
30
37
|
// file is used as the source type for migration
|
|
31
38
|
const source = file;
|
|
32
39
|
const validSources = ['looker', 'tableau', 'dbt', 'metabase', 'raw-sql'];
|
|
33
40
|
if (!validSources.includes(source)) {
|
|
34
41
|
console.error(`\n ✗ Unknown migration source: "${source}"`);
|
|
35
42
|
console.error(` Valid sources: ${validSources.join(', ')}`);
|
|
43
|
+
console.error(` Or: "format" to upgrade .dql/.dqlnb files to the canonical on-disk format`);
|
|
36
44
|
console.error('');
|
|
37
45
|
process.exit(1);
|
|
38
46
|
}
|
|
@@ -103,4 +111,82 @@ export async function runMigrate(file, flags) {
|
|
|
103
111
|
console.log(' 4. Commit and push for certification');
|
|
104
112
|
console.log('');
|
|
105
113
|
}
|
|
114
|
+
export async function runFormatMigrate(root, flags) {
|
|
115
|
+
const dryRun = flags.check === true;
|
|
116
|
+
const report = {
|
|
117
|
+
scanned: 0,
|
|
118
|
+
alreadyCanonical: 0,
|
|
119
|
+
upgraded: 0,
|
|
120
|
+
failed: [],
|
|
121
|
+
dryRun,
|
|
122
|
+
};
|
|
123
|
+
for (const absPath of walkDqlFiles(root)) {
|
|
124
|
+
report.scanned += 1;
|
|
125
|
+
const rel = relative(root, absPath) || absPath;
|
|
126
|
+
const source = readFileSync(absPath, 'utf-8');
|
|
127
|
+
let canonical;
|
|
128
|
+
try {
|
|
129
|
+
canonical = absPath.endsWith('.dqlnb') ? canonicalizeNotebook(source) : canonicalize(source);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
report.failed.push({ path: rel, error: error instanceof Error ? error.message : String(error) });
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (canonical === source) {
|
|
136
|
+
report.alreadyCanonical += 1;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (!dryRun)
|
|
140
|
+
writeFileSync(absPath, canonical, 'utf-8');
|
|
141
|
+
report.upgraded += 1;
|
|
142
|
+
}
|
|
143
|
+
if (flags.format === 'json') {
|
|
144
|
+
console.log(JSON.stringify(report, null, 2));
|
|
145
|
+
if (report.failed.length > 0)
|
|
146
|
+
process.exit(1);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
console.log(`\n DQL format migration${dryRun ? ' (dry run)' : ''}`);
|
|
150
|
+
console.log(' ─────────────────────────────');
|
|
151
|
+
console.log(` Scanned: ${report.scanned}`);
|
|
152
|
+
console.log(` Already canonical: ${report.alreadyCanonical}`);
|
|
153
|
+
console.log(` ${dryRun ? 'Would upgrade' : 'Upgraded'}: ${report.upgraded}`);
|
|
154
|
+
if (report.failed.length > 0) {
|
|
155
|
+
console.log(` Failed: ${report.failed.length}`);
|
|
156
|
+
for (const f of report.failed)
|
|
157
|
+
console.log(` ✗ ${f.path}: ${f.error}`);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
console.log('');
|
|
161
|
+
}
|
|
162
|
+
function* walkDqlFiles(root) {
|
|
163
|
+
const stack = [root];
|
|
164
|
+
while (stack.length > 0) {
|
|
165
|
+
const dir = stack.pop();
|
|
166
|
+
let entries;
|
|
167
|
+
try {
|
|
168
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
for (const entry of entries) {
|
|
174
|
+
if (entry.name === 'node_modules' || entry.name === '.git' || entry.name === 'dist' || entry.name === 'target')
|
|
175
|
+
continue;
|
|
176
|
+
const full = join(dir, entry.name);
|
|
177
|
+
if (entry.isDirectory()) {
|
|
178
|
+
stack.push(full);
|
|
179
|
+
}
|
|
180
|
+
else if (entry.isFile() && (entry.name.endsWith('.dql') || entry.name.endsWith('.dqlnb'))) {
|
|
181
|
+
try {
|
|
182
|
+
if (statSync(full).size > 0)
|
|
183
|
+
yield full;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// skip unreadable
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
106
192
|
//# sourceMappingURL=migrate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAO3C,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
3
|
+
import { QueryExecutor } from '@duckcodeailabs/dql-connectors';
|
|
4
|
+
import { findProjectRoot, loadProjectConfig, normalizeProjectConnection } from '../local-runtime.js';
|
|
5
|
+
import { discoverScheduledBlocks } from '../schedule/discovery.js';
|
|
6
|
+
import { runBlock } from '../schedule/runner.js';
|
|
7
|
+
import { listRunRecords } from '../schedule/runs.js';
|
|
8
|
+
import { startScheduleService } from '../schedule/service.js';
|
|
9
|
+
export async function runSchedule(sub, rest, flags) {
|
|
10
|
+
switch (sub) {
|
|
11
|
+
case 'list':
|
|
12
|
+
return runScheduleList(flags);
|
|
13
|
+
case 'run':
|
|
14
|
+
return runScheduleRun(rest, flags);
|
|
15
|
+
case 'status':
|
|
16
|
+
return runScheduleStatus(flags);
|
|
17
|
+
case 'start':
|
|
18
|
+
return runScheduleStart(flags);
|
|
19
|
+
case 'stop':
|
|
20
|
+
throw new Error('dql schedule runs in the foreground — stop with Ctrl+C in the terminal where it is running.');
|
|
21
|
+
default:
|
|
22
|
+
throw new Error('Usage: dql schedule <list|run|start|status> [args]');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function runScheduleList(flags) {
|
|
26
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
27
|
+
const blocks = discoverScheduledBlocks(projectRoot);
|
|
28
|
+
if (flags.format === 'json') {
|
|
29
|
+
console.log(JSON.stringify({ blocks }, null, 2));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (blocks.length === 0) {
|
|
33
|
+
console.log('No scheduled blocks found. Add @schedule("daily", "9:00 AM") to a .dql file.');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
console.log(`Scheduled blocks (${blocks.length}):`);
|
|
37
|
+
for (const b of blocks) {
|
|
38
|
+
const alerts = b.alerts.length > 0 ? ` alerts=${b.alerts.length}` : '';
|
|
39
|
+
const notifs = b.notifications.length > 0 ? ` notify=${b.notifications.map((n) => n.type).join(',')}` : '';
|
|
40
|
+
console.log(` ${b.name.padEnd(40)} cron="${b.schedule.cron}"${alerts}${notifs}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async function runScheduleRun(rest, flags) {
|
|
44
|
+
const target = rest[0];
|
|
45
|
+
if (!target)
|
|
46
|
+
throw new Error('Usage: dql schedule run <path-to-block.dql>');
|
|
47
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
48
|
+
const absPath = isAbsolute(target) ? target : resolve(process.cwd(), target);
|
|
49
|
+
if (!existsSync(absPath))
|
|
50
|
+
throw new Error(`File not found: ${target}`);
|
|
51
|
+
const projectConfig = loadProjectConfig(projectRoot);
|
|
52
|
+
const connection = normalizeProjectConnection(projectConfig.defaultConnection ?? { driver: 'duckdb' }, projectRoot);
|
|
53
|
+
const executor = new QueryExecutor();
|
|
54
|
+
const record = await runBlock(absPath, {
|
|
55
|
+
executor,
|
|
56
|
+
connection,
|
|
57
|
+
projectRoot,
|
|
58
|
+
trigger: 'manual',
|
|
59
|
+
});
|
|
60
|
+
if (flags.format === 'json') {
|
|
61
|
+
console.log(JSON.stringify(record, null, 2));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const breached = record.alerts.filter((a) => a.breached).length;
|
|
65
|
+
const tag = record.error ? `error: ${record.error}` : breached > 0 ? `${breached} alert(s) breached` : 'ok';
|
|
66
|
+
console.log(` ${record.block} → ${tag}`);
|
|
67
|
+
console.log(` queries: ${record.queries.length} (${record.queries.filter((q) => !q.error).length} ok)`);
|
|
68
|
+
for (const q of record.queries) {
|
|
69
|
+
const s = q.error ? `err: ${q.error}` : `${q.rowCount} rows in ${q.durationMs}ms`;
|
|
70
|
+
console.log(` ${q.chartId}: ${s}`);
|
|
71
|
+
}
|
|
72
|
+
if (record.alerts.length > 0) {
|
|
73
|
+
console.log(` alerts:`);
|
|
74
|
+
for (const a of record.alerts) {
|
|
75
|
+
const status = a.error ? `err: ${a.error}` : a.breached ? 'BREACHED' : 'ok';
|
|
76
|
+
const obs = a.observedValue !== undefined ? ` (observed ${a.observedValue})` : '';
|
|
77
|
+
console.log(` ${status}${obs}: ${a.alert.conditionSQL}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (record.notifications.length > 0) {
|
|
81
|
+
console.log(` notifications:`);
|
|
82
|
+
for (const n of record.notifications) {
|
|
83
|
+
const status = n.delivered ? 'sent' : `failed: ${n.error}`;
|
|
84
|
+
console.log(` ${n.type} → ${n.recipients.join(', ') || '(default)'} [${status}]`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function runScheduleStatus(flags) {
|
|
89
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
90
|
+
const records = listRunRecords(projectRoot, 10);
|
|
91
|
+
if (flags.format === 'json') {
|
|
92
|
+
console.log(JSON.stringify({ records }, null, 2));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (records.length === 0) {
|
|
96
|
+
console.log('No run history in .dql/runs/. Trigger a run with: dql schedule run <path>');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
console.log(`Last ${records.length} runs:`);
|
|
100
|
+
for (const r of records) {
|
|
101
|
+
const breached = r.alerts.filter((a) => a.breached).length;
|
|
102
|
+
const tag = r.error ? 'error' : breached > 0 ? `breached:${breached}` : 'ok';
|
|
103
|
+
console.log(` ${r.startedAt} ${r.block.padEnd(40)} ${r.trigger.padEnd(6)} ${tag}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function runScheduleStart(flags) {
|
|
107
|
+
const service = await startScheduleService();
|
|
108
|
+
if (flags.format === 'json') {
|
|
109
|
+
console.log(JSON.stringify({ started: true, blocks: service.blocks }, null, 2));
|
|
110
|
+
}
|
|
111
|
+
else if (service.blocks.length === 0) {
|
|
112
|
+
console.log('No scheduled blocks found. Add @schedule(...) to a .dql file and restart.');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
console.log(`[schedule] running ${service.blocks.length} block(s). Ctrl+C to stop.`);
|
|
117
|
+
for (const b of service.blocks) {
|
|
118
|
+
console.log(` - ${b.name} cron="${b.schedule.cron}"`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Graceful shutdown.
|
|
122
|
+
const shutdown = async () => {
|
|
123
|
+
await service.stop();
|
|
124
|
+
console.log('\n[schedule] stopped');
|
|
125
|
+
process.exit(0);
|
|
126
|
+
};
|
|
127
|
+
process.on('SIGINT', shutdown);
|
|
128
|
+
process.on('SIGTERM', shutdown);
|
|
129
|
+
// Hold the event loop open.
|
|
130
|
+
await new Promise(() => { });
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=schedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":"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"}
|
package/dist/digest.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Digest build helper — resolves block sources + SHAs and drives digest-emitter.
|
|
3
|
+
*
|
|
4
|
+
* Runs outside compile() so the narrative (potentially LLM-backed) stays an
|
|
5
|
+
* async post-process step and doesn't push async up through the core compiler.
|
|
6
|
+
*/
|
|
7
|
+
import { type CompilationOutput, type DigestBuildResult, type DigestLLMProvider } from '@duckcodeailabs/dql-compiler';
|
|
8
|
+
export declare function isDigestOutput(output: CompilationOutput): boolean;
|
|
9
|
+
export declare function runDigestBuild(output: CompilationOutput, projectRoot: string, llm?: DigestLLMProvider): Promise<DigestBuildResult>;
|
|
10
|
+
//# sourceMappingURL=digest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEjE;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,iBAAiB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAsB5B"}
|
package/dist/digest.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Digest build helper — resolves block sources + SHAs and drives digest-emitter.
|
|
3
|
+
*
|
|
4
|
+
* Runs outside compile() so the narrative (potentially LLM-backed) stays an
|
|
5
|
+
* async post-process step and doesn't push async up through the core compiler.
|
|
6
|
+
*/
|
|
7
|
+
import { execSync } from 'node:child_process';
|
|
8
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { buildManifest } from '@duckcodeailabs/dql-core';
|
|
11
|
+
import { buildDigest, } from '@duckcodeailabs/dql-compiler';
|
|
12
|
+
export function isDigestOutput(output) {
|
|
13
|
+
return Boolean(output.metadata?.narrative);
|
|
14
|
+
}
|
|
15
|
+
export async function runDigestBuild(output, projectRoot, llm) {
|
|
16
|
+
const narrative = output.metadata?.narrative;
|
|
17
|
+
if (!narrative) {
|
|
18
|
+
throw new Error('runDigestBuild called on non-digest output');
|
|
19
|
+
}
|
|
20
|
+
const sources = loadBlockSources(projectRoot, narrative.sources);
|
|
21
|
+
const digestIR = {
|
|
22
|
+
title: output.metadata.title,
|
|
23
|
+
narrative,
|
|
24
|
+
// The digest-emitter only needs `title` + `narrative` + `sources` for
|
|
25
|
+
// narrative composition; the dashboard HTML is threaded in separately.
|
|
26
|
+
charts: [],
|
|
27
|
+
filters: [],
|
|
28
|
+
params: [],
|
|
29
|
+
notifications: output.metadata.notifications ?? [],
|
|
30
|
+
alerts: output.metadata.alerts ?? [],
|
|
31
|
+
layout: { type: 'grid', columns: 12, items: [] },
|
|
32
|
+
variables: {},
|
|
33
|
+
};
|
|
34
|
+
return buildDigest(digestIR, output.html, sources, llm);
|
|
35
|
+
}
|
|
36
|
+
function loadBlockSources(projectRoot, sourceNames) {
|
|
37
|
+
const manifest = loadOrBuildManifest(projectRoot);
|
|
38
|
+
const sources = new Map();
|
|
39
|
+
for (const name of sourceNames) {
|
|
40
|
+
const block = manifest?.blocks?.[name];
|
|
41
|
+
if (!block) {
|
|
42
|
+
sources.set(name, { path: name, description: undefined });
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
sources.set(name, {
|
|
46
|
+
path: block.filePath,
|
|
47
|
+
description: block.description,
|
|
48
|
+
gitCommitSha: resolveGitSha(projectRoot, block.filePath),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return sources;
|
|
52
|
+
}
|
|
53
|
+
function loadOrBuildManifest(projectRoot) {
|
|
54
|
+
const cached = join(projectRoot, 'dql-manifest.json');
|
|
55
|
+
if (existsSync(cached)) {
|
|
56
|
+
try {
|
|
57
|
+
return JSON.parse(readFileSync(cached, 'utf-8'));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// fall through to fresh build
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
return buildManifest({ projectRoot, dqlVersion: '0.0.0' });
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function resolveGitSha(projectRoot, filePath) {
|
|
71
|
+
try {
|
|
72
|
+
const sha = execSync(`git log -1 --format=%H -- "${filePath}"`, {
|
|
73
|
+
cwd: projectRoot,
|
|
74
|
+
encoding: 'utf-8',
|
|
75
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
76
|
+
}).trim();
|
|
77
|
+
return sha.length > 0 ? sha : undefined;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.js","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface RepoContext {
|
|
2
|
+
/** Absolute path to the repository root (where `.git` lives). */
|
|
3
|
+
dir: string;
|
|
4
|
+
/** Relative path of the requested file from the repo root, POSIX-separated. */
|
|
5
|
+
relpath: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Locate the git repository containing `absPath`. Walks upward looking
|
|
9
|
+
* for a `.git` directory. Returns `null` when no repository is found.
|
|
10
|
+
*/
|
|
11
|
+
export declare function findRepoContext(absPath: string): RepoContext | null;
|
|
12
|
+
/**
|
|
13
|
+
* Read the HEAD-committed contents of `relpath` as a UTF-8 string. Returns
|
|
14
|
+
* `null` if HEAD has no such file (newly added in the working copy).
|
|
15
|
+
*/
|
|
16
|
+
export declare function readHeadBlob(ctx: RepoContext): Promise<string | null>;
|
|
17
|
+
//# sourceMappingURL=git-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-service.d.ts","sourceRoot":"","sources":["../src/git-service.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAcnE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc3E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Thin isomorphic-git wrapper used by `dql diff <path>` to resolve the
|
|
2
|
+
// HEAD blob for a file inside a git repo.
|
|
3
|
+
import { statSync } from 'node:fs';
|
|
4
|
+
import { join, relative, resolve } from 'node:path';
|
|
5
|
+
import git from 'isomorphic-git';
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
/**
|
|
8
|
+
* Locate the git repository containing `absPath`. Walks upward looking
|
|
9
|
+
* for a `.git` directory. Returns `null` when no repository is found.
|
|
10
|
+
*/
|
|
11
|
+
export function findRepoContext(absPath) {
|
|
12
|
+
let dir = resolve(absPath);
|
|
13
|
+
if (!statSync(dir, { throwIfNoEntry: false })?.isDirectory()) {
|
|
14
|
+
dir = resolve(dir, '..');
|
|
15
|
+
}
|
|
16
|
+
while (true) {
|
|
17
|
+
if (statSync(join(dir, '.git'), { throwIfNoEntry: false })) {
|
|
18
|
+
const rel = relative(dir, absPath).split(/[\\/]/).join('/');
|
|
19
|
+
return { dir, relpath: rel };
|
|
20
|
+
}
|
|
21
|
+
const parent = resolve(dir, '..');
|
|
22
|
+
if (parent === dir)
|
|
23
|
+
return null;
|
|
24
|
+
dir = parent;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Read the HEAD-committed contents of `relpath` as a UTF-8 string. Returns
|
|
29
|
+
* `null` if HEAD has no such file (newly added in the working copy).
|
|
30
|
+
*/
|
|
31
|
+
export async function readHeadBlob(ctx) {
|
|
32
|
+
try {
|
|
33
|
+
const commitSha = await git.resolveRef({ fs, dir: ctx.dir, ref: 'HEAD' });
|
|
34
|
+
const { blob } = await git.readBlob({
|
|
35
|
+
fs,
|
|
36
|
+
dir: ctx.dir,
|
|
37
|
+
oid: commitSha,
|
|
38
|
+
filepath: ctx.relpath,
|
|
39
|
+
});
|
|
40
|
+
return new TextDecoder('utf-8').decode(blob);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (isNotFoundError(error))
|
|
44
|
+
return null;
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function isNotFoundError(error) {
|
|
49
|
+
if (!error || typeof error !== 'object')
|
|
50
|
+
return false;
|
|
51
|
+
const code = error.code;
|
|
52
|
+
return code === 'NotFoundError' || code === 'ENOENT';
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=git-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-service.js","sourceRoot":"","sources":["../src/git-service.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,0CAA0C;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAS9B;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC;QAC7D,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5D,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC/B,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAgB;IACjD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC;YAClC,EAAE;YACF,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,GAAG,EAAE,SAAS;YACd,QAAQ,EAAE,GAAG,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,eAAe,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAC;IAC/C,OAAO,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,QAAQ,CAAC;AACvD,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -22,6 +22,9 @@ import { runLineage } from './commands/lineage.js';
|
|
|
22
22
|
import { runCompile } from './commands/compile.js';
|
|
23
23
|
import { runSync } from './commands/sync.js';
|
|
24
24
|
import { runDiff } from './commands/diff.js';
|
|
25
|
+
import { runMcp } from './commands/mcp.js';
|
|
26
|
+
import { runApp } from './commands/app.js';
|
|
27
|
+
import { runSchedule } from './commands/schedule.js';
|
|
25
28
|
const HELP = `
|
|
26
29
|
dql — DQL CLI
|
|
27
30
|
|
|
@@ -38,13 +41,18 @@ const HELP = `
|
|
|
38
41
|
dql certify <file.dql> Evaluate certification rules
|
|
39
42
|
dql info <file.dql> Show block metadata
|
|
40
43
|
dql migrate <source> Scaffold migration from looker/tableau/dbt/metabase/raw-sql
|
|
41
|
-
dql
|
|
42
|
-
dql
|
|
44
|
+
dql migrate format [--check] Upgrade all .dql/.dqlnb files to canonical format
|
|
45
|
+
dql fmt <file.dql|.dqlnb> Format DQL/notebook file in place
|
|
46
|
+
dql diff <path> Diff a .dql/.dqlnb file vs HEAD
|
|
47
|
+
dql diff <before> <after> Semantic diff between two files
|
|
43
48
|
dql notebook [path] Launch the browser-first notebook for a project
|
|
44
49
|
dql semantic <sub> [path] Semantic layer: list, validate, query, pull
|
|
45
50
|
dql compile [path] Generate project manifest (dql-manifest.json)
|
|
46
51
|
dql sync dbt [path] Detect dbt manifest changes; report DQL cache status
|
|
47
52
|
dql lineage [block] [path] Answer-layer lineage analysis
|
|
53
|
+
dql mcp [--http] Run the DQL MCP server (stdio by default; --http = loopback)
|
|
54
|
+
dql app new|ls|show <name> Manage App artifacts (domain-scoped notebook + dashboard bundles)
|
|
55
|
+
dql schedule list|run|start|status Local scheduler for @schedule'd blocks (alerts + notifications)
|
|
48
56
|
dql --version Show version
|
|
49
57
|
dql --help Show this help
|
|
50
58
|
|
|
@@ -83,7 +91,7 @@ async function main() {
|
|
|
83
91
|
console.log(HELP.trim());
|
|
84
92
|
process.exit(0);
|
|
85
93
|
}
|
|
86
|
-
if (!file && command !== 'init' && command !== 'serve' && command !== 'doctor' && command !== 'notebook' && command !== 'validate' && command !== 'semantic' && command !== 'lineage' && command !== 'compile' && command !== 'sync') {
|
|
94
|
+
if (!file && command !== 'init' && command !== 'serve' && command !== 'doctor' && command !== 'notebook' && command !== 'validate' && command !== 'semantic' && command !== 'lineage' && command !== 'compile' && command !== 'sync' && command !== 'mcp' && command !== 'app' && command !== 'schedule') {
|
|
87
95
|
console.error('Error: No file/argument specified. Run "dql --help" for usage.');
|
|
88
96
|
process.exit(1);
|
|
89
97
|
}
|
|
@@ -146,6 +154,15 @@ async function main() {
|
|
|
146
154
|
case 'diff':
|
|
147
155
|
await runDiff(file, rest, flags);
|
|
148
156
|
break;
|
|
157
|
+
case 'mcp':
|
|
158
|
+
await runMcp(file, flags);
|
|
159
|
+
break;
|
|
160
|
+
case 'app':
|
|
161
|
+
await runApp(file, rest, flags);
|
|
162
|
+
break;
|
|
163
|
+
case 'schedule':
|
|
164
|
+
await runSchedule(file, rest, flags);
|
|
165
|
+
break;
|
|
149
166
|
default:
|
|
150
167
|
console.error(`Unknown command: ${command}. Run "dql --help" for usage.`);
|
|
151
168
|
process.exit(1);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-agent-sdk.d.ts","sourceRoot":"","sources":["../../src/llm/claude-agent-sdk.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAmB,WAAW,EAA4B,MAAM,YAAY,CAAC;AAsLzF,eAAO,MAAM,oBAAoB,EAAE,WAiBlC,CAAC"}
|