@vibe-agent-toolkit/agent-config 0.1.0-rc.10
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/README.md +71 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/loader/manifest-loader.d.ts +21 -0
- package/dist/loader/manifest-loader.d.ts.map +1 -0
- package/dist/loader/manifest-loader.js +79 -0
- package/dist/loader/manifest-loader.js.map +1 -0
- package/dist/validator/agent-validator.d.ts +19 -0
- package/dist/validator/agent-validator.d.ts.map +1 -0
- package/dist/validator/agent-validator.js +148 -0
- package/dist/validator/agent-validator.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# @vibe-agent-toolkit/agent-config
|
|
2
|
+
|
|
3
|
+
Agent manifest loading and validation for vibe-agent-toolkit.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Load and validate agent manifests (using `@vibe-agent-toolkit/agent-schema`)
|
|
8
|
+
- Validate tool prerequisites (RAG databases exist, etc.)
|
|
9
|
+
- Validate resource file existence (prompts, docs, templates)
|
|
10
|
+
- Foundation for future agent execution (no LLM integration in this phase)
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
bun add @vibe-agent-toolkit/agent-config
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
### Loading an Agent
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { loadAgentManifest } from '@vibe-agent-toolkit/agent-config';
|
|
24
|
+
|
|
25
|
+
const manifest = await loadAgentManifest('./agent.yaml');
|
|
26
|
+
console.log(`Loaded: ${manifest.metadata.name} v${manifest.metadata.version}`);
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Validating an Agent
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { validateAgent } from '@vibe-agent-toolkit/agent-config';
|
|
33
|
+
|
|
34
|
+
const result = await validateAgent('./agent.yaml');
|
|
35
|
+
|
|
36
|
+
if (result.valid) {
|
|
37
|
+
console.log('✅ Agent is valid');
|
|
38
|
+
} else {
|
|
39
|
+
console.error('❌ Validation errors:', result.errors);
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## API
|
|
44
|
+
|
|
45
|
+
### `loadAgentManifest(path: string): Promise<LoadedAgentManifest>`
|
|
46
|
+
|
|
47
|
+
Load and parse agent manifest from file.
|
|
48
|
+
|
|
49
|
+
**Parameters**:
|
|
50
|
+
- `path` - Path to agent.yaml or agent directory
|
|
51
|
+
|
|
52
|
+
**Returns**: Validated agent manifest with `__manifestPath` property
|
|
53
|
+
|
|
54
|
+
**Throws**: Error if file not found or invalid
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
### `validateAgent(path: string): Promise<ValidationResult>`
|
|
59
|
+
|
|
60
|
+
Validate agent manifest and check prerequisites.
|
|
61
|
+
|
|
62
|
+
**Parameters**:
|
|
63
|
+
- `path` - Path to agent.yaml or agent directory
|
|
64
|
+
|
|
65
|
+
**Returns**: Validation result with errors/warnings
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## License
|
|
70
|
+
|
|
71
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent manifest loading and validation
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
export type { AgentManifest, AgentMetadata, AgentSpec, LLMConfig, Tool, } from '@vibe-agent-toolkit/agent-schema';
|
|
6
|
+
export { findManifestPath, loadAgentManifest, type LoadedAgentManifest, } from './loader/manifest-loader.js';
|
|
7
|
+
export { validateAgent, type ValidationResult, } from './validator/agent-validator.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,aAAa,EACb,aAAa,EACb,SAAS,EACT,SAAS,EACT,IAAI,GACL,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,gCAAgC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent manifest loading and validation
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
// Loader
|
|
6
|
+
export { findManifestPath, loadAgentManifest, } from './loader/manifest-loader.js';
|
|
7
|
+
// Validator
|
|
8
|
+
export { validateAgent, } from './validator/agent-validator.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,SAAS;AACT,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,6BAA6B,CAAC;AAErC,YAAY;AACZ,OAAO,EACL,aAAa,GAEd,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type AgentManifest } from '@vibe-agent-toolkit/agent-schema';
|
|
2
|
+
export interface LoadedAgentManifest extends AgentManifest {
|
|
3
|
+
/**
|
|
4
|
+
* Absolute path to the manifest file
|
|
5
|
+
* Added by loader for reference
|
|
6
|
+
*/
|
|
7
|
+
__manifestPath: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Find agent manifest file from path argument
|
|
11
|
+
* Supports:
|
|
12
|
+
* - Direct path to manifest (agent.yaml, agent.yml)
|
|
13
|
+
* - Directory containing manifest
|
|
14
|
+
*/
|
|
15
|
+
export declare function findManifestPath(pathArg: string): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Load and validate agent manifest from file
|
|
18
|
+
* Returns manifest with additional __manifestPath property
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadAgentManifest(pathArg: string): Promise<LoadedAgentManifest>;
|
|
21
|
+
//# sourceMappingURL=manifest-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-loader.d.ts","sourceRoot":"","sources":["../../src/loader/manifest-loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAG3F,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BvE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuCrF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { AgentManifestSchema } from '@vibe-agent-toolkit/agent-schema';
|
|
4
|
+
import { parse as parseYaml } from 'yaml';
|
|
5
|
+
/**
|
|
6
|
+
* Find agent manifest file from path argument
|
|
7
|
+
* Supports:
|
|
8
|
+
* - Direct path to manifest (agent.yaml, agent.yml)
|
|
9
|
+
* - Directory containing manifest
|
|
10
|
+
*/
|
|
11
|
+
export async function findManifestPath(pathArg) {
|
|
12
|
+
const absolutePath = path.resolve(process.cwd(), pathArg);
|
|
13
|
+
// Check if it's a direct file reference
|
|
14
|
+
if (pathArg.endsWith('.yaml') || pathArg.endsWith('.yml')) {
|
|
15
|
+
try {
|
|
16
|
+
await fs.access(absolutePath);
|
|
17
|
+
return absolutePath;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error(`Manifest file not found: ${absolutePath}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Assume it's a directory - search for manifest
|
|
24
|
+
const candidates = [
|
|
25
|
+
path.join(absolutePath, 'agent.yaml'),
|
|
26
|
+
path.join(absolutePath, 'agent.yml'),
|
|
27
|
+
];
|
|
28
|
+
for (const candidate of candidates) {
|
|
29
|
+
try {
|
|
30
|
+
await fs.access(candidate);
|
|
31
|
+
return candidate;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Continue to next candidate
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`No agent manifest found in ${absolutePath}. Expected agent.yaml or agent.yml`);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Load and validate agent manifest from file
|
|
41
|
+
* Returns manifest with additional __manifestPath property
|
|
42
|
+
*/
|
|
43
|
+
export async function loadAgentManifest(pathArg) {
|
|
44
|
+
try {
|
|
45
|
+
// Find manifest file
|
|
46
|
+
const manifestPath = await findManifestPath(pathArg);
|
|
47
|
+
// Read file (manifestPath validated by findManifestPath)
|
|
48
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Path validated above
|
|
49
|
+
const content = await fs.readFile(manifestPath, 'utf-8');
|
|
50
|
+
// Parse YAML
|
|
51
|
+
let data;
|
|
52
|
+
try {
|
|
53
|
+
data = parseYaml(content);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw new Error(`Failed to parse YAML: ${error instanceof Error ? error.message : 'unknown error'}`);
|
|
57
|
+
}
|
|
58
|
+
// Validate schema
|
|
59
|
+
const result = AgentManifestSchema.safeParse(data);
|
|
60
|
+
if (!result.success) {
|
|
61
|
+
const errors = result.error.errors
|
|
62
|
+
.map(err => ` - ${err.path.join('.')}: ${err.message}`)
|
|
63
|
+
.join('\n');
|
|
64
|
+
throw new Error(`Agent manifest validation failed:\n${errors}`);
|
|
65
|
+
}
|
|
66
|
+
// Add manifest path to result
|
|
67
|
+
return {
|
|
68
|
+
...result.data,
|
|
69
|
+
__manifestPath: manifestPath,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (error instanceof Error) {
|
|
74
|
+
throw new Error(`Failed to load agent manifest from ${pathArg}: ${error.message}`);
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=manifest-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-loader.js","sourceRoot":"","sources":["../../src/loader/manifest-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ValidationResult {
|
|
2
|
+
valid: boolean;
|
|
3
|
+
errors: string[];
|
|
4
|
+
warnings: string[];
|
|
5
|
+
manifest: {
|
|
6
|
+
name: string;
|
|
7
|
+
version: string;
|
|
8
|
+
path: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Validate agent manifest and check prerequisites
|
|
13
|
+
* Performs:
|
|
14
|
+
* - Schema validation (via loader)
|
|
15
|
+
* - Tool configuration checks (RAG databases, etc.)
|
|
16
|
+
* - Resource file existence checks
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateAgent(pathArg: string): Promise<ValidationResult>;
|
|
19
|
+
//# sourceMappingURL=agent-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-validator.d.ts","sourceRoot":"","sources":["../../src/validator/agent-validator.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+C9E"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { loadAgentManifest } from '../loader/manifest-loader.js';
|
|
4
|
+
/**
|
|
5
|
+
* Validate agent manifest and check prerequisites
|
|
6
|
+
* Performs:
|
|
7
|
+
* - Schema validation (via loader)
|
|
8
|
+
* - Tool configuration checks (RAG databases, etc.)
|
|
9
|
+
* - Resource file existence checks
|
|
10
|
+
*/
|
|
11
|
+
export async function validateAgent(pathArg) {
|
|
12
|
+
const errors = [];
|
|
13
|
+
const warnings = [];
|
|
14
|
+
try {
|
|
15
|
+
// Load and validate schema
|
|
16
|
+
const manifest = await loadAgentManifest(pathArg);
|
|
17
|
+
const agentDir = path.dirname(manifest.__manifestPath);
|
|
18
|
+
// Validate RAG configuration
|
|
19
|
+
if (manifest.spec.rag) {
|
|
20
|
+
await validateRAGConfig(manifest, agentDir, errors, warnings);
|
|
21
|
+
}
|
|
22
|
+
// Validate resource files
|
|
23
|
+
if (manifest.spec.resources) {
|
|
24
|
+
await validateResources(manifest, agentDir, errors, warnings);
|
|
25
|
+
}
|
|
26
|
+
// Validate prompt references
|
|
27
|
+
if (manifest.spec.prompts) {
|
|
28
|
+
await validatePrompts(manifest, agentDir, errors, warnings);
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
valid: errors.length === 0,
|
|
32
|
+
errors,
|
|
33
|
+
warnings,
|
|
34
|
+
manifest: {
|
|
35
|
+
name: manifest.metadata.name,
|
|
36
|
+
version: manifest.metadata.version ?? 'unknown',
|
|
37
|
+
path: manifest.__manifestPath,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
// Schema validation or file loading failed
|
|
43
|
+
return {
|
|
44
|
+
valid: false,
|
|
45
|
+
errors: [error instanceof Error ? error.message : 'Unknown validation error'],
|
|
46
|
+
warnings: [],
|
|
47
|
+
manifest: {
|
|
48
|
+
name: 'unknown',
|
|
49
|
+
version: 'unknown',
|
|
50
|
+
path: pathArg,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validate RAG configuration
|
|
57
|
+
*/
|
|
58
|
+
async function validateRAGConfig(manifest, agentDir, errors, warnings) {
|
|
59
|
+
// Check if RAG database exists
|
|
60
|
+
// Default location is .rag-db in agent directory
|
|
61
|
+
const ragDbPath = path.join(agentDir, '.rag-db');
|
|
62
|
+
try {
|
|
63
|
+
await fs.access(ragDbPath);
|
|
64
|
+
// Database exists - good!
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
errors.push(`RAG database not found: ${ragDbPath}. Run 'vat rag index' to create database.`);
|
|
68
|
+
}
|
|
69
|
+
// Warn if no RAG sources defined
|
|
70
|
+
if (manifest.spec.rag) {
|
|
71
|
+
const ragConfigs = Object.values(manifest.spec.rag);
|
|
72
|
+
const hasSources = ragConfigs.some(config => config.sources);
|
|
73
|
+
if (!hasSources) {
|
|
74
|
+
warnings.push('RAG configuration defined but no sources specified');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Validate resource files exist
|
|
80
|
+
*/
|
|
81
|
+
async function validateResources(manifest, agentDir, errors, _warnings) {
|
|
82
|
+
if (!manifest.spec.resources)
|
|
83
|
+
return;
|
|
84
|
+
for (const [resourceId, resource] of Object.entries(manifest.spec.resources)) {
|
|
85
|
+
// Resource can be either a Resource object or a nested record of Resource objects
|
|
86
|
+
if ('path' in resource && typeof resource.path === 'string') {
|
|
87
|
+
await validateSingleResource(agentDir, resourceId, resource.path, errors);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
await validateNestedResources(agentDir, resourceId, resource, errors);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Validate a single resource file
|
|
96
|
+
*/
|
|
97
|
+
async function validateSingleResource(agentDir, resourceId, resourcePath, errors) {
|
|
98
|
+
const fullPath = path.resolve(agentDir, resourcePath);
|
|
99
|
+
try {
|
|
100
|
+
await fs.access(fullPath);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
errors.push(`Resource '${resourceId}' not found: ${resourcePath}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Validate nested resource files
|
|
108
|
+
*/
|
|
109
|
+
async function validateNestedResources(agentDir, resourceId, resourceRecord, errors) {
|
|
110
|
+
for (const [nestedId, nestedResource] of Object.entries(resourceRecord)) {
|
|
111
|
+
if (typeof nestedResource !== 'object' || !nestedResource || !('path' in nestedResource)) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const resourcePath = path.resolve(agentDir, nestedResource.path);
|
|
115
|
+
try {
|
|
116
|
+
await fs.access(resourcePath);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
errors.push(`Resource '${resourceId}.${nestedId}' not found: ${nestedResource.path}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validate prompt files exist
|
|
125
|
+
*/
|
|
126
|
+
async function validatePrompts(manifest, agentDir, errors, _warnings) {
|
|
127
|
+
if (!manifest.spec.prompts)
|
|
128
|
+
return;
|
|
129
|
+
if (manifest.spec.prompts.system) {
|
|
130
|
+
const systemPath = path.resolve(agentDir, manifest.spec.prompts.system.$ref);
|
|
131
|
+
try {
|
|
132
|
+
await fs.access(systemPath);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
errors.push(`System prompt not found: ${manifest.spec.prompts.system.$ref}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (manifest.spec.prompts.user) {
|
|
139
|
+
const userPath = path.resolve(agentDir, manifest.spec.prompts.user.$ref);
|
|
140
|
+
try {
|
|
141
|
+
await fs.access(userPath);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
errors.push(`User prompt not found: ${manifest.spec.prompts.user.$ref}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=agent-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-validator.js","sourceRoot":"","sources":["../../src/validator/agent-validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vibe-agent-toolkit/agent-config",
|
|
3
|
+
"version": "0.1.0-rc.10",
|
|
4
|
+
"description": "Agent manifest loading and validation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc --build",
|
|
20
|
+
"build:watch": "tsc --build --watch",
|
|
21
|
+
"clean": "rm -rf dist",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest watch",
|
|
24
|
+
"test:coverage": "vitest run --coverage",
|
|
25
|
+
"typecheck": "tsc --noEmit"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@vibe-agent-toolkit/agent-schema": "0.1.0-rc.10",
|
|
29
|
+
"@vibe-agent-toolkit/utils": "0.1.0-rc.10",
|
|
30
|
+
"@vibe-agent-toolkit/rag": "0.1.0-rc.10",
|
|
31
|
+
"yaml": "^2.3.4"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^22.0.0",
|
|
35
|
+
"typescript": "~5.7.2",
|
|
36
|
+
"vitest": "^3.0.3"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"ai",
|
|
40
|
+
"agent",
|
|
41
|
+
"config",
|
|
42
|
+
"validation",
|
|
43
|
+
"manifest"
|
|
44
|
+
],
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "https://github.com/jdutton/vibe-agent-toolkit.git"
|
|
48
|
+
}
|
|
49
|
+
}
|