@specverse/engines 6.0.1 → 6.0.4
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/behavior-ai-service.d.ts.map +1 -1
- package/dist/ai/behavior-ai-service.js +18 -6
- package/dist/ai/behavior-ai-service.js.map +1 -1
- package/dist/ai/prompt-loader.d.ts +7 -3
- package/dist/ai/prompt-loader.d.ts.map +1 -1
- package/dist/ai/prompt-loader.js +67 -69
- package/dist/ai/prompt-loader.js.map +1 -1
- package/dist/libs/instance-factories/cli/templates/commander/command-generator.js +17 -6
- package/dist/libs/instance-factories/tools/templates/mcp/mcp-server-generator.js +8 -7
- package/libs/instance-factories/cli/templates/commander/command-generator.ts +17 -6
- package/libs/instance-factories/tools/templates/mcp/mcp-server-generator.ts +10 -9
- package/package.json +2 -1
- package/assets/examples/manifests/01-simple-default-mappings.yaml +0 -36
- package/assets/examples/manifests/02-capability-mappings.yaml +0 -55
- package/assets/examples/manifests/03-hybrid-mappings.yaml +0 -109
- package/assets/examples/manifests/README.md +0 -245
- package/assets/examples/manifests/backend-only.yaml +0 -43
- package/assets/examples/manifests/blog-api.md +0 -78
- package/assets/examples/manifests/blog-api.specly +0 -79
- package/assets/examples/manifests/frontend-only.yaml +0 -24
- package/assets/examples/manifests/fullstack-app.yaml +0 -42
- package/assets/examples/manifests/fullstack-monorepo.yaml +0 -59
- package/assets/examples-decomposed/cloud-native-manifest.example.yaml +0 -8
- package/assets/examples-decomposed/cloud-native-manifest.md +0 -379
- package/assets/examples-decomposed/cloud-native-manifest.specly +0 -60
- package/assets/examples-decomposed/docker-compose-manifest.example.yaml +0 -8
- package/assets/examples-decomposed/docker-compose-manifest.md +0 -326
- package/assets/examples-decomposed/docker-compose-manifest.specly +0 -40
- package/assets/examples-decomposed/kubernetes-deployment-manifest.example.yaml +0 -8
- package/assets/examples-decomposed/kubernetes-deployment-manifest.md +0 -237
- package/assets/examples-decomposed/kubernetes-deployment-manifest.specly +0 -41
- package/assets/examples-inference/inference-engine-demo.example.yaml +0 -8
- package/assets/examples-inference/inference-engine-demo.md +0 -574
- package/assets/examples-inference/inference-engine-demo.specly +0 -216
- package/assets/prompts/core/README.md +0 -319
- package/assets/prompts/core/standard/default/analyse.prompt.yaml +0 -505
- package/assets/prompts/core/standard/default/app-demo.prompt.yaml +0 -233
- package/assets/prompts/core/standard/default/behavior.prompt.yaml +0 -157
- package/assets/prompts/core/standard/default/create.prompt.yaml +0 -426
- package/assets/prompts/core/standard/default/materialise.prompt.yaml +0 -844
- package/assets/prompts/core/standard/default/realize.prompt.yaml +0 -611
- package/assets/prompts/core/standard/v9/analyse.prompt.yaml +0 -505
- package/assets/prompts/core/standard/v9/app-demo.prompt.yaml +0 -233
- package/assets/prompts/core/standard/v9/behavior.prompt.yaml +0 -157
- package/assets/prompts/core/standard/v9/create.prompt.yaml +0 -426
- package/assets/prompts/core/standard/v9/materialise.prompt.yaml +0 -844
- package/assets/prompts/core/standard/v9/realize.prompt.yaml +0 -611
- package/assets/templates/default/specs/main.specly +0 -65
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behavior-ai-service.d.ts","sourceRoot":"","sources":["../../src/ai/behavior-ai-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"behavior-ai-service.d.ts","sourceRoot":"","sources":["../../src/ai/behavior-ai-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAaH,MAAM,WAAW,wBAAwB;IACvC,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyDD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAAC;IACd,OAAO,CAAC,UAAU,CAAC;IACnB,OAAO,CAAC,MAAM,CAAC;IACf,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IAExB,uDAAuD;IACvD,IAAI,WAAW,IAAI,OAAO,CAEzB;gBAEW,OAAO,GAAE,wBAA6B;IAQlD;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;;;;OAKG;IACH,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;IAI5C,oDAAoD;IAC9C,gBAAgB,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA0B5E,oFAAoF;IACpF,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,WAAW;CAQpB"}
|
|
@@ -24,18 +24,30 @@ import yaml from 'js-yaml';
|
|
|
24
24
|
import { existsSync, readFileSync } from 'fs';
|
|
25
25
|
import { dirname, join } from 'path';
|
|
26
26
|
import { fileURLToPath } from 'url';
|
|
27
|
+
import { createRequire } from 'module';
|
|
27
28
|
import { resolveModel, resolveProviderId } from './model-resolver.js';
|
|
28
29
|
import { detectInstalledSkill } from './skill-detection.js';
|
|
29
|
-
|
|
30
|
+
const require = createRequire(import.meta.url);
|
|
31
|
+
/**
|
|
32
|
+
* Load the structured behavior prompt from `@specverse/assets/prompts/`,
|
|
33
|
+
* falling back to the legacy `engines/assets/prompts/` location for older
|
|
34
|
+
* engine builds (engines ≤ 6.0.2 bundled prompts directly).
|
|
35
|
+
*/
|
|
30
36
|
function loadBehaviorPrompt() {
|
|
31
37
|
try {
|
|
38
|
+
const candidates = [];
|
|
39
|
+
// 1. Try @specverse/assets first.
|
|
40
|
+
try {
|
|
41
|
+
const pkg = require.resolve('@specverse/assets/package.json');
|
|
42
|
+
candidates.push(join(dirname(pkg), 'prompts', 'core', 'standard', 'v9', 'behavior.prompt.yaml'));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* not installed — fall through */
|
|
46
|
+
}
|
|
47
|
+
// 2. Legacy engines-bundled fallback.
|
|
32
48
|
const __filename = fileURLToPath(import.meta.url);
|
|
33
49
|
const __dirname = dirname(__filename);
|
|
34
|
-
|
|
35
|
-
const candidates = [
|
|
36
|
-
join(__dirname, '..', '..', 'assets', 'prompts', 'core', 'standard', 'v9', 'behavior.prompt.yaml'),
|
|
37
|
-
join(__dirname, '..', '..', '..', 'assets', 'prompts', 'core', 'standard', 'v9', 'behavior.prompt.yaml'),
|
|
38
|
-
];
|
|
50
|
+
candidates.push(join(__dirname, '..', '..', 'assets', 'prompts', 'core', 'standard', 'v9', 'behavior.prompt.yaml'), join(__dirname, '..', '..', '..', 'assets', 'prompts', 'core', 'standard', 'v9', 'behavior.prompt.yaml'));
|
|
39
51
|
for (const path of candidates) {
|
|
40
52
|
if (existsSync(path)) {
|
|
41
53
|
const doc = yaml.load(readFileSync(path, 'utf8'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behavior-ai-service.js","sourceRoot":"","sources":["../../src/ai/behavior-ai-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"behavior-ai-service.js","sourceRoot":"","sources":["../../src/ai/behavior-ai-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Prompt Path Resolution for AI Commands
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* Prompts now live in @specverse/assets (a content-only leaf package); we
|
|
5
|
+
* resolve there first. Falls back to the legacy __dirname-walk for
|
|
6
|
+
* backwards compatibility with old engine builds that still bundled
|
|
7
|
+
* prompts in engines/assets/prompts/ (engines ≤ 6.0.2).
|
|
4
8
|
*/
|
|
5
9
|
/**
|
|
6
10
|
* Resolve prompt version to actual file system path
|
|
7
11
|
*/
|
|
8
|
-
export declare function resolvePromptPath(pver: string,
|
|
12
|
+
export declare function resolvePromptPath(pver: string, _basePath?: string): string;
|
|
9
13
|
/**
|
|
10
14
|
* Validate that a prompt path exists and contains required prompt files
|
|
11
15
|
*/
|
|
@@ -16,7 +20,7 @@ export declare function validatePromptPath(promptPath: string, operation?: strin
|
|
|
16
20
|
/**
|
|
17
21
|
* Get available prompt versions
|
|
18
22
|
*/
|
|
19
|
-
export declare function getAvailablePromptVersions(
|
|
23
|
+
export declare function getAvailablePromptVersions(_basePath?: string): {
|
|
20
24
|
version: string;
|
|
21
25
|
path: string;
|
|
22
26
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-loader.d.ts","sourceRoot":"","sources":["../../src/ai/prompt-loader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"prompt-loader.d.ts","sourceRoot":"","sources":["../../src/ai/prompt-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4CH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CA+B1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA+BtC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,CAAC,EAAE,MAAM,GACjB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAyCnD"}
|
package/dist/ai/prompt-loader.js
CHANGED
|
@@ -1,46 +1,62 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Prompt Path Resolution for AI Commands
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* Prompts now live in @specverse/assets (a content-only leaf package); we
|
|
5
|
+
* resolve there first. Falls back to the legacy __dirname-walk for
|
|
6
|
+
* backwards compatibility with old engine builds that still bundled
|
|
7
|
+
* prompts in engines/assets/prompts/ (engines ≤ 6.0.2).
|
|
4
8
|
*/
|
|
5
9
|
import { resolve, dirname, join } from 'path';
|
|
6
10
|
import { existsSync, readdirSync } from 'fs';
|
|
7
11
|
import { fileURLToPath } from 'url';
|
|
12
|
+
import { createRequire } from 'module';
|
|
13
|
+
const require = createRequire(import.meta.url);
|
|
8
14
|
/**
|
|
9
|
-
* Resolve
|
|
15
|
+
* Resolve the prompts base directory — `<assets>/prompts/`.
|
|
16
|
+
*
|
|
17
|
+
* Priority:
|
|
18
|
+
* 1. @specverse/assets package (the new home)
|
|
19
|
+
* 2. Legacy engines/assets/prompts/ (back-compat fallback)
|
|
10
20
|
*/
|
|
11
|
-
|
|
12
|
-
//
|
|
13
|
-
|
|
21
|
+
function resolvePromptsBase() {
|
|
22
|
+
// 1. Try @specverse/assets first.
|
|
23
|
+
try {
|
|
24
|
+
const pkg = require.resolve('@specverse/assets/package.json');
|
|
25
|
+
const assetsBase = join(dirname(pkg), 'prompts');
|
|
26
|
+
if (existsSync(join(assetsBase, 'core', 'standard'))) {
|
|
27
|
+
return assetsBase;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
/* @specverse/assets not installed — fall through to legacy path */
|
|
32
|
+
}
|
|
33
|
+
// 2. Fall back to engine-bundled prompts (engines ≤ 6.0.2).
|
|
34
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
35
|
const __dirname = dirname(__filename);
|
|
15
|
-
|
|
16
|
-
const possiblePromptDirs = [
|
|
36
|
+
const legacyDirs = [
|
|
17
37
|
resolve(__dirname, '../assets/prompts'), // From src/ to assets/ (development)
|
|
18
38
|
resolve(__dirname, '../../assets/prompts'), // From dist/ to assets/ (built)
|
|
19
39
|
resolve(__dirname, '../../../assets/prompts'), // From dist/commands/ to assets/
|
|
20
|
-
resolve(__dirname, '../../'), // Legacy: project root with prompts/ subdir
|
|
21
|
-
resolve(__dirname, '../../../'),
|
|
22
|
-
resolve(__dirname, '../../../../'),
|
|
23
40
|
];
|
|
24
|
-
|
|
25
|
-
for (const dir of possiblePromptDirs) {
|
|
26
|
-
// Check for assets/prompts layout (core/standard/vN inside)
|
|
41
|
+
for (const dir of legacyDirs) {
|
|
27
42
|
if (existsSync(join(dir, 'core', 'standard'))) {
|
|
28
|
-
|
|
29
|
-
break;
|
|
30
|
-
}
|
|
31
|
-
// Check for legacy project root layout (prompts/core/standard/vN)
|
|
32
|
-
if (existsSync(join(dir, 'prompts', 'core', 'standard'))) {
|
|
33
|
-
promptsBase = join(dir, 'prompts');
|
|
34
|
-
break;
|
|
43
|
+
return dir;
|
|
35
44
|
}
|
|
36
45
|
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve prompt version to actual file system path
|
|
50
|
+
*/
|
|
51
|
+
export function resolvePromptPath(pver, _basePath) {
|
|
52
|
+
const promptsBase = resolvePromptsBase();
|
|
37
53
|
if (!promptsBase) {
|
|
38
|
-
throw new Error('Could not locate prompts directory. Ensure @specverse/
|
|
54
|
+
throw new Error('Could not locate prompts directory. Ensure @specverse/assets is installed (npm install @specverse/assets).');
|
|
39
55
|
}
|
|
40
56
|
// Resolve version to path
|
|
41
57
|
if (pver === 'default' || pver.match(/^v\d+$/)) {
|
|
42
58
|
let versionPath = join(promptsBase, 'core/standard', pver);
|
|
43
|
-
// Handle 'default'
|
|
59
|
+
// Handle 'default' — symlink may not survive npm package installation
|
|
44
60
|
if (pver === 'default' && !existsSync(versionPath)) {
|
|
45
61
|
// Fallback to latest version (v9)
|
|
46
62
|
const latestVersion = 'v9';
|
|
@@ -80,7 +96,12 @@ export function validatePromptPath(promptPath, operation) {
|
|
|
80
96
|
}
|
|
81
97
|
else {
|
|
82
98
|
// Check for all standard prompt files
|
|
83
|
-
const requiredFiles = [
|
|
99
|
+
const requiredFiles = [
|
|
100
|
+
'analyse.prompt.yaml',
|
|
101
|
+
'create.prompt.yaml',
|
|
102
|
+
'materialise.prompt.yaml',
|
|
103
|
+
'realize.prompt.yaml',
|
|
104
|
+
];
|
|
84
105
|
for (const file of requiredFiles) {
|
|
85
106
|
const filePath = join(promptPath, file);
|
|
86
107
|
if (!existsSync(filePath)) {
|
|
@@ -93,55 +114,32 @@ export function validatePromptPath(promptPath, operation) {
|
|
|
93
114
|
/**
|
|
94
115
|
* Get available prompt versions
|
|
95
116
|
*/
|
|
96
|
-
export function getAvailablePromptVersions(
|
|
117
|
+
export function getAvailablePromptVersions(_basePath) {
|
|
97
118
|
try {
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
resolve(__dirname2, '../assets/prompts'),
|
|
104
|
-
resolve(__dirname2, '../../assets/prompts'),
|
|
105
|
-
resolve(__dirname2, '../../../assets/prompts'),
|
|
106
|
-
resolve(__dirname2, '../../'),
|
|
107
|
-
resolve(__dirname2, '../../../'),
|
|
108
|
-
resolve(__dirname2, '../../../../'),
|
|
109
|
-
];
|
|
110
|
-
let standardPath = null;
|
|
111
|
-
for (const dir of possiblePromptDirs2) {
|
|
112
|
-
const candidate = join(dir, 'core', 'standard');
|
|
113
|
-
if (existsSync(candidate)) {
|
|
114
|
-
standardPath = candidate;
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
const legacy = join(dir, 'prompts', 'core', 'standard');
|
|
118
|
-
if (existsSync(legacy)) {
|
|
119
|
-
standardPath = legacy;
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
if (!standardPath)
|
|
119
|
+
const promptsBase = resolvePromptsBase();
|
|
120
|
+
if (!promptsBase)
|
|
121
|
+
return [];
|
|
122
|
+
const standardPath = join(promptsBase, 'core', 'standard');
|
|
123
|
+
if (!existsSync(standardPath))
|
|
124
124
|
return [];
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
description = 'Three-Layer Architecture Prompts (v3)';
|
|
138
|
-
}
|
|
139
|
-
versions.push({
|
|
140
|
-
version: entry.name,
|
|
141
|
-
path: versionPath,
|
|
142
|
-
name: description
|
|
143
|
-
});
|
|
125
|
+
const versions = [];
|
|
126
|
+
const entries = readdirSync(standardPath, { withFileTypes: true });
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
if (entry.isDirectory() && entry.name.match(/^v\d+$/)) {
|
|
129
|
+
const versionPath = join(standardPath, entry.name);
|
|
130
|
+
// Determine version description based on version number
|
|
131
|
+
let description = `Prompts (${entry.name})`;
|
|
132
|
+
if (entry.name === 'v2') {
|
|
133
|
+
description = 'Optimized Prompts (v2, 75% token reduction)';
|
|
134
|
+
}
|
|
135
|
+
else if (entry.name === 'v3') {
|
|
136
|
+
description = 'Three-Layer Architecture Prompts (v3)';
|
|
144
137
|
}
|
|
138
|
+
versions.push({
|
|
139
|
+
version: entry.name,
|
|
140
|
+
path: versionPath,
|
|
141
|
+
name: description,
|
|
142
|
+
});
|
|
145
143
|
}
|
|
146
144
|
}
|
|
147
145
|
// Sort versions by version number
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-loader.js","sourceRoot":"","sources":["../../src/ai/prompt-loader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"prompt-loader.js","sourceRoot":"","sources":["../../src/ai/prompt-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C;;;;;;GAMG;AACH,SAAS,kBAAkB;IACzB,kCAAkC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,UAAU,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;IAED,4DAA4D;IAC5D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAQ,qCAAqC;QACpF,OAAO,CAAC,SAAS,EAAE,sBAAsB,CAAC,EAAK,gCAAgC;QAC/E,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC,EAAE,iCAAiC;KACjF,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,SAAkB;IAChE,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;IACzC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;QAE3D,sEAAsE;QACtE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACnD,kCAAkC;YAClC,MAAM,aAAa,GAAG,IAAI,CAAC;YAC3B,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,2BAA2B,aAAa,kBAAkB,WAAW,EAAE,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,iBAAiB,WAAW,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B;QAChE,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,+CAA+C,CAAC,CAAC;IAClG,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAkB,EAClB,SAAkB;IAElB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;QACzD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,4DAA4D;IAC5D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,SAAS,cAAc,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,sCAAsC;QACtC,MAAM,aAAa,GAAG;YACpB,qBAAqB;YACrB,oBAAoB;YACpB,yBAAyB;YACzB,qBAAqB;SACtB,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAAkB;IAElB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;QACzC,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAsD,EAAE,CAAC;QACvE,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEnD,wDAAwD;gBACxD,IAAI,WAAW,GAAG,YAAY,KAAK,CAAC,IAAI,GAAG,CAAC;gBAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBACxB,WAAW,GAAG,6CAA6C,CAAC;gBAC9D,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBAC/B,WAAW,GAAG,uCAAuC,CAAC;gBACxD,CAAC;gBAED,QAAQ,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE,KAAK,CAAC,IAAI;oBACnB,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,WAAW;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YACrD,OAAO,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -581,12 +581,23 @@ import { fileURLToPath } from 'url';`,
|
|
|
581
581
|
try {
|
|
582
582
|
const { createRequire } = await import('module');
|
|
583
583
|
const require = createRequire(import.meta.url);
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
584
|
+
// Try @specverse/assets first (canonical home post 2026-04-25),
|
|
585
|
+
// fall back to @specverse/engines for older installs.
|
|
586
|
+
const candidates = [];
|
|
587
|
+
try {
|
|
588
|
+
const assetsPkg = require.resolve('@specverse/assets/package.json');
|
|
589
|
+
candidates.push(
|
|
590
|
+
join(dirname(assetsPkg), 'templates', 'default', 'specs', 'main.specly')
|
|
591
|
+
);
|
|
592
|
+
} catch {}
|
|
593
|
+
try {
|
|
594
|
+
const enginesPkg = require.resolve('@specverse/engines/package.json');
|
|
595
|
+
candidates.push(
|
|
596
|
+
join(dirname(enginesPkg), 'assets', 'templates', 'default', 'specs', 'main.specly')
|
|
597
|
+
);
|
|
598
|
+
} catch {}
|
|
599
|
+
const canonicalSpec = candidates.find((p) => existsSync(p));
|
|
600
|
+
if (canonicalSpec) {
|
|
590
601
|
let content = readFileSync(canonicalSpec, 'utf8');
|
|
591
602
|
for (const [key, val] of Object.entries(vars)) {
|
|
592
603
|
content = content.split(key).join(val);
|
|
@@ -20,7 +20,7 @@ function generateMCPServer(context) {
|
|
|
20
20
|
writeFileSync(join(srcDir, "tools.ts"), generateTools(cliCommands));
|
|
21
21
|
writeFileSync(join(srcDir, "prompts.ts"), generatePrompts());
|
|
22
22
|
return `MCP server generated in: ${mcpDir}
|
|
23
|
-
${cliCommands.length} tools, 5 resources, 6 prompts (derived from @specverse/
|
|
23
|
+
${cliCommands.length} tools, 5 resources, 6 prompts (derived from @specverse/assets/prompts)`;
|
|
24
24
|
}
|
|
25
25
|
function resolveSelfVersion() {
|
|
26
26
|
try {
|
|
@@ -130,9 +130,10 @@ function generatePackageJson(version, description) {
|
|
|
130
130
|
},
|
|
131
131
|
dependencies: {
|
|
132
132
|
"@modelcontextprotocol/sdk": "^1.17.4",
|
|
133
|
-
"@specverse/
|
|
133
|
+
"@specverse/assets": "^1.0.0",
|
|
134
|
+
"@specverse/engines": "^6.0.3",
|
|
134
135
|
"@specverse/entities": "^5.1.0",
|
|
135
|
-
"@specverse/self": "^5.
|
|
136
|
+
"@specverse/self": "^5.4.0",
|
|
136
137
|
"js-yaml": "^4.1.0"
|
|
137
138
|
},
|
|
138
139
|
devDependencies: {
|
|
@@ -511,7 +512,7 @@ function buildCliReferenceMarkdown(tools) {
|
|
|
511
512
|
function generatePrompts() {
|
|
512
513
|
return `/**
|
|
513
514
|
* Prompt registry \u2014 reads the canonical workflow prompts from
|
|
514
|
-
* @specverse/
|
|
515
|
+
* @specverse/assets/prompts/core/standard/default/ at startup and
|
|
515
516
|
* serves them as MCP prompts. Each YAML file (create, analyse, materialise,
|
|
516
517
|
* realize, behavior, app-demo) becomes one invocable prompt.
|
|
517
518
|
*/
|
|
@@ -540,8 +541,8 @@ function resolveEntitiesFile(relative: string): string {
|
|
|
540
541
|
return join(dirname(pkg), relative);
|
|
541
542
|
}
|
|
542
543
|
|
|
543
|
-
function
|
|
544
|
-
const pkg = require.resolve('@specverse/
|
|
544
|
+
function resolveAssetsDir(relative: string): string {
|
|
545
|
+
const pkg = require.resolve('@specverse/assets/package.json');
|
|
545
546
|
return join(dirname(pkg), relative);
|
|
546
547
|
}
|
|
547
548
|
|
|
@@ -558,7 +559,7 @@ const USER_FACING = new Set<string>([
|
|
|
558
559
|
]);
|
|
559
560
|
|
|
560
561
|
function loadPrompts(): Prompt[] {
|
|
561
|
-
const promptsDir =
|
|
562
|
+
const promptsDir = resolveAssetsDir('prompts/core/standard/default');
|
|
562
563
|
const entries = readdirSync(promptsDir).filter(f => f.endsWith('.prompt.yaml'));
|
|
563
564
|
const prompts: Prompt[] = [];
|
|
564
565
|
for (const entry of entries) {
|
|
@@ -636,12 +636,23 @@ import { fileURLToPath } from 'url';`,
|
|
|
636
636
|
try {
|
|
637
637
|
const { createRequire } = await import('module');
|
|
638
638
|
const require = createRequire(import.meta.url);
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
639
|
+
// Try @specverse/assets first (canonical home post 2026-04-25),
|
|
640
|
+
// fall back to @specverse/engines for older installs.
|
|
641
|
+
const candidates = [];
|
|
642
|
+
try {
|
|
643
|
+
const assetsPkg = require.resolve('@specverse/assets/package.json');
|
|
644
|
+
candidates.push(
|
|
645
|
+
join(dirname(assetsPkg), 'templates', 'default', 'specs', 'main.specly')
|
|
646
|
+
);
|
|
647
|
+
} catch {}
|
|
648
|
+
try {
|
|
649
|
+
const enginesPkg = require.resolve('@specverse/engines/package.json');
|
|
650
|
+
candidates.push(
|
|
651
|
+
join(dirname(enginesPkg), 'assets', 'templates', 'default', 'specs', 'main.specly')
|
|
652
|
+
);
|
|
653
|
+
} catch {}
|
|
654
|
+
const canonicalSpec = candidates.find((p) => existsSync(p));
|
|
655
|
+
if (canonicalSpec) {
|
|
645
656
|
let content = readFileSync(canonicalSpec, 'utf8');
|
|
646
657
|
for (const [key, val] of Object.entries(vars)) {
|
|
647
658
|
content = content.split(key).join(val);
|
|
@@ -48,7 +48,7 @@ export default function generateMCPServer(context: TemplateContext): string {
|
|
|
48
48
|
writeFileSync(join(srcDir, 'tools.ts'), generateTools(cliCommands));
|
|
49
49
|
writeFileSync(join(srcDir, 'prompts.ts'), generatePrompts());
|
|
50
50
|
|
|
51
|
-
return `MCP server generated in: ${mcpDir}\n ${cliCommands.length} tools, 5 resources, 6 prompts (derived from @specverse/
|
|
51
|
+
return `MCP server generated in: ${mcpDir}\n ${cliCommands.length} tools, 5 resources, 6 prompts (derived from @specverse/assets/prompts)`;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
/**
|
|
@@ -208,9 +208,10 @@ function generatePackageJson(version: string, description: string): string {
|
|
|
208
208
|
},
|
|
209
209
|
dependencies: {
|
|
210
210
|
'@modelcontextprotocol/sdk': '^1.17.4',
|
|
211
|
-
'@specverse/
|
|
211
|
+
'@specverse/assets': '^1.0.0',
|
|
212
|
+
'@specverse/engines': '^6.0.3',
|
|
212
213
|
'@specverse/entities': '^5.1.0',
|
|
213
|
-
'@specverse/self': '^5.
|
|
214
|
+
'@specverse/self': '^5.4.0',
|
|
214
215
|
'js-yaml': '^4.1.0',
|
|
215
216
|
},
|
|
216
217
|
devDependencies: {
|
|
@@ -602,8 +603,8 @@ function buildCliReferenceMarkdown(tools: CLITool[]): string {
|
|
|
602
603
|
|
|
603
604
|
/**
|
|
604
605
|
* Emit prompts.ts — loads the canonical workflow prompts from
|
|
605
|
-
* @specverse/
|
|
606
|
-
*
|
|
606
|
+
* @specverse/assets/prompts/core/standard/default/ at module-init time.
|
|
607
|
+
* Each YAML prompt becomes one MCP prompt; the declared
|
|
607
608
|
* {{template variables}} surface as MCP prompt arguments the client fills.
|
|
608
609
|
* Schema paths ({{aiSchemaPath}}, {{referenceSchemaPath}},
|
|
609
610
|
* {{referenceExamplePath}}) are auto-filled with package-relative paths so
|
|
@@ -612,7 +613,7 @@ function buildCliReferenceMarkdown(tools: CLITool[]): string {
|
|
|
612
613
|
function generatePrompts(): string {
|
|
613
614
|
return `/**
|
|
614
615
|
* Prompt registry — reads the canonical workflow prompts from
|
|
615
|
-
* @specverse/
|
|
616
|
+
* @specverse/assets/prompts/core/standard/default/ at startup and
|
|
616
617
|
* serves them as MCP prompts. Each YAML file (create, analyse, materialise,
|
|
617
618
|
* realize, behavior, app-demo) becomes one invocable prompt.
|
|
618
619
|
*/
|
|
@@ -641,8 +642,8 @@ function resolveEntitiesFile(relative: string): string {
|
|
|
641
642
|
return join(dirname(pkg), relative);
|
|
642
643
|
}
|
|
643
644
|
|
|
644
|
-
function
|
|
645
|
-
const pkg = require.resolve('@specverse/
|
|
645
|
+
function resolveAssetsDir(relative: string): string {
|
|
646
|
+
const pkg = require.resolve('@specverse/assets/package.json');
|
|
646
647
|
return join(dirname(pkg), relative);
|
|
647
648
|
}
|
|
648
649
|
|
|
@@ -659,7 +660,7 @@ const USER_FACING = new Set<string>([
|
|
|
659
660
|
]);
|
|
660
661
|
|
|
661
662
|
function loadPrompts(): Prompt[] {
|
|
662
|
-
const promptsDir =
|
|
663
|
+
const promptsDir = resolveAssetsDir('prompts/core/standard/default');
|
|
663
664
|
const entries = readdirSync(promptsDir).filter(f => f.endsWith('.prompt.yaml'));
|
|
664
665
|
const prompts: Prompt[] = [];
|
|
665
666
|
for (const entry of entries) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@specverse/engines",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.4",
|
|
4
4
|
"description": "SpecVerse toolchain — parser, inference, realize, generators, AI, registry, bundles",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"@ai-sdk/anthropic": "^3.0.71",
|
|
50
50
|
"@ai-sdk/openai-compatible": "^2.0.41",
|
|
51
51
|
"@ai-sdk/provider": "^3.0.8",
|
|
52
|
+
"@specverse/assets": "^1.0.0",
|
|
52
53
|
"@specverse/entities": "^5.1.0",
|
|
53
54
|
"@specverse/runtime": "^5.0.1",
|
|
54
55
|
"@specverse/types": "^5.1.0",
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# SpecVerse v3.3 Manifest - Simple Default Mappings Example
|
|
2
|
-
#
|
|
3
|
-
# This manifest demonstrates the simplest v3.3 approach:
|
|
4
|
-
# Using defaultMappings to specify instance factories by category.
|
|
5
|
-
#
|
|
6
|
-
# Resolution: All instances of a category use the same factory.
|
|
7
|
-
|
|
8
|
-
specVersion: "3.3.0"
|
|
9
|
-
name: "simple-api-manifest"
|
|
10
|
-
description: "Basic REST API with Fastify and PostgreSQL using default mappings"
|
|
11
|
-
version: "1.0.0"
|
|
12
|
-
|
|
13
|
-
# Link to deployment specification
|
|
14
|
-
deployment:
|
|
15
|
-
deploymentSource: "./blog-api.specly"
|
|
16
|
-
deploymentName: "production"
|
|
17
|
-
|
|
18
|
-
# Default instance factories by category (lowest priority)
|
|
19
|
-
# Fine-grained factories allow flexible composition
|
|
20
|
-
defaultMappings:
|
|
21
|
-
controller: "FastifyAPI" # Pure Fastify routes (no ORM coupling)
|
|
22
|
-
service: "PrismaORM" # Prisma ORM for data access
|
|
23
|
-
storage: "PostgreSQL15" # PostgreSQL database instance
|
|
24
|
-
|
|
25
|
-
# Capability-based mappings for cross-cutting concerns
|
|
26
|
-
capabilityMappings:
|
|
27
|
-
- capability: "validation.runtime"
|
|
28
|
-
instanceFactory: "ZodValidation"
|
|
29
|
-
|
|
30
|
-
# Global configuration applied to all instance factories
|
|
31
|
-
configuration:
|
|
32
|
-
environment: "production"
|
|
33
|
-
region: "us-east-1"
|
|
34
|
-
logging:
|
|
35
|
-
level: "info"
|
|
36
|
-
format: "json"
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# SpecVerse v3.3 Manifest - Capability Mappings Example
|
|
2
|
-
#
|
|
3
|
-
# This manifest demonstrates capability-based mapping with pattern matching.
|
|
4
|
-
# Different capabilities can be mapped to different instance factories.
|
|
5
|
-
#
|
|
6
|
-
# Resolution: Matches capability patterns with wildcard support.
|
|
7
|
-
|
|
8
|
-
specVersion: "3.3.0"
|
|
9
|
-
name: "capability-based-manifest"
|
|
10
|
-
description: "API with specialized factories for different capability patterns"
|
|
11
|
-
version: "1.0.0"
|
|
12
|
-
|
|
13
|
-
deployment:
|
|
14
|
-
deploymentSource: "./blog-api.specly"
|
|
15
|
-
deploymentName: "production"
|
|
16
|
-
|
|
17
|
-
# Default factories (used when no capability match found)
|
|
18
|
-
defaultMappings:
|
|
19
|
-
controller: "FastifyPrismaAPI"
|
|
20
|
-
storage: "PostgreSQL15"
|
|
21
|
-
|
|
22
|
-
# Capability-based mappings (medium priority)
|
|
23
|
-
# Overrides defaults when capability pattern matches
|
|
24
|
-
capabilityMappings:
|
|
25
|
-
# REST API endpoints use Fastify
|
|
26
|
-
- capability: "api.rest"
|
|
27
|
-
instanceFactory: "FastifyPrismaAPI"
|
|
28
|
-
version: "^1.0.0"
|
|
29
|
-
|
|
30
|
-
# WebSocket capabilities use specialized factory
|
|
31
|
-
- capability: "api.websocket"
|
|
32
|
-
instanceFactory: "FastifyWebSocketAPI"
|
|
33
|
-
version: "^1.0.0"
|
|
34
|
-
|
|
35
|
-
# Reporting endpoints get specialized configuration
|
|
36
|
-
- capability: "api.rest.reports"
|
|
37
|
-
instanceFactory: "ReportingAPI"
|
|
38
|
-
configuration:
|
|
39
|
-
caching: true
|
|
40
|
-
timeout: 60000
|
|
41
|
-
|
|
42
|
-
# Database storage uses PostgreSQL
|
|
43
|
-
- capability: "storage.database"
|
|
44
|
-
instanceFactory: "PostgreSQL15"
|
|
45
|
-
|
|
46
|
-
# Cache capabilities use Redis
|
|
47
|
-
- capability: "storage.cache"
|
|
48
|
-
instanceFactory: "Redis7"
|
|
49
|
-
|
|
50
|
-
# Validation uses Zod
|
|
51
|
-
- capability: "validation.runtime"
|
|
52
|
-
instanceFactory: "ZodValidation"
|
|
53
|
-
|
|
54
|
-
configuration:
|
|
55
|
-
environment: "production"
|