Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/automacoescomerciaisintegradas_pagia.json

1 line
44 KiB
JSON

{"repo": "automacoescomerciaisintegradas/pagia", "files": {"apps/backend/src/providers/multi-provider.ts": {"7af1693113c6489efe9aaa8d6c55c7065e1e0417": {"t": 1785745599.2280095, "n": 10459, "h": "20adb011771f835e", "c": "/**\n * PAGIA - Multi-Provider AI Gateway\n * Suporta: OpenAI, Gemini, Anthropic, Groq, Mistral, OpenRouter, Qwen, DeepSeek, Ollama, Local\n */\n\nimport { AIProvider, AIProviderOptions } from '../cli-core/types.js';\nimport { getRouterManager } from '../core/router-manager.js';\n\ntype ProviderName = 'openai' | 'gemini' | 'anthropic' | 'groq' | 'mistral' | 'openrouter' | 'qwen' | 'deepseek' | 'ollama' | 'local';\n\ninterface ProviderConfig {\n name: ProviderName;\n baseUrl: string;\n apiKey: string;\n model: string;\n headers?: Record<string, string>;\n}\n\n// Configurações dos providers baseadas em variáveis de ambiente e router.json\nfunction getProviderConfigs(): Record<ProviderName, ProviderConfig> {\n const baseConfigs: Record<ProviderName, ProviderConfig> = {\n openai: {\n name: 'openai',\n baseUrl: process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1',\n apiKey: process.env.OPENAI_API_KEY || '',\n model: process.env.OPENAI_MODEL || 'gpt-4o',\n },\n gemini: {\n name: 'gemini',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta',\n apiKey: process.env.GEMINI_API_KEY || '',\n model: process.env.GEMINI_MODEL || 'gemini-2.0-flash',\n },\n anthropic: {\n name: 'anthropic',\n baseUrl: 'https://api.anthropic.com/v1',\n apiKey: process.env.ANTHROPIC_API_KEY || '',\n model: process.env.ANTHROPIC_MODEL || 'claude-3-5-sonnet-20241022',\n },\n groq: {\n name: 'groq',\n baseUrl: 'https://api.groq.com/openai/v1',\n apiKey: process.env.GROQ_API_KEY || '',\n model: process.env.GROQ_MODEL || 'llama-3.3-70b-versatile',\n },\n mistral: {\n name: 'mistral',\n baseUrl: 'https://api.mistral.ai/v1',\n apiKey: process.env.MISTRAL_API_KEY || '',\n model: process.env.MISTRAL_MODEL || 'mistral-large-latest',\n },\n openrouter: {\n name: 'openrouter',\n baseUrl: 'https://openrouter.ai/api/v1',\n apiKey: process.env.OPENROUTER_API_KEY || '',\n model: process.env.OPENROUTER_MODEL || 'anthropic/claude-3.5-sonnet',\n headers: {\n 'HTTP-Referer': 'https://pagia.dev',\n 'X-Title': 'PAGIA CLI',\n },\n },\n qwen: {\n name: 'qwen',\n baseUrl: process.env.QWEN_BASE_URL || 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n apiKey: process.env.QWEN_API_KEY || '',\n model: process.env.QWEN_MODEL || 'qwen-turbo',\n },\n deepseek: {\n name: 'deepseek',\n baseUrl: process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com/v1',\n apiKey: process.env.DEEPSEEK_API_KEY || '',\n model: process.env.DEEPSEEK_MODEL || 'deepseek-chat',\n },\n ollama: {\n name: 'ollama',\n baseUrl: process.env.OLLAMA_HOST || 'http://localhost:11434',\n apiKey: '',\n model: process.env.OLLAMA_MODEL || 'llama3.2',\n },\n local: {\n name: 'local',\n baseUrl: process.env.LOCAL_LLM_URL || 'http://localhost:8080/v1',\n apiKey: '',\n model: 'local',\n },\n };\n\n // Override with router.json if it exists\n try {\n const router = getRouterManager();\n const rConfig = router.getConfig();\n if (rConfig && rConfig.providers) {\n for (const p of rConfig.providers) {\n if (baseConfigs[p.name as ProviderName]) {\n const bc = baseConfigs[p.name as ProviderName];\n bc.apiKey = p.api_key || bc.apiKey;\n bc.baseUrl = p.api_base_url || bc.baseUrl;\n bc.model = p.models[0] || bc.model;\n } else {\n // New dynamic provider from router.json\n (baseConfigs as any)[p.name] = {\n name: p.name,\n baseUrl: p.api_base_url,\n apiKey: p.api_key,\n model: p.models[0]\n };\n }\n }\n }\n } catch { /* ignore */ }\n\n return baseConfigs;\n}\n\nexport class MultiProvider implements AIProvider {\n name: string;\n private config: ProviderConfig;\n\n constructor(providerName?: ProviderName) {\n const configs = getProviderConfigs();\n const router = getRouterManager();\n const rConfig = router.getConfig();\n\n let selectedProvider = (providerName || process.env.AI_PROVIDER) as ProviderName;\n\n // If no explicit provider, try the router's default\n if (!selectedProvider && rConfig?.router?.default) {\n selectedProvider = rConfig.router.default.provider as ProviderName;\n }\n\n // Fallback to groq as it was the original default\n if (!selectedProvider || !configs[selectedProvider]) {\n selectedProvider = 'groq';\n }\n\n this.config = configs[selectedProvider];\n\n // If router has a specific model for this provider, use it\n if (rConfig?.router?.default?.provider === selectedProvider) {\n this.config.model = rConfig.router.default.model;\n }\n\n this.name = selectedProvider;\n }\n\n async ask(prompt: string, options?: AIProviderOptions): Promise<string> {\n // Gemini usa API diferente\n if (this.config.name === 'gemini') {\n return this.callGemini(prompt, options);\n }\n\n // Ollama usa endpoint diferente\n if (this.config.name === 'ollama') {\n return this.callOllama(prompt, options);\n }\n\n // Todos os outros usam formato OpenAI-compatible\n return this.callOpenAICompatible(prompt, options);\n }\n\n private async callOpenAICompatible(prompt: string, options?: AIProviderOptions): Promise<string> {\n const messages: any[] = [];\n\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n // Headers extras (ex: OpenRouter)\n if (this.config.headers) {\n Object.assign(headers, this.config.headers);\n }\n\n // Sanitize baseURL: remove /chat/completions if present (the fetch call below adds it)\n let baseURL = this.config.baseUrl;\n if (baseURL.endsWith('/chat/completions')) {\n baseURL = baseURL.replace('/chat/completions', '');\n }\n\n const response = await fetch(`${baseURL}/chat/completions`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model: this.config.model,\n messages,\n temperature: options?.temperature ?? 0.7,\n max_tokens: options?.maxTokens ?? 4096,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`[${this.config.name}] HTTP ${response.status}: ${errorText.slice(0, 200)}`);\n }\n\n const data = await response.json() as any;\n\n if (data.error) {\n throw new Error(`[${this.config.name}] ${data.error.message || data.error}`);\n }\n\n return data.choices?.[0]?.message?.content || '(Resposta vazia)';\n }\n\n private async callGemini(prompt: string, options?: AIProviderOptions): Promise<string> {\n const url = `${this.config.baseUrl}/models/${this.config.model}:generateContent?key=${this.config.apiKey}`;\n\n const contents: any[] = [];\n\n if (options?.systemPrompt) {\n contents.push({ role: 'user', parts: [{ text: options.systemPrompt }] });\n contents.push({ role: 'model', parts: [{ text: 'Entendido.' }] });\n }\n contents.push({ role: 'user', parts: [{ text: prompt }] });\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n contents,\n generationConfig: {\n temperature: options?.temperature ?? 0.7,\n maxOutputTokens: options?.maxTokens ?? 4096,\n },\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`[gemini] HTTP ${response.status}: ${errorText.slice(0, 200)}`);\n }\n\n const data = await response.json() as any;\n\n if (data.error) {\n throw new Error(`[gemini] ${data.error.message}`);\n }\n\n return data.candidates?.[0]?.content?.parts?.[0]?.text || '(Resposta vazia)';\n }\n\n private async callOllama(prompt: string, options?: AIProviderOptions): Promise<string> {\n const response = await fetch(`${this.config.baseUrl}/api/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.config.model,\n messages: [\n ...(options?.systemPrompt ? [{ role: 'system', content: options.systemPrompt }] : []),\n { role: 'user', content: prompt },\n ],\n stream: false,\n options: {\n temperature: options?.temperature ?? 0.7,\n },\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`[ollama] HTTP ${response.status}: ${errorText.slice(0, 200)}`);\n }\n\n const data = await response.json() as any;\n return data.message?.content || '(Resposta vazia)';\n }\n\n static listAvailableProviders(): { name: string; configured: boolean; model: string }[] {\n const configs = getProviderConfigs();\n return Object.entries(configs).map(([name, config]) => ({\n name,\n configured: name === 'local' || name === 'ollama' || !!config.apiKey,\n model: config.model,\n }));\n }\n}\n\n// Singleton padrão\nexport const multiProvider = new MultiProvider();\n"}, "ab0b462c07cfc93c48169c127f31429ccae37204": {"t": 1785754647.5954208, "n": 10459, "h": "20adb011771f835e", "c": "/**\n * PAGIA - Multi-Provider AI Gateway\n * Suporta: OpenAI, Gemini, Anthropic, Groq, Mistral, OpenRouter, Qwen, DeepSeek, Ollama, Local\n */\n\nimport { AIProvider, AIProviderOptions } from '../cli-core/types.js';\nimport { getRouterManager } from '../core/router-manager.js';\n\ntype ProviderName = 'openai' | 'gemini' | 'anthropic' | 'groq' | 'mistral' | 'openrouter' | 'qwen' | 'deepseek' | 'ollama' | 'local';\n\ninterface ProviderConfig {\n name: ProviderName;\n baseUrl: string;\n apiKey: string;\n model: string;\n headers?: Record<string, string>;\n}\n\n// Configurações dos providers baseadas em variáveis de ambiente e router.json\nfunction getProviderConfigs(): Record<ProviderName, ProviderConfig> {\n const baseConfigs: Record<ProviderName, ProviderConfig> = {\n openai: {\n name: 'openai',\n baseUrl: process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1',\n apiKey: process.env.OPENAI_API_KEY || '',\n model: process.env.OPENAI_MODEL || 'gpt-4o',\n },\n gemini: {\n name: 'gemini',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta',\n apiKey: process.env.GEMINI_API_KEY || '',\n model: process.env.GEMINI_MODEL || 'gemini-2.0-flash',\n },\n anthropic: {\n name: 'anthropic',\n baseUrl: 'https://api.anthropic.com/v1',\n apiKey: process.env.ANTHROPIC_API_KEY || '',\n model: process.env.ANTHROPIC_MODEL || 'claude-3-5-sonnet-20241022',\n },\n groq: {\n name: 'groq',\n baseUrl: 'https://api.groq.com/openai/v1',\n apiKey: process.env.GROQ_API_KEY || '',\n model: process.env.GROQ_MODEL || 'llama-3.3-70b-versatile',\n },\n mistral: {\n name: 'mistral',\n baseUrl: 'https://api.mistral.ai/v1',\n apiKey: process.env.MISTRAL_API_KEY || '',\n model: process.env.MISTRAL_MODEL || 'mistral-large-latest',\n },\n openrouter: {\n name: 'openrouter',\n baseUrl: 'https://openrouter.ai/api/v1',\n apiKey: process.env.OPENROUTER_API_KEY || '',\n model: process.env.OPENROUTER_MODEL || 'anthropic/claude-3.5-sonnet',\n headers: {\n 'HTTP-Referer': 'https://pagia.dev',\n 'X-Title': 'PAGIA CLI',\n },\n },\n qwen: {\n name: 'qwen',\n baseUrl: process.env.QWEN_BASE_URL || 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n apiKey: process.env.QWEN_API_KEY || '',\n model: process.env.QWEN_MODEL || 'qwen-turbo',\n },\n deepseek: {\n name: 'deepseek',\n baseUrl: process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com/v1',\n apiKey: process.env.DEEPSEEK_API_KEY || '',\n model: process.env.DEEPSEEK_MODEL || 'deepseek-chat',\n },\n ollama: {\n name: 'ollama',\n baseUrl: process.env.OLLAMA_HOST || 'http://localhost:11434',\n apiKey: '',\n model: process.env.OLLAMA_MODEL || 'llama3.2',\n },\n local: {\n name: 'local',\n baseUrl: process.env.LOCAL_LLM_URL || 'http://localhost:8080/v1',\n apiKey: '',\n model: 'local',\n },\n };\n\n // Override with router.json if it exists\n try {\n const router = getRouterManager();\n const rConfig = router.getConfig();\n if (rConfig && rConfig.providers) {\n for (const p of rConfig.providers) {\n if (baseConfigs[p.name as ProviderName]) {\n const bc = baseConfigs[p.name as ProviderName];\n bc.apiKey = p.api_key || bc.apiKey;\n bc.baseUrl = p.api_base_url || bc.baseUrl;\n bc.model = p.models[0] || bc.model;\n } else {\n // New dynamic provider from router.json\n (baseConfigs as any)[p.name] = {\n name: p.name,\n baseUrl: p.api_base_url,\n apiKey: p.api_key,\n model: p.models[0]\n };\n }\n }\n }\n } catch { /* ignore */ }\n\n return baseConfigs;\n}\n\nexport class MultiProvider implements AIProvider {\n name: string;\n private config: ProviderConfig;\n\n constructor(providerName?: ProviderName) {\n const configs = getProviderConfigs();\n const router = getRouterManager();\n const rConfig = router.getConfig();\n\n let selectedProvider = (providerName || process.env.AI_PROVIDER) as ProviderName;\n\n // If no explicit provider, try the router's default\n if (!selectedProvider && rConfig?.router?.default) {\n selectedProvider = rConfig.router.default.provider as ProviderName;\n }\n\n // Fallback to groq as it was the original default\n if (!selectedProvider || !configs[selectedProvider]) {\n selectedProvider = 'groq';\n }\n\n this.config = configs[selectedProvider];\n\n // If router has a specific model for this provider, use it\n if (rConfig?.router?.default?.provider === selectedProvider) {\n this.config.model = rConfig.router.default.model;\n }\n\n this.name = selectedProvider;\n }\n\n async ask(prompt: string, options?: AIProviderOptions): Promise<string> {\n // Gemini usa API diferente\n if (this.config.name === 'gemini') {\n return this.callGemini(prompt, options);\n }\n\n // Ollama usa endpoint diferente\n if (this.config.name === 'ollama') {\n return this.callOllama(prompt, options);\n }\n\n // Todos os outros usam formato OpenAI-compatible\n return this.callOpenAICompatible(prompt, options);\n }\n\n private async callOpenAICompatible(prompt: string, options?: AIProviderOptions): Promise<string> {\n const messages: any[] = [];\n\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n // Headers extras (ex: OpenRouter)\n if (this.config.headers) {\n Object.assign(headers, this.config.headers);\n }\n\n // Sanitize baseURL: remove /chat/completions if present (the fetch call below adds it)\n let baseURL = this.config.baseUrl;\n if (baseURL.endsWith('/chat/completions')) {\n baseURL = baseURL.replace('/chat/completions', '');\n }\n\n const response = await fetch(`${baseURL}/chat/completions`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model: this.config.model,\n messages,\n temperature: options?.temperature ?? 0.7,\n max_tokens: options?.maxTokens ?? 4096,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`[${this.config.name}] HTTP ${response.status}: ${errorText.slice(0, 200)}`);\n }\n\n const data = await response.json() as any;\n\n if (data.error) {\n throw new Error(`[${this.config.name}] ${data.error.message || data.error}`);\n }\n\n return data.choices?.[0]?.message?.content || '(Resposta vazia)';\n }\n\n private async callGemini(prompt: string, options?: AIProviderOptions): Promise<string> {\n const url = `${this.config.baseUrl}/models/${this.config.model}:generateContent?key=${this.config.apiKey}`;\n\n const contents: any[] = [];\n\n if (options?.systemPrompt) {\n contents.push({ role: 'user', parts: [{ text: options.systemPrompt }] });\n contents.push({ role: 'model', parts: [{ text: 'Entendido.' }] });\n }\n contents.push({ role: 'user', parts: [{ text: prompt }] });\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n contents,\n generationConfig: {\n temperature: options?.temperature ?? 0.7,\n maxOutputTokens: options?.maxTokens ?? 4096,\n },\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`[gemini] HTTP ${response.status}: ${errorText.slice(0, 200)}`);\n }\n\n const data = await response.json() as any;\n\n if (data.error) {\n throw new Error(`[gemini] ${data.error.message}`);\n }\n\n return data.candidates?.[0]?.content?.parts?.[0]?.text || '(Resposta vazia)';\n }\n\n private async callOllama(prompt: string, options?: AIProviderOptions): Promise<string> {\n const response = await fetch(`${this.config.baseUrl}/api/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: this.config.model,\n messages: [\n ...(options?.systemPrompt ? [{ role: 'system', content: options.systemPrompt }] : []),\n { role: 'user', content: prompt },\n ],\n stream: false,\n options: {\n temperature: options?.temperature ?? 0.7,\n },\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`[ollama] HTTP ${response.status}: ${errorText.slice(0, 200)}`);\n }\n\n const data = await response.json() as any;\n return data.message?.content || '(Resposta vazia)';\n }\n\n static listAvailableProviders(): { name: string; configured: boolean; model: string }[] {\n const configs = getProviderConfigs();\n return Object.entries(configs).map(([name, config]) => ({\n name,\n configured: name === 'local' || name === 'ollama' || !!config.apiKey,\n model: config.model,\n }));\n }\n}\n\n// Singleton padrão\nexport const multiProvider = new MultiProvider();\n"}}, ".pagia/config.yml": {"7af1693113c6489efe9aaa8d6c55c7065e1e0417": {"t": 1785746863.8490398, "n": 6982, "h": "5104245cf6584722", "c": "# ════════════════════════════════════════════════════════════════════════════════\n# PAGIA - Plano de Ação de Gestão e Implementação com IA\n# Arquivo de Configuração Principal\n# ════════════════════════════════════════════════════════════════════════════════\n\nversion: 1.0.0\nbase_install: true\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# AI PROVIDERS\n# Configure os provedores de IA disponíveis para sua CLI\n# ════════════════════════════════════════════════════════════════════════════════\n\nai_provider:\n # Provider padrão (openai, gemini, groq, mistral, anthropic, openrouter, qwen, deepseek, ollama, local)\n default: groq\n \n # Fallback quando o provider principal falhar\n fallback: gemini\n \n # Timeout para chamadas de API (em segundos)\n timeout: 60\n \n # Máximo de tentativas em caso de falha\n max_retries: 3\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# INTEGRAÇÃO COM CLAUDE CODE\n# Configure para usar comandos Claude Code no seu projeto\n#\n# Override: --claude-code-commands=true/false\n# ════════════════════════════════════════════════════════════════════════════════\n\nclaude_code_commands: true\n\n# Instalar agentes como subagentes do Claude Code\n# Requer: claude_code_commands: true\n#\n# Override: --use-claude-code-subagents=true/false\nuse_claude_code_subagents: true\n\n# Usar Skills do Claude Code para standards\n# Requer: claude_code_commands: true\n#\n# Override: --standards-as-claude-code-skills=true/false\nstandards_as_claude_code_skills: false\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# INTEGRAÇÃO COM OUTRAS FERRAMENTAS\n# Configure para Cursor, Windsurf, Qwen Code, etc.\n#\n# Override: --pagia-commands=true/false\n# ════════════════════════════════════════════════════════════════════════════════\n\npagia_commands: true\n\n# Pasta onde os comandos serão instalados\ncommands_folder: .pagia/commands\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# AGENTES\n# Configure os agentes disponíveis e seu comportamento\n# ════════════════════════════════════════════════════════════════════════════════\n\nagents:\n # Pasta onde os agentes estão definidos\n folder: .pagia/agents\n \n # Agentes habilitados por padrão\n enabled:\n - spec-initializer\n - spec-shaper\n - spec-writer\n - spec-verifier\n - task-planner\n - implementer\n - implementation-verifier\n - product-planner\n - task-list-creator\n \n # Composição de agentes (pipeline, parallel, voting)\n composition_strategy: pipeline\n \n # Modo de execução (interactive, autonomous)\n execution_mode: interactive\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# PLANOS E TAREFAS\n# Configure como planos e tarefas são gerenciados\n# ════════════════════════════════════════════════════════════════════════════════\n\nplans:\n # Pasta principal dos planos\n folder: .pagia/plans\n \n # Tipos de plano habilitados\n types:\n - global # Plano estratégico de alto nível\n - stages # Plano detalhado por etapas\n - prompts # Planos gerados por prompts\n - ai # Planos autônomos da IA\n \n # Sincronização automática de tarefas\n auto_sync: true\n \n # Formato de exportação (yaml, json, markdown)\n export_format: yaml\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# BASE DE CONHECIMENTO\n# Configure a base de conhecimento semântica\n# ════════════════════════════════════════════════════════════════════════════════\n\nknowledge:\n # Pasta da base de conhecimento\n folder: .pagia/knowledge\n \n # Tipos de documentos aceitos\n supported_types:\n - markdown\n - typescript\n - javascript\n - python\n - yaml\n - json\n \n # Indexação automática\n auto_index: true\n \n # Modelo de embeddings\n embedding_model: text-embedding-3-small\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# MCP SERVER\n# Configure o servidor Model Context Protocol\n# ════════════════════════════════════════════════════════════════════════════════\n\nmcp:\n # Habilitar servidor MCP\n enabled: true\n \n # Porta padrão\n port: 3100\n \n # Ferramentas expostas\n tools:\n - read_plan\n - update_plan\n - list_agents\n - run_agent\n - search_knowledge\n \n # IDEs suportadas\n ide_configs:\n - cursor\n - vscode\n - claude\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# TDD WORKFLOW\n# Configure o fluxo de desenvolvimento orientado a testes\n# ════════════════════════════════════════════════════════════════════════════════\n\ntdd:\n # Habilitar TDD workflow\n enabled: true\n \n # Framework de testes padrão\n test_framework: vitest\n \n # Comando para rodar testes\n test_command: npm test\n \n # Cobertura mínima exigida (%)\n min_coverage: 80\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# LLM GATEWAY\n# Configure o gateway local para LLMs\n# ════════════════════════════════════════════════════════════════════════════════\n\nllm_gateway:\n # Habilitar gateway\n enabled: true\n \n # Porta do gateway\n port: 3000\n \n # URL do LLM local (llama.cpp, LM Studio, etc)\n local_llm_url: http://localhost:8080\n \n # Providers habilitados no gateway\n providers:\n - local\n - openai\n - gemini\n - anthropic\n - groq\n - deepseek\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# INTERFACE\n# Configure a aparência e comportamento da CLI\n# ════════════════════════════════════════════════════════════════════════════════\n\ninterface:\n # Tema (light, dark, auto)\n theme: auto\n \n # Idioma (pt-BR, en-US)\n language: pt-BR\n \n # Mostrar banner ao iniciar\n show_banner: true\n \n # Mostrar dicas\n show_tips: true\n \n # Modo debug\n debug: false\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# PROFILE\n# Perfil padrão a ser usado\n#\n# Override: --profile [nome-do-perfil]\n# ════════════════════════════════════════════════════════════════════════════════\n\nprofile: default\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# PROFILES\n# Defina perfis customizados para diferentes contextos\n# ════════════════════════════════════════════════════════════════════════════════\n\nprofiles:\n default:\n ai_provider: groq\n agents:\n - analyst\n - coder\n execution_mode: interactive\n \n autonomous:\n ai_provider: openai\n agents:\n - conductor\n - analyst\n - architect\n - coder\n - tester\n execution_mode: autonomous\n \n minimal:\n ai_provider: groq\n agents:\n - coder\n execution_mode: interactive\n \n enterprise:\n ai_provider: anthropic\n agents:\n - product-owner\n - scrum-master\n - analyst\n - architect\n - coder\n - qa\n - tester\n execution_mode: autonomous\n tdd:\n enabled: true\n min_coverage: 90\n"}, "ab0b462c07cfc93c48169c127f31429ccae37204": {"t": 1785754647.7740533, "n": 6982, "h": "5104245cf6584722", "c": "# ════════════════════════════════════════════════════════════════════════════════\n# PAGIA - Plano de Ação de Gestão e Implementação com IA\n# Arquivo de Configuração Principal\n# ════════════════════════════════════════════════════════════════════════════════\n\nversion: 1.0.0\nbase_install: true\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# AI PROVIDERS\n# Configure os provedores de IA disponíveis para sua CLI\n# ════════════════════════════════════════════════════════════════════════════════\n\nai_provider:\n # Provider padrão (openai, gemini, groq, mistral, anthropic, openrouter, qwen, deepseek, ollama, local)\n default: groq\n \n # Fallback quando o provider principal falhar\n fallback: gemini\n \n # Timeout para chamadas de API (em segundos)\n timeout: 60\n \n # Máximo de tentativas em caso de falha\n max_retries: 3\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# INTEGRAÇÃO COM CLAUDE CODE\n# Configure para usar comandos Claude Code no seu projeto\n#\n# Override: --claude-code-commands=true/false\n# ════════════════════════════════════════════════════════════════════════════════\n\nclaude_code_commands: true\n\n# Instalar agentes como subagentes do Claude Code\n# Requer: claude_code_commands: true\n#\n# Override: --use-claude-code-subagents=true/false\nuse_claude_code_subagents: true\n\n# Usar Skills do Claude Code para standards\n# Requer: claude_code_commands: true\n#\n# Override: --standards-as-claude-code-skills=true/false\nstandards_as_claude_code_skills: false\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# INTEGRAÇÃO COM OUTRAS FERRAMENTAS\n# Configure para Cursor, Windsurf, Qwen Code, etc.\n#\n# Override: --pagia-commands=true/false\n# ════════════════════════════════════════════════════════════════════════════════\n\npagia_commands: true\n\n# Pasta onde os comandos serão instalados\ncommands_folder: .pagia/commands\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# AGENTES\n# Configure os agentes disponíveis e seu comportamento\n# ════════════════════════════════════════════════════════════════════════════════\n\nagents:\n # Pasta onde os agentes estão definidos\n folder: .pagia/agents\n \n # Agentes habilitados por padrão\n enabled:\n - spec-initializer\n - spec-shaper\n - spec-writer\n - spec-verifier\n - task-planner\n - implementer\n - implementation-verifier\n - product-planner\n - task-list-creator\n \n # Composição de agentes (pipeline, parallel, voting)\n composition_strategy: pipeline\n \n # Modo de execução (interactive, autonomous)\n execution_mode: interactive\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# PLANOS E TAREFAS\n# Configure como planos e tarefas são gerenciados\n# ════════════════════════════════════════════════════════════════════════════════\n\nplans:\n # Pasta principal dos planos\n folder: .pagia/plans\n \n # Tipos de plano habilitados\n types:\n - global # Plano estratégico de alto nível\n - stages # Plano detalhado por etapas\n - prompts # Planos gerados por prompts\n - ai # Planos autônomos da IA\n \n # Sincronização automática de tarefas\n auto_sync: true\n \n # Formato de exportação (yaml, json, markdown)\n export_format: yaml\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# BASE DE CONHECIMENTO\n# Configure a base de conhecimento semântica\n# ════════════════════════════════════════════════════════════════════════════════\n\nknowledge:\n # Pasta da base de conhecimento\n folder: .pagia/knowledge\n \n # Tipos de documentos aceitos\n supported_types:\n - markdown\n - typescript\n - javascript\n - python\n - yaml\n - json\n \n # Indexação automática\n auto_index: true\n \n # Modelo de embeddings\n embedding_model: text-embedding-3-small\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# MCP SERVER\n# Configure o servidor Model Context Protocol\n# ════════════════════════════════════════════════════════════════════════════════\n\nmcp:\n # Habilitar servidor MCP\n enabled: true\n \n # Porta padrão\n port: 3100\n \n # Ferramentas expostas\n tools:\n - read_plan\n - update_plan\n - list_agents\n - run_agent\n - search_knowledge\n \n # IDEs suportadas\n ide_configs:\n - cursor\n - vscode\n - claude\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# TDD WORKFLOW\n# Configure o fluxo de desenvolvimento orientado a testes\n# ════════════════════════════════════════════════════════════════════════════════\n\ntdd:\n # Habilitar TDD workflow\n enabled: true\n \n # Framework de testes padrão\n test_framework: vitest\n \n # Comando para rodar testes\n test_command: npm test\n \n # Cobertura mínima exigida (%)\n min_coverage: 80\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# LLM GATEWAY\n# Configure o gateway local para LLMs\n# ════════════════════════════════════════════════════════════════════════════════\n\nllm_gateway:\n # Habilitar gateway\n enabled: true\n \n # Porta do gateway\n port: 3000\n \n # URL do LLM local (llama.cpp, LM Studio, etc)\n local_llm_url: http://localhost:8080\n \n # Providers habilitados no gateway\n providers:\n - local\n - openai\n - gemini\n - anthropic\n - groq\n - deepseek\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# INTERFACE\n# Configure a aparência e comportamento da CLI\n# ════════════════════════════════════════════════════════════════════════════════\n\ninterface:\n # Tema (light, dark, auto)\n theme: auto\n \n # Idioma (pt-BR, en-US)\n language: pt-BR\n \n # Mostrar banner ao iniciar\n show_banner: true\n \n # Mostrar dicas\n show_tips: true\n \n # Modo debug\n debug: false\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# PROFILE\n# Perfil padrão a ser usado\n#\n# Override: --profile [nome-do-perfil]\n# ════════════════════════════════════════════════════════════════════════════════\n\nprofile: default\n\n\n# ════════════════════════════════════════════════════════════════════════════════\n# PROFILES\n# Defina perfis customizados para diferentes contextos\n# ════════════════════════════════════════════════════════════════════════════════\n\nprofiles:\n default:\n ai_provider: groq\n agents:\n - analyst\n - coder\n execution_mode: interactive\n \n autonomous:\n ai_provider: openai\n agents:\n - conductor\n - analyst\n - architect\n - coder\n - tester\n execution_mode: autonomous\n \n minimal:\n ai_provider: groq\n agents:\n - coder\n execution_mode: interactive\n \n enterprise:\n ai_provider: anthropic\n agents:\n - product-owner\n - scrum-master\n - analyst\n - architect\n - coder\n - qa\n - tester\n execution_mode: autonomous\n tdd:\n enabled: true\n min_coverage: 90\n"}}}}