@dcyfr/ai-code-gen 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +469 -0
  3. package/dist/ai/code-gen.d.ts +60 -0
  4. package/dist/ai/code-gen.d.ts.map +1 -0
  5. package/dist/ai/code-gen.js +164 -0
  6. package/dist/ai/code-gen.js.map +1 -0
  7. package/dist/ai/index.d.ts +8 -0
  8. package/dist/ai/index.d.ts.map +1 -0
  9. package/dist/ai/index.js +7 -0
  10. package/dist/ai/index.js.map +1 -0
  11. package/dist/ai/prompts.d.ts +32 -0
  12. package/dist/ai/prompts.d.ts.map +1 -0
  13. package/dist/ai/prompts.js +96 -0
  14. package/dist/ai/prompts.js.map +1 -0
  15. package/dist/ai/provider.d.ts +34 -0
  16. package/dist/ai/provider.d.ts.map +1 -0
  17. package/dist/ai/provider.js +76 -0
  18. package/dist/ai/provider.js.map +1 -0
  19. package/dist/ast/analyzer.d.ts +34 -0
  20. package/dist/ast/analyzer.d.ts.map +1 -0
  21. package/dist/ast/analyzer.js +159 -0
  22. package/dist/ast/analyzer.js.map +1 -0
  23. package/dist/ast/index.d.ts +9 -0
  24. package/dist/ast/index.d.ts.map +1 -0
  25. package/dist/ast/index.js +8 -0
  26. package/dist/ast/index.js.map +1 -0
  27. package/dist/ast/parser.d.ts +16 -0
  28. package/dist/ast/parser.d.ts.map +1 -0
  29. package/dist/ast/parser.js +280 -0
  30. package/dist/ast/parser.js.map +1 -0
  31. package/dist/ast/printer.d.ts +51 -0
  32. package/dist/ast/printer.d.ts.map +1 -0
  33. package/dist/ast/printer.js +126 -0
  34. package/dist/ast/printer.js.map +1 -0
  35. package/dist/ast/transformer.d.ts +11 -0
  36. package/dist/ast/transformer.d.ts.map +1 -0
  37. package/dist/ast/transformer.js +194 -0
  38. package/dist/ast/transformer.js.map +1 -0
  39. package/dist/cli.d.ts +15 -0
  40. package/dist/cli.d.ts.map +1 -0
  41. package/dist/cli.js +284 -0
  42. package/dist/cli.js.map +1 -0
  43. package/dist/generators/api-route.d.ts +14 -0
  44. package/dist/generators/api-route.d.ts.map +1 -0
  45. package/dist/generators/api-route.js +82 -0
  46. package/dist/generators/api-route.js.map +1 -0
  47. package/dist/generators/base.d.ts +29 -0
  48. package/dist/generators/base.d.ts.map +1 -0
  49. package/dist/generators/base.js +89 -0
  50. package/dist/generators/base.js.map +1 -0
  51. package/dist/generators/component.d.ts +14 -0
  52. package/dist/generators/component.d.ts.map +1 -0
  53. package/dist/generators/component.js +77 -0
  54. package/dist/generators/component.js.map +1 -0
  55. package/dist/generators/index.d.ts +10 -0
  56. package/dist/generators/index.d.ts.map +1 -0
  57. package/dist/generators/index.js +10 -0
  58. package/dist/generators/index.js.map +1 -0
  59. package/dist/generators/model.d.ts +14 -0
  60. package/dist/generators/model.d.ts.map +1 -0
  61. package/dist/generators/model.js +89 -0
  62. package/dist/generators/model.js.map +1 -0
  63. package/dist/generators/registry.d.ts +42 -0
  64. package/dist/generators/registry.d.ts.map +1 -0
  65. package/dist/generators/registry.js +84 -0
  66. package/dist/generators/registry.js.map +1 -0
  67. package/dist/generators/test.d.ts +13 -0
  68. package/dist/generators/test.d.ts.map +1 -0
  69. package/dist/generators/test.js +39 -0
  70. package/dist/generators/test.js.map +1 -0
  71. package/dist/index.d.ts +19 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +20 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/lib/config.d.ts +16 -0
  76. package/dist/lib/config.d.ts.map +1 -0
  77. package/dist/lib/config.js +52 -0
  78. package/dist/lib/config.js.map +1 -0
  79. package/dist/lib/file-system.d.ts +30 -0
  80. package/dist/lib/file-system.d.ts.map +1 -0
  81. package/dist/lib/file-system.js +71 -0
  82. package/dist/lib/file-system.js.map +1 -0
  83. package/dist/lib/logger.d.ts +17 -0
  84. package/dist/lib/logger.d.ts.map +1 -0
  85. package/dist/lib/logger.js +43 -0
  86. package/dist/lib/logger.js.map +1 -0
  87. package/dist/lib/strings.d.ts +41 -0
  88. package/dist/lib/strings.d.ts.map +1 -0
  89. package/dist/lib/strings.js +92 -0
  90. package/dist/lib/strings.js.map +1 -0
  91. package/dist/templates/builtins.d.ts +13 -0
  92. package/dist/templates/builtins.d.ts.map +1 -0
  93. package/dist/templates/builtins.js +275 -0
  94. package/dist/templates/builtins.js.map +1 -0
  95. package/dist/templates/engine.d.ts +69 -0
  96. package/dist/templates/engine.d.ts.map +1 -0
  97. package/dist/templates/engine.js +154 -0
  98. package/dist/templates/engine.js.map +1 -0
  99. package/dist/templates/index.d.ts +6 -0
  100. package/dist/templates/index.d.ts.map +1 -0
  101. package/dist/templates/index.js +6 -0
  102. package/dist/templates/index.js.map +1 -0
  103. package/dist/types/index.d.ts +401 -0
  104. package/dist/types/index.d.ts.map +1 -0
  105. package/dist/types/index.js +7 -0
  106. package/dist/types/index.js.map +1 -0
  107. package/package.json +80 -0
