@omaikit/agents 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.
- package/README.md +31 -0
- package/dist/agent.d.ts +31 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +30 -0
- package/dist/agent.js.map +1 -0
- package/dist/ai-provider/anthropic.d.ts +13 -0
- package/dist/ai-provider/anthropic.d.ts.map +1 -0
- package/dist/ai-provider/anthropic.js +85 -0
- package/dist/ai-provider/anthropic.js.map +1 -0
- package/dist/ai-provider/factory.d.ts +3 -0
- package/dist/ai-provider/factory.d.ts.map +1 -0
- package/dist/ai-provider/factory.js +22 -0
- package/dist/ai-provider/factory.js.map +1 -0
- package/dist/ai-provider/openai.d.ts +16 -0
- package/dist/ai-provider/openai.d.ts.map +1 -0
- package/dist/ai-provider/openai.js +252 -0
- package/dist/ai-provider/openai.js.map +1 -0
- package/dist/ai-provider/provider.d.ts +25 -0
- package/dist/ai-provider/provider.d.ts.map +1 -0
- package/dist/ai-provider/provider.js +2 -0
- package/dist/ai-provider/provider.js.map +1 -0
- package/dist/ai-provider/token-manager.d.ts +12 -0
- package/dist/ai-provider/token-manager.d.ts.map +1 -0
- package/dist/ai-provider/token-manager.js +63 -0
- package/dist/ai-provider/token-manager.js.map +1 -0
- package/dist/coder/code-parser.d.ts +23 -0
- package/dist/coder/code-parser.d.ts.map +1 -0
- package/dist/coder/code-parser.js +184 -0
- package/dist/coder/code-parser.js.map +1 -0
- package/dist/coder/coder.d.ts +79 -0
- package/dist/coder/coder.d.ts.map +1 -0
- package/dist/coder/coder.js +476 -0
- package/dist/coder/coder.js.map +1 -0
- package/dist/coder/dependency-resolver.d.ts +23 -0
- package/dist/coder/dependency-resolver.d.ts.map +1 -0
- package/dist/coder/dependency-resolver.js +94 -0
- package/dist/coder/dependency-resolver.js.map +1 -0
- package/dist/coder/language-handlers.d.ts +38 -0
- package/dist/coder/language-handlers.d.ts.map +1 -0
- package/dist/coder/language-handlers.js +264 -0
- package/dist/coder/language-handlers.js.map +1 -0
- package/dist/coder/linter-integration.d.ts +37 -0
- package/dist/coder/linter-integration.d.ts.map +1 -0
- package/dist/coder/linter-integration.js +200 -0
- package/dist/coder/linter-integration.js.map +1 -0
- package/dist/coder/prompt-templates.d.ts +13 -0
- package/dist/coder/prompt-templates.d.ts.map +1 -0
- package/dist/coder/prompt-templates.js +78 -0
- package/dist/coder/prompt-templates.js.map +1 -0
- package/dist/coder/quality-checker.d.ts +31 -0
- package/dist/coder/quality-checker.d.ts.map +1 -0
- package/dist/coder/quality-checker.js +264 -0
- package/dist/coder/quality-checker.js.map +1 -0
- package/dist/coder/syntax-validator.d.ts +21 -0
- package/dist/coder/syntax-validator.d.ts.map +1 -0
- package/dist/coder/syntax-validator.js +169 -0
- package/dist/coder/syntax-validator.js.map +1 -0
- package/dist/coder.d.ts +2 -0
- package/dist/coder.d.ts.map +1 -0
- package/dist/coder.js +2 -0
- package/dist/coder.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +6 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +12 -0
- package/dist/logger.js.map +1 -0
- package/dist/manager/manager.d.ts +31 -0
- package/dist/manager/manager.d.ts.map +1 -0
- package/dist/manager/manager.js +162 -0
- package/dist/manager/manager.js.map +1 -0
- package/dist/memory/memory-store.d.ts +20 -0
- package/dist/memory/memory-store.d.ts.map +1 -0
- package/dist/memory/memory-store.js +68 -0
- package/dist/memory/memory-store.js.map +1 -0
- package/dist/planner/clarification-handler.d.ts +11 -0
- package/dist/planner/clarification-handler.d.ts.map +1 -0
- package/dist/planner/clarification-handler.js +60 -0
- package/dist/planner/clarification-handler.js.map +1 -0
- package/dist/planner/plan-parser.d.ts +11 -0
- package/dist/planner/plan-parser.d.ts.map +1 -0
- package/dist/planner/plan-parser.js +136 -0
- package/dist/planner/plan-parser.js.map +1 -0
- package/dist/planner/plan-validator.d.ts +29 -0
- package/dist/planner/plan-validator.d.ts.map +1 -0
- package/dist/planner/plan-validator.js +123 -0
- package/dist/planner/plan-validator.js.map +1 -0
- package/dist/planner/planner.d.ts +25 -0
- package/dist/planner/planner.d.ts.map +1 -0
- package/dist/planner/planner.js +334 -0
- package/dist/planner/planner.js.map +1 -0
- package/dist/planner/prompt-templates.d.ts +9 -0
- package/dist/planner/prompt-templates.d.ts.map +1 -0
- package/dist/planner/prompt-templates.js +168 -0
- package/dist/planner/prompt-templates.js.map +1 -0
- package/dist/planner.d.ts +2 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +2 -0
- package/dist/planner.js.map +1 -0
- package/dist/reviewer/reviewer.d.ts +29 -0
- package/dist/reviewer/reviewer.d.ts.map +1 -0
- package/dist/reviewer/reviewer.js +40 -0
- package/dist/reviewer/reviewer.js.map +1 -0
- package/dist/reviewer.d.ts +2 -0
- package/dist/reviewer.d.ts.map +1 -0
- package/dist/reviewer.js +2 -0
- package/dist/reviewer.js.map +1 -0
- package/dist/tester/coverage-analyzer.d.ts +9 -0
- package/dist/tester/coverage-analyzer.d.ts.map +1 -0
- package/dist/tester/coverage-analyzer.js +18 -0
- package/dist/tester/coverage-analyzer.js.map +1 -0
- package/dist/tester/coverage-validator.d.ts +10 -0
- package/dist/tester/coverage-validator.d.ts.map +1 -0
- package/dist/tester/coverage-validator.js +14 -0
- package/dist/tester/coverage-validator.js.map +1 -0
- package/dist/tester/framework-detector.d.ts +4 -0
- package/dist/tester/framework-detector.d.ts.map +1 -0
- package/dist/tester/framework-detector.js +26 -0
- package/dist/tester/framework-detector.js.map +1 -0
- package/dist/tester/prompt-templates.d.ts +6 -0
- package/dist/tester/prompt-templates.d.ts.map +1 -0
- package/dist/tester/prompt-templates.js +30 -0
- package/dist/tester/prompt-templates.js.map +1 -0
- package/dist/tester/test-executor.d.ts +11 -0
- package/dist/tester/test-executor.d.ts.map +1 -0
- package/dist/tester/test-executor.js +24 -0
- package/dist/tester/test-executor.js.map +1 -0
- package/dist/tester/test-parser.d.ts +10 -0
- package/dist/tester/test-parser.d.ts.map +1 -0
- package/dist/tester/test-parser.js +83 -0
- package/dist/tester/test-parser.js.map +1 -0
- package/dist/tester/test-patterns.d.ts +10 -0
- package/dist/tester/test-patterns.d.ts.map +1 -0
- package/dist/tester/test-patterns.js +65 -0
- package/dist/tester/test-patterns.js.map +1 -0
- package/dist/tester/tester.d.ts +56 -0
- package/dist/tester/tester.d.ts.map +1 -0
- package/dist/tester/tester.js +246 -0
- package/dist/tester/tester.js.map +1 -0
- package/dist/tester.d.ts +3 -0
- package/dist/tester.d.ts.map +1 -0
- package/dist/tester.js +2 -0
- package/dist/tester.js.map +1 -0
- package/dist/tools/default-registry.d.ts +3 -0
- package/dist/tools/default-registry.d.ts.map +1 -0
- package/dist/tools/default-registry.js +12 -0
- package/dist/tools/default-registry.js.map +1 -0
- package/dist/tools/edit.d.ts +4 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +95 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/read.d.ts +4 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +39 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/registry.d.ts +11 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +31 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search.d.ts +4 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +52 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/types.d.ts +37 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/utils.d.ts +10 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +76 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
export class PromptTemplates {
|
|
2
|
+
generatePrompt(description, projectType, techStack) {
|
|
3
|
+
const techStackStr = techStack && techStack.length > 0 ? `Technology Stack: ${techStack.join(', ')}` : '';
|
|
4
|
+
const projectTypeStr = projectType ? `Project Type: ${projectType}` : '';
|
|
5
|
+
const languageHint = this.getLanguageHint(projectType, techStack);
|
|
6
|
+
const structureHint = this.getStructureHint(languageHint, projectType);
|
|
7
|
+
return `You are an expert project planner. Generate a detailed Agile project plan for the following feature request.
|
|
8
|
+
|
|
9
|
+
Feature Description: ${description}
|
|
10
|
+
|
|
11
|
+
${projectTypeStr}
|
|
12
|
+
${techStackStr}
|
|
13
|
+
${languageHint ? `Programming Language: ${languageHint}` : ''}
|
|
14
|
+
|
|
15
|
+
Project Structure Guidance:
|
|
16
|
+
${structureHint}
|
|
17
|
+
|
|
18
|
+
Generate a comprehensive plan with the following JSON structure:
|
|
19
|
+
{
|
|
20
|
+
"id": "P-0",
|
|
21
|
+
"title": "Brief project title",
|
|
22
|
+
"description": "Full description",
|
|
23
|
+
"clarifications": [],
|
|
24
|
+
"milestones": [
|
|
25
|
+
{
|
|
26
|
+
"id": "M1",
|
|
27
|
+
"title": "Milestone name",
|
|
28
|
+
"description": "Milestone description",
|
|
29
|
+
"duration": 5,
|
|
30
|
+
"successCriteria": ["Milestone success criteria"],
|
|
31
|
+
"tasks": [
|
|
32
|
+
{
|
|
33
|
+
"id": "T1",
|
|
34
|
+
"title": "Task name",
|
|
35
|
+
"description": "Task description",
|
|
36
|
+
"type": "feature",
|
|
37
|
+
"estimatedEffort": 3,
|
|
38
|
+
"acceptanceCriteria": ["Acceptance criteria"],
|
|
39
|
+
"inputDependencies": ["T0"],
|
|
40
|
+
"outputDependencies": ["T2"],
|
|
41
|
+
"targetModule": "module-path",
|
|
42
|
+
"affectedModules": ["module-path"],
|
|
43
|
+
"suggestedApproach": "Brief implementation guidance",
|
|
44
|
+
"technicalNotes": "Optional technical notes",
|
|
45
|
+
"riskFactors": [
|
|
46
|
+
{
|
|
47
|
+
"description": "Risk description",
|
|
48
|
+
"likelihood": "low",
|
|
49
|
+
"impact": "medium",
|
|
50
|
+
"mitigation": "Mitigation steps"
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"status": "planned",
|
|
54
|
+
"blockers": []
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
Requirements:
|
|
62
|
+
1. Create 2-5 milestones
|
|
63
|
+
2. Each milestone should have 3-8 tasks
|
|
64
|
+
3. Effort estimates should be in hours (1-40)
|
|
65
|
+
4. Include realistic dependencies between tasks
|
|
66
|
+
5. Tasks should cover all aspects: design, implementation, testing, documentation
|
|
67
|
+
6. Use clear, actionable task titles
|
|
68
|
+
7. Ensure each task includes all required fields in the schema
|
|
69
|
+
8. Ensure dependency DAG is acyclic
|
|
70
|
+
9. Each task must reference the intended files/folders via targetModule and affectedModules using the project structure guidance
|
|
71
|
+
|
|
72
|
+
Return ONLY valid JSON, no markdown or extra text.`;
|
|
73
|
+
}
|
|
74
|
+
getLanguageHint(projectType, techStack) {
|
|
75
|
+
const entries = [projectType, ...(techStack ?? [])].filter((value) => Boolean(value));
|
|
76
|
+
const haystack = entries.join(' ').toLowerCase();
|
|
77
|
+
if (haystack.includes('golang') || haystack.includes(' go '))
|
|
78
|
+
return 'Go';
|
|
79
|
+
if (haystack.includes('typescript') || haystack.includes('ts'))
|
|
80
|
+
return 'TypeScript';
|
|
81
|
+
if (haystack.includes('javascript') || haystack.includes('node') || haystack.includes('react'))
|
|
82
|
+
return 'JavaScript';
|
|
83
|
+
if (haystack.includes('python'))
|
|
84
|
+
return 'Python';
|
|
85
|
+
if (haystack.includes('rust'))
|
|
86
|
+
return 'Rust';
|
|
87
|
+
if (haystack.includes('c#') || haystack.includes('csharp') || haystack.includes('.net'))
|
|
88
|
+
return 'C#';
|
|
89
|
+
if (haystack.includes('php') || haystack.includes('laravel'))
|
|
90
|
+
return 'PHP';
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
getStructureHint(languageHint, projectType) {
|
|
94
|
+
const type = (projectType || '').toLowerCase();
|
|
95
|
+
if (languageHint === 'Go') {
|
|
96
|
+
return `Use standard Go layout:
|
|
97
|
+
- cmd/<app>/ (entrypoints)
|
|
98
|
+
- internal/ (private packages)
|
|
99
|
+
- pkg/ (public packages)
|
|
100
|
+
- api/ (OpenAPI/protos)
|
|
101
|
+
- configs/ (config files)
|
|
102
|
+
- scripts/ (tooling)`;
|
|
103
|
+
}
|
|
104
|
+
if (languageHint === 'PHP') {
|
|
105
|
+
return `Use PSR-4 layout:
|
|
106
|
+
- src/ (application code)
|
|
107
|
+
- tests/ (tests)
|
|
108
|
+
- public/ (entrypoint)
|
|
109
|
+
- config/ (configuration)
|
|
110
|
+
- routes/ (routing)`;
|
|
111
|
+
}
|
|
112
|
+
if (type.includes('api') || type.includes('backend')) {
|
|
113
|
+
return `Use a service-style layout:
|
|
114
|
+
- src/
|
|
115
|
+
- api/ (routes/controllers)
|
|
116
|
+
- services/
|
|
117
|
+
- repositories/
|
|
118
|
+
- models/
|
|
119
|
+
- middleware/
|
|
120
|
+
- tests/
|
|
121
|
+
- config/`;
|
|
122
|
+
}
|
|
123
|
+
if (type.includes('frontend') || type.includes('web')) {
|
|
124
|
+
return `Use a web-app layout:
|
|
125
|
+
- src/
|
|
126
|
+
- components/
|
|
127
|
+
- pages/ (or routes/)
|
|
128
|
+
- hooks/ or utils/
|
|
129
|
+
- styles/
|
|
130
|
+
- public/
|
|
131
|
+
- tests/`;
|
|
132
|
+
}
|
|
133
|
+
return `Use a standard modular layout:
|
|
134
|
+
- src/ (core code)
|
|
135
|
+
- tests/ (unit/integration tests)
|
|
136
|
+
- config/ (configuration)
|
|
137
|
+
- scripts/ (tooling)`;
|
|
138
|
+
}
|
|
139
|
+
generateClarificationPrompt(description, ambiguities) {
|
|
140
|
+
return `Given this feature description: "${description}"
|
|
141
|
+
|
|
142
|
+
I need clarification on these points:
|
|
143
|
+
${ambiguities.map((a) => `- ${a}`).join('\n')}
|
|
144
|
+
|
|
145
|
+
Please provide brief, specific clarifications for each point. Format as JSON:
|
|
146
|
+
{
|
|
147
|
+
"clarifications": {
|
|
148
|
+
"point1": "answer",
|
|
149
|
+
"point2": "answer"
|
|
150
|
+
}
|
|
151
|
+
}`;
|
|
152
|
+
}
|
|
153
|
+
getSystemPrompt() {
|
|
154
|
+
return `You are an expert Agile project planner with 10+ years of experience planning software projects.
|
|
155
|
+
You excel at breaking down complex features into manageable tasks, identifying dependencies, and creating realistic effort estimates.
|
|
156
|
+
You always think about the critical path and bottlenecks.
|
|
157
|
+
You prefer generating plans in valid JSON format without any markdown formatting.`;
|
|
158
|
+
}
|
|
159
|
+
generateRepairPrompt(rawResponse) {
|
|
160
|
+
return `You are a JSON repair assistant. Fix the following malformed JSON and return ONLY valid JSON with the same schema as the planner output.
|
|
161
|
+
|
|
162
|
+
Malformed JSON:
|
|
163
|
+
${rawResponse}
|
|
164
|
+
|
|
165
|
+
Return ONLY valid JSON, no markdown or extra text.`;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=prompt-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-templates.js","sourceRoot":"","sources":["../../src/planner/prompt-templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/planner.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Agent } from '../agent.js';
|
|
2
|
+
import { Logger } from '../logger.js';
|
|
3
|
+
import { AgentInput, AgentOutput } from '../types.js';
|
|
4
|
+
export declare class ReviewerAgent extends Agent {
|
|
5
|
+
protected logger: Logger;
|
|
6
|
+
name: string;
|
|
7
|
+
constructor(logger?: Logger);
|
|
8
|
+
/**
|
|
9
|
+
* Initialize agent resources. Called once before execution.
|
|
10
|
+
*/
|
|
11
|
+
init(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Hook before execution.
|
|
14
|
+
*/
|
|
15
|
+
beforeExecute(_input: AgentInput): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Execute the agent's main logic.
|
|
18
|
+
*/
|
|
19
|
+
execute(input: AgentInput): Promise<AgentOutput>;
|
|
20
|
+
/**
|
|
21
|
+
* Hook after execution.
|
|
22
|
+
*/
|
|
23
|
+
afterExecute(_output: AgentOutput): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Error handler hook.
|
|
26
|
+
*/
|
|
27
|
+
onError(error: Error): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=reviewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/reviewer/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEnD,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAW;gBAElB,MAAM,CAAC,EAAE,MAAM;IAK3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAEtD;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAShD;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvD;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CAG3C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Agent } from '../agent.js';
|
|
2
|
+
import { Logger } from '../logger.js';
|
|
3
|
+
export class ReviewerAgent extends Agent {
|
|
4
|
+
logger;
|
|
5
|
+
name = 'Agent';
|
|
6
|
+
constructor(logger) {
|
|
7
|
+
super();
|
|
8
|
+
this.logger = logger ?? new Logger();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Initialize agent resources. Called once before execution.
|
|
12
|
+
*/
|
|
13
|
+
async init() { }
|
|
14
|
+
/**
|
|
15
|
+
* Hook before execution.
|
|
16
|
+
*/
|
|
17
|
+
async beforeExecute(_input) { }
|
|
18
|
+
/**
|
|
19
|
+
* Execute the agent's main logic.
|
|
20
|
+
*/
|
|
21
|
+
execute(input) {
|
|
22
|
+
this.logger.info('Executing ReviewerAgent with input', { input });
|
|
23
|
+
// Placeholder implementation
|
|
24
|
+
const output = {
|
|
25
|
+
result: 'Review generation not yet implemented.',
|
|
26
|
+
};
|
|
27
|
+
return Promise.resolve(output);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Hook after execution.
|
|
31
|
+
*/
|
|
32
|
+
async afterExecute(_output) { }
|
|
33
|
+
/**
|
|
34
|
+
* Error handler hook.
|
|
35
|
+
*/
|
|
36
|
+
async onError(error) {
|
|
37
|
+
this.logger.error('Agent error', { error: String(error) });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../src/reviewer/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC5B,MAAM,CAAS;IAClB,IAAI,GAAW,OAAO,CAAC;IAE9B,YAAY,MAAe;QACzB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,KAAmB,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,MAAkB,IAAkB,CAAC;IAEzD;;OAEG;IACH,OAAO,CAAC,KAAiB;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,6BAA6B;QAC7B,MAAM,MAAM,GAAgB;YAC1B,MAAM,EAAE,wCAAwC;SACjD,CAAC;QACF,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAoB,IAAkB,CAAC;IAE1D;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,KAAY;QACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/reviewer.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TestFile } from '@omaikit/models';
|
|
2
|
+
export interface CoverageResult {
|
|
3
|
+
overall: number;
|
|
4
|
+
byFile: Record<string, number>;
|
|
5
|
+
}
|
|
6
|
+
export declare class CoverageAnalyzer {
|
|
7
|
+
analyze(files: TestFile[]): CoverageResult;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=coverage-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-analyzer.d.ts","sourceRoot":"","sources":["../../src/tester/coverage-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc;CAkB3C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class CoverageAnalyzer {
|
|
2
|
+
analyze(files) {
|
|
3
|
+
if (files.length === 0) {
|
|
4
|
+
return { overall: 0, byFile: {} };
|
|
5
|
+
}
|
|
6
|
+
const byFile = {};
|
|
7
|
+
const scores = files.map((file) => {
|
|
8
|
+
const testCount = file.testCases.length;
|
|
9
|
+
const base = file.content.includes('describe') || file.content.includes('def test_') ? 70 : 60;
|
|
10
|
+
const score = Math.min(95, base + testCount * 5);
|
|
11
|
+
byFile[file.path] = score;
|
|
12
|
+
return score;
|
|
13
|
+
});
|
|
14
|
+
const overall = Math.round(scores.reduce((sum, score) => sum + score, 0) / scores.length);
|
|
15
|
+
return { overall, byFile };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=coverage-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-analyzer.js","sourceRoot":"","sources":["../../src/tester/coverage-analyzer.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,gBAAgB;IAC3B,OAAO,CAAC,KAAiB;QACvB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACpC,CAAC;QAED,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YACxC,MAAM,IAAI,GACR,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface CoverageValidationResult {
|
|
2
|
+
isValid: boolean;
|
|
3
|
+
target: number;
|
|
4
|
+
actual: number;
|
|
5
|
+
issues: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare class CoverageValidator {
|
|
8
|
+
validate(coverage: number, target?: number): CoverageValidationResult;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=coverage-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-validator.d.ts","sourceRoot":"","sources":["../../src/tester/coverage-validator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,wBAAwB;CAY1E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export class CoverageValidator {
|
|
2
|
+
validate(coverage, target = 80) {
|
|
3
|
+
if (coverage >= target) {
|
|
4
|
+
return { isValid: true, target, actual: coverage, issues: [] };
|
|
5
|
+
}
|
|
6
|
+
return {
|
|
7
|
+
isValid: false,
|
|
8
|
+
target,
|
|
9
|
+
actual: coverage,
|
|
10
|
+
issues: [`Coverage ${coverage}% is below target ${target}%`],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=coverage-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-validator.js","sourceRoot":"","sources":["../../src/tester/coverage-validator.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,iBAAiB;IAC5B,QAAQ,CAAC,QAAgB,EAAE,SAAiB,EAAE;QAC5C,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACjE,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM;YACN,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,CAAC,YAAY,QAAQ,qBAAqB,MAAM,GAAG,CAAC;SAC7D,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-detector.d.ts","sourceRoot":"","sources":["../../src/tester/framework-detector.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,GAAG,GAAG,MAAM;CAwBvD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export class FrameworkDetector {
|
|
2
|
+
detect(language, projectContext) {
|
|
3
|
+
const normalized = language.toLowerCase();
|
|
4
|
+
const hint = projectContext?.testing?.framework || projectContext?.analysis?.testingFramework;
|
|
5
|
+
if (typeof hint === 'string') {
|
|
6
|
+
return hint;
|
|
7
|
+
}
|
|
8
|
+
switch (normalized) {
|
|
9
|
+
case 'python':
|
|
10
|
+
return 'pytest';
|
|
11
|
+
case 'go':
|
|
12
|
+
return 'go test';
|
|
13
|
+
case 'rust':
|
|
14
|
+
return 'cargo test';
|
|
15
|
+
case 'csharp':
|
|
16
|
+
case 'c#':
|
|
17
|
+
return 'dotnet test';
|
|
18
|
+
case 'javascript':
|
|
19
|
+
return 'jest';
|
|
20
|
+
case 'typescript':
|
|
21
|
+
default:
|
|
22
|
+
return 'vitest';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=framework-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-detector.js","sourceRoot":"","sources":["../../src/tester/framework-detector.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAiB;IAC5B,MAAM,CAAC,QAAgB,EAAE,cAAoB;QAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,cAAc,EAAE,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,QAAQ,EAAE,gBAAgB,CAAC;QAC9F,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAC;YAClB,KAAK,IAAI;gBACP,OAAO,SAAS,CAAC;YACnB,KAAK,MAAM;gBACT,OAAO,YAAY,CAAC;YACtB,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,OAAO,aAAa,CAAC;YACvB,KAAK,YAAY;gBACf,OAAO,MAAM,CAAC;YAChB,KAAK,YAAY,CAAC;YAClB;gBACE,OAAO,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Task } from '@omaikit/models';
|
|
2
|
+
export declare class TestPromptTemplates {
|
|
3
|
+
private patterns;
|
|
4
|
+
generatePrompt(task: Task, projectContext: any, plan: any, language: string, framework: string): Promise<string>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=prompt-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-templates.d.ts","sourceRoot":"","sources":["../../src/tester/prompt-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAG5C,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAsB;IAEhC,cAAc,CAClB,IAAI,EAAE,IAAI,EACV,cAAc,EAAE,GAAG,EACnB,IAAI,EAAE,GAAG,EACT,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC;CA4BnB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { TestPatterns } from './test-patterns.js';
|
|
2
|
+
export class TestPromptTemplates {
|
|
3
|
+
patterns = new TestPatterns();
|
|
4
|
+
async generatePrompt(task, projectContext, plan, language, framework) {
|
|
5
|
+
const patterns = this.patterns.getPatterns(language, framework);
|
|
6
|
+
const projectName = projectContext?.name || projectContext?.project?.name || 'the project';
|
|
7
|
+
return [
|
|
8
|
+
`You are a test engineer generating ${framework} tests for ${projectName}.`,
|
|
9
|
+
'',
|
|
10
|
+
`Task: ${task.title}`,
|
|
11
|
+
`Description: ${task.description || 'No description provided.'}`,
|
|
12
|
+
'',
|
|
13
|
+
'Requirements:',
|
|
14
|
+
...task.acceptanceCriteria.map((criteria) => `- ${criteria}`),
|
|
15
|
+
'',
|
|
16
|
+
'Generate comprehensive unit, integration, and edge case tests.',
|
|
17
|
+
'Return tests as code blocks. Include a file header in each block like:',
|
|
18
|
+
' // File: tests/<name>.test.ts',
|
|
19
|
+
'',
|
|
20
|
+
'Patterns:',
|
|
21
|
+
...patterns.map((pattern) => `- ${pattern.name}: ${pattern.description}\n Example: ${pattern.example}`),
|
|
22
|
+
'',
|
|
23
|
+
`Target language: ${language}`,
|
|
24
|
+
`Test framework: ${framework}`,
|
|
25
|
+
'',
|
|
26
|
+
'Ensure tests include error handling, clear assertions, and descriptive names.',
|
|
27
|
+
].join('\n');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=prompt-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-templates.js","sourceRoot":"","sources":["../../src/tester/prompt-templates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,OAAO,mBAAmB;IACtB,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IAEtC,KAAK,CAAC,cAAc,CAClB,IAAU,EACV,cAAmB,EACnB,IAAS,EACT,QAAgB,EAChB,SAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,cAAc,EAAE,IAAI,IAAI,cAAc,EAAE,OAAO,EAAE,IAAI,IAAI,aAAa,CAAC;QAE3F,OAAO;YACL,sCAAsC,SAAS,cAAc,WAAW,GAAG;YAC3E,EAAE;YACF,SAAS,IAAI,CAAC,KAAK,EAAE;YACrB,gBAAgB,IAAI,CAAC,WAAW,IAAI,0BAA0B,EAAE;YAChE,EAAE;YACF,eAAe;YACf,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC7D,EAAE;YACF,gEAAgE;YAChE,wEAAwE;YACxE,iCAAiC;YACjC,EAAE;YACF,WAAW;YACX,GAAG,QAAQ,CAAC,GAAG,CACb,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,WAAW,gBAAgB,OAAO,CAAC,OAAO,EAAE,CACxF;YACD,EAAE;YACF,oBAAoB,QAAQ,EAAE;YAC9B,mBAAmB,SAAS,EAAE;YAC9B,EAAE;YACF,+EAA+E;SAChF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TestFile } from '@omaikit/models';
|
|
2
|
+
export interface TestExecutionResult {
|
|
3
|
+
passed: number;
|
|
4
|
+
failed: number;
|
|
5
|
+
skipped: number;
|
|
6
|
+
durationMs: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class TestExecutor {
|
|
9
|
+
run(files: TestFile[], framework: string): Promise<TestExecutionResult>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=test-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-executor.d.ts","sourceRoot":"","sources":["../../src/tester/test-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IACjB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAwB9E"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export class TestExecutor {
|
|
2
|
+
async run(files, framework) {
|
|
3
|
+
const start = Date.now();
|
|
4
|
+
const totalTests = files.reduce((sum, file) => sum + file.testCases.length, 0);
|
|
5
|
+
if (process.env.VITEST !== undefined) {
|
|
6
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
7
|
+
return {
|
|
8
|
+
passed: totalTests,
|
|
9
|
+
failed: 0,
|
|
10
|
+
skipped: 0,
|
|
11
|
+
durationMs: Date.now() - start,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
// Placeholder for real execution logic
|
|
15
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
16
|
+
return {
|
|
17
|
+
passed: totalTests,
|
|
18
|
+
failed: 0,
|
|
19
|
+
skipped: 0,
|
|
20
|
+
durationMs: Date.now() - start,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=test-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-executor.js","sourceRoot":"","sources":["../../src/tester/test-executor.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,GAAG,CAAC,KAAiB,EAAE,SAAiB;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE/E,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO;gBACL,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,CAAC;gBACV,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC;QACJ,CAAC;QAED,uCAAuC;QACvC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAExD,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC/B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TestFile } from '@omaikit/models';
|
|
2
|
+
export declare class TestParser {
|
|
3
|
+
parse(response: string, language: string, framework: string): TestFile[];
|
|
4
|
+
private extractCodeBlocks;
|
|
5
|
+
private extractTestCases;
|
|
6
|
+
private buildFallbackFile;
|
|
7
|
+
private defaultTemplate;
|
|
8
|
+
private defaultFilePath;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=test-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-parser.d.ts","sourceRoot":"","sources":["../../src/tester/test-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,iBAAiB,CAAC;AAK1D,qBAAa,UAAU;IACrB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAE;IA2BxE,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,eAAe;CAIxB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
const FILE_HEADER_REGEX = /(?:^|\n)\s*(?:\/\/|#)\s*File:\s*(.+)\s*(?:\n|$)/i;
|
|
2
|
+
const CODE_BLOCK_REGEX = /```([\w-]*)\n([\s\S]*?)```/g;
|
|
3
|
+
export class TestParser {
|
|
4
|
+
parse(response, language, framework) {
|
|
5
|
+
const files = [];
|
|
6
|
+
const codeBlocks = this.extractCodeBlocks(response);
|
|
7
|
+
if (codeBlocks.length === 0) {
|
|
8
|
+
return [this.buildFallbackFile(language, framework, response)];
|
|
9
|
+
}
|
|
10
|
+
codeBlocks.forEach((block, index) => {
|
|
11
|
+
const pathMatch = FILE_HEADER_REGEX.exec(block.content);
|
|
12
|
+
const path = pathMatch?.[1]?.trim() || this.defaultFilePath(language, index);
|
|
13
|
+
const content = pathMatch
|
|
14
|
+
? block.content.replace(pathMatch[0], '').trim()
|
|
15
|
+
: block.content.trim();
|
|
16
|
+
files.push({
|
|
17
|
+
path,
|
|
18
|
+
language: block.language || language,
|
|
19
|
+
framework,
|
|
20
|
+
testCases: this.extractTestCases(content, framework),
|
|
21
|
+
content,
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
return files;
|
|
25
|
+
}
|
|
26
|
+
extractCodeBlocks(response) {
|
|
27
|
+
const blocks = [];
|
|
28
|
+
let match;
|
|
29
|
+
while ((match = CODE_BLOCK_REGEX.exec(response)) !== null) {
|
|
30
|
+
blocks.push({
|
|
31
|
+
language: match[1] || '',
|
|
32
|
+
content: match[2] || '',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return blocks;
|
|
36
|
+
}
|
|
37
|
+
extractTestCases(content, framework) {
|
|
38
|
+
const cases = [];
|
|
39
|
+
const lower = framework.toLowerCase();
|
|
40
|
+
if (lower.includes('vitest') || lower.includes('jest')) {
|
|
41
|
+
const regex = /(?:it|test)\(\s*['"`]([^'"`]+)['"`]/g;
|
|
42
|
+
let match;
|
|
43
|
+
while ((match = regex.exec(content)) !== null) {
|
|
44
|
+
cases.push({ name: match[1], type: 'unit' });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (lower.includes('pytest')) {
|
|
48
|
+
const regex = /def\s+(test_[a-zA-Z0-9_]+)/g;
|
|
49
|
+
let match;
|
|
50
|
+
while ((match = regex.exec(content)) !== null) {
|
|
51
|
+
cases.push({ name: match[1], type: 'unit' });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (cases.length === 0 && content.trim()) {
|
|
55
|
+
cases.push({ name: 'generated-test', type: 'unit' });
|
|
56
|
+
}
|
|
57
|
+
return cases;
|
|
58
|
+
}
|
|
59
|
+
buildFallbackFile(language, framework, response) {
|
|
60
|
+
const content = response.trim() ? response : this.defaultTemplate(language, framework);
|
|
61
|
+
return {
|
|
62
|
+
path: this.defaultFilePath(language, 0),
|
|
63
|
+
language,
|
|
64
|
+
framework,
|
|
65
|
+
testCases: this.extractTestCases(content, framework),
|
|
66
|
+
content,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
defaultTemplate(language, framework) {
|
|
70
|
+
if (language.toLowerCase() === 'python') {
|
|
71
|
+
return 'def test_placeholder():\n assert True';
|
|
72
|
+
}
|
|
73
|
+
if (framework.toLowerCase().includes('vitest') || framework.toLowerCase().includes('jest')) {
|
|
74
|
+
return 'describe("placeholder", () => {\n it("works", () => {\n expect(true).toBe(true);\n });\n});';
|
|
75
|
+
}
|
|
76
|
+
return '/* Generated tests */';
|
|
77
|
+
}
|
|
78
|
+
defaultFilePath(language, index) {
|
|
79
|
+
const ext = language.toLowerCase() === 'python' ? 'py' : 'ts';
|
|
80
|
+
return `tests/generated-${index + 1}.test.${ext}`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=test-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-parser.js","sourceRoot":"","sources":["../../src/tester/test-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface TestPattern {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
example: string;
|
|
5
|
+
type: 'unit' | 'integration' | 'edge';
|
|
6
|
+
}
|
|
7
|
+
export declare class TestPatterns {
|
|
8
|
+
getPatterns(language: string, framework: string): TestPattern[];
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=test-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-patterns.d.ts","sourceRoot":"","sources":["../../src/tester/test-patterns.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;CACvC;AAED,qBAAa,YAAY;IACvB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;CAsEhE"}
|