@dcyfr/ai 1.0.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/CHANGELOG.md +91 -0
- package/LICENSE +21 -0
- package/README.md +210 -0
- package/bin/cli.js +249 -0
- package/bin/dcyfr-ai.js +376 -0
- package/config/default.json +123 -0
- package/config/default.yaml +161 -0
- package/config/minimal.yaml +16 -0
- package/dist/ai/config/loader.d.ts +91 -0
- package/dist/ai/config/loader.d.ts.map +1 -0
- package/dist/ai/config/loader.js +259 -0
- package/dist/ai/config/loader.js.map +1 -0
- package/dist/ai/config/schema.d.ts +854 -0
- package/dist/ai/config/schema.d.ts.map +1 -0
- package/dist/ai/config/schema.js +260 -0
- package/dist/ai/config/schema.js.map +1 -0
- package/dist/ai/core/provider-registry.d.ts +115 -0
- package/dist/ai/core/provider-registry.d.ts.map +1 -0
- package/dist/ai/core/provider-registry.js +360 -0
- package/dist/ai/core/provider-registry.js.map +1 -0
- package/dist/ai/core/telemetry-engine.d.ts +114 -0
- package/dist/ai/core/telemetry-engine.d.ts.map +1 -0
- package/dist/ai/core/telemetry-engine.js +390 -0
- package/dist/ai/core/telemetry-engine.js.map +1 -0
- package/dist/ai/index.d.ts +17 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +21 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/plugins/plugin-loader.d.ts +132 -0
- package/dist/ai/plugins/plugin-loader.d.ts.map +1 -0
- package/dist/ai/plugins/plugin-loader.js +316 -0
- package/dist/ai/plugins/plugin-loader.js.map +1 -0
- package/dist/ai/types/index.d.ts +179 -0
- package/dist/ai/types/index.d.ts.map +1 -0
- package/dist/ai/types/index.js +11 -0
- package/dist/ai/types/index.js.map +1 -0
- package/dist/ai/types/telemetry.d.ts +117 -0
- package/dist/ai/types/telemetry.d.ts.map +1 -0
- package/dist/ai/types/telemetry.js +6 -0
- package/dist/ai/types/telemetry.js.map +1 -0
- package/dist/ai/utils/storage.d.ts +37 -0
- package/dist/ai/utils/storage.d.ts.map +1 -0
- package/dist/ai/utils/storage.js +129 -0
- package/dist/ai/utils/storage.js.map +1 -0
- package/dist/ai/validation/validation-framework.d.ts +112 -0
- package/dist/ai/validation/validation-framework.d.ts.map +1 -0
- package/dist/ai/validation/validation-framework.js +221 -0
- package/dist/ai/validation/validation-framework.js.map +1 -0
- package/package.json +67 -0
package/bin/dcyfr-ai.js
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* DCYFR AI Framework CLI
|
|
5
|
+
* Extended tool for initialization, validation, and management
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { ConfigLoader } from '../dist/ai/config/loader.js';
|
|
9
|
+
import { FrameworkConfigSchema, DEFAULT_CONFIG } from '../dist/ai/config/schema.js';
|
|
10
|
+
import { existsSync, writeFileSync, mkdirSync } from 'fs';
|
|
11
|
+
import { join, dirname } from 'path';
|
|
12
|
+
import { fileURLToPath } from 'url';
|
|
13
|
+
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = dirname(__filename);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Parse command line arguments
|
|
19
|
+
*/
|
|
20
|
+
function parseArgs() {
|
|
21
|
+
const args = process.argv.slice(2);
|
|
22
|
+
const command = args[0] || 'help';
|
|
23
|
+
const flags = {};
|
|
24
|
+
const positional = [];
|
|
25
|
+
|
|
26
|
+
for (let i = 1; i < args.length; i++) {
|
|
27
|
+
const arg = args[i];
|
|
28
|
+
|
|
29
|
+
if (arg.startsWith('--')) {
|
|
30
|
+
const [key, value] = arg.substring(2).split('=');
|
|
31
|
+
flags[key] = value !== undefined ? value : args[i + 1];
|
|
32
|
+
if (value === undefined && args[i + 1] && !args[i + 1].startsWith('-')) {
|
|
33
|
+
i++; // Skip next arg if it was used as value
|
|
34
|
+
}
|
|
35
|
+
} else if (arg.startsWith('-')) {
|
|
36
|
+
flags[arg.substring(1)] = true;
|
|
37
|
+
} else {
|
|
38
|
+
positional.push(arg);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return { command, args: positional, flags };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Initialize new project
|
|
47
|
+
*/
|
|
48
|
+
async function initProject(options) {
|
|
49
|
+
const name = options.flags.name || 'my-app';
|
|
50
|
+
const type = options.flags.type || 'vanilla';
|
|
51
|
+
|
|
52
|
+
console.log(`🚀 Initializing ${type} project: ${name}\n`);
|
|
53
|
+
|
|
54
|
+
// Create package.json
|
|
55
|
+
const packageJson = {
|
|
56
|
+
name,
|
|
57
|
+
version: '1.0.0',
|
|
58
|
+
description: `${name} - powered by @dcyfr/ai`,
|
|
59
|
+
type: 'module',
|
|
60
|
+
scripts: {
|
|
61
|
+
validate: 'dcyfr-ai validate',
|
|
62
|
+
report: 'dcyfr-ai report',
|
|
63
|
+
},
|
|
64
|
+
dependencies: {
|
|
65
|
+
'@dcyfr/ai': '^1.0.0',
|
|
66
|
+
},
|
|
67
|
+
dcyfr: {
|
|
68
|
+
version: '1.0.0',
|
|
69
|
+
projectName: name,
|
|
70
|
+
telemetry: {
|
|
71
|
+
enabled: true,
|
|
72
|
+
storage: 'file',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
if (!existsSync('package.json')) {
|
|
78
|
+
writeFileSync('package.json', JSON.stringify(packageJson, null, 2));
|
|
79
|
+
console.log('✅ Created package.json');
|
|
80
|
+
} else {
|
|
81
|
+
console.log('ℹ️ package.json already exists, skipping');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Create config file
|
|
85
|
+
await initConfig(options);
|
|
86
|
+
|
|
87
|
+
console.log('\n✨ Project initialized!');
|
|
88
|
+
console.log('\nNext steps:');
|
|
89
|
+
console.log(' 1. npm install');
|
|
90
|
+
console.log(' 2. dcyfr-ai config:validate');
|
|
91
|
+
console.log(' 3. dcyfr-ai validate\n');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Initialize configuration file
|
|
96
|
+
*/
|
|
97
|
+
async function initConfig(options) {
|
|
98
|
+
const format = options.flags.format || 'yaml';
|
|
99
|
+
const minimal = options.flags.minimal;
|
|
100
|
+
const outputPath = options.flags.output || (format === 'json' ? '.dcyfr.json' : '.dcyfr.yaml');
|
|
101
|
+
|
|
102
|
+
console.log(`📝 Creating ${outputPath}...\n`);
|
|
103
|
+
|
|
104
|
+
if (existsSync(outputPath)) {
|
|
105
|
+
console.log(`❌ File ${outputPath} already exists`);
|
|
106
|
+
console.log(' Use --output to specify different file');
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Load templates
|
|
111
|
+
const templateDir = join(__dirname, '..', 'config');
|
|
112
|
+
const templateFile = minimal
|
|
113
|
+
? `minimal.${format}`
|
|
114
|
+
: `default.${format}`;
|
|
115
|
+
const templatePath = join(templateDir, templateFile);
|
|
116
|
+
|
|
117
|
+
try {
|
|
118
|
+
const { readFileSync } = await import('fs');
|
|
119
|
+
const template = readFileSync(templatePath, 'utf-8');
|
|
120
|
+
writeFileSync(outputPath, template);
|
|
121
|
+
console.log(`✅ Created ${outputPath}`);
|
|
122
|
+
} catch (error) {
|
|
123
|
+
console.error(`❌ Failed to create config: ${error.message}`);
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Validate configuration
|
|
130
|
+
*/
|
|
131
|
+
async function validateConfig(options) {
|
|
132
|
+
console.log('🔍 Validating DCYFR configuration...\n');
|
|
133
|
+
|
|
134
|
+
const projectRoot = options.flags.root || process.cwd();
|
|
135
|
+
const configFile = options.flags.config;
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
const loader = new ConfigLoader({
|
|
139
|
+
projectRoot,
|
|
140
|
+
configFile,
|
|
141
|
+
enableEnvOverrides: true,
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const config = await loader.load();
|
|
145
|
+
const validated = FrameworkConfigSchema.parse(config);
|
|
146
|
+
|
|
147
|
+
console.log('✅ Configuration is valid!\n');
|
|
148
|
+
console.log(`📋 Project: ${validated.projectName}`);
|
|
149
|
+
console.log(`📁 Version: ${validated.version}`);
|
|
150
|
+
console.log(`📊 Telemetry: ${validated.telemetry.enabled ? 'enabled' : 'disabled'}`);
|
|
151
|
+
console.log(`🔌 Providers: ${validated.providers.enabled ? 'enabled' : 'disabled'}`);
|
|
152
|
+
console.log(`✓ Validation: ${validated.validation.enabled ? 'enabled' : 'disabled'}`);
|
|
153
|
+
|
|
154
|
+
if (options.flags.verbose || options.flags.v) {
|
|
155
|
+
console.log('\n📄 Full Configuration:');
|
|
156
|
+
console.log(JSON.stringify(validated, null, 2));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
} catch (error) {
|
|
160
|
+
console.error('❌ Configuration validation failed:\n');
|
|
161
|
+
console.error(error.message);
|
|
162
|
+
|
|
163
|
+
if (error.errors) {
|
|
164
|
+
console.error('\nValidation errors:');
|
|
165
|
+
error.errors.forEach(err => {
|
|
166
|
+
console.error(` - ${err.path.join('.')}: ${err.message}`);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Show configuration schema
|
|
176
|
+
*/
|
|
177
|
+
function showSchema() {
|
|
178
|
+
console.log('📋 DCYFR Configuration Schema\n');
|
|
179
|
+
console.log(JSON.stringify(DEFAULT_CONFIG, null, 2));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Create plugin template
|
|
184
|
+
*/
|
|
185
|
+
async function createPlugin(options) {
|
|
186
|
+
const name = options.flags.name;
|
|
187
|
+
|
|
188
|
+
if (!name) {
|
|
189
|
+
console.error('❌ Plugin name is required');
|
|
190
|
+
console.log('Usage: dcyfr-ai plugin:create --name <name>');
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const outputDir = options.flags.output || 'plugins';
|
|
195
|
+
const pluginFile = `${name}.ts`;
|
|
196
|
+
const outputPath = join(outputDir, pluginFile);
|
|
197
|
+
|
|
198
|
+
// Create directory
|
|
199
|
+
if (!existsSync(outputDir)) {
|
|
200
|
+
mkdirSync(outputDir, { recursive: true });
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const pluginTemplate = `/**
|
|
204
|
+
* ${name} Plugin
|
|
205
|
+
*
|
|
206
|
+
* Custom validation plugin for @dcyfr/ai framework
|
|
207
|
+
*/
|
|
208
|
+
|
|
209
|
+
import type { Plugin, ValidationContext, ValidationResult } from '@dcyfr/ai';
|
|
210
|
+
|
|
211
|
+
export const ${toCamelCase(name)}: Plugin = {
|
|
212
|
+
manifest: {
|
|
213
|
+
name: '${name}',
|
|
214
|
+
version: '1.0.0',
|
|
215
|
+
description: 'Custom validation plugin',
|
|
216
|
+
author: 'Your Name',
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
async onLoad() {
|
|
220
|
+
console.log('${name} plugin loaded');
|
|
221
|
+
},
|
|
222
|
+
|
|
223
|
+
async onValidate(context: ValidationContext): Promise<ValidationResult> {
|
|
224
|
+
const violations = [];
|
|
225
|
+
const warnings = [];
|
|
226
|
+
|
|
227
|
+
console.log(\`Validating \${context.files.length} files...\`);
|
|
228
|
+
|
|
229
|
+
// TODO: Implement your validation logic here
|
|
230
|
+
for (const file of context.files) {
|
|
231
|
+
// Check something about the file
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return {
|
|
235
|
+
valid: violations.length === 0,
|
|
236
|
+
violations,
|
|
237
|
+
warnings,
|
|
238
|
+
metadata: {
|
|
239
|
+
filesChecked: context.files.length,
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
async onComplete() {
|
|
245
|
+
console.log('${name} plugin validation complete');
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
`;
|
|
249
|
+
|
|
250
|
+
writeFileSync(outputPath, pluginTemplate);
|
|
251
|
+
|
|
252
|
+
console.log(`✅ Plugin created: ${outputPath}`);
|
|
253
|
+
console.log('\nNext steps:');
|
|
254
|
+
console.log(` 1. Edit ${outputPath} to implement validation logic`);
|
|
255
|
+
console.log(' 2. Import and load the plugin in your validation script\n');
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Show help
|
|
260
|
+
*/
|
|
261
|
+
function showHelp() {
|
|
262
|
+
console.log(`
|
|
263
|
+
@dcyfr/ai CLI - AI Agent Framework
|
|
264
|
+
|
|
265
|
+
USAGE:
|
|
266
|
+
dcyfr-ai <command> [options]
|
|
267
|
+
|
|
268
|
+
COMMANDS:
|
|
269
|
+
init Initialize new project with @dcyfr/ai
|
|
270
|
+
config:init Create a new configuration file
|
|
271
|
+
config:validate Validate current configuration
|
|
272
|
+
config:schema Show configuration schema
|
|
273
|
+
plugin:create Create a new plugin template
|
|
274
|
+
validate Run validation checks
|
|
275
|
+
test Alias for validate
|
|
276
|
+
report Generate telemetry report
|
|
277
|
+
help Show this help message
|
|
278
|
+
|
|
279
|
+
INIT OPTIONS:
|
|
280
|
+
--name <name> Project name
|
|
281
|
+
--type <type> Project type (nextjs, express, vanilla) [default: vanilla]
|
|
282
|
+
|
|
283
|
+
CONFIG:INIT OPTIONS:
|
|
284
|
+
--format <type> Configuration format (yaml, json) [default: yaml]
|
|
285
|
+
--minimal Generate minimal configuration
|
|
286
|
+
--output <path> Output file path [default: .dcyfr.yaml]
|
|
287
|
+
|
|
288
|
+
CONFIG:VALIDATE OPTIONS:
|
|
289
|
+
--verbose, -v Show full configuration
|
|
290
|
+
--config <path> Path to config file
|
|
291
|
+
--root <path> Project root directory
|
|
292
|
+
|
|
293
|
+
PLUGIN:CREATE OPTIONS:
|
|
294
|
+
--name <name> Plugin name (required)
|
|
295
|
+
--output <path> Output directory [default: plugins]
|
|
296
|
+
|
|
297
|
+
VALIDATE OPTIONS:
|
|
298
|
+
--config <path> Path to config file
|
|
299
|
+
--files <glob> File pattern to validate [default: src/**/*.ts]
|
|
300
|
+
|
|
301
|
+
REPORT OPTIONS:
|
|
302
|
+
--period <time> Time period (7d, 30d, 90d) [default: 30d]
|
|
303
|
+
--agent <name> Filter by agent
|
|
304
|
+
|
|
305
|
+
EXAMPLES:
|
|
306
|
+
dcyfr-ai init --name my-app --type nextjs
|
|
307
|
+
dcyfr-ai config:init
|
|
308
|
+
dcyfr-ai config:validate --verbose
|
|
309
|
+
dcyfr-ai plugin:create --name my-validator
|
|
310
|
+
dcyfr-ai validate --files "src/**/*.{ts,tsx}"
|
|
311
|
+
dcyfr-ai report --period 7d --agent claude
|
|
312
|
+
|
|
313
|
+
For more information, visit: https://github.com/dcyfr/dcyfr-ai
|
|
314
|
+
`);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Utility: Convert to camelCase
|
|
319
|
+
*/
|
|
320
|
+
function toCamelCase(str) {
|
|
321
|
+
return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Main CLI handler
|
|
326
|
+
*/
|
|
327
|
+
async function main() {
|
|
328
|
+
const options = parseArgs();
|
|
329
|
+
const { command } = options;
|
|
330
|
+
|
|
331
|
+
try {
|
|
332
|
+
switch (command) {
|
|
333
|
+
case 'init':
|
|
334
|
+
await initProject(options);
|
|
335
|
+
break;
|
|
336
|
+
case 'config:init':
|
|
337
|
+
await initConfig(options);
|
|
338
|
+
break;
|
|
339
|
+
case 'config:validate':
|
|
340
|
+
await validateConfig(options);
|
|
341
|
+
break;
|
|
342
|
+
case 'config:schema':
|
|
343
|
+
showSchema();
|
|
344
|
+
break;
|
|
345
|
+
case 'plugin:create':
|
|
346
|
+
await createPlugin(options);
|
|
347
|
+
break;
|
|
348
|
+
case 'validate':
|
|
349
|
+
case 'test':
|
|
350
|
+
console.log('🔍 Validation runner');
|
|
351
|
+
console.log('ℹ️ Use PluginLoader and ValidationFramework in your code');
|
|
352
|
+
console.log('See: https://github.com/dcyfr/dcyfr-ai/blob/main/docs/GETTING-STARTED.md\n');
|
|
353
|
+
break;
|
|
354
|
+
case 'report':
|
|
355
|
+
console.log('📊 Telemetry report generator');
|
|
356
|
+
console.log('ℹ️ Use TelemetryEngine API to generate reports');
|
|
357
|
+
console.log('See: https://github.com/dcyfr/dcyfr-ai/blob/main/examples/standalone-nextjs/scripts/telemetry-report.js\n');
|
|
358
|
+
break;
|
|
359
|
+
case 'help':
|
|
360
|
+
case '--help':
|
|
361
|
+
case '-h':
|
|
362
|
+
showHelp();
|
|
363
|
+
break;
|
|
364
|
+
default:
|
|
365
|
+
console.error(`❌ Unknown command: ${command}`);
|
|
366
|
+
console.log('Run "dcyfr-ai help" for usage information.');
|
|
367
|
+
process.exit(1);
|
|
368
|
+
}
|
|
369
|
+
} catch (error) {
|
|
370
|
+
console.error(`❌ Error: ${error.message}`);
|
|
371
|
+
process.exit(1);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Run CLI
|
|
376
|
+
main();
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://dcyfr.ai/schema/config.json",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"projectName": "my-app",
|
|
5
|
+
"telemetry": {
|
|
6
|
+
"enabled": true,
|
|
7
|
+
"storage": "file",
|
|
8
|
+
"storagePath": ".dcyfr/telemetry",
|
|
9
|
+
"retentionDays": 30,
|
|
10
|
+
"sampling": 1.0
|
|
11
|
+
},
|
|
12
|
+
"providers": {
|
|
13
|
+
"enabled": true,
|
|
14
|
+
"primary": "claude",
|
|
15
|
+
"fallback": ["groq", "ollama", "copilot"],
|
|
16
|
+
"timeout": 30000,
|
|
17
|
+
"retries": 3,
|
|
18
|
+
"providers": {
|
|
19
|
+
"claude": {
|
|
20
|
+
"enabled": true,
|
|
21
|
+
"model": "claude-3-5-sonnet-20241022",
|
|
22
|
+
"maxTokens": 8192
|
|
23
|
+
},
|
|
24
|
+
"groq": {
|
|
25
|
+
"enabled": true,
|
|
26
|
+
"model": "llama-3.3-70b-versatile"
|
|
27
|
+
},
|
|
28
|
+
"ollama": {
|
|
29
|
+
"enabled": true,
|
|
30
|
+
"baseUrl": "http://localhost:11434",
|
|
31
|
+
"model": "llama3.2"
|
|
32
|
+
},
|
|
33
|
+
"copilot": {
|
|
34
|
+
"enabled": true
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"validation": {
|
|
39
|
+
"enabled": true,
|
|
40
|
+
"parallel": true,
|
|
41
|
+
"failFast": false,
|
|
42
|
+
"gates": [
|
|
43
|
+
{
|
|
44
|
+
"name": "typescript",
|
|
45
|
+
"plugins": ["typescript-compiler"],
|
|
46
|
+
"required": true,
|
|
47
|
+
"failureMode": "error"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "linting",
|
|
51
|
+
"plugins": ["eslint"],
|
|
52
|
+
"required": true,
|
|
53
|
+
"failureMode": "error"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "testing",
|
|
57
|
+
"plugins": ["vitest"],
|
|
58
|
+
"required": false,
|
|
59
|
+
"failureMode": "warn"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
"plugins": [
|
|
64
|
+
{
|
|
65
|
+
"name": "typescript-compiler",
|
|
66
|
+
"enabled": true,
|
|
67
|
+
"timeout": 30000,
|
|
68
|
+
"failureMode": "error"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "eslint",
|
|
72
|
+
"enabled": true,
|
|
73
|
+
"timeout": 15000,
|
|
74
|
+
"failureMode": "warn"
|
|
75
|
+
}
|
|
76
|
+
],
|
|
77
|
+
"agents": {
|
|
78
|
+
"designTokens": {
|
|
79
|
+
"enabled": true,
|
|
80
|
+
"tokenFile": "src/lib/design-tokens.ts",
|
|
81
|
+
"compliance": 0.90,
|
|
82
|
+
"autofix": false,
|
|
83
|
+
"strictMode": true,
|
|
84
|
+
"patterns": {
|
|
85
|
+
"spacing": ["SPACING.XS", "SPACING.SM", "SPACING.MD", "SPACING.LG", "SPACING.XL"],
|
|
86
|
+
"typography": ["TYPOGRAPHY.H1", "TYPOGRAPHY.H2", "TYPOGRAPHY.BODY"],
|
|
87
|
+
"colors": ["SEMANTIC_COLORS.primary", "SEMANTIC_COLORS.success"]
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"barrelExports": {
|
|
91
|
+
"enabled": true,
|
|
92
|
+
"barrelPaths": ["@/components", "@/lib", "@/utils"],
|
|
93
|
+
"allowRelativeWithin": false,
|
|
94
|
+
"strictMode": true,
|
|
95
|
+
"exceptions": ["src/app/**/layout.tsx", "src/app/**/page.tsx"]
|
|
96
|
+
},
|
|
97
|
+
"pageLayout": {
|
|
98
|
+
"enabled": true,
|
|
99
|
+
"targetUsage": 0.90,
|
|
100
|
+
"pagePattern": "src/app/**/page.tsx",
|
|
101
|
+
"exceptions": ["ArticleLayout", "ArchiveLayout", "ErrorLayout"],
|
|
102
|
+
"strictMode": true
|
|
103
|
+
},
|
|
104
|
+
"testData": {
|
|
105
|
+
"enabled": true,
|
|
106
|
+
"testPattern": "**/*.{test,spec}.{ts,tsx,js,jsx}",
|
|
107
|
+
"sensitivePatterns": {
|
|
108
|
+
"apiKeys": true,
|
|
109
|
+
"passwords": true,
|
|
110
|
+
"secrets": true,
|
|
111
|
+
"tokens": true,
|
|
112
|
+
"emails": true,
|
|
113
|
+
"urls": true
|
|
114
|
+
},
|
|
115
|
+
"allowedPrefixes": ["MOCK_", "TEST_", "FAKE_", "FIXTURE_"]
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"project": {
|
|
119
|
+
"root": ".",
|
|
120
|
+
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.js", "src/**/*.jsx"],
|
|
121
|
+
"exclude": ["node_modules/**", "dist/**", "build/**", ".next/**", "coverage/**"]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# DCYFR AI Framework Configuration
|
|
2
|
+
# Version: 1.0.0
|
|
3
|
+
# Documentation: https://github.com/dcyfr/dcyfr-ai
|
|
4
|
+
|
|
5
|
+
# Framework version
|
|
6
|
+
version: '1.0.0'
|
|
7
|
+
|
|
8
|
+
# Project metadata
|
|
9
|
+
projectName: my-app
|
|
10
|
+
|
|
11
|
+
# Telemetry configuration
|
|
12
|
+
telemetry:
|
|
13
|
+
enabled: true
|
|
14
|
+
storage: file
|
|
15
|
+
storagePath: .dcyfr/telemetry
|
|
16
|
+
retentionDays: 30
|
|
17
|
+
sampling: 1.0
|
|
18
|
+
|
|
19
|
+
# AI Provider configuration
|
|
20
|
+
providers:
|
|
21
|
+
enabled: true
|
|
22
|
+
primary: claude
|
|
23
|
+
fallback:
|
|
24
|
+
- groq
|
|
25
|
+
- ollama
|
|
26
|
+
- copilot
|
|
27
|
+
timeout: 30000
|
|
28
|
+
retries: 3
|
|
29
|
+
providers:
|
|
30
|
+
claude:
|
|
31
|
+
enabled: true
|
|
32
|
+
# apiKey: ${ANTHROPIC_API_KEY}
|
|
33
|
+
model: claude-3-5-sonnet-20241022
|
|
34
|
+
maxTokens: 8192
|
|
35
|
+
groq:
|
|
36
|
+
enabled: true
|
|
37
|
+
# apiKey: ${GROQ_API_KEY}
|
|
38
|
+
model: llama-3.3-70b-versatile
|
|
39
|
+
ollama:
|
|
40
|
+
enabled: true
|
|
41
|
+
baseUrl: http://localhost:11434
|
|
42
|
+
model: llama3.2
|
|
43
|
+
copilot:
|
|
44
|
+
enabled: true
|
|
45
|
+
# Uses GitHub Copilot authentication
|
|
46
|
+
|
|
47
|
+
# Validation configuration
|
|
48
|
+
validation:
|
|
49
|
+
enabled: true
|
|
50
|
+
parallel: true
|
|
51
|
+
failFast: false
|
|
52
|
+
gates:
|
|
53
|
+
- name: typescript
|
|
54
|
+
plugins:
|
|
55
|
+
- typescript-compiler
|
|
56
|
+
required: true
|
|
57
|
+
failureMode: error
|
|
58
|
+
|
|
59
|
+
- name: linting
|
|
60
|
+
plugins:
|
|
61
|
+
- eslint
|
|
62
|
+
required: true
|
|
63
|
+
failureMode: error
|
|
64
|
+
|
|
65
|
+
- name: testing
|
|
66
|
+
plugins:
|
|
67
|
+
- vitest
|
|
68
|
+
required: false
|
|
69
|
+
failureMode: warn
|
|
70
|
+
|
|
71
|
+
# Plugin configuration
|
|
72
|
+
plugins:
|
|
73
|
+
- name: typescript-compiler
|
|
74
|
+
enabled: true
|
|
75
|
+
timeout: 30000
|
|
76
|
+
failureMode: error
|
|
77
|
+
|
|
78
|
+
- name: eslint
|
|
79
|
+
enabled: true
|
|
80
|
+
timeout: 15000
|
|
81
|
+
failureMode: warn
|
|
82
|
+
|
|
83
|
+
# DCYFR Agents configuration
|
|
84
|
+
agents:
|
|
85
|
+
# Design token validator
|
|
86
|
+
designTokens:
|
|
87
|
+
enabled: true
|
|
88
|
+
tokenFile: src/lib/design-tokens.ts
|
|
89
|
+
compliance: 0.90
|
|
90
|
+
autofix: false
|
|
91
|
+
strictMode: true
|
|
92
|
+
patterns:
|
|
93
|
+
spacing:
|
|
94
|
+
- SPACING.XS
|
|
95
|
+
- SPACING.SM
|
|
96
|
+
- SPACING.MD
|
|
97
|
+
- SPACING.LG
|
|
98
|
+
- SPACING.XL
|
|
99
|
+
typography:
|
|
100
|
+
- TYPOGRAPHY.H1
|
|
101
|
+
- TYPOGRAPHY.H2
|
|
102
|
+
- TYPOGRAPHY.BODY
|
|
103
|
+
colors:
|
|
104
|
+
- SEMANTIC_COLORS.primary
|
|
105
|
+
- SEMANTIC_COLORS.success
|
|
106
|
+
|
|
107
|
+
# Barrel export checker
|
|
108
|
+
barrelExports:
|
|
109
|
+
enabled: true
|
|
110
|
+
barrelPaths:
|
|
111
|
+
- '@/components'
|
|
112
|
+
- '@/lib'
|
|
113
|
+
- '@/utils'
|
|
114
|
+
allowRelativeWithin: false
|
|
115
|
+
strictMode: true
|
|
116
|
+
exceptions:
|
|
117
|
+
- src/app/**/layout.tsx
|
|
118
|
+
- src/app/**/page.tsx
|
|
119
|
+
|
|
120
|
+
# PageLayout enforcer
|
|
121
|
+
pageLayout:
|
|
122
|
+
enabled: true
|
|
123
|
+
targetUsage: 0.90
|
|
124
|
+
pagePattern: src/app/**/page.tsx
|
|
125
|
+
exceptions:
|
|
126
|
+
- ArticleLayout
|
|
127
|
+
- ArchiveLayout
|
|
128
|
+
- ErrorLayout
|
|
129
|
+
strictMode: true
|
|
130
|
+
|
|
131
|
+
# Test data guardian
|
|
132
|
+
testData:
|
|
133
|
+
enabled: true
|
|
134
|
+
testPattern: '**/*.{test,spec}.{ts,tsx,js,jsx}'
|
|
135
|
+
sensitivePatterns:
|
|
136
|
+
apiKeys: true
|
|
137
|
+
passwords: true
|
|
138
|
+
secrets: true
|
|
139
|
+
tokens: true
|
|
140
|
+
emails: true
|
|
141
|
+
urls: true
|
|
142
|
+
allowedPrefixes:
|
|
143
|
+
- MOCK_
|
|
144
|
+
- TEST_
|
|
145
|
+
- FAKE_
|
|
146
|
+
- FIXTURE_
|
|
147
|
+
|
|
148
|
+
# Project settings
|
|
149
|
+
project:
|
|
150
|
+
root: .
|
|
151
|
+
include:
|
|
152
|
+
- src/**/*.ts
|
|
153
|
+
- src/**/*.tsx
|
|
154
|
+
- src/**/*.js
|
|
155
|
+
- src/**/*.jsx
|
|
156
|
+
exclude:
|
|
157
|
+
- node_modules/**
|
|
158
|
+
- dist/**
|
|
159
|
+
- build/**
|
|
160
|
+
- .next/**
|
|
161
|
+
- coverage/**
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# DCYFR AI Framework - Minimal Configuration
|
|
2
|
+
# Only specify what differs from defaults
|
|
3
|
+
|
|
4
|
+
version: '1.0.0'
|
|
5
|
+
projectName: my-minimal-app
|
|
6
|
+
|
|
7
|
+
# Enable only what you need
|
|
8
|
+
agents:
|
|
9
|
+
designTokens:
|
|
10
|
+
enabled: true
|
|
11
|
+
barrelExports:
|
|
12
|
+
enabled: true
|
|
13
|
+
pageLayout:
|
|
14
|
+
enabled: false
|
|
15
|
+
testData:
|
|
16
|
+
enabled: true
|