@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.
Files changed (49) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/LICENSE +21 -0
  3. package/README.md +210 -0
  4. package/bin/cli.js +249 -0
  5. package/bin/dcyfr-ai.js +376 -0
  6. package/config/default.json +123 -0
  7. package/config/default.yaml +161 -0
  8. package/config/minimal.yaml +16 -0
  9. package/dist/ai/config/loader.d.ts +91 -0
  10. package/dist/ai/config/loader.d.ts.map +1 -0
  11. package/dist/ai/config/loader.js +259 -0
  12. package/dist/ai/config/loader.js.map +1 -0
  13. package/dist/ai/config/schema.d.ts +854 -0
  14. package/dist/ai/config/schema.d.ts.map +1 -0
  15. package/dist/ai/config/schema.js +260 -0
  16. package/dist/ai/config/schema.js.map +1 -0
  17. package/dist/ai/core/provider-registry.d.ts +115 -0
  18. package/dist/ai/core/provider-registry.d.ts.map +1 -0
  19. package/dist/ai/core/provider-registry.js +360 -0
  20. package/dist/ai/core/provider-registry.js.map +1 -0
  21. package/dist/ai/core/telemetry-engine.d.ts +114 -0
  22. package/dist/ai/core/telemetry-engine.d.ts.map +1 -0
  23. package/dist/ai/core/telemetry-engine.js +390 -0
  24. package/dist/ai/core/telemetry-engine.js.map +1 -0
  25. package/dist/ai/index.d.ts +17 -0
  26. package/dist/ai/index.d.ts.map +1 -0
  27. package/dist/ai/index.js +21 -0
  28. package/dist/ai/index.js.map +1 -0
  29. package/dist/ai/plugins/plugin-loader.d.ts +132 -0
  30. package/dist/ai/plugins/plugin-loader.d.ts.map +1 -0
  31. package/dist/ai/plugins/plugin-loader.js +316 -0
  32. package/dist/ai/plugins/plugin-loader.js.map +1 -0
  33. package/dist/ai/types/index.d.ts +179 -0
  34. package/dist/ai/types/index.d.ts.map +1 -0
  35. package/dist/ai/types/index.js +11 -0
  36. package/dist/ai/types/index.js.map +1 -0
  37. package/dist/ai/types/telemetry.d.ts +117 -0
  38. package/dist/ai/types/telemetry.d.ts.map +1 -0
  39. package/dist/ai/types/telemetry.js +6 -0
  40. package/dist/ai/types/telemetry.js.map +1 -0
  41. package/dist/ai/utils/storage.d.ts +37 -0
  42. package/dist/ai/utils/storage.d.ts.map +1 -0
  43. package/dist/ai/utils/storage.js +129 -0
  44. package/dist/ai/utils/storage.js.map +1 -0
  45. package/dist/ai/validation/validation-framework.d.ts +112 -0
  46. package/dist/ai/validation/validation-framework.d.ts.map +1 -0
  47. package/dist/ai/validation/validation-framework.js +221 -0
  48. package/dist/ai/validation/validation-framework.js.map +1 -0
  49. package/package.json +67 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Storage utilities and adapters
