summaryrefslogtreecommitdiff
path: root/admin-panel/src/server/agents/ranger.ts
diff options
context:
space:
mode:
Diffstat (limited to 'admin-panel/src/server/agents/ranger.ts')
-rw-r--r--admin-panel/src/server/agents/ranger.ts54
1 files changed, 54 insertions, 0 deletions
diff --git a/admin-panel/src/server/agents/ranger.ts b/admin-panel/src/server/agents/ranger.ts
new file mode 100644
index 0000000..f1f3918
--- /dev/null
+++ b/admin-panel/src/server/agents/ranger.ts
@@ -0,0 +1,54 @@
+import { BaseAgent, type AgentContext, type AgentResult } from './base-agent.js';
+import type { ClaudeResponse } from '../services/claude.service.js';
+
+export class RangerAgent extends BaseAgent {
+ name = 'ranger';
+ templateFile = 'ranger.md';
+ model = 'claude-sonnet-4-20250514';
+
+ protected getSystemPrompt(): string {
+ return 'You are a QA engineer making the final pass/fail decision. Be fair but thorough. Only pass tasks that genuinely meet their acceptance criteria.';
+ }
+
+ protected parseResponse(response: ClaudeResponse, _ctx: AgentContext): AgentResult {
+ const content = response.content;
+ const firstLine = content.split('\n')[0].trim().toUpperCase();
+ const passed = firstLine.includes('PASS');
+ const verdict: 'approve' | 'reject' = passed ? 'approve' : 'reject';
+
+ const testEntry = {
+ agent: 'ranger',
+ verdict: passed ? 'pass' : 'fail',
+ content,
+ timestamp: new Date().toISOString(),
+ };
+
+ const updates: Record<string, unknown> = {};
+
+ let currentResults: unknown[];
+ try {
+ currentResults = JSON.parse(_ctx.testResults || '[]');
+ } catch {
+ currentResults = [];
+ }
+ currentResults.push(testEntry);
+ updates.test_results = JSON.stringify(currentResults);
+
+ if (passed) {
+ updates.status = 'done';
+ updates.completed_at = new Date().toISOString();
+ } else {
+ updates.status = 'impl'; // Send back to builder
+ }
+
+ return {
+ success: true,
+ content,
+ tokensUsed: response.tokensUsed,
+ model: response.model,
+ updates,
+ verdict,
+ message: `Final verdict: ${passed ? 'PASS' : 'FAIL'}`,
+ };
+ }
+}