@specverse/engines 5.0.2 → 5.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 (57) hide show
  1. package/dist/ai/commands/fill.d.ts.map +1 -1
  2. package/dist/ai/commands/fill.js +16 -7
  3. package/dist/ai/commands/fill.js.map +1 -1
  4. package/dist/ai/commands/template.d.ts.map +1 -1
  5. package/dist/ai/commands/template.js +17 -8
  6. package/dist/ai/commands/template.js.map +1 -1
  7. package/dist/bundles/deriveCatalog.d.ts +18 -0
  8. package/dist/bundles/deriveCatalog.d.ts.map +1 -0
  9. package/dist/bundles/deriveCatalog.js +263 -0
  10. package/dist/bundles/deriveCatalog.js.map +1 -0
  11. package/dist/bundles/index.d.ts +15 -0
  12. package/dist/bundles/index.d.ts.map +1 -0
  13. package/dist/bundles/index.js +15 -0
  14. package/dist/bundles/index.js.map +1 -0
  15. package/dist/bundles/types.d.ts +53 -0
  16. package/dist/bundles/types.d.ts.map +1 -0
  17. package/dist/bundles/types.js +22 -0
  18. package/dist/bundles/types.js.map +1 -0
  19. package/dist/bundles/validate.d.ts +55 -0
  20. package/dist/bundles/validate.d.ts.map +1 -0
  21. package/dist/bundles/validate.js +471 -0
  22. package/dist/bundles/validate.js.map +1 -0
  23. package/dist/inference/quint-transpiler.js +2 -2
  24. package/dist/inference/quint-transpiler.js.map +1 -1
  25. package/dist/libs/instance-factories/applications/templates/react/runtime-package-json-generator.js +1 -1
  26. package/dist/libs/instance-factories/cli/templates/commander/command-generator.js +43 -0
  27. package/dist/libs/instance-factories/tools/templates/mcp/mcp-server-generator.js +11 -4
  28. package/libs/instance-factories/applications/templates/react/runtime-package-json-generator.ts +1 -1
  29. package/libs/instance-factories/cli/templates/commander/command-generator.ts +43 -0
  30. package/libs/instance-factories/tools/templates/mcp/mcp-server-generator.ts +10 -3
  31. package/package.json +9 -5
  32. package/assets/examples/09-api/ai-spec.yaml +0 -194
  33. package/assets/examples/09-api/converted.yaml +0 -95
  34. package/assets/examples/09-api/diagram-architecture.mmd +0 -10
  35. package/assets/examples/09-api/diagram-er.mmd +0 -10
  36. package/assets/examples/09-api/documentation.html +0 -104
  37. package/assets/examples/09-api/documentation.md +0 -95
  38. package/assets/examples/09-api/inferred-spec.yaml +0 -420
  39. package/assets/examples/09-api/openapi.json +0 -61
  40. package/assets/examples/10-api/README.md +0 -216
  41. package/assets/examples/10-api/ai-spec.yaml +0 -194
  42. package/assets/examples/10-api/converted.yaml +0 -96
  43. package/assets/examples/10-api/diagram-architecture.mmd +0 -10
  44. package/assets/examples/10-api/diagram-er.mmd +0 -10
  45. package/assets/examples/10-api/documentation.html +0 -104
  46. package/assets/examples/10-api/documentation.md +0 -95
  47. package/assets/examples/10-api/inferred-spec.yaml +0 -7
  48. package/assets/examples/10-api/metadata.yaml +0 -89
  49. package/assets/examples/10-api/openapi.json +0 -61
  50. package/assets/examples/10-api/package-integration-test.js +0 -177
  51. package/assets/examples/10-api/usage-example.js +0 -323
  52. package/assets/examples/10-api/usage-example.ts +0 -363
  53. package/assets/examples/10-api/workflow-test.js +0 -113
  54. package/assets/examples/validate-examples-with-expected-failures.cjs +0 -328
  55. package/assets/examples/validate-examples.cjs +0 -225
  56. package/assets/prompts/MOVED.md +0 -35
  57. package/assets/prompts/SUMMARY-v8-PROMOTION.md +0 -445
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/bundles/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,QAAQ,GACR,UAAU,GACV,OAAO,GACP,MAAM,GACN,WAAW,CAAC;AAEhB,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,2BAA2B;AAC3B,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC,CA4BvB;AAED,mDAAmD;AACnD,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAa1B"}
@@ -0,0 +1,471 @@
1
+ /**
2
+ * Validate a bundle's facets and return a structured report.
3
+ *
4
+ * v1 covers four facets: catalog (derived-vs-scan consistency), schema
5
+ * (JSON Schema validity), examples (parse via @specverse/engines/parser),
6
+ * tests (inventory only — execution remains vitest's job). Behaviour,
7
+ * inference, conventions, generators arrive in later iterations.
8
+ *
9
+ * Programmatic API for now. A `spv validate-bundle` CLI wrapper is a
10
+ * separate concern once the underlying validation shape settles.
11
+ *
12
+ * See: specverse-self/docs/proposals/PLUGGABLE-BUNDLE-MODEL.md
13
+ */
14
+ import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
15
+ import { basename, dirname, join, resolve } from 'path';
16
+ import { createRequire } from 'node:module';
17
+ import { spawnSync } from 'child_process';
18
+ import Ajv2020 from 'ajv/dist/2020.js';
19
+ import addFormats from 'ajv-formats';
20
+ import { deriveCatalog, clearCatalogCache } from './deriveCatalog.js';
21
+ import { parseSpecVerseFile } from '../parser/index.js';
22
+ const require = createRequire(import.meta.url);
23
+ // ── Public API ──────────────────────────────────────────────────────────
24
+ /** Validate one bundle. */
25
+ export async function validateBundle(bundleDir, options = {}) {
26
+ const start = Date.now();
27
+ const absDir = resolve(bundleDir);
28
+ const name = basename(absDir);
29
+ // Prevent a stale cache from masking source changes across repeated calls.
30
+ clearCatalogCache();
31
+ const schemaPath = options.schemaPath ?? resolveDefaultSchemaPath();
32
+ const facets = [];
33
+ facets.push(runFacet('catalog', () => checkCatalog(absDir)));
34
+ facets.push(runFacet('schema', () => checkSchema(absDir)));
35
+ facets.push(runFacet('examples', () => checkExamples(absDir, schemaPath)));
36
+ facets.push(runFacet('tests', () => checkTests(absDir)));
37
+ facets.push(runFacet('docs', () => checkDocs(absDir)));
38
+ facets.push(runFacet('behaviour', () => checkBehaviour(absDir)));
39
+ const totals = { pass: 0, fail: 0, skip: 0 };
40
+ for (const f of facets)
41
+ totals[f.status]++;
42
+ return {
43
+ bundle: name,
44
+ path: absDir,
45
+ facets,
46
+ totals,
47
+ duration: Date.now() - start,
48
+ };
49
+ }
50
+ /** Validate several bundles. Reports aggregate. */
51
+ export async function validateBundles(bundleDirs, options = {}) {
52
+ const start = Date.now();
53
+ const bundles = [];
54
+ for (const dir of bundleDirs) {
55
+ bundles.push(await validateBundle(dir, options));
56
+ }
57
+ const totals = { pass: 0, fail: 0, skip: 0 };
58
+ for (const b of bundles) {
59
+ totals.pass += b.totals.pass;
60
+ totals.fail += b.totals.fail;
61
+ totals.skip += b.totals.skip;
62
+ }
63
+ return { bundles, totals, duration: Date.now() - start };
64
+ }
65
+ // ── Facet runner ────────────────────────────────────────────────────────
66
+ function runFacet(name, fn) {
67
+ const start = Date.now();
68
+ try {
69
+ const partial = fn();
70
+ return { facet: name, duration: Date.now() - start, ...partial };
71
+ }
72
+ catch (err) {
73
+ return {
74
+ facet: name,
75
+ status: 'fail',
76
+ duration: Date.now() - start,
77
+ issues: [{ severity: 'error', message: `unexpected exception: ${errMsg(err)}` }],
78
+ };
79
+ }
80
+ }
81
+ function errMsg(err) {
82
+ if (err instanceof Error)
83
+ return err.message;
84
+ return String(err);
85
+ }
86
+ // ── Per-facet checks ────────────────────────────────────────────────────
87
+ function checkCatalog(bundleDir) {
88
+ const catalog = deriveCatalog(bundleDir);
89
+ const issues = [];
90
+ // Every entry's path should resolve to an actual file on disk.
91
+ for (const entry of catalog) {
92
+ const abs = resolve(bundleDir, entry.path.replace(/^\.\//, ''));
93
+ if (!existsSync(abs)) {
94
+ issues.push({
95
+ severity: 'warning',
96
+ message: `catalog entry references missing file: ${entry.path}`,
97
+ location: entry.path,
98
+ });
99
+ }
100
+ }
101
+ return {
102
+ status: issues.some((i) => i.severity === 'error') ? 'fail' : 'pass',
103
+ issues,
104
+ metrics: {
105
+ total: catalog.length,
106
+ examples: catalog.filter((e) => e.category === 'example').length,
107
+ tests: catalog.filter((e) => e.category === 'test').length,
108
+ behaviours: catalog.filter((e) => e.category === 'behaviour').length,
109
+ additional: catalog.filter((e) => !['example', 'test', 'behaviour'].includes(e.category)).length,
110
+ },
111
+ };
112
+ }
113
+ function checkSchema(bundleDir) {
114
+ const schemaDir = join(bundleDir, 'schema');
115
+ if (!existsSync(schemaDir) || !statSync(schemaDir).isDirectory()) {
116
+ return { status: 'skip', issues: [], metrics: { files: 0 } };
117
+ }
118
+ const files = readdirSync(schemaDir).filter((f) => f.endsWith('.json'));
119
+ if (files.length === 0) {
120
+ return { status: 'skip', issues: [], metrics: { files: 0 } };
121
+ }
122
+ const ajv = new Ajv2020.default({ strict: false, allErrors: true });
123
+ addFormats.default(ajv);
124
+ // Schemas under entities/src/**/schema/ use either draft-2020-12 (via the
125
+ // Ajv2020 default) or draft-07 (historical). Register draft-07 meta-schema
126
+ // so compiling a draft-07-declaring schema doesn't fail on a missing ref.
127
+ try {
128
+ const draft7 = require('ajv/dist/refs/json-schema-draft-07.json');
129
+ if (!ajv.getSchema('http://json-schema.org/draft-07/schema')) {
130
+ ajv.addMetaSchema(draft7);
131
+ }
132
+ }
133
+ catch {
134
+ // ajv missing the draft-07 ref shipfile — fall back to skipping
135
+ }
136
+ const issues = [];
137
+ for (const file of files) {
138
+ const fullPath = join(schemaDir, file);
139
+ try {
140
+ const content = readFileSync(fullPath, 'utf8');
141
+ const schema = JSON.parse(content);
142
+ // Compiling the schema is the validity check.
143
+ ajv.compile(schema);
144
+ }
145
+ catch (err) {
146
+ issues.push({
147
+ severity: 'error',
148
+ message: `schema invalid: ${errMsg(err)}`,
149
+ location: `schema/${file}`,
150
+ });
151
+ }
152
+ }
153
+ return {
154
+ status: issues.length === 0 ? 'pass' : 'fail',
155
+ issues,
156
+ metrics: { files: files.length },
157
+ };
158
+ }
159
+ function checkExamples(bundleDir, schemaPath) {
160
+ const examplesDir = join(bundleDir, '__examples__');
161
+ if (!existsSync(examplesDir)) {
162
+ return { status: 'skip', issues: [], metrics: { files: 0 } };
163
+ }
164
+ if (!schemaPath || !existsSync(schemaPath)) {
165
+ return {
166
+ status: 'skip',
167
+ issues: [
168
+ {
169
+ severity: 'warning',
170
+ message: 'no schema path available; skipping example parse',
171
+ },
172
+ ],
173
+ metrics: { files: 0 },
174
+ };
175
+ }
176
+ const examples = findFiles(examplesDir, (f) => f.endsWith('.specly'));
177
+ const issues = [];
178
+ const bundleName = basename(bundleDir);
179
+ for (const file of examples) {
180
+ try {
181
+ const result = parseSpecVerseFile(file, schemaPath);
182
+ if (result.errors && result.errors.length > 0) {
183
+ for (const e of result.errors) {
184
+ const asAny = e;
185
+ issues.push({
186
+ severity: 'error',
187
+ message: typeof e === 'string' ? e : asAny?.message ?? JSON.stringify(e),
188
+ location: relFromBundle(file, bundleDir),
189
+ });
190
+ }
191
+ continue;
192
+ }
193
+ // Bundle-association check: the example should exercise the bundle's
194
+ // entity type. Two ways to pass:
195
+ // 1. The parsed AST has a non-empty section for the bundle's entity
196
+ // (`component.models`, `component.views`, etc., or root
197
+ // `deployments` for deployments).
198
+ // 2. The colocated `.example.yaml` declares `concepts:` including
199
+ // the bundle name — this covers cases where the example
200
+ // exercises the entity via inference (e.g. a models-only spec
201
+ // that demonstrates auto-view generation in the views bundle).
202
+ if (result.ast) {
203
+ const structural = specContainsSection(result.ast, bundleName);
204
+ const declared = exampleDeclaresConcept(file, bundleName);
205
+ if (!structural && !declared) {
206
+ issues.push({
207
+ severity: 'warning',
208
+ message: `example in bundle '${bundleName}' doesn't exercise a '${bundleName}' section and no .example.yaml concepts claim it — verify it belongs in this bundle`,
209
+ location: relFromBundle(file, bundleDir),
210
+ });
211
+ }
212
+ }
213
+ }
214
+ catch (err) {
215
+ issues.push({
216
+ severity: 'error',
217
+ message: `example failed to parse: ${errMsg(err)}`,
218
+ location: relFromBundle(file, bundleDir),
219
+ });
220
+ }
221
+ }
222
+ return {
223
+ status: issues.some((i) => i.severity === 'error') ? 'fail' : 'pass',
224
+ issues,
225
+ metrics: { files: examples.length },
226
+ };
227
+ }
228
+ /** Check if the colocated `.example.yaml` metadata declares the given bundle
229
+ * as one of its concepts. This is the author's explicit claim that the
230
+ * example demonstrates the bundle's entity type — used as a fallback when
231
+ * the parsed spec doesn't directly contain a section for the bundle
232
+ * (typical for inference-demo examples).
233
+ */
234
+ function exampleDeclaresConcept(specFile, bundleName) {
235
+ const metaPath = join(dirname(specFile), basename(specFile, '.specly') + '.example.yaml');
236
+ if (!existsSync(metaPath))
237
+ return false;
238
+ let content = '';
239
+ try {
240
+ content = readFileSync(metaPath, 'utf8');
241
+ }
242
+ catch {
243
+ return false;
244
+ }
245
+ // Simple regex over YAML: concepts: [a, b, c] or concepts:\n - a\n - b
246
+ // Match the bundle name (plural) or its singular form (strip trailing 's').
247
+ const singular = bundleName.endsWith('s') ? bundleName.slice(0, -1) : bundleName;
248
+ const conceptsBlock = content.match(/concepts:\s*(?:\[(.*?)\]|((?:\n\s*-\s+.*)+))/i);
249
+ if (!conceptsBlock)
250
+ return false;
251
+ const raw = (conceptsBlock[1] || conceptsBlock[2] || '').toLowerCase();
252
+ return raw.includes(bundleName.toLowerCase()) || raw.includes(singular.toLowerCase());
253
+ }
254
+ /** Check whether a parsed spec AST contains a non-empty section for the given
255
+ * entity name. `deployments` is at the root; everything else is under each
256
+ * component. Returns true if at least one example of the entity is present.
257
+ */
258
+ function specContainsSection(ast, entityName) {
259
+ if (entityName === 'deployments') {
260
+ const deployments = ast?.deployments;
261
+ if (Array.isArray(deployments))
262
+ return deployments.length > 0;
263
+ return !!deployments && Object.keys(deployments).length > 0;
264
+ }
265
+ const components = ast?.components ?? [];
266
+ if (!Array.isArray(components))
267
+ return false;
268
+ for (const component of components) {
269
+ const section = component[entityName];
270
+ if (section == null)
271
+ continue;
272
+ if (Array.isArray(section) && section.length > 0)
273
+ return true;
274
+ if (typeof section === 'object' && Object.keys(section).length > 0)
275
+ return true;
276
+ }
277
+ return false;
278
+ }
279
+ function checkTests(bundleDir) {
280
+ const testsDir = join(bundleDir, '__tests__');
281
+ if (!existsSync(testsDir)) {
282
+ return { status: 'skip', issues: [], metrics: { files: 0 } };
283
+ }
284
+ const TEST_RE = /\.(test|spec)\.(ts|tsx|js|mjs)$/;
285
+ const tests = findFiles(testsDir, (f) => TEST_RE.test(f));
286
+ const issues = [];
287
+ // Bundle-import heuristic: each test file should reach back into its
288
+ // bundle — either `import … from '../<sibling>.js'` or '../index.js' or
289
+ // a relative path under '../'. If a test imports nothing from '../', it
290
+ // may be miscategorised.
291
+ for (const file of tests) {
292
+ let content = '';
293
+ try {
294
+ content = readFileSync(file, 'utf8');
295
+ }
296
+ catch {
297
+ continue;
298
+ }
299
+ const bundleLocal = /from\s+['"]\.\.\//.test(content);
300
+ if (!bundleLocal) {
301
+ issues.push({
302
+ severity: 'warning',
303
+ message: `test does not import from '../' — may not belong to this bundle`,
304
+ location: relFromBundle(file, bundleDir),
305
+ });
306
+ }
307
+ }
308
+ return {
309
+ status: issues.some((i) => i.severity === 'error') ? 'fail' : 'pass',
310
+ issues,
311
+ metrics: {
312
+ files: tests.length,
313
+ hint: tests.length > 0 ? `run with: npx vitest run ${bundleDir}` : '',
314
+ },
315
+ };
316
+ }
317
+ /** Verify that every .specly in __examples__/ has a colocated .md whose
318
+ * content has an H1 and at least mentions the bundle's entity type.
319
+ * Weak check — catches obvious misfiles + forgotten-doc situations.
320
+ */
321
+ function checkDocs(bundleDir) {
322
+ const examplesDir = join(bundleDir, '__examples__');
323
+ if (!existsSync(examplesDir)) {
324
+ return { status: 'skip', issues: [], metrics: { files: 0 } };
325
+ }
326
+ const specs = findFiles(examplesDir, (f) => f.endsWith('.specly'));
327
+ const bundleName = basename(bundleDir).toLowerCase();
328
+ const issues = [];
329
+ let docsChecked = 0;
330
+ for (const spec of specs) {
331
+ const mdPath = join(dirname(spec), basename(spec, '.specly') + '.md');
332
+ if (!existsSync(mdPath)) {
333
+ issues.push({
334
+ severity: 'warning',
335
+ message: `no colocated .md next to ${basename(spec)}`,
336
+ location: relFromBundle(spec, bundleDir),
337
+ });
338
+ continue;
339
+ }
340
+ docsChecked += 1;
341
+ let content = '';
342
+ try {
343
+ content = readFileSync(mdPath, 'utf8');
344
+ }
345
+ catch {
346
+ issues.push({
347
+ severity: 'error',
348
+ message: `unreadable .md`,
349
+ location: relFromBundle(mdPath, bundleDir),
350
+ });
351
+ continue;
352
+ }
353
+ if (!/^#\s+/m.test(content)) {
354
+ issues.push({
355
+ severity: 'warning',
356
+ message: `.md missing an H1 heading`,
357
+ location: relFromBundle(mdPath, bundleDir),
358
+ });
359
+ }
360
+ // Mentions-bundle heuristic: plural (bundle dir name) OR singular
361
+ // (strip trailing 's') appears at least once, case-insensitive.
362
+ const singular = bundleName.endsWith('s') ? bundleName.slice(0, -1) : bundleName;
363
+ const lower = content.toLowerCase();
364
+ if (!lower.includes(bundleName) && !lower.includes(singular)) {
365
+ issues.push({
366
+ severity: 'warning',
367
+ message: `.md doesn't mention '${bundleName}' (or '${singular}') — doc may not describe this bundle`,
368
+ location: relFromBundle(mdPath, bundleDir),
369
+ });
370
+ }
371
+ }
372
+ return {
373
+ status: issues.some((i) => i.severity === 'error') ? 'fail' : 'pass',
374
+ issues,
375
+ metrics: { docs: docsChecked, specs: specs.length },
376
+ };
377
+ }
378
+ /** Run `quint typecheck` on every .qnt file in __behaviour__/. Skips with a
379
+ * warning if quint isn't on PATH. Full `quint verify` (safety/liveness
380
+ * proof) is a future extension — typecheck catches syntax + shape errors
381
+ * cheaply in milliseconds per file.
382
+ */
383
+ function checkBehaviour(bundleDir) {
384
+ const behaviourDir = join(bundleDir, '__behaviour__');
385
+ if (!existsSync(behaviourDir)) {
386
+ return { status: 'skip', issues: [], metrics: { files: 0 } };
387
+ }
388
+ const qntFiles = findFiles(behaviourDir, (f) => f.endsWith('.qnt'));
389
+ if (qntFiles.length === 0) {
390
+ return { status: 'skip', issues: [], metrics: { files: 0 } };
391
+ }
392
+ // Probe quint availability once.
393
+ const probe = spawnSync('quint', ['--version'], { encoding: 'utf8' });
394
+ if (probe.error || probe.status !== 0) {
395
+ return {
396
+ status: 'skip',
397
+ issues: [
398
+ {
399
+ severity: 'warning',
400
+ message: 'quint CLI not on PATH — install via npm install -g @informalsystems/quint',
401
+ },
402
+ ],
403
+ metrics: { files: qntFiles.length },
404
+ };
405
+ }
406
+ const issues = [];
407
+ for (const file of qntFiles) {
408
+ const res = spawnSync('quint', ['typecheck', file], {
409
+ encoding: 'utf8',
410
+ timeout: 15000,
411
+ });
412
+ if (res.status !== 0) {
413
+ issues.push({
414
+ severity: 'error',
415
+ message: `quint typecheck failed: ${(res.stderr || res.stdout || '').slice(0, 200).trim()}`,
416
+ location: relFromBundle(file, bundleDir),
417
+ });
418
+ }
419
+ }
420
+ return {
421
+ status: issues.some((i) => i.severity === 'error') ? 'fail' : 'pass',
422
+ issues,
423
+ metrics: { files: qntFiles.length },
424
+ };
425
+ }
426
+ // ── Utilities ───────────────────────────────────────────────────────────
427
+ function findFiles(dir, match) {
428
+ const out = [];
429
+ const walk = (d) => {
430
+ let entries;
431
+ try {
432
+ entries = readdirSync(d);
433
+ }
434
+ catch {
435
+ return;
436
+ }
437
+ for (const entry of entries) {
438
+ const full = join(d, entry);
439
+ let s;
440
+ try {
441
+ s = statSync(full);
442
+ }
443
+ catch {
444
+ continue;
445
+ }
446
+ if (s.isDirectory())
447
+ walk(full);
448
+ else if (s.isFile() && match(entry))
449
+ out.push(full);
450
+ }
451
+ };
452
+ walk(dir);
453
+ return out;
454
+ }
455
+ function relFromBundle(filePath, bundleDir) {
456
+ if (filePath.startsWith(bundleDir)) {
457
+ return './' + filePath.slice(bundleDir.length + 1).replaceAll('\\', '/');
458
+ }
459
+ return filePath;
460
+ }
461
+ function resolveDefaultSchemaPath() {
462
+ try {
463
+ const pkg = require.resolve('@specverse/entities/package.json');
464
+ const schemaPath = join(pkg, '..', 'schema', 'SPECVERSE-SCHEMA.json');
465
+ return existsSync(schemaPath) ? schemaPath : null;
466
+ }
467
+ catch {
468
+ return null;
469
+ }
470
+ }
471
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/bundles/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AA6C/C,2EAA2E;AAE3E,2BAA2B;AAC3B,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,UAA2B,EAAE;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE9B,2EAA2E;IAC3E,iBAAiB,EAAE,CAAC;IAEpB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,wBAAwB,EAAE,CAAC;IAEpE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IAE3C,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,MAAM;QACZ,MAAM;QACN,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC7B,CAAC;AACJ,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAoB,EACpB,UAA2B,EAAE;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;AAC3D,CAAC;AAED,2EAA2E;AAE3E,SAAS,QAAQ,CACf,IAAe,EACf,EAAiD;IAEjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,EAAE,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAC5B,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;SACjF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,GAAY;IAC1B,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,2EAA2E;AAE3E,SAAS,YAAY,CAAC,SAAiB;IACrC,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,+DAA+D;IAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,0CAA0C,KAAK,CAAC,IAAI,EAAE;gBAC/D,QAAQ,EAAE,KAAK,CAAC,IAAI;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACpE,MAAM;QACN,OAAO,EAAE;YACP,KAAK,EAAE,OAAO,CAAC,MAAM;YACrB,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM;YAChE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;YAC1D,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC,MAAM;YACpE,UAAU,EAAE,OAAO,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC9D,CAAC,MAAM;SACT;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,SAAiB;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACjE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,GAAG,GAAG,IAAK,OAAe,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,UAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,0EAA0E;IAC1E,2EAA2E;IAC3E,0EAA0E;IAC1E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,yCAAyC,CAAC,CAAC;QAClE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,wCAAwC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;IACD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,8CAA8C;YAC9C,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,mBAAmB,MAAM,CAAC,GAAG,CAAC,EAAE;gBACzC,QAAQ,EAAE,UAAU,IAAI,EAAE;aAC3B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAC7C,MAAM;QACN,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,SAAiB,EACjB,UAAyB;IAEzB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE;gBACN;oBACE,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,kDAAkD;iBAC5D;aACF;YACD,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACtE,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACpD,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAC9B,MAAM,KAAK,GAAG,CAAQ,CAAC;oBACvB,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;wBACxE,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC;qBACzC,CAAC,CAAC;gBACL,CAAC;gBACD,SAAS;YACX,CAAC;YACD,qEAAqE;YACrE,iCAAiC;YACjC,sEAAsE;YACtE,6DAA6D;YAC7D,uCAAuC;YACvC,oEAAoE;YACpE,6DAA6D;YAC7D,mEAAmE;YACnE,oEAAoE;YACpE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBAC/D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC1D,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC7B,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,SAAS;wBACnB,OAAO,EAAE,sBAAsB,UAAU,yBAAyB,UAAU,qFAAqF;wBACjK,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC;qBACzC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,4BAA4B,MAAM,CAAC,GAAG,CAAC,EAAE;gBAClD,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACpE,MAAM;QACN,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE;KACpC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAAC,QAAgB,EAAE,UAAkB;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,eAAe,CAAC,CAAC;IAC1F,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACjF,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACrF,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvE,OAAO,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;AACxF,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,GAAQ,EAAE,UAAkB;IACvD,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,GAAG,EAAE,WAAW,CAAC;QACrC,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAAE,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,UAAU,GAAG,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAI,SAAiB,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,OAAO,IAAI,IAAI;YAAE,SAAS;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAClF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,OAAO,GAAG,iCAAiC,CAAC;IAClD,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,qEAAqE;IACrE,wEAAwE;IACxE,wEAAwE;IACxE,yBAAyB;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,iEAAiE;gBAC1E,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACpE,MAAM;QACN,OAAO,EAAE;YACP,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE;SACtE;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,SAAiB;IAClC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,4BAA4B,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACrD,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC;aACzC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,WAAW,IAAI,CAAC,CAAC;QACjB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,gBAAgB;gBACzB,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC;aAC3C,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,2BAA2B;gBACpC,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;QACD,kEAAkE;QAClE,gEAAgE;QAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACjF,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,wBAAwB,UAAU,UAAU,QAAQ,uCAAuC;gBACpG,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACpE,MAAM;QACN,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE;KACpD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/D,CAAC;IAED,iCAAiC;IACjC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE;gBACN;oBACE,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,2EAA2E;iBACrF;aACF;YACD,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE;YAClD,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,2BAA2B,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC3F,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACpE,MAAM;QACN,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,2EAA2E;AAE3E,SAAS,SAAS,CAAC,GAAW,EAAE,KAAgC;IAC9D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE;QACzB,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,CAAC;YACN,IAAI,CAAC;gBACH,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;iBAC3B,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,SAAiB;IACxD,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,wBAAwB;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -26,7 +26,7 @@ export function transpileEntityGuards(entitiesDir) {
26
26
  if (!existsSync(categoryDir))
27
27
  continue;
28
28
  for (const entity of readdirSync(categoryDir)) {
29
- const behaviourDir = join(categoryDir, entity, 'behaviour');
29
+ const behaviourDir = join(categoryDir, entity, '__behaviour__');
30
30
  if (!existsSync(behaviourDir))
31
31
  continue;
32
32
  for (const file of readdirSync(behaviourDir).filter(f => f.endsWith('.qnt'))) {
@@ -52,7 +52,7 @@ export function extractStateVariables(entitiesDir) {
52
52
  if (!existsSync(categoryDir))
53
53
  continue;
54
54
  for (const entity of readdirSync(categoryDir)) {
55
- const behaviourDir = join(categoryDir, entity, 'behaviour');
55
+ const behaviourDir = join(categoryDir, entity, '__behaviour__');
56
56
  if (!existsSync(behaviourDir))
57
57
  continue;
58
58
  for (const file of readdirSync(behaviourDir).filter(f => f.endsWith('.qnt'))) {