@@ -0,0 +1,164 @@
1
+ /**
2
+ * @dcyfr/ai-code-gen - AI Code Generator
3
+ *
4
+ * High-level AI-powered code generation combining prompts with providers.
5
+ */
6
+ import { createAIProvider, MockAIProvider } from './provider.js';
7
+ import { reviewCodePrompt, refactorCodePrompt, generateDocsPrompt } from './prompts.js';
8
+ /** AI code generation service */
9
+ export class AICodeGenerator {
10
+ provider;
11
+ constructor(config) {
12
+ this.provider = config ? createAIProvider(config) : new MockAIProvider();
13
+ }
14
+ /**
15
+ * Generate code from a request.
16
+ */
17
+ async generateCode(request) {
18
+ return this.provider.generate(request);
19
+ }
20
+ /**
21
+ * Review code and return findings.
22
+ */
23
+ async reviewCode(options) {
24
+ const start = Date.now();
25
+ const prompt = reviewCodePrompt(options);
26
+ const response = await this.provider.complete(prompt);
27
+ // For mock provider, return sample findings
28
+ const findings = this.parseFindingsOrDefault(response, options.code);
29
+ const score = this.calculateScore(findings);
30
+ return {
31
+ findings,
32
+ summary: `Found ${findings.length} issues (score: ${score}/100)`,
33
+ score,
34
+ durationMs: Date.now() - start,
35
+ };
36
+ }
37
+ /**
38
+ * Suggest refactorings for code.
39
+ */
40
+ async suggestRefactoring(options) {
41
+ const prompt = refactorCodePrompt(options);
42
+ const response = await this.provider.complete(prompt);
43
+ return this.parseSuggestionsOrDefault(response, options.code);
44
+ }
45
+ /**
46
+ * Generate documentation for code.
47
+ */
48
+ async generateDocs(options) {
49
+ const prompt = generateDocsPrompt(options);
50
+ return this.provider.complete(prompt);
51
+ }
52
+ /**
53
+ * Parse findings from AI response, or return heuristic defaults.
54
+ */
55
+ parseFindingsOrDefault(response, code) {
56
+ try {
57
+ const parsed = JSON.parse(response);
58
+ if (Array.isArray(parsed))
59
+ return parsed;
60
+ }
61
+ catch {
62
+ // If response isn't valid JSON, generate heuristic findings
63
+ }
64
+ return this.generateHeuristicFindings(code);
65
+ }
66
+ /**
67
+ * Generate basic heuristic findings from code patterns.
68
+ */
69
+ generateHeuristicFindings(code) {
70
+ const findings = [];
71
+ // Check for console.log
72
+ const consoleMatches = code.match(/console\.(log|warn|error)/g);
73
+ if (consoleMatches) {
74
+ findings.push({
75
+ severity: 'info',
76
+ message: `Found ${consoleMatches.length} console statement(s). Consider using a structured logger.`,
77
+ category: 'style',
78
+ });
79
+ }
80
+ // Check for any type
81
+ if (code.includes(': any') || code.includes('<any>')) {
82
+ findings.push({
83
+ severity: 'warning',
84
+ message: 'Usage of "any" type detected. Consider using more specific types.',
85
+ category: 'correctness',
86
+ });
87
+ }
88
+ // Check for TODO comments
89
+ const todoMatches = code.match(/\/\/\s*TODO/gi);
90
+ if (todoMatches) {
91
+ findings.push({
92
+ severity: 'info',
93
+ message: `Found ${todoMatches.length} TODO comment(s).`,
94
+ category: 'maintainability',
95
+ });
96
+ }
97
+ // Check for long lines
98
+ const longLines = code.split('\n').filter((l) => l.length > 120);
99
+ if (longLines.length > 0) {
100
+ findings.push({
101
+ severity: 'info',
102
+ message: `${longLines.length} line(s) exceed 120 characters.`,
103
+ category: 'style',
104
+ });
105
+ }
106
+ return findings;
107
+ }
108
+ /**
109
+ * Parse refactoring suggestions from AI response, or return defaults.
110
+ */
111
+ parseSuggestionsOrDefault(response, code) {
112
+ try {
113
+ const parsed = JSON.parse(response);
114
+ if (Array.isArray(parsed))
115
+ return parsed;
116
+ }
117
+ catch {
118
+ // Return default suggestions
119
+ }
120
+ const suggestions = [];
121
+ // Check for long functions
122
+ const fnMatches = code.match(/function\s+\w+/g);
123
+ if (fnMatches && fnMatches.length > 5) {
124
+ suggestions.push({
125
+ description: 'Consider extracting related functions into separate modules',
126
+ original: `${fnMatches.length} functions in single file`,
127
+ refactored: 'Split into focused modules',
128
+ rationale: 'Smaller modules are easier to test and maintain',
129
+ impact: 'medium',
130
+ });
131
+ }
132
+ return suggestions;
133
+ }
134
+ /**
135
+ * Calculate a quality score from findings.
136
+ */
137
+ calculateScore(findings) {
138
+ let score = 100;
139
+ for (const finding of findings) {
140
+ switch (finding.severity) {
141
+ case 'error':
142
+ score -= 15;
143
+ break;
144
+ case 'warning':
145
+ score -= 5;
146
+ break;
147
+ case 'info':
148
+ score -= 1;
149
+ break;
150
+ case 'suggestion':
151
+ score -= 0;
152
+ break;
153
+ }
154
+ }
155
+ return Math.max(0, Math.min(100, score));
156
+ }
157
+ }
158
+ /**
159
+ * Create an AI code generator with configuration.
160
+ */
161
+ export function createAICodeGenerator(config) {
162
+ return new AICodeGenerator(config);
163
+ }
164
+ //# sourceMappingURL=code-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-gen.js","sourceRoot":"","sources":["../../src/ai/code-gen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @dcyfr/ai-code-gen - AI module exports
3
+ */
4
+ export { AICodeGenerator, createAICodeGenerator } from './code-gen.js';
5
+ export { MockAIProvider, createAIProvider } from './provider.js';
6
+ export type { AIProvider } from './provider.js';
7
+ export { generateCodePrompt, reviewCodePrompt, refactorCodePrompt, generateDocsPrompt, } from './prompts.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @dcyfr/ai-code-gen - AI module exports
3
+ */
4
+ export { AICodeGenerator, createAICodeGenerator } from './code-gen.js';
5
+ export { MockAIProvider, createAIProvider } from './provider.js';
6
+ export { generateCodePrompt, reviewCodePrompt, refactorCodePrompt, generateDocsPrompt, } from './prompts.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @dcyfr/ai-code-gen - AI Prompt Templates
3
+ *
4
+ * Structured prompts for LLM-powered code generation, review, and refactoring.
5
+ */
6
+ /** Prompt template for code generation */
7
+ export declare function generateCodePrompt(options: {
8
+ description: string;
9
+ language: string;
10
+ framework?: string;
11
+ constraints?: string[];
12
+ context?: string;
13
+ }): string;
14
+ /** Prompt template for code review */
15
+ export declare function reviewCodePrompt(options: {
16
+ code: string;
17
+ language: string;
18
+ focus?: string[];
19
+ }): string;
20
+ /** Prompt template for refactoring suggestions */
21
+ export declare function refactorCodePrompt(options: {
22
+ code: string;
23
+ language: string;
24
+ goals?: string[];
25
+ }): string;
26
+ /** Prompt template for documentation generation */
27
+ export declare function generateDocsPrompt(options: {
28
+ code: string;
29
+ language: string;
30
+ style?: 'jsdoc' | 'tsdoc' | 'markdown';
31
+ }): string;
32
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,0CAA0C;AAC1C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAoCT;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,GAAG,MAAM,CAoCT;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,GAAG,MAAM,CAsCT;AAED,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;CACxC,GAAG,MAAM,CAmBT"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @dcyfr/ai-code-gen - AI Prompt Templates
3
+ *
4
+ * Structured prompts for LLM-powered code generation, review, and refactoring.
5
+ */
6
+ /** Prompt template for code generation */
7
+ export function generateCodePrompt(options) {
8
+ const parts = [
9
+ `Generate ${options.language} code for the following:`,
10
+ '',
11
+ `Description: ${options.description}`,
12
+ '',
13
+ `Language: ${options.language}`,
14
+ ];
15
+ if (options.framework) {
16
+ parts.push(`Framework: ${options.framework}`);
17
+ }
18
+ if (options.constraints && options.constraints.length > 0) {
19
+ parts.push('', 'Constraints:');
20
+ for (const constraint of options.constraints) {
21
+ parts.push(`- ${constraint}`);
22
+ }
23
+ }
24
+ if (options.context) {
25
+ parts.push('', 'Existing code context:', '```', options.context, '```');
26
+ }
27
+ parts.push('', 'Requirements:', '- Write clean, well-documented code', '- Include proper TypeScript types', '- Follow best practices for the specified language/framework', '- Include error handling where appropriate', '', 'Return ONLY the code, no explanations.');
28
+ return parts.join('\n');
29
+ }
30
+ /** Prompt template for code review */
31
+ export function reviewCodePrompt(options) {
32
+ const parts = [
33
+ `Review the following ${options.language} code:`,
34
+ '',
35
+ '```',
36
+ options.code,
37
+ '```',
38
+ '',
39
+ 'Analyze for:',
40
+ '1. Security vulnerabilities',
41
+ '2. Performance issues',
42
+ '3. Code style and readability',
43
+ '4. Correctness and edge cases',
44
+ '5. Maintainability',
45
+ ];
46
+ if (options.focus && options.focus.length > 0) {
47
+ parts.push('', 'Focus areas:');
48
+ for (const area of options.focus) {
49
+ parts.push(`- ${area}`);
50
+ }
51
+ }
52
+ parts.push('', 'For each finding, provide:', '- Severity: error | warning | info | suggestion', '- Category: security | performance | style | correctness | maintainability', '- Message: description of the issue', '- Line: approximate line number', '- Suggested fix: how to resolve the issue', '', 'Return findings as a JSON array.');
53
+ return parts.join('\n');
54
+ }
55
+ /** Prompt template for refactoring suggestions */
56
+ export function refactorCodePrompt(options) {
57
+ const parts = [
58
+ `Suggest refactoring for the following ${options.language} code:`,
59
+ '',
60
+ '```',
61
+ options.code,
62
+ '```',
63
+ ];
64
+ if (options.goals && options.goals.length > 0) {
65
+ parts.push('', 'Refactoring goals:');
66
+ for (const goal of options.goals) {
67
+ parts.push(`- ${goal}`);
68
+ }
69
+ }
70
+ else {
71
+ parts.push('', 'Goals:', '- Reduce complexity', '- Improve readability', '- Extract reusable patterns', '- Apply SOLID principles');
72
+ }
73
+ parts.push('', 'For each suggestion, provide:', '- Description: what to refactor', '- Original: the original code snippet', '- Refactored: the improved code', '- Rationale: why this improves the code', '- Impact: low | medium | high', '', 'Return suggestions as a JSON array.');
74
+ return parts.join('\n');
75
+ }
76
+ /** Prompt template for documentation generation */
77
+ export function generateDocsPrompt(options) {
78
+ const style = options.style ?? 'jsdoc';
79
+ return [
80
+ `Generate ${style} documentation for the following ${options.language} code:`,
81
+ '',
82
+ '```',
83
+ options.code,
84
+ '```',
85
+ '',
86
+ 'Requirements:',
87
+ `- Use ${style} format`,
88
+ '- Document all exported functions, classes, and interfaces',
89
+ '- Include @param, @returns, and @example tags',
90
+ '- Be concise but thorough',
91
+ '- Include edge cases in @example sections',
92
+ '',
93
+ 'Return the documented code.',
94
+ ].join('\n');
95
+ }
96
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @dcyfr/ai-code-gen - AI Provider Interface
3
+ *
4
+ * Abstraction layer for LLM providers with a mock provider for testing.
5
+ */
6
+ import type { AIProviderConfig, AICodeRequest, AICodeResponse } from '../types/index.js';
7
+ import { generateCodePrompt } from './prompts.js';
8
+ /** AI provider interface */
9
+ export interface AIProvider {
10
+ /** Provider name */
11
+ readonly name: string;
12
+ /** Generate code from a request */
13
+ generate(request: AICodeRequest): Promise<AICodeResponse>;
14
+ /** Generate a raw completion from a prompt */
15
+ complete(prompt: string): Promise<string>;
16
+ }
17
+ /**
18
+ * Mock AI provider for testing and offline development.
19
+ * Generates deterministic placeholder code based on the request.
20
+ */
21
+ export declare class MockAIProvider implements AIProvider {
22
+ readonly name = "mock";
23
+ generate(request: AICodeRequest): Promise<AICodeResponse>;
24
+ complete(prompt: string): Promise<string>;
25
+ private generateMockCode;
26
+ private generateTypeScriptMock;
27
+ }
28
+ /**
29
+ * Create an AI provider from configuration.
30
+ * Currently supports 'mock' provider; real providers can be added later.
31
+ */
32
+ export declare function createAIProvider(config: AIProviderConfig): AIProvider;
33
+ export { generateCodePrompt };
34
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,4BAA4B;AAC5B,MAAM,WAAW,UAAU;IACzB,oBAAoB;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1D,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,UAAU;IAC/C,QAAQ,CAAC,IAAI,UAAU;IAEjB,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAgBzD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/C,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,sBAAsB;CA6B/B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAerE;AAGD,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @dcyfr/ai-code-gen - AI Provider Interface
3
+ *
4
+ * Abstraction layer for LLM providers with a mock provider for testing.
5
+ */
6
+ import { generateCodePrompt } from './prompts.js';
7
+ /**
8
+ * Mock AI provider for testing and offline development.
9
+ * Generates deterministic placeholder code based on the request.
10
+ */
11
+ export class MockAIProvider {
12
+ name = 'mock';
13
+ async generate(request) {
14
+ const code = this.generateMockCode(request);
15
+ return {
16
+ code,
17
+ explanation: `Mock-generated ${request.language} code for: ${request.prompt}`,
18
+ language: request.language,
19
+ confidence: 0.85,
20
+ usage: {
21
+ promptTokens: request.prompt.length,
22
+ completionTokens: code.length,
23
+ totalTokens: request.prompt.length + code.length,
24
+ },
25
+ };
26
+ }
27
+ async complete(prompt) {
28
+ return `// Mock completion for prompt (${prompt.length} chars)\n// TODO: Replace with real AI provider\n`;
29
+ }
30
+ generateMockCode(request) {
31
+ const lang = request.language.toLowerCase();
32
+ if (lang === 'typescript' || lang === 'ts') {
33
+ return this.generateTypeScriptMock(request);
34
+ }
35
+ return `// ${request.language} code for: ${request.prompt}\n// Generated by mock provider\n`;
36
+ }
37
+ generateTypeScriptMock(request) {
38
+ const lines = [
39
+ `/**`,
40
+ ` * ${request.prompt}`,
41
+ ` * `,
42
+ ` * @generated by @dcyfr/ai-code-gen (mock)`,
43
+ ` */`,
44
+ ``,
45
+ ];
46
+ if (request.framework) {
47
+ lines.push(`// Framework: ${request.framework}`);
48
+ }
49
+ if (request.constraints && request.constraints.length > 0) {
50
+ lines.push(`// Constraints: ${request.constraints.join(', ')}`);
51
+ }
52
+ lines.push(``, `export function generatedFunction(): void {`, ` // TODO: Implement ${request.prompt}`, ` console.log('Generated code placeholder');`, `}`, ``);
53
+ return lines.join('\n');
54
+ }
55
+ }
56
+ /**
57
+ * Create an AI provider from configuration.
58
+ * Currently supports 'mock' provider; real providers can be added later.
59
+ */
60
+ export function createAIProvider(config) {
61
+ switch (config.provider) {
62
+ case 'mock':
63
+ return new MockAIProvider();
64
+ case 'openai':
65
+ case 'anthropic':
66
+ case 'local':
67
+ // Return mock with a warning for unsupported providers
68
+ console.warn(`AI provider '${config.provider}' is not yet implemented. Using mock provider.`);
69
+ return new MockAIProvider();
70
+ default:
71
+ throw new Error(`Unknown AI provider: ${config.provider}`);
72
+ }
73
+ }
74
+ // Re-export for convenience
75
+ export { generateCodePrompt };
76
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAYlD;;;GAGG;AACH,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,MAAM,CAAC;IAEvB,KAAK,CAAC,QAAQ,CAAC,OAAsB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE5C,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,kBAAkB,OAAO,CAAC,QAAQ,cAAc,OAAO,CAAC,MAAM,EAAE;YAC7E,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE;gBACL,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;gBACnC,gBAAgB,EAAE,IAAI,CAAC,MAAM;gBAC7B,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;aACjD;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,OAAO,kCAAkC,MAAM,CAAC,MAAM,mDAAmD,CAAC;IAC5G,CAAC;IAEO,gBAAgB,CAAC,OAAsB;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAE5C,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,MAAM,OAAO,CAAC,QAAQ,cAAc,OAAO,CAAC,MAAM,mCAAmC,CAAC;IAC/F,CAAC;IAEO,sBAAsB,CAAC,OAAsB;QACnD,MAAM,KAAK,GAAG;YACZ,KAAK;YACL,MAAM,OAAO,CAAC,MAAM,EAAE;YACtB,KAAK;YACL,4CAA4C;YAC5C,KAAK;YACL,EAAE;SACH,CAAC;QAEF,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,6CAA6C,EAC7C,wBAAwB,OAAO,CAAC,MAAM,EAAE,EACxC,8CAA8C,EAC9C,GAAG,EACH,EAAE,CACH,CAAC;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW,CAAC;QACjB,KAAK,OAAO;YACV,uDAAuD;YACvD,OAAO,CAAC,IAAI,CACV,gBAAgB,MAAM,CAAC,QAAQ,gDAAgD,CAChF,CAAC;YACF,OAAO,IAAI,cAAc,EAAE,CAAC;QAC9B;YACE,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,4BAA4B;AAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @dcyfr/ai-code-gen - Code Analyzer
3
+ *
4
+ * Static analysis utilities for TypeScript source code.
5
+ */
6
+ import type { CodeMetrics } from '../types/index.js';
7
+ /** Analysis issue */
8
+ export interface AnalysisIssue {
9
+ type: 'dead-code' | 'complexity' | 'naming' | 'missing-jsdoc' | 'large-file';
10
+ severity: 'info' | 'warning' | 'error';
11
+ message: string;
12
+ node?: string;
13
+ line?: number;
14
+ }
15
+ /** Full analysis report */
16
+ export interface AnalysisReport {
17
+ filePath: string;
18
+ issues: AnalysisIssue[];
19
+ metrics: CodeMetrics;
20
+ summary: string;
21
+ }
22
+ /**
23
+ * Analyze source code and produce a report with issues and metrics.
24
+ */
25
+ export declare function analyzeCode(source: string, filePath?: string): AnalysisReport;
26
+ /**
27
+ * Compare two source files and identify structural differences.
28
+ */
29
+ export declare function compareStructure(sourceA: string, sourceB: string): {
30
+ added: string[];
31
+ removed: string[];
32
+ modified: string[];
33
+ };
34
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/ast/analyzer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAA2B,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG9E,qBAAqB;AACrB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,eAAe,GAAG,YAAY,CAAC;IAC7E,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,2BAA2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAc,GAAG,cAAc,CAUlF;AAsID;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAsBA"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * @dcyfr/ai-code-gen - Code Analyzer
3
+ *
4
+ * Static analysis utilities for TypeScript source code.
5
+ */
6
+ import { parseSource } from './parser.js';
7
+ /**
8
+ * Analyze source code and produce a report with issues and metrics.
9
+ */
10
+ export function analyzeCode(source, filePath = 'source.ts') {
11
+ const result = parseSource(source, filePath);
12
+ const issues = detectIssues(result);
13
+ return {
14
+ filePath,
15
+ issues,
16
+ metrics: result.metrics,
17
+ summary: generateSummary(result, issues),
18
+ };
19
+ }
20
+ /**
21
+ * Detect code issues from an analysis result.
22
+ */
23
+ function detectIssues(result) {
24
+ const issues = [];
25
+ // Check for large files
26
+ if (result.metrics.linesOfCode > 500) {
27
+ issues.push({
28
+ type: 'large-file',
29
+ severity: 'warning',
30
+ message: `File has ${result.metrics.linesOfCode} lines. Consider splitting into smaller modules.`,
31
+ });
32
+ }
33
+ // Check cyclomatic complexity
34
+ if (result.metrics.cyclomaticComplexity > 20) {
35
+ issues.push({
36
+ type: 'complexity',
37
+ severity: 'warning',
38
+ message: `High cyclomatic complexity: ${result.metrics.cyclomaticComplexity}. Consider refactoring.`,
39
+ });
40
+ }
41
+ // Check for missing JSDoc on exported items
42
+ for (const node of result.nodes) {
43
+ checkNodeIssues(node, issues);
44
+ }
45
+ // Check for unused imports (heuristic: if named import not found in exports/nodes)
46
+ for (const imp of result.imports) {
47
+ if (imp.isTypeOnly)
48
+ continue; // Type imports are fine
49
+ for (const named of imp.namedImports) {
50
+ const isUsed = result.nodes.some((n) => n.name === named ||
51
+ JSON.stringify(n.metadata).includes(named) ||
52
+ n.children.some((c) => c.name === named));
53
+ if (!isUsed) {
54
+ issues.push({
55
+ type: 'dead-code',
56
+ severity: 'info',
57
+ message: `Import '${named}' from '${imp.moduleSpecifier}' may be unused`,
58
+ node: named,
59
+ });
60
+ }
61
+ }
62
+ }
63
+ return issues;
64
+ }
65
+ /**
66
+ * Check a single AST node for issues.
67
+ */
68
+ function checkNodeIssues(node, issues) {
69
+ // Missing JSDoc on exported declarations
70
+ if (node.isExported && !node.jsdoc) {
71
+ if (node.kind === 'function' || node.kind === 'class' || node.kind === 'interface') {
72
+ issues.push({
73
+ type: 'missing-jsdoc',
74
+ severity: 'info',
75
+ message: `Exported ${node.kind} '${node.name}' is missing JSDoc documentation`,
76
+ node: node.name,
77
+ line: node.startLine,
78
+ });
79
+ }
80
+ }
81
+ // Check naming conventions
82
+ if (node.kind === 'class' || node.kind === 'interface') {
83
+ if (!/^[A-Z]/.test(node.name) && node.name !== '<anonymous>') {
84
+ issues.push({
85
+ type: 'naming',
86
+ severity: 'warning',
87
+ message: `${node.kind} '${node.name}' should start with an uppercase letter`,
88
+ node: node.name,
89
+ line: node.startLine,
90
+ });
91
+ }
92
+ }
93
+ if (node.kind === 'function' || node.kind === 'variable') {
94
+ if (/^[A-Z]/.test(node.name) && node.name !== '<anonymous>') {
95
+ // Exception: React components (functions starting with uppercase are valid)
96
+ // Only flag if it doesn't look like a React component or constant
97
+ const isConstant = /^[A-Z_]+$/.test(node.name);
98
+ if (!isConstant && node.kind === 'variable') {
99
+ // Variable starting with uppercase could be a React component or constant - skip
100
+ }
101
+ else if (node.kind === 'function') {
102
+ // Functions starting with uppercase could be React components - skip
103
+ }
104
+ }
105
+ }
106
+ // Check children recursively
107
+ for (const child of node.children) {
108
+ checkNodeIssues(child, issues);
109
+ }
110
+ }
111
+ /**
112
+ * Generate a human-readable summary of the analysis.
113
+ */
114
+ function generateSummary(result, issues) {
115
+ const m = result.metrics;
116
+ const errorCount = issues.filter((i) => i.severity === 'error').length;
117
+ const warningCount = issues.filter((i) => i.severity === 'warning').length;
118
+ const infoCount = issues.filter((i) => i.severity === 'info').length;
119
+ const parts = [
120
+ `${m.linesOfCode} LOC`,
121
+ `${m.functionCount} functions`,
122
+ `${m.classCount} classes`,
123
+ `${m.importCount} imports`,
124
+ `${m.exportCount} exports`,
125
+ `complexity: ${m.cyclomaticComplexity}`,
126
+ ];
127
+ const issueStr = [
128
+ errorCount > 0 ? `${errorCount} errors` : null,
129
+ warningCount > 0 ? `${warningCount} warnings` : null,
130
+ infoCount > 0 ? `${infoCount} info` : null,
131
+ ]
132
+ .filter(Boolean)
133
+ .join(', ');
134
+ return `${parts.join(', ')}${issueStr ? ` | Issues: ${issueStr}` : ' | No issues'}`;
135
+ }
136
+ /**
137
+ * Compare two source files and identify structural differences.
138
+ */
139
+ export function compareStructure(sourceA, sourceB) {
140
+ const resultA = parseSource(sourceA, 'a.ts');
141
+ const resultB = parseSource(sourceB, 'b.ts');
142
+ const namesA = new Set(resultA.nodes.map((n) => `${n.kind}:${n.name}`));
143
+ const namesB = new Set(resultB.nodes.map((n) => `${n.kind}:${n.name}`));
144
+ const added = [...namesB].filter((n) => !namesA.has(n));
145
+ const removed = [...namesA].filter((n) => !namesB.has(n));
146
+ // Nodes present in both but with different line counts (rough heuristic)
147
+ const common = [...namesA].filter((n) => namesB.has(n));
148
+ const modified = common.filter((key) => {
149
+ const nodeA = resultA.nodes.find((n) => `${n.kind}:${n.name}` === key);
150
+ const nodeB = resultB.nodes.find((n) => `${n.kind}:${n.name}` === key);
151
+ if (!nodeA || !nodeB)
152
+ return false;
153
+ const sizeA = nodeA.endLine - nodeA.startLine;
154
+ const sizeB = nodeB.endLine - nodeB.startLine;
155
+ return Math.abs(sizeA - sizeB) > 2;
156
+ });
157
+ return { added, removed, modified };
158
+ }
159
+ //# sourceMappingURL=analyzer.js.map