3
+ * @module @dcyfr/ai/utils/storage
4
+ */
5
+ import type { StorageAdapter, StorageType } from '../types';
6
+ /**
7
+ * In-memory storage adapter (default, no persistence)
8
+ */
9
+ export declare class MemoryStorageAdapter implements StorageAdapter {
10
+ type: StorageType;
11
+ private store;
12
+ get<T>(key: string): Promise<T | null>;
13
+ set<T>(key: string, value: T): Promise<void>;
14
+ delete(key: string): Promise<void>;
15
+ list(prefix?: string): Promise<string[]>;
16
+ clear(): Promise<void>;
17
+ }
18
+ /**
19
+ * File-based storage adapter (Node.js only)
20
+ */
21
+ export declare class FileStorageAdapter implements StorageAdapter {
22
+ type: StorageType;
23
+ private basePath;
24
+ constructor(basePath: string);
25
+ get<T>(key: string): Promise<T | null>;
26
+ set<T>(key: string, value: T): Promise<void>;
27
+ delete(key: string): Promise<void>;
28
+ list(prefix?: string): Promise<string[]>;
29
+ clear(): Promise<void>;
30
+ }
31
+ /**
32
+ * Storage adapter factory
33
+ */
34
+ export declare function createStorageAdapter(type: StorageType, options?: {
35
+ basePath?: string;
36
+ }): StorageAdapter;
37
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../packages/ai/utils/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5D;;GAEG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,IAAI,EAAE,WAAW,CAAY;IAC7B,OAAO,CAAC,KAAK,CAAmC;IAE1C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAKtC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,IAAI,EAAE,WAAW,CAAU;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAItB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAetC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB7B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAevG"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Storage utilities and adapters
3
+ * @module @dcyfr/ai/utils/storage
4
+ */
5
+ /**
6
+ * In-memory storage adapter (default, no persistence)
7
+ */
8
+ export class MemoryStorageAdapter {
9
+ type = 'memory';
10
+ store = new Map();
11
+ async get(key) {
12
+ const value = this.store.get(key);
13
+ return value !== undefined ? value : null;
14
+ }
15
+ async set(key, value) {
16
+ this.store.set(key, value);
17
+ }
18
+ async delete(key) {
19
+ this.store.delete(key);
20
+ }
21
+ async list(prefix) {
22
+ const keys = Array.from(this.store.keys());
23
+ if (!prefix)
24
+ return keys;
25
+ return keys.filter(key => key.startsWith(prefix));
26
+ }
27
+ async clear() {
28
+ this.store.clear();
29
+ }
30
+ }
31
+ /**
32
+ * File-based storage adapter (Node.js only)
33
+ */
34
+ export class FileStorageAdapter {
35
+ type = 'file';
36
+ basePath;
37
+ constructor(basePath) {
38
+ this.basePath = basePath;
39
+ }
40
+ async get(key) {
41
+ try {
42
+ const fs = await import('fs/promises');
43
+ const path = await import('path');
44
+ const filePath = path.join(this.basePath, `${key}.json`);
45
+ const content = await fs.readFile(filePath, 'utf-8');
46
+ return JSON.parse(content);
47
+ }
48
+ catch (error) {
49
+ if (error.code === 'ENOENT') {
50
+ return null;
51
+ }
52
+ throw error;
53
+ }
54
+ }
55
+ async set(key, value) {
56
+ const fs = await import('fs/promises');
57
+ const path = await import('path');
58
+ const filePath = path.join(this.basePath, `${key}.json`);
59
+ // Ensure directory exists
60
+ await fs.mkdir(this.basePath, { recursive: true });
61
+ await fs.writeFile(filePath, JSON.stringify(value, null, 2), 'utf-8');
62
+ }
63
+ async delete(key) {
64
+ const fs = await import('fs/promises');
65
+ const path = await import('path');
66
+ const filePath = path.join(this.basePath, `${key}.json`);
67
+ try {
68
+ await fs.unlink(filePath);
69
+ }
70
+ catch (error) {
71
+ if (error.code !== 'ENOENT') {
72
+ throw error;
73
+ }
74
+ }
75
+ }
76
+ async list(prefix) {
77
+ const fs = await import('fs/promises');
78
+ const path = await import('path');
79
+ try {
80
+ const files = await fs.readdir(this.basePath);
81
+ const jsonFiles = files
82
+ .filter(f => f.endsWith('.json'))
83
+ .map(f => f.replace(/\.json$/, ''));
84
+ if (!prefix)
85
+ return jsonFiles;
86
+ return jsonFiles.filter(key => key.startsWith(prefix));
87
+ }
88
+ catch (error) {
89
+ if (error.code === 'ENOENT') {
90
+ return [];
91
+ }
92
+ throw error;
93
+ }
94
+ }
95
+ async clear() {
96
+ const fs = await import('fs/promises');
97
+ const path = await import('path');
98
+ try {
99
+ const files = await this.list();
100
+ await Promise.all(files.map(key => {
101
+ const filePath = path.join(this.basePath, `${key}.json`);
102
+ return fs.unlink(filePath);
103
+ }));
104
+ }
105
+ catch (error) {
106
+ // Ignore errors during clear
107
+ }
108
+ }
109
+ }
110
+ /**
111
+ * Storage adapter factory
112
+ */
113
+ export function createStorageAdapter(type, options) {
114
+ switch (type) {
115
+ case 'memory':
116
+ return new MemoryStorageAdapter();
117
+ case 'file':
118
+ if (!options?.basePath) {
119
+ throw new Error('FileStorageAdapter requires basePath option');
120
+ }
121
+ return new FileStorageAdapter(options.basePath);
122
+ case 'redis':
123
+ case 'database':
124
+ throw new Error(`Storage type '${type}' not yet implemented. Use 'memory' or 'file'.`);
125
+ default:
126
+ throw new Error(`Unknown storage type: ${type}`);
127
+ }
128
+ }
129
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../packages/ai/utils/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Validation Framework - Orchestrates quality gates and validation plugins
3
+ *
4
+ * Provides a high-level API for running validation checks across a project
5
+ * using loaded plugins.
6
+ *
7
+ * @module @dcyfr/ai/validation/validation-framework
8
+ * @example
9
+ * ```typescript
10
+ * import { ValidationFramework } from '@dcyfr/ai/validation/validation-framework';
11
+ *
12
+ * const framework = new ValidationFramework();
13
+ * await framework.loadPlugins(['@dcyfr/agents/design-token-validator']);
14
+ *
15
+ * const result = await framework.validate({
16
+ * projectRoot: process.cwd(),
17
+ * files: ['src/**\/*.ts'],
18
+ * config: { strict: true },
19
+ * });
20
+ *
21
+ * if (!result.valid) {
22
+ * console.error('Validation failed:', result.violations);
23
+ * }
24
+ * ```
25
+ */
26
+ import { PluginLoader } from '../plugins/plugin-loader';
27
+ import type { ValidationContext, ValidationViolation } from '../types';
28
+ /**
29
+ * Validation gate configuration
30
+ */
31
+ export interface ValidationGate {
32
+ name: string;
33
+ plugins: string[];
34
+ required: boolean;
35
+ failureMode: 'error' | 'warn' | 'skip';
36
+ }
37
+ /**
38
+ * Validation framework configuration
39
+ */
40
+ export interface ValidationFrameworkConfig {
41
+ gates?: ValidationGate[];
42
+ failureMode?: 'error' | 'warn' | 'block';
43
+ parallel?: boolean;
44
+ timeout?: number;
45
+ }
46
+ /**
47
+ * Validation report
48
+ */
49
+ export interface ValidationReport {
50
+ valid: boolean;
51
+ gates: {
52
+ name: string;
53
+ passed: boolean;
54
+ violations: ValidationViolation[];
55
+ warnings: ValidationViolation[];
56
+ executionTime: number;
57
+ }[];
58
+ summary: {
59
+ totalGates: number;
60
+ passedGates: number;
61
+ failedGates: number;
62
+ totalViolations: number;
63
+ totalWarnings: number;
64
+ executionTime: number;
65
+ };
66
+ }
67
+ /**
68
+ * Validation Framework - high-level validation orchestrator
69
+ */
70
+ export declare class ValidationFramework {
71
+ private loader;
72
+ private config;
73
+ private gates;
74
+ constructor(config?: ValidationFrameworkConfig);
75
+ /**
76
+ * Load validation plugins
77
+ */
78
+ loadPlugins(plugins: string[]): Promise<void>;
79
+ /**
80
+ * Validate project using all configured gates
81
+ */
82
+ validate(context: ValidationContext): Promise<ValidationReport>;
83
+ /**
84
+ * Validate with specific gates
85
+ */
86
+ validateGates(gateNames: string[], context: ValidationContext): Promise<ValidationReport>;
87
+ /**
88
+ * Add a custom gate
89
+ */
90
+ addGate(gate: ValidationGate): void;
91
+ /**
92
+ * Remove a gate
93
+ */
94
+ removeGate(gateName: string): void;
95
+ /**
96
+ * Get all gates
97
+ */
98
+ getGates(): ValidationGate[];
99
+ /**
100
+ * Get plugin loader
101
+ */
102
+ getLoader(): PluginLoader;
103
+ /**
104
+ * Run a single gate
105
+ */
106
+ private runGate;
107
+ /**
108
+ * Get default validation gates
109
+ */
110
+ private getDefaultGates;
111
+ }
112
+ //# sourceMappingURL=validation-framework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-framework.d.ts","sourceRoot":"","sources":["../../../packages/ai/validation/validation-framework.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAoB,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,mBAAmB,EAAE,CAAC;QAClC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;QAChC,aAAa,EAAE,MAAM,CAAC;KACvB,EAAE,CAAC;IACJ,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,KAAK,CAAmB;gBAEpB,MAAM,GAAE,yBAA8B;IAgBlD;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyCrE;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkB/F;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQnC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQlC;;OAEG;IACH,QAAQ,IAAI,cAAc,EAAE;IAI5B;;OAEG;IACH,SAAS,IAAI,YAAY;IAIzB;;OAEG;YACW,OAAO;IAuDrB;;OAEG;IACH,OAAO,CAAC,eAAe;CA4BxB"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Validation Framework - Orchestrates quality gates and validation plugins
3
+ *
4
+ * Provides a high-level API for running validation checks across a project
5
+ * using loaded plugins.
6
+ *
7
+ * @module @dcyfr/ai/validation/validation-framework
8
+ * @example
9
+ * ```typescript
10
+ * import { ValidationFramework } from '@dcyfr/ai/validation/validation-framework';
11
+ *
12
+ * const framework = new ValidationFramework();
13
+ * await framework.loadPlugins(['@dcyfr/agents/design-token-validator']);
14
+ *
15
+ * const result = await framework.validate({
16
+ * projectRoot: process.cwd(),
17
+ * files: ['src/**\/*.ts'],
18
+ * config: { strict: true },
19
+ * });
20
+ *
21
+ * if (!result.valid) {
22
+ * console.error('Validation failed:', result.violations);
23
+ * }
24
+ * ```
25
+ */
26
+ import { PluginLoader } from '../plugins/plugin-loader';
27
+ /**
28
+ * Validation Framework - high-level validation orchestrator
29
+ */
30
+ export class ValidationFramework {
31
+ loader;
32
+ config;
33
+ gates;
34
+ constructor(config = {}) {
35
+ this.config = {
36
+ failureMode: 'error',
37
+ parallel: true,
38
+ timeout: 30000,
39
+ ...config,
40
+ };
41
+ this.loader = new PluginLoader({
42
+ failureMode: 'throw',
43
+ timeout: this.config.timeout,
44
+ });
45
+ this.gates = config.gates || this.getDefaultGates();
46
+ }
47
+ /**
48
+ * Load validation plugins
49
+ */
50
+ async loadPlugins(plugins) {
51
+ await this.loader.loadPlugins(plugins);
52
+ }
53
+ /**
54
+ * Validate project using all configured gates
55
+ */
56
+ async validate(context) {
57
+ const startTime = Date.now();
58
+ const gateResults = [];
59
+ // Run gates in parallel or serial based on config
60
+ if (this.config.parallel) {
61
+ const results = await Promise.all(this.gates.map(gate => this.runGate(gate, context)));
62
+ gateResults.push(...results);
63
+ }
64
+ else {
65
+ for (const gate of this.gates) {
66
+ const result = await this.runGate(gate, context);
67
+ gateResults.push(result);
68
+ }
69
+ }
70
+ const totalExecutionTime = Date.now() - startTime;
71
+ // Calculate summary
72
+ const passedGates = gateResults.filter(g => g.passed).length;
73
+ const failedGates = gateResults.length - passedGates;
74
+ const totalViolations = gateResults.reduce((sum, g) => sum + g.violations.length, 0);
75
+ const totalWarnings = gateResults.reduce((sum, g) => sum + g.warnings.length, 0);
76
+ const valid = failedGates === 0 && totalViolations === 0;
77
+ return {
78
+ valid,
79
+ gates: gateResults,
80
+ summary: {
81
+ totalGates: gateResults.length,
82
+ passedGates,
83
+ failedGates,
84
+ totalViolations,
85
+ totalWarnings,
86
+ executionTime: totalExecutionTime,
87
+ },
88
+ };
89
+ }
90
+ /**
91
+ * Validate with specific gates
92
+ */
93
+ async validateGates(gateNames, context) {
94
+ const selectedGates = this.gates.filter(g => gateNames.includes(g.name));
95
+ if (selectedGates.length === 0) {
96
+ throw new Error(`No gates found matching: ${gateNames.join(', ')}`);
97
+ }
98
+ // Temporarily swap gates
99
+ const originalGates = this.gates;
100
+ this.gates = selectedGates;
101
+ try {
102
+ return await this.validate(context);
103
+ }
104
+ finally {
105
+ this.gates = originalGates;
106
+ }
107
+ }
108
+ /**
109
+ * Add a custom gate
110
+ */
111
+ addGate(gate) {
112
+ // Check for duplicate names
113
+ if (this.gates.some(g => g.name === gate.name)) {
114
+ throw new Error(`Gate '${gate.name}' already exists`);
115
+ }
116
+ this.gates.push(gate);
117
+ }
118
+ /**
119
+ * Remove a gate
120
+ */
121
+ removeGate(gateName) {
122
+ const index = this.gates.findIndex(g => g.name === gateName);
123
+ if (index === -1) {
124
+ throw new Error(`Gate '${gateName}' not found`);
125
+ }
126
+ this.gates.splice(index, 1);
127
+ }
128
+ /**
129
+ * Get all gates
130
+ */
131
+ getGates() {
132
+ return [...this.gates];
133
+ }
134
+ /**
135
+ * Get plugin loader
136
+ */
137
+ getLoader() {
138
+ return this.loader;
139
+ }
140
+ /**
141
+ * Run a single gate
142
+ */
143
+ async runGate(gate, context) {
144
+ const startTime = Date.now();
145
+ try {
146
+ const result = await this.loader.validateWith(gate.plugins, context);
147
+ const executionTime = Date.now() - startTime;
148
+ const passed = result.valid && result.violations.length === 0;
149
+ return {
150
+ name: gate.name,
151
+ passed,
152
+ violations: result.violations,
153
+ warnings: result.warnings,
154
+ executionTime,
155
+ };
156
+ }
157
+ catch (error) {
158
+ const executionTime = Date.now() - startTime;
159
+ if (gate.failureMode === 'skip') {
160
+ console.warn(`⚠️ Gate '${gate.name}' skipped due to error:`, error);
161
+ return {
162
+ name: gate.name,
163
+ passed: true,
164
+ violations: [],
165
+ warnings: [
166
+ {
167
+ type: 'gate-error',
168
+ severity: 'warning',
169
+ message: `Gate skipped: ${error instanceof Error ? error.message : String(error)}`,
170
+ },
171
+ ],
172
+ executionTime,
173
+ };
174
+ }
175
+ const errorViolation = {
176
+ type: 'gate-error',
177
+ severity: 'error',
178
+ message: `Gate execution failed: ${error instanceof Error ? error.message : String(error)}`,
179
+ };
180
+ return {
181
+ name: gate.name,
182
+ passed: false,
183
+ violations: [errorViolation],
184
+ warnings: [],
185
+ executionTime,
186
+ };
187
+ }
188
+ }
189
+ /**
190
+ * Get default validation gates
191
+ */
192
+ getDefaultGates() {
193
+ return [
194
+ {
195
+ name: 'typescript',
196
+ plugins: ['typescript-validator'],
197
+ required: true,
198
+ failureMode: 'error',
199
+ },
200
+ {
201
+ name: 'eslint',
202
+ plugins: ['eslint-validator'],
203
+ required: true,
204
+ failureMode: 'error',
205
+ },
206
+ {
207
+ name: 'tests',
208
+ plugins: ['test-coverage-validator'],
209
+ required: true,
210
+ failureMode: 'error',
211
+ },
212
+ {
213
+ name: 'security',
214
+ plugins: ['security-validator'],
215
+ required: false,
216
+ failureMode: 'warn',
217
+ },
218
+ ];
219
+ }
220
+ }
221
+ //# sourceMappingURL=validation-framework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-framework.js","sourceRoot":"","sources":["../../../packages/ai/validation/validation-framework.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@dcyfr/ai",
3
+ "version": "1.0.0",
4
+ "description": "Portable AI agent framework with plugin architecture",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "type": "module",
8
+ "bin": {
9
+ "dcyfr-ai": "./bin/dcyfr-ai.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "test": "vitest run",
14
+ "test:watch": "vitest",
15
+ "typecheck": "tsc --noEmit",
16
+ "lint": "eslint packages/",
17
+ "prepare": "npm run build",
18
+ "cli": "node bin/cli.js"
19
+ },
20
+ "keywords": [
21
+ "ai",
22
+ "agent",
23
+ "framework",
24
+ "plugin",
25
+ "llm",
26
+ "claude",
27
+ "copilot",
28
+ "automation"
29
+ ],
30
+ "author": "DCYFR Labs",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/dcyfr/dcyfr-ai.git"
35
+ },
36
+ "bugs": {
37
+ "url": "https://github.com/dcyfr/dcyfr-ai/issues"
38
+ },
39
+ "homepage": "https://github.com/dcyfr/dcyfr-ai#readme",
40
+ "dependencies": {
41
+ "zod": "^3.22.4",
42
+ "yaml": "^2.3.4"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^20.0.0",
46
+ "typescript": "^5.3.0",
47
+ "vitest": "^1.0.0",
48
+ "eslint": "^8.55.0"
49
+ },
50
+ "peerDependencies": {
51
+ "typescript": "^5.0.0"
52
+ },
53
+ "engines": {
54
+ "node": ">=18.0.0"
55
+ },
56
+ "files": [
57
+ "dist",
58
+ "bin",
59
+ "config",
60
+ "README.md",
61
+ "LICENSE",
62
+ "CHANGELOG.md"
63
+ ],
64
+ "publishConfig": {
65
+ "access": "public"
66
+ }
67
+ }