@duckcodeailabs/dql-agent 1.6.33 → 1.7.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 (184) hide show
  1. package/dist/agent-run-engine.d.ts +39 -8
  2. package/dist/agent-run-engine.d.ts.map +1 -1
  3. package/dist/agent-run-engine.js +169 -10
  4. package/dist/agent-run-engine.js.map +1 -1
  5. package/dist/agent-run-gates.d.ts.map +1 -1
  6. package/dist/agent-run-gates.js +21 -3
  7. package/dist/agent-run-gates.js.map +1 -1
  8. package/dist/agent-run-planner.d.ts.map +1 -1
  9. package/dist/agent-run-planner.js +14 -3
  10. package/dist/agent-run-planner.js.map +1 -1
  11. package/dist/agentic/answer-contract.d.ts +37 -0
  12. package/dist/agentic/answer-contract.d.ts.map +1 -0
  13. package/dist/agentic/answer-contract.js +47 -0
  14. package/dist/agentic/answer-contract.js.map +1 -0
  15. package/dist/agentic/tool-loop.d.ts +48 -0
  16. package/dist/agentic/tool-loop.d.ts.map +1 -0
  17. package/dist/agentic/tool-loop.js +181 -0
  18. package/dist/agentic/tool-loop.js.map +1 -0
  19. package/dist/agentic/toolset.d.ts +40 -0
  20. package/dist/agentic/toolset.d.ts.map +1 -0
  21. package/dist/agentic/toolset.js +265 -0
  22. package/dist/agentic/toolset.js.map +1 -0
  23. package/dist/answer-loop.d.ts +82 -6
  24. package/dist/answer-loop.d.ts.map +1 -1
  25. package/dist/answer-loop.js +799 -112
  26. package/dist/answer-loop.js.map +1 -1
  27. package/dist/app-builder.d.ts.map +1 -1
  28. package/dist/app-builder.js +18 -10
  29. package/dist/app-builder.js.map +1 -1
  30. package/dist/cascade/budgets.d.ts +20 -2
  31. package/dist/cascade/budgets.d.ts.map +1 -1
  32. package/dist/cascade/budgets.js +83 -45
  33. package/dist/cascade/budgets.js.map +1 -1
  34. package/dist/cascade/route-policy.d.ts +1 -1
  35. package/dist/cascade/route-policy.d.ts.map +1 -1
  36. package/dist/cascade/route-policy.js +6 -0
  37. package/dist/cascade/route-policy.js.map +1 -1
  38. package/dist/domain-context.d.ts +30 -0
  39. package/dist/domain-context.d.ts.map +1 -0
  40. package/dist/domain-context.js +68 -0
  41. package/dist/domain-context.js.map +1 -0
  42. package/dist/embeddings/provider.d.ts +67 -4
  43. package/dist/embeddings/provider.d.ts.map +1 -1
  44. package/dist/embeddings/provider.js +167 -6
  45. package/dist/embeddings/provider.js.map +1 -1
  46. package/dist/hints/correction-eval.d.ts +30 -0
  47. package/dist/hints/correction-eval.d.ts.map +1 -0
  48. package/dist/hints/correction-eval.js +63 -0
  49. package/dist/hints/correction-eval.js.map +1 -0
  50. package/dist/hints/git-store.d.ts +39 -3
  51. package/dist/hints/git-store.d.ts.map +1 -1
  52. package/dist/hints/git-store.js +172 -2
  53. package/dist/hints/git-store.js.map +1 -1
  54. package/dist/hints/staleness.d.ts +30 -0
  55. package/dist/hints/staleness.d.ts.map +1 -0
  56. package/dist/hints/staleness.js +38 -0
  57. package/dist/hints/staleness.js.map +1 -0
  58. package/dist/hints/store.d.ts.map +1 -1
  59. package/dist/hints/store.js +3 -32
  60. package/dist/hints/store.js.map +1 -1
  61. package/dist/hints/types.d.ts +41 -0
  62. package/dist/hints/types.d.ts.map +1 -1
  63. package/dist/hints/types.js +1 -0
  64. package/dist/hints/types.js.map +1 -1
  65. package/dist/index.d.ts +46 -10
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +180 -9
  68. package/dist/index.js.map +1 -1
  69. package/dist/intent-controller.d.ts.map +1 -1
  70. package/dist/intent-controller.js +15 -3
  71. package/dist/intent-controller.js.map +1 -1
  72. package/dist/kg/build.d.ts.map +1 -1
  73. package/dist/kg/build.js +196 -4
  74. package/dist/kg/build.js.map +1 -1
  75. package/dist/kg/sqlite-fts.d.ts +13 -0
  76. package/dist/kg/sqlite-fts.d.ts.map +1 -1
  77. package/dist/kg/sqlite-fts.js +82 -49
  78. package/dist/kg/sqlite-fts.js.map +1 -1
  79. package/dist/kg/types.d.ts +9 -2
  80. package/dist/kg/types.d.ts.map +1 -1
  81. package/dist/memory/fts-query.d.ts +37 -4
  82. package/dist/memory/fts-query.d.ts.map +1 -1
  83. package/dist/memory/fts-query.js +53 -12
  84. package/dist/memory/fts-query.js.map +1 -1
  85. package/dist/metadata/analysis-planner.d.ts.map +1 -1
  86. package/dist/metadata/analysis-planner.js +179 -28
  87. package/dist/metadata/analysis-planner.js.map +1 -1
  88. package/dist/metadata/analytical-policy.d.ts +51 -0
  89. package/dist/metadata/analytical-policy.d.ts.map +1 -0
  90. package/dist/metadata/analytical-policy.js +309 -0
  91. package/dist/metadata/analytical-policy.js.map +1 -0
  92. package/dist/metadata/block-adapt.d.ts +37 -0
  93. package/dist/metadata/block-adapt.d.ts.map +1 -0
  94. package/dist/metadata/block-adapt.js +89 -0
  95. package/dist/metadata/block-adapt.js.map +1 -0
  96. package/dist/metadata/block-fit.js +37 -4
  97. package/dist/metadata/block-fit.js.map +1 -1
  98. package/dist/metadata/catalog.d.ts +85 -1
  99. package/dist/metadata/catalog.d.ts.map +1 -1
  100. package/dist/metadata/catalog.js +674 -92
  101. package/dist/metadata/catalog.js.map +1 -1
  102. package/dist/metadata/dbt-first-safety.d.ts +19 -0
  103. package/dist/metadata/dbt-first-safety.d.ts.map +1 -0
  104. package/dist/metadata/dbt-first-safety.js +17 -0
  105. package/dist/metadata/dbt-first-safety.js.map +1 -0
  106. package/dist/metadata/example-match.d.ts +30 -0
  107. package/dist/metadata/example-match.d.ts.map +1 -0
  108. package/dist/metadata/example-match.js +69 -0
  109. package/dist/metadata/example-match.js.map +1 -0
  110. package/dist/metadata/grain-ledger.d.ts +51 -0
  111. package/dist/metadata/grain-ledger.d.ts.map +1 -0
  112. package/dist/metadata/grain-ledger.js +174 -0
  113. package/dist/metadata/grain-ledger.js.map +1 -0
  114. package/dist/metadata/metric-match.d.ts +21 -1
  115. package/dist/metadata/metric-match.d.ts.map +1 -1
  116. package/dist/metadata/metric-match.js +157 -21
  117. package/dist/metadata/metric-match.js.map +1 -1
  118. package/dist/metadata/sql-context-validation.d.ts.map +1 -1
  119. package/dist/metadata/sql-context-validation.js +42 -2
  120. package/dist/metadata/sql-context-validation.js.map +1 -1
  121. package/dist/metadata/sql-grounding.d.ts +4 -2
  122. package/dist/metadata/sql-grounding.d.ts.map +1 -1
  123. package/dist/metadata/sql-grounding.js +29 -4
  124. package/dist/metadata/sql-grounding.js.map +1 -1
  125. package/dist/metadata/sql-retrieval.d.ts +5 -2
  126. package/dist/metadata/sql-retrieval.d.ts.map +1 -1
  127. package/dist/metadata/sql-retrieval.js +28 -6
  128. package/dist/metadata/sql-retrieval.js.map +1 -1
  129. package/dist/propose/build-from-prompt.d.ts +34 -0
  130. package/dist/propose/build-from-prompt.d.ts.map +1 -1
  131. package/dist/propose/build-from-prompt.js +205 -19
  132. package/dist/propose/build-from-prompt.js.map +1 -1
  133. package/dist/propose/failure-analysis.d.ts +48 -0
  134. package/dist/propose/failure-analysis.d.ts.map +1 -0
  135. package/dist/propose/failure-analysis.js +71 -0
  136. package/dist/propose/failure-analysis.js.map +1 -0
  137. package/dist/propose/join-mining.d.ts +18 -0
  138. package/dist/propose/join-mining.d.ts.map +1 -0
  139. package/dist/propose/join-mining.js +74 -0
  140. package/dist/propose/join-mining.js.map +1 -0
  141. package/dist/providers/claude.d.ts.map +1 -1
  142. package/dist/providers/claude.js +36 -1
  143. package/dist/providers/claude.js.map +1 -1
  144. package/dist/providers/index.d.ts +2 -2
  145. package/dist/providers/index.d.ts.map +1 -1
  146. package/dist/providers/index.js +1 -1
  147. package/dist/providers/index.js.map +1 -1
  148. package/dist/providers/openai.d.ts.map +1 -1
  149. package/dist/providers/openai.js +34 -1
  150. package/dist/providers/openai.js.map +1 -1
  151. package/dist/providers/reasoning-effort.d.ts +27 -0
  152. package/dist/providers/reasoning-effort.d.ts.map +1 -1
  153. package/dist/providers/reasoning-effort.js +32 -0
  154. package/dist/providers/reasoning-effort.js.map +1 -1
  155. package/dist/providers/types.d.ts +2 -1
  156. package/dist/providers/types.d.ts.map +1 -1
  157. package/dist/research-loop.d.ts.map +1 -1
  158. package/dist/research-loop.js +9 -2
  159. package/dist/research-loop.js.map +1 -1
  160. package/dist/semantic-bridge/compose.d.ts.map +1 -1
  161. package/dist/semantic-bridge/compose.js +316 -25
  162. package/dist/semantic-bridge/compose.js.map +1 -1
  163. package/dist/skills/bootstrap.d.ts +57 -0
  164. package/dist/skills/bootstrap.d.ts.map +1 -0
  165. package/dist/skills/bootstrap.js +260 -0
  166. package/dist/skills/bootstrap.js.map +1 -0
  167. package/dist/skills/defaults.d.ts +2 -2
  168. package/dist/skills/defaults.js +2 -2
  169. package/dist/skills/domain-skills.d.ts +24 -0
  170. package/dist/skills/domain-skills.d.ts.map +1 -0
  171. package/dist/skills/domain-skills.js +76 -0
  172. package/dist/skills/domain-skills.js.map +1 -0
  173. package/dist/skills/loader.d.ts +56 -8
  174. package/dist/skills/loader.d.ts.map +1 -1
  175. package/dist/skills/loader.js +257 -41
  176. package/dist/skills/loader.js.map +1 -1
  177. package/dist/synthesize.d.ts.map +1 -1
  178. package/dist/synthesize.js +152 -16
  179. package/dist/synthesize.js.map +1 -1
  180. package/dist/tools/registry.d.ts +1 -1
  181. package/dist/tools/registry.d.ts.map +1 -1
  182. package/dist/tools/registry.js +54 -12
  183. package/dist/tools/registry.js.map +1 -1
  184. package/package.json +4 -4
