@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.
- package/dist/ai/commands/fill.d.ts.map +1 -1
- package/dist/ai/commands/fill.js +16 -7
- package/dist/ai/commands/fill.js.map +1 -1
- package/dist/ai/commands/template.d.ts.map +1 -1
- package/dist/ai/commands/template.js +17 -8
- package/dist/ai/commands/template.js.map +1 -1
- package/dist/bundles/deriveCatalog.d.ts +18 -0
- package/dist/bundles/deriveCatalog.d.ts.map +1 -0
- package/dist/bundles/deriveCatalog.js +263 -0
- package/dist/bundles/deriveCatalog.js.map +1 -0
- package/dist/bundles/index.d.ts +15 -0
- package/dist/bundles/index.d.ts.map +1 -0
- package/dist/bundles/index.js +15 -0
- package/dist/bundles/index.js.map +1 -0
- package/dist/bundles/types.d.ts +53 -0
- package/dist/bundles/types.d.ts.map +1 -0
- package/dist/bundles/types.js +22 -0
- package/dist/bundles/types.js.map +1 -0
- package/dist/bundles/validate.d.ts +55 -0
- package/dist/bundles/validate.d.ts.map +1 -0
- package/dist/bundles/validate.js +471 -0
- package/dist/bundles/validate.js.map +1 -0
- package/dist/inference/quint-transpiler.js +2 -2
- package/dist/inference/quint-transpiler.js.map +1 -1
- package/dist/libs/instance-factories/applications/templates/react/runtime-package-json-generator.js +1 -1
- package/dist/libs/instance-factories/cli/templates/commander/command-generator.js +43 -0
- package/dist/libs/instance-factories/tools/templates/mcp/mcp-server-generator.js +11 -4
- package/libs/instance-factories/applications/templates/react/runtime-package-json-generator.ts +1 -1
- package/libs/instance-factories/cli/templates/commander/command-generator.ts +43 -0
- package/libs/instance-factories/tools/templates/mcp/mcp-server-generator.ts +10 -3
- package/package.json +9 -5
- package/assets/examples/09-api/ai-spec.yaml +0 -194
- package/assets/examples/09-api/converted.yaml +0 -95
- package/assets/examples/09-api/diagram-architecture.mmd +0 -10
- package/assets/examples/09-api/diagram-er.mmd +0 -10
- package/assets/examples/09-api/documentation.html +0 -104
- package/assets/examples/09-api/documentation.md +0 -95
- package/assets/examples/09-api/inferred-spec.yaml +0 -420
- package/assets/examples/09-api/openapi.json +0 -61
- package/assets/examples/10-api/README.md +0 -216
- package/assets/examples/10-api/ai-spec.yaml +0 -194
- package/assets/examples/10-api/converted.yaml +0 -96
- package/assets/examples/10-api/diagram-architecture.mmd +0 -10
- package/assets/examples/10-api/diagram-er.mmd +0 -10
- package/assets/examples/10-api/documentation.html +0 -104
- package/assets/examples/10-api/documentation.md +0 -95
- package/assets/examples/10-api/inferred-spec.yaml +0 -7
- package/assets/examples/10-api/metadata.yaml +0 -89
- package/assets/examples/10-api/openapi.json +0 -61
- package/assets/examples/10-api/package-integration-test.js +0 -177
- package/assets/examples/10-api/usage-example.js +0 -323
- package/assets/examples/10-api/usage-example.ts +0 -363
- package/assets/examples/10-api/workflow-test.js +0 -113
- package/assets/examples/validate-examples-with-expected-failures.cjs +0 -328
- package/assets/examples/validate-examples.cjs +0 -225
- package/assets/prompts/MOVED.md +0 -35
- package/assets/prompts/SUMMARY-v8-PROMOTION.md +0 -445
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../../src/ai/commands/fill.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../../src/ai/commands/fill.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA4FvG,wBAAsB,YAAY,CAChC,SAAS,EAAE,WAAW,EACtB,YAAY,EAAE,gBAAgB,EAC9B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CA0GvB;AAED,eAAe,YAAY,CAAC"}
|
package/dist/ai/commands/fill.js
CHANGED
|
@@ -6,7 +6,15 @@ import { getTemplate } from './template.js';
|
|
|
6
6
|
import { existsSync, readdirSync, readFileSync } from 'fs';
|
|
7
7
|
import { join, resolve, dirname } from 'path';
|
|
8
8
|
import { execSync } from 'child_process';
|
|
9
|
-
import {
|
|
9
|
+
import { createRequire } from 'node:module';
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
/** Resolve @specverse/entities/schema/<name>. Same resolver pattern as
|
|
12
|
+
* template.ts + the MCP generator.
|
|
13
|
+
*/
|
|
14
|
+
function resolveEntitiesSchemaFile(name) {
|
|
15
|
+
const pkg = require.resolve('@specverse/entities/package.json');
|
|
16
|
+
return join(dirname(pkg), 'schema', name);
|
|
17
|
+
}
|
|
10
18
|
function getDirectoryStructure(dirPath, maxDepth = 3) {
|
|
11
19
|
try {
|
|
12
20
|
// Use ls to get directory structure
|
|
@@ -80,12 +88,13 @@ function getKeyFilesContent(dirPath) {
|
|
|
80
88
|
export async function fillTemplate(operation, requirements, options = {}) {
|
|
81
89
|
try {
|
|
82
90
|
const template = await getTemplate(operation, options);
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const
|
|
91
|
+
// Schema paths — both files live in @specverse/entities/schema/,
|
|
92
|
+
// populated by entities' build (compose-schema + json-to-yaml-schema +
|
|
93
|
+
// generate-minimal-syntax-reference). Unified with template.ts and
|
|
94
|
+
// the MCP generator on the same filenames (the old V3.1-prefixed name
|
|
95
|
+
// that used to live in specverse-lang is retired).
|
|
96
|
+
const aiSchemaPath = resolveEntitiesSchemaFile('SPECVERSE-SCHEMA-AI.yaml');
|
|
97
|
+
const referenceSchemaPath = resolveEntitiesSchemaFile('MINIMAL-SYNTAX-REFERENCE.specly');
|
|
89
98
|
// Prepare variables for substitution
|
|
90
99
|
let variables = {
|
|
91
100
|
requirements: requirements.requirements,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill.js","sourceRoot":"","sources":["../../../src/ai/commands/fill.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAY,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAY,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"fill.js","sourceRoot":"","sources":["../../../src/ai/commands/fill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/ai/commands/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../../src/ai/commands/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAevF,wBAAsB,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,CAwHjH;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -3,10 +3,20 @@
|
|
|
3
3
|
* Get raw prompt template for specified operation
|
|
4
4
|
*/
|
|
5
5
|
import { readFile } from 'node:fs/promises';
|
|
6
|
-
import { join, dirname
|
|
7
|
-
import {
|
|
6
|
+
import { join, dirname } from 'node:path';
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
8
8
|
import * as yaml from 'js-yaml';
|
|
9
9
|
import { resolvePromptPath, validatePromptPath } from '../prompt-loader.js';
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
/** Resolve a file under @specverse/entities/schema/. The schema dir is
|
|
12
|
+
* populated by entities' build (compose-schema + json-to-yaml-schema +
|
|
13
|
+
* generate-minimal-syntax-reference). Same resolution path the MCP
|
|
14
|
+
* generator uses for specverse://schema.
|
|
15
|
+
*/
|
|
16
|
+
function resolveEntitiesSchemaFile(name) {
|
|
17
|
+
const pkg = require.resolve('@specverse/entities/package.json');
|
|
18
|
+
return join(dirname(pkg), 'schema', name);
|
|
19
|
+
}
|
|
10
20
|
export async function getTemplate(operation, options = {}) {
|
|
11
21
|
try {
|
|
12
22
|
// Resolve prompt path based on version
|
|
@@ -21,12 +31,11 @@ export async function getTemplate(operation, options = {}) {
|
|
|
21
31
|
const templatePath = join(promptDir, `${operation}.prompt.yaml`);
|
|
22
32
|
const templateContent = await readFile(templatePath, 'utf8');
|
|
23
33
|
const templateData = yaml.load(templateContent);
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const referenceExamplePath = join(schemaDir, 'MINIMAL-SYNTAX-REFERENCE.specly');
|
|
34
|
+
// Schema paths for prompt template variables. Both files live in
|
|
35
|
+
// @specverse/entities/schema/ — the AI-guidance YAML next to the
|
|
36
|
+
// JSON Schema, the minimal-syntax example next to both.
|
|
37
|
+
const aiSchemaPath = resolveEntitiesSchemaFile('SPECVERSE-SCHEMA-AI.yaml');
|
|
38
|
+
const referenceExamplePath = resolveEntitiesSchemaFile('MINIMAL-SYNTAX-REFERENCE.specly');
|
|
30
39
|
// Build comprehensive system prompt from all system sections
|
|
31
40
|
let systemPrompt = '';
|
|
32
41
|
if (templateData.system?.role) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/ai/commands/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/ai/commands/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C;;;;GAIG;AACH,SAAS,yBAAyB,CAAC,IAAY;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAsB,EAAE,UAA4B,EAAE;IACtF,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;QAClC,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE1C,qCAAqC;QACrC,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,iCAAiC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,iDAAiD;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,cAAc,CAAC,CAAC;QACjE,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAQ,CAAC;QAEvD,iEAAiE;QACjE,iEAAiE;QACjE,wDAAwD;QACxD,MAAM,YAAY,GAAG,yBAAyB,CAAC,0BAA0B,CAAC,CAAC;QAC3E,MAAM,oBAAoB,GAAG,yBAAyB,CAAC,iCAAiC,CAAC,CAAC;QAE1F,6DAA6D;QAC7D,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YAC9B,YAAY,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAClD,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YACjC,IAAI,YAAY;gBAAE,YAAY,IAAI,MAAM,CAAC;YACzC,YAAY,IAAI,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACtE,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;YACtC,IAAI,YAAY;gBAAE,YAAY,IAAI,MAAM,CAAC;YACzC,YAAY,IAAI,mBAAmB,CAAC;YACpC,MAAM,QAAQ,GAAG,CAAC,IAAS,EAAE,EAAE;gBAC7B,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,KAAK,IAAI,EAAE,CAAC;gBACjD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBAAE,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC7G,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,CAAC;gBACD,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,CAAC,CAAC;YACF,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBACpD,YAAY,IAAI,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3F,CAAC;iBAAM,CAAC;gBACN,YAAY,IAAI,OAAO,YAAY,CAAC,MAAM,CAAC,YAAY,KAAK,QAAQ;oBAClE,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY;oBAClC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;YACrC,IAAI,YAAY;gBAAE,YAAY,IAAI,MAAM,CAAC;YACzC,YAAY,IAAI,kBAAkB,CAAC;YACnC,MAAM,QAAQ,GAAG,CAAC,IAAS,EAAE,EAAE;gBAC7B,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,KAAK,IAAI,EAAE,CAAC;gBACjD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBAAE,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC7G,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,CAAC;gBACD,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,CAAC,CAAC;YACF,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnD,YAAY,IAAI,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1F,CAAC;iBAAM,CAAC;gBACN,YAAY,IAAI,OAAO,YAAY,CAAC,MAAM,CAAC,WAAW,KAAK,QAAQ;oBACjE,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW;oBACjC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YACnC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjD,aAAa,IAAI,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAC9E,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CACpF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;QACD,IAAI,YAAY,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClE,IAAI,aAAa;gBAAE,aAAa,IAAI,MAAM,CAAC;YAC3C,aAAa,IAAI,iBAAiB,CAAC;YACnC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAY,EAAE,KAAa,EAAE,EAAE;gBAC5D,aAAa,IAAI,aAAa,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,MAAM,CAAC;gBAC/D,IAAI,OAAO,CAAC,WAAW;oBAAE,aAAa,IAAI,GAAG,OAAO,CAAC,WAAW,MAAM,CAAC;gBACvE,IAAI,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;oBAChC,aAAa,IAAI,kBAAkB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC;gBACzF,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,aAAa,IAAI,wBAAwB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC;gBAC7E,CAAC;gBACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;oBACxB,aAAa,IAAI,kBAAkB,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;gBACpE,CAAC;gBACD,aAAa,IAAI,WAAW,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,iEAAiE;QACjE,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAU,EAAE;YACjD,OAAO,IAAI;iBACR,OAAO,CAAC,6BAA6B,EAAE,YAAY,CAAC;iBACpD,OAAO,CAAC,qCAAqC,EAAE,oBAAoB,CAAC;iBACpE,OAAO,CAAC,oCAAoC,EAAE,oBAAoB,CAAC,CAAC,CAAC,iBAAiB;QAC3F,CAAC,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,YAAY,CAAC,IAAI,IAAI,GAAG,SAAS,WAAW;YAClD,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,OAAO;YACxC,MAAM,EAAE,iBAAiB,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC;YACpE,IAAI,EAAE,iBAAiB,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,IAAI,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/E,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;YAC9D,SAAS,EAAE,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;SACvE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0CAA0C,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IACvI,CAAC;AACH,CAAC;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive a bundle's catalog by scanning its content facet directories.
|
|
3
|
+
*
|
|
4
|
+
* Entry point for the pluggable-bundle catalog subsystem. Called from each
|
|
5
|
+
* bundle's top-level `index.ts` (e.g. `entities/src/core/models/index.ts`)
|
|
6
|
+
* to produce a `CatalogEntry[]` that replaces hand-maintained `docs/index.ts`
|
|
7
|
+
* + `tests/index.ts` arrays.
|
|
8
|
+
*
|
|
9
|
+
* Results are cached per bundle directory — safe to call from module-load
|
|
10
|
+
* paths; subsequent calls for the same bundle return the cached array.
|
|
11
|
+
*
|
|
12
|
+
* See: specverse-self/docs/proposals/PLUGGABLE-BUNDLE-MODEL.md
|
|
13
|
+
*/
|
|
14
|
+
import { CatalogEntry, DeriveCatalogOptions } from './types.js';
|
|
15
|
+
export declare function deriveCatalog(bundleDir: string, options?: DeriveCatalogOptions): CatalogEntry[];
|
|
16
|
+
/** Clear the cache — primarily for tests that mutate fixture content between runs. */
|
|
17
|
+
export declare function clearCatalogCache(): void;
|
|
18
|
+
//# sourceMappingURL=deriveCatalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deriveCatalog.d.ts","sourceRoot":"","sources":["../../src/bundles/deriveCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EACL,YAAY,EACZ,oBAAoB,EAIrB,MAAM,YAAY,CAAC;AAIpB,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,oBAAyB,GACjC,YAAY,EAAE,CAyChB;AAED,sFAAsF;AACtF,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive a bundle's catalog by scanning its content facet directories.
|
|
3
|
+
*
|
|
4
|
+
* Entry point for the pluggable-bundle catalog subsystem. Called from each
|
|
5
|
+
* bundle's top-level `index.ts` (e.g. `entities/src/core/models/index.ts`)
|
|
6
|
+
* to produce a `CatalogEntry[]` that replaces hand-maintained `docs/index.ts`
|
|
7
|
+
* + `tests/index.ts` arrays.
|
|
8
|
+
*
|
|
9
|
+
* Results are cached per bundle directory — safe to call from module-load
|
|
10
|
+
* paths; subsequent calls for the same bundle return the cached array.
|
|
11
|
+
*
|
|
12
|
+
* See: specverse-self/docs/proposals/PLUGGABLE-BUNDLE-MODEL.md
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
|
|
15
|
+
import { basename, dirname, extname, join, relative, resolve } from 'path';
|
|
16
|
+
import { DEFAULT_FACETS, } from './types.js';
|
|
17
|
+
const cache = new Map();
|
|
18
|
+
export function deriveCatalog(bundleDir, options = {}) {
|
|
19
|
+
// Normalise to absolute so cache hits work across relative callers.
|
|
20
|
+
const root = resolve(bundleDir);
|
|
21
|
+
const cacheKey = JSON.stringify({
|
|
22
|
+
root,
|
|
23
|
+
additional: options.additionalReferences,
|
|
24
|
+
facets: options.facets,
|
|
25
|
+
});
|
|
26
|
+
const cached = cache.get(cacheKey);
|
|
27
|
+
if (cached)
|
|
28
|
+
return cached;
|
|
29
|
+
const facets = {
|
|
30
|
+
...DEFAULT_FACETS,
|
|
31
|
+
...(options.facets ?? {}),
|
|
32
|
+
};
|
|
33
|
+
const entries = [];
|
|
34
|
+
for (const facet of Object.keys(facets)) {
|
|
35
|
+
const facetDir = join(root, facet);
|
|
36
|
+
if (!existsSync(facetDir) || !statSync(facetDir).isDirectory())
|
|
37
|
+
continue;
|
|
38
|
+
const pattern = facets[facet];
|
|
39
|
+
const regex = globToRegExp(pattern.glob);
|
|
40
|
+
for (const abs of walkFiles(facetDir)) {
|
|
41
|
+
const relFromFacet = relative(facetDir, abs);
|
|
42
|
+
if (!regex.test(relFromFacet))
|
|
43
|
+
continue;
|
|
44
|
+
const entry = buildEntry(abs, root, pattern.category);
|
|
45
|
+
entries.push(entry);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Mixed mode: caller-supplied external references appended after derived.
|
|
49
|
+
if (options.additionalReferences) {
|
|
50
|
+
entries.push(...options.additionalReferences);
|
|
51
|
+
}
|
|
52
|
+
cache.set(cacheKey, entries);
|
|
53
|
+
return entries;
|
|
54
|
+
}
|
|
55
|
+
/** Clear the cache — primarily for tests that mutate fixture content between runs. */
|
|
56
|
+
export function clearCatalogCache() {
|
|
57
|
+
cache.clear();
|
|
58
|
+
}
|
|
59
|
+
// ── Title / description extraction ────────────────────────────────────────
|
|
60
|
+
function buildEntry(filePath, bundleRoot, category) {
|
|
61
|
+
const relPath = './' + relative(bundleRoot, filePath).replaceAll('\\', '/');
|
|
62
|
+
const ext = extname(filePath).toLowerCase();
|
|
63
|
+
let title = '';
|
|
64
|
+
let description;
|
|
65
|
+
if (ext === '.specly') {
|
|
66
|
+
// Look for colocated `<basename>.md` as the doc.
|
|
67
|
+
const mdPath = join(dirname(filePath), basename(filePath, '.specly') + '.md');
|
|
68
|
+
if (existsSync(mdPath)) {
|
|
69
|
+
const md = readMdLeading(mdPath);
|
|
70
|
+
title = md.title;
|
|
71
|
+
description = md.description;
|
|
72
|
+
}
|
|
73
|
+
if (!title)
|
|
74
|
+
title = humanize(basename(filePath, '.specly'));
|
|
75
|
+
}
|
|
76
|
+
else if (ext === '.qnt') {
|
|
77
|
+
// Leading `//` comment block.
|
|
78
|
+
const c = readQuintLeading(filePath);
|
|
79
|
+
title = c.title || humanize(basename(filePath, '.qnt'));
|
|
80
|
+
description = c.description;
|
|
81
|
+
}
|
|
82
|
+
else if (ext === '.ts' || ext === '.tsx' || ext === '.js' || ext === '.mjs') {
|
|
83
|
+
// Test file — extract leading JSDoc-style comment.
|
|
84
|
+
const c = readJSDocLeading(filePath);
|
|
85
|
+
title = c.title || humanize(basename(filePath).replace(/\.(test|spec)\.\w+$/, ''));
|
|
86
|
+
description = c.description;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
title = humanize(basename(filePath, ext));
|
|
90
|
+
}
|
|
91
|
+
const entry = { title, category, path: relPath };
|
|
92
|
+
if (description)
|
|
93
|
+
entry.description = description;
|
|
94
|
+
return entry;
|
|
95
|
+
}
|
|
96
|
+
function readMdLeading(mdPath) {
|
|
97
|
+
let content;
|
|
98
|
+
try {
|
|
99
|
+
content = readFileSync(mdPath, 'utf8');
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return { title: '' };
|
|
103
|
+
}
|
|
104
|
+
const lines = content.split('\n');
|
|
105
|
+
let title = '';
|
|
106
|
+
let description;
|
|
107
|
+
let seenH1 = false;
|
|
108
|
+
for (const line of lines) {
|
|
109
|
+
if (!seenH1) {
|
|
110
|
+
const h1 = line.match(/^#\s+(.+)$/);
|
|
111
|
+
if (h1) {
|
|
112
|
+
title = h1[1].trim();
|
|
113
|
+
seenH1 = true;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const trimmed = line.trim();
|
|
119
|
+
if (!trimmed)
|
|
120
|
+
continue;
|
|
121
|
+
if (trimmed.startsWith('#'))
|
|
122
|
+
break; // next heading — description ends
|
|
123
|
+
if (trimmed.startsWith('```'))
|
|
124
|
+
break; // code fence — not prose
|
|
125
|
+
if (trimmed.startsWith('>'))
|
|
126
|
+
continue; // blockquote — skip
|
|
127
|
+
description = trimmed.replace(/^\*\*|\*\*$/g, '').replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
return { title, description };
|
|
131
|
+
}
|
|
132
|
+
function readQuintLeading(qntPath) {
|
|
133
|
+
let content;
|
|
134
|
+
try {
|
|
135
|
+
content = readFileSync(qntPath, 'utf8');
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return { title: '' };
|
|
139
|
+
}
|
|
140
|
+
const commentLines = [];
|
|
141
|
+
for (const line of content.split('\n')) {
|
|
142
|
+
const t = line.trim();
|
|
143
|
+
if (t.startsWith('//')) {
|
|
144
|
+
commentLines.push(t.replace(/^\/\/\s?/, ''));
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (t === '') {
|
|
148
|
+
if (commentLines.length)
|
|
149
|
+
continue;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
break; // first non-comment, non-blank line ends the prolog
|
|
153
|
+
}
|
|
154
|
+
const [titleLine, ...rest] = commentLines.filter(Boolean);
|
|
155
|
+
return {
|
|
156
|
+
title: (titleLine ?? '').trim(),
|
|
157
|
+
description: rest.length ? rest.join(' ').trim() : undefined,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function readJSDocLeading(filePath) {
|
|
161
|
+
let content;
|
|
162
|
+
try {
|
|
163
|
+
content = readFileSync(filePath, 'utf8');
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return { title: '' };
|
|
167
|
+
}
|
|
168
|
+
const match = content.match(/^\s*\/\*\*([\s\S]*?)\*\//);
|
|
169
|
+
if (!match)
|
|
170
|
+
return { title: '' };
|
|
171
|
+
const lines = match[1]
|
|
172
|
+
.split('\n')
|
|
173
|
+
.map((l) => l.replace(/^\s*\*\s?/, '').trim())
|
|
174
|
+
.filter((l) => !l.startsWith('@'));
|
|
175
|
+
const nonEmpty = lines.filter(Boolean);
|
|
176
|
+
const [titleLine, ...rest] = nonEmpty;
|
|
177
|
+
return {
|
|
178
|
+
title: (titleLine ?? '').trim(),
|
|
179
|
+
description: rest.length ? rest.join(' ').trim() : undefined,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function humanize(slug) {
|
|
183
|
+
return slug
|
|
184
|
+
.replace(/[-_]+/g, ' ')
|
|
185
|
+
.replace(/\b\w/g, (c) => c.toUpperCase());
|
|
186
|
+
}
|
|
187
|
+
// ── Filesystem walking + glob matching ────────────────────────────────────
|
|
188
|
+
function* walkFiles(dir) {
|
|
189
|
+
let entries;
|
|
190
|
+
try {
|
|
191
|
+
entries = readdirSync(dir);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
for (const entry of entries) {
|
|
197
|
+
const full = join(dir, entry);
|
|
198
|
+
let s;
|
|
199
|
+
try {
|
|
200
|
+
s = statSync(full);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (s.isDirectory())
|
|
206
|
+
yield* walkFiles(full);
|
|
207
|
+
else if (s.isFile())
|
|
208
|
+
yield full;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Minimal glob → RegExp for the patterns we support:
|
|
213
|
+
* `**` → any path segments (including none)
|
|
214
|
+
* `*` → non-separator run
|
|
215
|
+
* `{a,b}` → alternation
|
|
216
|
+
* Paths use forward slashes for matching regardless of OS.
|
|
217
|
+
*/
|
|
218
|
+
function globToRegExp(glob) {
|
|
219
|
+
let re = '';
|
|
220
|
+
let i = 0;
|
|
221
|
+
while (i < glob.length) {
|
|
222
|
+
const ch = glob[i];
|
|
223
|
+
if (ch === '*' && glob[i + 1] === '*') {
|
|
224
|
+
// `**` or `**/`
|
|
225
|
+
if (glob[i + 2] === '/') {
|
|
226
|
+
re += '(?:.*/)?';
|
|
227
|
+
i += 3;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
re += '.*';
|
|
231
|
+
i += 2;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
else if (ch === '*') {
|
|
235
|
+
re += '[^/]*';
|
|
236
|
+
i += 1;
|
|
237
|
+
}
|
|
238
|
+
else if (ch === '{') {
|
|
239
|
+
const end = glob.indexOf('}', i);
|
|
240
|
+
if (end === -1) {
|
|
241
|
+
re += '\\{';
|
|
242
|
+
i += 1;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
const alts = glob.slice(i + 1, end).split(',').map(escapeRegex);
|
|
246
|
+
re += '(?:' + alts.join('|') + ')';
|
|
247
|
+
i = end + 1;
|
|
248
|
+
}
|
|
249
|
+
else if ('/.?+^$()[]\\'.includes(ch)) {
|
|
250
|
+
re += '\\' + ch;
|
|
251
|
+
i += 1;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
re += ch;
|
|
255
|
+
i += 1;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return new RegExp('^' + re + '$');
|
|
259
|
+
}
|
|
260
|
+
function escapeRegex(s) {
|
|
261
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=deriveCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deriveCatalog.js","sourceRoot":"","sources":["../../src/bundles/deriveCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @specverse/engines/bundles
|
|
3
|
+
*
|
|
4
|
+
* Pluggable-bundle catalog subsystem. Scans a bundle's content facet
|
|
5
|
+
* directories and returns a unified `CatalogEntry[]` summary. Designed to
|
|
6
|
+
* replace hand-maintained catalog files per bundle — content is primary,
|
|
7
|
+
* catalog is derived.
|
|
8
|
+
*
|
|
9
|
+
* See: specverse-self/docs/proposals/PLUGGABLE-BUNDLE-MODEL.md
|
|
10
|
+
*/
|
|
11
|
+
export { deriveCatalog, clearCatalogCache } from './deriveCatalog.js';
|
|
12
|
+
export { DEFAULT_FACETS, type CatalogEntry, type CatalogCategory, type DeriveCatalogOptions, type FacetName as CatalogFacetName, type FacetPattern, } from './types.js';
|
|
13
|
+
export { validateBundle, validateBundles } from './validate.js';
|
|
14
|
+
export type { FacetName as ValidateFacetName, FacetIssue, FacetResult, BundleReport, WorkspaceReport, ValidateOptions, } from './validate.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bundles/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EACL,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,SAAS,IAAI,gBAAgB,EAClC,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EACV,SAAS,IAAI,iBAAiB,EAC9B,UAAU,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @specverse/engines/bundles
|
|
3
|
+
*
|
|
4
|
+
* Pluggable-bundle catalog subsystem. Scans a bundle's content facet
|
|
5
|
+
* directories and returns a unified `CatalogEntry[]` summary. Designed to
|
|
6
|
+
* replace hand-maintained catalog files per bundle — content is primary,
|
|
7
|
+
* catalog is derived.
|
|
8
|
+
*
|
|
9
|
+
* See: specverse-self/docs/proposals/PLUGGABLE-BUNDLE-MODEL.md
|
|
10
|
+
*/
|
|
11
|
+
export { deriveCatalog, clearCatalogCache } from './deriveCatalog.js';
|
|
12
|
+
export { DEFAULT_FACETS, } from './types.js';
|
|
13
|
+
// ── Bundle validation ────────────────────────────────────────────────
|
|
14
|
+
export { validateBundle, validateBundles } from './validate.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bundles/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EACL,cAAc,GAMf,MAAM,YAAY,CAAC;AAEpB,wEAAwE;AACxE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the pluggable-bundle catalog subsystem.
|
|
3
|
+
*
|
|
4
|
+
* A "bundle" is a self-contained package of schema + implementation + content
|
|
5
|
+
* (examples, tests, behaviour specs). This module's job is producing a
|
|
6
|
+
* `CatalogEntry[]` summary of a bundle's content by scanning its content
|
|
7
|
+
* facet directories (`__examples__/`, `__tests__/`, `__behaviour__/`).
|
|
8
|
+
*
|
|
9
|
+
* See: specverse-self/docs/proposals/PLUGGABLE-BUNDLE-MODEL.md
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* CatalogEntry and CatalogCategory are defined canonically in
|
|
13
|
+
* `@specverse/types/entity-module` (which also aliases them as
|
|
14
|
+
* `EntityDocReference` and `EntityTestReference` for consumer naming
|
|
15
|
+
* intent). Re-exported here so consumers who import from
|
|
16
|
+
* `@specverse/engines/bundles` have everything they need from one path.
|
|
17
|
+
*/
|
|
18
|
+
import type { CatalogCategory, CatalogEntry } from '@specverse/types';
|
|
19
|
+
export type { CatalogCategory, CatalogEntry } from '@specverse/types';
|
|
20
|
+
/** A content facet that the catalog scanner knows how to walk. */
|
|
21
|
+
export type FacetName = '__examples__' | '__tests__' | '__behaviour__';
|
|
22
|
+
/**
|
|
23
|
+
* How a facet is scanned. `glob` is a `fast-glob`-compatible pattern relative
|
|
24
|
+
* to the facet directory; `category` is assigned to every entry the scanner
|
|
25
|
+
* emits for this facet.
|
|
26
|
+
*/
|
|
27
|
+
export interface FacetPattern {
|
|
28
|
+
glob: string;
|
|
29
|
+
category: CatalogCategory;
|
|
30
|
+
}
|
|
31
|
+
/** Configuration for `deriveCatalog`. All fields are optional. */
|
|
32
|
+
export interface DeriveCatalogOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Mixed-mode entries: hand-written references the scanner can't discover
|
|
35
|
+
* (e.g. external guides outside the bundle). Appended to the derived set
|
|
36
|
+
* with no de-duplication.
|
|
37
|
+
*/
|
|
38
|
+
additionalReferences?: CatalogEntry[];
|
|
39
|
+
/**
|
|
40
|
+
* Override scanning behaviour per facet. Default is the production table
|
|
41
|
+
* exported as `DEFAULT_FACETS`. Use this only when a bundle deviates from
|
|
42
|
+
* the standard layout.
|
|
43
|
+
*/
|
|
44
|
+
facets?: Partial<Record<FacetName, FacetPattern>>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Default facet patterns used when `DeriveCatalogOptions.facets` isn't
|
|
48
|
+
* provided. Tight patterns (extension-specific) so non-content files (e.g. a
|
|
49
|
+
* stray `grammar.yaml` physically nested inside `__behaviour__/`) cannot leak
|
|
50
|
+
* into the catalog regardless of directory depth.
|
|
51
|
+
*/
|
|
52
|
+
export declare const DEFAULT_FACETS: Record<FacetName, FacetPattern>;
|
|
53
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bundles/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEtE,kEAAkE;AAClE,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,WAAW,GAAG,eAAe,CAAC;AAEvE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,kEAAkE;AAClE,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,YAAY,EAAE,CAAC;IAEtC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;CACnD;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,YAAY,CAI1D,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the pluggable-bundle catalog subsystem.
|
|
3
|
+
*
|
|
4
|
+
* A "bundle" is a self-contained package of schema + implementation + content
|
|
5
|
+
* (examples, tests, behaviour specs). This module's job is producing a
|
|
6
|
+
* `CatalogEntry[]` summary of a bundle's content by scanning its content
|
|
7
|
+
* facet directories (`__examples__/`, `__tests__/`, `__behaviour__/`).
|
|
8
|
+
*
|
|
9
|
+
* See: specverse-self/docs/proposals/PLUGGABLE-BUNDLE-MODEL.md
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Default facet patterns used when `DeriveCatalogOptions.facets` isn't
|
|
13
|
+
* provided. Tight patterns (extension-specific) so non-content files (e.g. a
|
|
14
|
+
* stray `grammar.yaml` physically nested inside `__behaviour__/`) cannot leak
|
|
15
|
+
* into the catalog regardless of directory depth.
|
|
16
|
+
*/
|
|
17
|
+
export const DEFAULT_FACETS = {
|
|
18
|
+
__examples__: { glob: '**/*.specly', category: 'example' },
|
|
19
|
+
__tests__: { glob: '**/*.test.{ts,tsx,js,mjs}', category: 'test' },
|
|
20
|
+
__behaviour__: { glob: '**/*.qnt', category: 'behaviour' },
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/bundles/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA0CH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoC;IAC7D,YAAY,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC1D,SAAS,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,EAAE;IAClE,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE;CAC3D,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
export type FacetName = 'catalog' | 'schema' | 'examples' | 'tests' | 'docs' | 'behaviour';
|
|
15
|
+
export interface FacetIssue {
|
|
16
|
+
severity: 'error' | 'warning';
|
|
17
|
+
message: string;
|
|
18
|
+
location?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface FacetResult {
|
|
21
|
+
facet: FacetName;
|
|
22
|
+
status: 'pass' | 'fail' | 'skip';
|
|
23
|
+
duration: number;
|
|
24
|
+
issues: FacetIssue[];
|
|
25
|
+
metrics?: Record<string, number | string>;
|
|
26
|
+
}
|
|
27
|
+
export interface BundleReport {
|
|
28
|
+
bundle: string;
|
|
29
|
+
path: string;
|
|
30
|
+
facets: FacetResult[];
|
|
31
|
+
totals: {
|
|
32
|
+
pass: number;
|
|
33
|
+
fail: number;
|
|
34
|
+
skip: number;
|
|
35
|
+
};
|
|
36
|
+
duration: number;
|
|
37
|
+
}
|
|
38
|
+
export interface WorkspaceReport {
|
|
39
|
+
bundles: BundleReport[];
|
|
40
|
+
totals: {
|
|
41
|
+
pass: number;
|
|
42
|
+
fail: number;
|
|
43
|
+
skip: number;
|
|
44
|
+
};
|
|
45
|
+
duration: number;
|
|
46
|
+
}
|
|
47
|
+
export interface ValidateOptions {
|
|
48
|
+
/** Override schema path. Defaults to @specverse/entities composed schema. */
|
|
49
|
+
schemaPath?: string;
|
|
50
|
+
}
|
|
51
|
+
/** Validate one bundle. */
|
|
52
|
+
export declare function validateBundle(bundleDir: string, options?: ValidateOptions): Promise<BundleReport>;
|
|
53
|
+
/** Validate several bundles. Reports aggregate. */
|
|
54
|
+
export declare function validateBundles(bundleDirs: string[], options?: ValidateOptions): Promise<WorkspaceReport>;
|
|
55
|
+
//# sourceMappingURL=validate.d.ts.map
|