@@ -0,0 +1,260 @@
1
+ import { buildDomainReferenceSkills } from './domain-skills.js';
2
+ function slug(value) {
3
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'domain';
4
+ }
5
+ /** Build reviewable candidates without writing tracked files. */
6
+ export function draftDomainSkillBootstrap(manifest) {
7
+ const candidates = [];
8
+ const declared = Object.values(manifest.domains ?? {});
9
+ const declaredNames = new Set(declared.map((domain) => domain.name.toLowerCase()));
10
+ const inferred = new Set();
11
+ for (const block of Object.values(manifest.blocks ?? {}))
12
+ if (block.domain)
13
+ inferred.add(block.domain);
14
+ for (const metric of Object.values(manifest.metrics ?? {}))
15
+ if (metric.domain)
16
+ inferred.add(metric.domain);
17
+ for (const term of Object.values(manifest.terms ?? {}))
18
+ if (term.domain)
19
+ inferred.add(term.domain);
20
+ for (const domain of declared) {
21
+ const metricCount = Object.values(manifest.metrics ?? {}).filter((metric) => metric.domain === domain.name).length;
22
+ const blockCount = Object.values(manifest.blocks ?? {}).filter((block) => block.domain === domain.name).length;
23
+ const termCount = Object.values(manifest.terms ?? {}).filter((term) => term.domain === domain.name).length;
24
+ candidates.push({
25
+ id: `domain:${slug(domain.name)}`,
26
+ kind: 'domain',
27
+ action: 'unchanged',
28
+ confidence: 1,
29
+ evidence: [`Declared in ${domain.filePath}`, `${metricCount} metrics`, `${blockCount} blocks`, `${termCount} terms`],
30
+ domain: {
31
+ name: domain.name,
32
+ parent: domain.parent,
33
+ owner: domain.owner,
34
+ businessOwner: domain.businessOwner,
35
+ boundedContext: domain.boundedContext,
36
+ sourceSystems: domain.sourceSystems,
37
+ primaryTerms: domain.primaryTerms,
38
+ tags: domain.tags,
39
+ businessOutcome: domain.businessOutcome,
40
+ description: domain.description,
41
+ reviewCadence: domain.reviewCadence,
42
+ inScope: domain.inScope,
43
+ outOfScope: domain.outOfScope,
44
+ dbtGroups: domain.dbtGroups,
45
+ dbtPaths: domain.dbtPaths,
46
+ dbtTags: domain.dbtTags,
47
+ semanticDomains: domain.semanticDomains,
48
+ semanticTags: domain.semanticTags,
49
+ sourcePath: domain.filePath,
50
+ },
51
+ });
52
+ }
53
+ for (const name of inferred) {
54
+ if (declaredNames.has(name.toLowerCase()))
55
+ continue;
56
+ const metricCount = Object.values(manifest.metrics ?? {}).filter((metric) => metric.domain === name).length;
57
+ const blockCount = Object.values(manifest.blocks ?? {}).filter((block) => block.domain === name).length;
58
+ const termCount = Object.values(manifest.terms ?? {}).filter((term) => term.domain === name).length;
59
+ candidates.push({
60
+ id: `domain:${slug(name)}`,
61
+ kind: 'domain',
62
+ action: 'create',
63
+ confidence: metricCount + blockCount + termCount >= 3 ? 0.9 : 0.55,
64
+ evidence: ['Inferred from governed artifacts', `${metricCount} metrics`, `${blockCount} blocks`, `${termCount} terms`],
65
+ domain: {
66
+ name,
67
+ boundedContext: `Governed analytics for ${name}. Review the generated scope before use.`,
68
+ reviewCadence: 'quarterly',
69
+ },
70
+ });
71
+ }
72
+ for (const skill of buildDomainReferenceSkills({ ...manifest, domains: Object.fromEntries(candidates.filter((candidate) => candidate.kind === 'domain' && candidate.domain).map((candidate) => [candidate.domain.name, {
73
+ name: candidate.domain.name,
74
+ filePath: candidate.domain.sourcePath ?? `domains/${slug(candidate.domain.name)}/domain.dql`,
75
+ ...candidate.domain,
76
+ }])) })) {
77
+ candidates.push({
78
+ id: `skill:${skill.id}`,
79
+ kind: 'skill',
80
+ action: 'create',
81
+ confidence: 0.85,
82
+ evidence: [`Derived from domain ${skill.domain}`, `${skill.preferredMetrics?.length ?? 0} metrics`, `${skill.preferredBlocks?.length ?? 0} certified blocks`],
83
+ skill: { ...skill, kind: 'domain_reference', status: 'draft', domains: skill.domain ? [skill.domain] : [] },
84
+ });
85
+ }
86
+ return candidates.sort((a, b) => a.kind.localeCompare(b.kind) || b.confidence - a.confidence || a.id.localeCompare(b.id));
87
+ }
88
+ /**
89
+ * A bounded, evidence-only prompt for enriching repository drafts. The model is
90
+ * never asked to discover metrics, joins, or new taxonomy: it may only improve
91
+ * prose and operational guidance for the candidate IDs supplied here.
92
+ */
93
+ export function buildDomainSkillBootstrapPrompt(manifest, candidates) {
94
+ const metricIndex = Object.values(manifest.metrics ?? {});
95
+ const blockIndex = Object.values(manifest.blocks ?? {});
96
+ const termIndex = Object.values(manifest.terms ?? {});
97
+ const items = candidates.map((candidate) => {
98
+ const domainName = candidate.domain?.name ?? candidate.skill?.domain ?? candidate.skill?.domains?.[0];
99
+ const metrics = metricIndex.filter((metric) => metric.domain === domainName).slice(0, 24)
100
+ .map((metric) => ({ id: metric.name, label: metric.label, description: truncate(metric.description, 180) }));
101
+ const blocks = blockIndex.filter((block) => block.domain === domainName).slice(0, 16)
102
+ .map((block) => ({ id: block.name, status: block.status, description: truncate(block.description, 180) }));
103
+ const terms = termIndex.filter((term) => term.domain === domainName).slice(0, 24)
104
+ .map((term) => ({ name: term.name, synonyms: (term.synonyms ?? []).slice(0, 8), caveats: (term.caveats ?? []).slice(0, 5) }));
105
+ return {
106
+ id: candidate.id,
107
+ kind: candidate.kind,
108
+ action: candidate.action,
109
+ domain: candidate.domain ? {
110
+ name: candidate.domain.name,
111
+ parent: candidate.domain.parent,
112
+ description: candidate.domain.description,
113
+ boundedContext: candidate.domain.boundedContext,
114
+ businessOutcome: candidate.domain.businessOutcome,
115
+ primaryTerms: candidate.domain.primaryTerms,
116
+ tags: candidate.domain.tags,
117
+ inScope: candidate.domain.inScope,
118
+ outOfScope: candidate.domain.outOfScope,
119
+ } : undefined,
120
+ skill: candidate.skill ? {
121
+ id: candidate.skill.id,
122
+ domain: candidate.skill.domain,
123
+ domains: candidate.skill.domains,
124
+ description: candidate.skill.description,
125
+ preferredMetrics: candidate.skill.preferredMetrics,
126
+ preferredBlocks: candidate.skill.preferredBlocks,
127
+ } : undefined,
128
+ evidence: candidate.evidence,
129
+ governedArtifacts: { metrics, blocks, terms },
130
+ };
131
+ });
132
+ return {
133
+ system: [
134
+ 'You enrich governed analytics domain and skill drafts from repository evidence.',
135
+ 'Return JSON only. Do not use markdown fences.',
136
+ 'Never invent or rename domains, metrics, dimensions, blocks, models, joins, filters, owners, or source systems.',
137
+ 'Do not create candidate IDs. Return only IDs supplied by the user.',
138
+ 'If repository evidence is insufficient, add a concise clarification rule instead of assuming a business definition.',
139
+ 'For domains, improve only business description, bounded context, outcome, in/out scope, primary terms, and tags.',
140
+ 'For skills, improve only description, triggers, exclusions, clarification rules, examples, and a concise Markdown body.',
141
+ 'Skill bodies must use exactly these sections when useful: Purpose, Governed reuse, Vocabulary, Guardrails, Clarify.',
142
+ 'Treat listed metrics and certified blocks as references, not proof of an unstated calculation. Keep every field concise.',
143
+ 'Output shape: {"drafts":[{"id":"...","description":"...","boundedContext":"...","businessOutcome":"...","inScope":["..."],"outOfScope":["..."],"primaryTerms":["..."],"tags":["..."],"triggers":["..."],"exclusions":["..."],"clarifyWhen":["..."],"examples":["..."],"body":"..."}]}. Omit fields you cannot ground.',
144
+ ].join('\n'),
145
+ user: JSON.stringify({ candidates: items }, null, 2),
146
+ };
147
+ }
148
+ /**
149
+ * Apply only safe, textual AI improvements. This deliberately rejects model
150
+ * attempts to add governed-object references or unknown candidate IDs.
151
+ */
152
+ export function mergeDomainSkillBootstrapEnrichment(candidates, response) {
153
+ const parsed = parseBootstrapResponse(response);
154
+ const byId = new Map(candidates.map((candidate) => [candidate.id, candidate]));
155
+ const applied = [];
156
+ const rejected = [];
157
+ const next = candidates.map((candidate) => ({ ...candidate }));
158
+ const nextById = new Map(next.map((candidate) => [candidate.id, candidate]));
159
+ for (const draft of parsed) {
160
+ const original = byId.get(draft.id);
161
+ const candidate = nextById.get(draft.id);
162
+ if (!original || !candidate) {
163
+ rejected.push(`Ignored unknown candidate ${draft.id || '(missing id)'}.`);
164
+ continue;
165
+ }
166
+ if (candidate.kind === 'domain' && candidate.domain) {
167
+ const domain = { ...candidate.domain };
168
+ const allowedTerms = new Set((original.domain?.primaryTerms ?? []).map(normalize));
169
+ const safeTerms = filterKnown(draft.primaryTerms, allowedTerms);
170
+ if ((draft.primaryTerms?.length ?? 0) !== safeTerms.length)
171
+ rejected.push(`Ignored ungrounded primary terms for ${draft.id}.`);
172
+ let changed = false;
173
+ changed = assignText(domain, 'description', draft.description) || changed;
174
+ changed = assignText(domain, 'boundedContext', draft.boundedContext) || changed;
175
+ changed = assignText(domain, 'businessOutcome', draft.businessOutcome) || changed;
176
+ changed = assignStrings(domain, 'inScope', draft.inScope) || changed;
177
+ changed = assignStrings(domain, 'outOfScope', draft.outOfScope) || changed;
178
+ changed = assignStrings(domain, 'tags', draft.tags) || changed;
179
+ if (safeTerms.length)
180
+ changed = assignStrings(domain, 'primaryTerms', safeTerms) || changed;
181
+ candidate.domain = domain;
182
+ if (changed) {
183
+ candidate.action = candidate.action === 'unchanged' ? 'update' : candidate.action;
184
+ candidate.notes = [...(candidate.notes ?? []), 'AI enrichment was constrained to repository evidence.'];
185
+ applied.push(draft.id);
186
+ }
187
+ continue;
188
+ }
189
+ if (candidate.kind === 'skill' && candidate.skill) {
190
+ const skill = { ...candidate.skill };
191
+ let changed = false;
192
+ changed = assignText(skill, 'description', draft.description) || changed;
193
+ changed = assignStrings(skill, 'triggers', draft.triggers) || changed;
194
+ changed = assignStrings(skill, 'exclusions', draft.exclusions) || changed;
195
+ changed = assignStrings(skill, 'clarifyWhen', draft.clarifyWhen) || changed;
196
+ changed = assignStrings(skill, 'examples', draft.examples) || changed;
197
+ changed = assignText(skill, 'body', draft.body, 8000) || changed;
198
+ candidate.skill = skill;
199
+ if (changed) {
200
+ candidate.action = candidate.action === 'unchanged' ? 'update' : candidate.action;
201
+ candidate.notes = [...(candidate.notes ?? []), 'AI enrichment was constrained to repository evidence.'];
202
+ applied.push(draft.id);
203
+ }
204
+ }
205
+ }
206
+ return { candidates: next, applied, rejected };
207
+ }
208
+ function parseBootstrapResponse(response) {
209
+ const match = response.match(/\{[\s\S]*\}/);
210
+ if (!match)
211
+ return [];
212
+ try {
213
+ const value = JSON.parse(match[0]);
214
+ if (!Array.isArray(value.drafts))
215
+ return [];
216
+ return value.drafts.flatMap((entry) => {
217
+ if (!entry || typeof entry !== 'object' || typeof entry.id !== 'string')
218
+ return [];
219
+ const raw = entry;
220
+ return [{
221
+ id: raw.id,
222
+ description: safeText(raw.description), boundedContext: safeText(raw.boundedContext), businessOutcome: safeText(raw.businessOutcome),
223
+ inScope: safeList(raw.inScope), outOfScope: safeList(raw.outOfScope), primaryTerms: safeList(raw.primaryTerms), tags: safeList(raw.tags),
224
+ triggers: safeList(raw.triggers), exclusions: safeList(raw.exclusions), clarifyWhen: safeList(raw.clarifyWhen), examples: safeList(raw.examples), body: safeText(raw.body, 8000),
225
+ }];
226
+ });
227
+ }
228
+ catch {
229
+ return [];
230
+ }
231
+ }
232
+ function safeText(value, max = 500) {
233
+ return typeof value === 'string' && value.trim() ? value.trim().slice(0, max) : undefined;
234
+ }
235
+ function safeList(value) {
236
+ if (!Array.isArray(value))
237
+ return undefined;
238
+ const values = value.filter((item) => typeof item === 'string').map((item) => item.trim().slice(0, 240)).filter(Boolean).slice(0, 20);
239
+ return values.length ? values : undefined;
240
+ }
241
+ function normalize(value) { return value.trim().toLowerCase(); }
242
+ function filterKnown(values, allowed) {
243
+ return (values ?? []).filter((value) => allowed.has(normalize(value)));
244
+ }
245
+ function truncate(value, max) { return value?.trim().slice(0, max); }
246
+ function assignText(target, key, value, max = 500) {
247
+ const record = target;
248
+ if (!value || value.length > max || record[key] === value)
249
+ return false;
250
+ record[key] = value;
251
+ return true;
252
+ }
253
+ function assignStrings(target, key, value) {
254
+ const record = target;
255
+ if (!value?.length || JSON.stringify(record[key] ?? []) === JSON.stringify(value))
256
+ return false;
257
+ record[key] = value;
258
+ return true;
259
+ }
260
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/skills/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Default starter Skills (spec 16) — `seedDefaultSkills` writes three EDITABLE
3
- * starters into `.dql/skills/`, idempotently (it NEVER clobbers a file the user
3
+ * starters into `skills/`, idempotently (it NEVER clobbers a file the user
4
4
  * has edited). The starters are:
5
5
  *
6
6
  * (a) Metrics glossary — pre-filled from the semantic layer (MetricFlow
@@ -29,7 +29,7 @@ export interface SeedDefaultSkillsResult {
29
29
  skipped: string[];
30
30
  }
31
31
  /**
32
- * Seed the editable starter skills into `.dql/skills/`. Idempotent: a starter is
32
+ * Seed the editable starter skills into `skills/`. Idempotent: a starter is
33
33
  * written only when its file does not already exist, so user edits are never
34
34
  * clobbered.
35
35
  */
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Default starter Skills (spec 16) — `seedDefaultSkills` writes three EDITABLE
3
- * starters into `.dql/skills/`, idempotently (it NEVER clobbers a file the user
3
+ * starters into `skills/`, idempotently (it NEVER clobbers a file the user
4
4
  * has edited). The starters are:
5
5
  *
6
6
  * (a) Metrics glossary — pre-filled from the semantic layer (MetricFlow
@@ -162,7 +162,7 @@ function blockAuthoringSkill() {
162
162
  };
163
163
  }
164
164
  /**
165
- * Seed the editable starter skills into `.dql/skills/`. Idempotent: a starter is
165
+ * Seed the editable starter skills into `skills/`. Idempotent: a starter is
166
166
  * written only when its file does not already exist, so user edits are never
167
167
  * clobbered.
168
168
  */
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Domain skill packs (W4.5).
3
+ *
4
+ * Anthropic's 21%→95% accuracy jump came from curated per-domain reference docs
5
+ * ("skills") that tell the agent the preferred metrics, canonical joins, and
6
+ * gotchas for each domain. This auto-drafts one reference skill per domain from
7
+ * the governed manifest — preferred certified metrics, certified blocks, glossary
8
+ * terms + their caveats — as an editable STARTER. A human curates it (the file is
9
+ * never clobbered on re-seed); it is injected only when retrieval routes to that
10
+ * domain. Distills what the manifest already knows into the shape the agent reads.
11
+ */
12
+ import type { DQLManifest } from '@duckcodeailabs/dql-core';
13
+ import { type Skill, type WriteSkillInput } from './loader.js';
14
+ /** Build one editable reference skill per domain from the governed manifest. Pure. */
15
+ export declare function buildDomainReferenceSkills(manifest: DQLManifest): WriteSkillInput[];
16
+ /**
17
+ * Seed per-domain reference skills into `skills/`. Idempotent: a domain skill
18
+ * is written only when its file does not already exist, so curator edits are kept.
19
+ */
20
+ export declare function seedDomainSkills(projectRoot: string, manifest: DQLManifest): {
21
+ created: Skill[];
22
+ skipped: string[];
23
+ };
24
+ //# sourceMappingURL=domain-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-skills.d.ts","sourceRoot":"","sources":["../../src/skills/domain-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAyB,KAAK,KAAK,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAMtF,sFAAsF;AACtF,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,WAAW,GAAG,eAAe,EAAE,CAsDnF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG;IAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAWpH"}
@@ -0,0 +1,76 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { skillPath, writeSkill } from './loader.js';
3
+ function slug(name) {
4
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'domain';
5
+ }
6
+ /** Build one editable reference skill per domain from the governed manifest. Pure. */
7
+ export function buildDomainReferenceSkills(manifest) {
8
+ const domains = Object.values(manifest.domains ?? {});
9
+ const blocks = Object.values(manifest.blocks ?? {});
10
+ const allMetrics = Object.values(manifest.metrics ?? {});
11
+ const allTerms = Object.values(manifest.terms ?? {});
12
+ const skills = [];
13
+ for (const domain of domains) {
14
+ const name = domain.name;
15
+ if (!name)
16
+ continue;
17
+ const metrics = allMetrics.filter((metric) => metric.domain === name);
18
+ const certifiedBlocks = blocks.filter((block) => block.domain === name && String(block.status ?? '').toLowerCase() === 'certified');
19
+ const terms = allTerms.filter((term) => term.domain === name);
20
+ const body = [
21
+ `# ${name} domain reference`,
22
+ '',
23
+ `Curated guidance for answering questions in the **${name}** domain. Prefer the`,
24
+ 'certified metrics and blocks below over ad-hoc SQL, and heed the caveats.',
25
+ '',
26
+ ];
27
+ body.push('## Preferred metrics');
28
+ body.push(metrics.length
29
+ ? metrics.map((m) => `- **${(m.label && m.label.trim()) || m.name}** (\`${m.name}\`)${m.description ? ` — ${m.description}` : ''}`).join('\n')
30
+ : '_No certified metrics in this domain yet._');
31
+ body.push('', '## Certified blocks');
32
+ body.push(certifiedBlocks.length
33
+ ? certifiedBlocks.map((b) => `- \`${b.name}\`${b.description ? ` — ${b.description}` : ''}`).join('\n')
34
+ : '_No certified blocks in this domain yet._');
35
+ const caveats = terms.flatMap((term) => (term.caveats ?? []).map((caveat) => `- ${term.name}: ${caveat}`));
36
+ if (caveats.length) {
37
+ body.push('', '## Gotchas', 'Domain caveats a senior analyst would warn about:', ...caveats);
38
+ }
39
+ body.push('', '_Auto-drafted from the manifest (W4.5). Edit to curate; it will not be overwritten on re-seed._');
40
+ const vocabulary = {};
41
+ for (const term of terms) {
42
+ vocabulary[term.name] = `term:${term.name}`;
43
+ for (const synonym of term.synonyms ?? [])
44
+ vocabulary[synonym] = `term:${term.name}`;
45
+ }
46
+ skills.push({
47
+ id: `domain-${slug(name)}`,
48
+ scope: 'project',
49
+ domain: name,
50
+ description: `Reference for the ${name} domain: preferred metrics, certified blocks, and gotchas.`,
51
+ preferredMetrics: metrics.map((m) => m.name),
52
+ preferredBlocks: certifiedBlocks.map((b) => b.name),
53
+ vocabulary,
54
+ body: body.join('\n'),
55
+ isStarter: true,
56
+ });
57
+ }
58
+ return skills;
59
+ }
60
+ /**
61
+ * Seed per-domain reference skills into `skills/`. Idempotent: a domain skill
62
+ * is written only when its file does not already exist, so curator edits are kept.
63
+ */
64
+ export function seedDomainSkills(projectRoot, manifest) {
65
+ const created = [];
66
+ const skipped = [];
67
+ for (const skill of buildDomainReferenceSkills(manifest)) {
68
+ if (existsSync(skillPath(projectRoot, skill.id))) {
69
+ skipped.push(skill.id);
70
+ continue;
71
+ }
72
+ created.push(writeSkill(projectRoot, skill));
73
+ }
74
+ return { created, skipped };
75
+ }
76
+ //# sourceMappingURL=domain-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-skills.js","sourceRoot":"","sources":["../../src/skills/domain-skills.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,10 @@
17
17
  */
18
18
  export interface Skill {
19
19
  id: string;
20
+ /** Author-facing id, retained when `id` is used by legacy callers. */
21
+ localId?: string;
22
+ /** Collision-free identity used by manifests, retrieval, and the KG. */
23
+ qualifiedId?: string;
20
24
  /**
21
25
  * Skill scope. PROJECT skills (`user` empty) are shared with everyone;
22
26
  * PERSONAL skills (`user` set) are bound to a single user. Derived from
@@ -27,9 +31,23 @@ export interface Skill {
27
31
  user?: string;
28
32
  /** Optional domain this skill belongs to (spec 17, part B). */
29
33
  domain?: string;
34
+ /** Domain paths for cross-domain skills. `domain` remains backward compatible. */
35
+ domains?: string[];
36
+ /** Optional focused Model Areas. This is a ranking hint inside an authorized domain, never an access grant. */
37
+ modelAreaRefs?: string[];
38
+ kind?: 'domain_reference' | 'metric_policy' | 'glossary' | 'analysis_pattern' | 'sql_policy' | 'custom';
39
+ status?: 'draft' | 'active' | 'deprecated';
40
+ owner?: string;
41
+ triggers?: string[];
42
+ exclusions?: string[];
30
43
  description?: string;
31
44
  preferredMetrics: string[];
32
45
  preferredBlocks: string[];
46
+ preferredDimensions?: string[];
47
+ requiredFilters?: string[];
48
+ clarifyWhen?: string[];
49
+ examples?: string[];
50
+ sourceRefs?: string[];
33
51
  vocabulary: Record<string, string>;
34
52
  /** Markdown body (everything after the closing `---`). */
35
53
  body: string;
@@ -45,16 +63,20 @@ export interface SkillLoadResult {
45
63
  }>;
46
64
  }
47
65
  /**
48
- * Walk `<projectRoot>/.dql/skills/**` and return every parsed Skill.
66
+ * Walk the visible, Git-owned `skills/**` tree. The historical
67
+ * `.dql/skills/**` tree remains read-compatible during migration, but a skill
68
+ * with the same id in `skills/` wins so projects can move incrementally.
49
69
  * Misformed files are reported in `errors`; valid Skills still come back.
50
70
  */
51
71
  export declare function loadSkills(projectRoot: string): SkillLoadResult;
52
72
  /** Public for tests. */
53
73
  export declare function parseSkill(raw: string, path: string): Skill | null;
54
- /** Skills directory for a project. */
74
+ /** Visible Git-owned skills directory for new and upgraded OSS projects. */
55
75
  export declare function skillsDir(projectRoot: string): string;
76
+ /** Historical local-state location, retained only as a read/migration source. */
77
+ export declare function legacySkillsDir(projectRoot: string): string;
56
78
  /** Resolve the `.skill.md` path a skill should be written to. */
57
- export declare function skillPath(projectRoot: string, id: string): string;
79
+ export declare function skillPath(projectRoot: string, id: string, domains?: string[]): string;
58
80
  /**
59
81
  * Render a Skill back to the EXACT `.skill.md` format `parseSkill` consumes, so
60
82
  * `parseSkill(renderSkill(s))` round-trips. Only emits keys that have content.
@@ -65,22 +87,39 @@ export interface WriteSkillInput {
65
87
  scope: 'project' | 'personal';
66
88
  user?: string;
67
89
  domain?: string;
90
+ domains?: string[];
91
+ modelAreaRefs?: string[];
92
+ kind?: Skill['kind'];
93
+ status?: Skill['status'];
94
+ owner?: string;
95
+ triggers?: string[];
96
+ exclusions?: string[];
68
97
  description?: string;
69
98
  preferredMetrics?: string[];
70
99
  preferredBlocks?: string[];
100
+ preferredDimensions?: string[];
101
+ requiredFilters?: string[];
102
+ clarifyWhen?: string[];
103
+ examples?: string[];
104
+ sourceRefs?: string[];
71
105
  vocabulary?: Record<string, string>;
72
106
  body?: string;
73
107
  isStarter?: boolean;
74
108
  }
75
- /**
76
- * Write a skill to `.dql/skills/<id>.skill.md` (overwriting if present). Returns
77
- * the persisted Skill as re-read from disk so callers see the canonical form.
78
- */
109
+ /** Write a skill to `skills/<id>.skill.md`, the shared source location. */
79
110
  export declare function writeSkill(projectRoot: string, input: WriteSkillInput): Skill;
80
111
  /** Alias for `writeSkill` — create-or-update by id. */
81
112
  export declare function upsertSkill(projectRoot: string, input: WriteSkillInput): Skill;
82
- /** Delete `.dql/skills/<id>.skill.md`. Returns true when a file was removed. */
113
+ /** Delete a skill from its actual source path. Returns true when a file was removed. */
83
114
  export declare function deleteSkill(projectRoot: string, id: string): boolean;
115
+ /**
116
+ * Explicit one-way OSS layout upgrade. Moves legacy skills into the visible
117
+ * source tree without overwriting a skill already migrated by a teammate.
118
+ */
119
+ export declare function migrateLegacySkills(projectRoot: string): {
120
+ moved: string[];
121
+ skipped: string[];
122
+ };
84
123
  /**
85
124
  * Compose Skills into a single system-prompt fragment for the agent.
86
125
  * Filtered by user when a persona is active.
@@ -88,7 +127,12 @@ export declare function deleteSkill(projectRoot: string, id: string): boolean;
88
127
  export declare function buildSkillsPrompt(skills: Skill[], userId: string | null): string;
89
128
  export declare function activeSkills(skills: Skill[], userId: string | null): Skill[];
90
129
  export declare function buildSkillBlockHints(skills: Skill[], userId: string | null): string[];
130
+ /** Metric ids a selected skill may prefer, including vocabulary aliases. */
131
+ export declare function buildSkillMetricHints(skills: Skill[], userId: string | null): string[];
132
+ /** Add governed metric aliases to retrieval text without changing the user request. */
133
+ export declare function expandQuestionWithSkillVocabulary(question: string, skills: Skill[], userId: string | null): string;
91
134
  export interface SelectRelevantSkillsOptions {
135
+ /** SKILL-001: scope is established before ranking, never by a score bonus. */
92
136
  /** Active user — gates personal skills (only this user's are eligible). */
93
137
  userId?: string | null;
94
138
  /** Max skills to return after pinned ones. Default 6. */
@@ -99,6 +143,10 @@ export interface SelectRelevantSkillsOptions {
99
143
  * kept when they are in-scope for the active user.
100
144
  */
101
145
  pinnedIds?: string[];
146
+ /** Domains inferred from the retrieved metadata context for this question. */
147
+ domains?: string[];
148
+ /** Optional focused Model Areas selected in the Model workspace. */
149
+ modelAreaIds?: string[];
102
150
  }
103
151
  /**
104
152
  * Rank in-scope skills by topic/vocabulary match to `question` and return the
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}