Files
ProgramadorBrasil 61ec71c5c7 feat: add 52 specialized AI agent skills (#217)
New skills covering 10 categories:

**Security & Audit**: 007 (STRIDE/PASTA/OWASP), cred-omega (secrets management)
**AI Personas**: Karpathy, Hinton, Sutskever, LeCun (4 sub-skills), Altman, Musk, Gates, Jobs, Buffett
**Multi-agent Orchestration**: agent-orchestrator, task-intelligence, multi-advisor
**Code Analysis**: matematico-tao (Terence Tao-inspired mathematical code analysis)
**Social & Messaging**: Instagram Graph API, Telegram Bot, WhatsApp Cloud API, social-orchestrator
**Image Generation**: AI Studio (Gemini), Stability AI, ComfyUI Gateway, image-studio router
**Brazilian Domain**: 6 auction specialist modules, 2 legal advisors, auctioneers data scraper
**Product & Growth**: design, invention, monetization, analytics, growth engine
**DevOps & LLM Ops**: Docker/CI-CD/AWS, RAG/embeddings/fine-tuning
**Skill Governance**: installer, sentinel auditor, context management

Each skill includes:
- Standardized YAML frontmatter (name, description, risk, source, tags, tools)
- Structured sections (Overview, When to Use, How it Works, Best Practices)
- Python scripts and reference documentation where applicable
- Cross-platform compatibility (Claude Code, Antigravity, Cursor, Gemini CLI, Codex CLI)

Co-authored-by: ProgramadorBrasil <214873561+ProgramadorBrasil@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:04:07 +01:00

147 lines
5.8 KiB
Python

"""
Cost Optimizer: analisa padroes que impactam consumo de tokens e custos de API.
Identifica SKILL.md muito grandes (impacto direto em tokens consumidos pelo Claude),
output verboso, oportunidades de cache, e padrao de chamadas API.
"""
from __future__ import annotations
from pathlib import Path
from typing import Any, Dict, List, Tuple
def analyze(skill_data: Dict[str, Any]) -> Tuple[float, List[Dict[str, Any]]]:
"""
Analisa custos de uma skill. Retorna (score, findings).
Score alto = skill eficiente em custo.
"""
score = 100.0
findings: List[Dict[str, Any]] = []
skill_name = skill_data["name"]
skill_path = Path(skill_data["path"])
# -- 1. Tamanho do SKILL.md (impacto direto em context window) ---------------
skill_md_lines = skill_data.get("skill_md_lines", 0)
if skill_md_lines > 500:
cost_impact = "alto"
severity = "high"
score -= 20
elif skill_md_lines > 300:
cost_impact = "medio"
severity = "medium"
score -= 10
elif skill_md_lines > 150:
cost_impact = "baixo"
severity = "low"
score -= 3
else:
cost_impact = None
if cost_impact:
# Estimar tokens: ~1.3 tokens por palavra, ~10 palavras por linha
est_tokens = int(skill_md_lines * 10 * 1.3)
findings.append({
"skill_name": skill_name,
"dimension": "cost",
"severity": severity,
"category": "large_skill_md",
"title": f"SKILL.md com {skill_md_lines} linhas (~{est_tokens:,} tokens estimados)",
"description": f"Impacto de custo {cost_impact}. Cada ativacao desta skill "
f"consome ~{est_tokens:,} tokens do context window.",
"recommendation": "Mover detalhes para references/ e manter SKILL.md < 200 linhas. "
"Usar progressive disclosure: SKILL.md = overview, "
"references/ = detalhes lidos sob demanda.",
"effort": "medium",
"impact": "high",
})
# -- 2. References muito grandes ----------------------------------------------
ref_dir = skill_path / "references"
if ref_dir.exists():
for ref_file in ref_dir.glob("*.md"):
try:
lines = len(ref_file.read_text(encoding="utf-8", errors="replace").splitlines())
except OSError:
continue
if lines > 300:
est_tokens = int(lines * 10 * 1.3)
findings.append({
"skill_name": skill_name,
"dimension": "cost",
"severity": "low",
"category": "large_reference",
"title": f"Reference grande: {ref_file.name} ({lines} linhas, ~{est_tokens:,} tokens)",
"description": "Se carregado inteiro no contexto, consome muitos tokens.",
"file_path": f"references/{ref_file.name}",
"recommendation": "Adicionar indice/TOC no inicio. Instruir no SKILL.md "
"para ler apenas secoes relevantes.",
"effort": "low",
"impact": "medium",
})
score -= 3
# -- 3. Output verboso dos scripts --------------------------------------------
for rel_path in skill_data.get("python_files", []):
filepath = skill_path / rel_path
if not filepath.exists():
continue
try:
source = filepath.read_text(encoding="utf-8", errors="replace")
except OSError:
continue
# Contar prints verbosos
import re
print_count = len(re.findall(r'\bprint\s*\(', source))
lines = len(source.splitlines())
# Se >10% das linhas sao prints, eh verboso
if lines > 20 and print_count > 0 and (print_count / lines) > 0.08:
findings.append({
"skill_name": skill_name,
"dimension": "cost",
"severity": "low",
"category": "verbose_output",
"title": f"Output verboso em {rel_path} ({print_count} prints em {lines} linhas)",
"description": "Output excessivo consome tokens do context window quando "
"Claude le a saida do script.",
"file_path": rel_path,
"recommendation": "Usar --verbose flag ou logging levels em vez de prints fixos. "
"Retornar JSON conciso por padrao.",
"effort": "low",
"impact": "medium",
})
score -= 3
# -- 4. Verificar se scripts retornam JSON estruturado vs texto livre -----------
has_json_output = False
for rel_path in skill_data.get("python_files", []):
filepath = skill_path / rel_path
if not filepath.exists():
continue
try:
source = filepath.read_text(encoding="utf-8", errors="replace")
except OSError:
continue
if "json.dumps" in source or "json.dump" in source:
has_json_output = True
break
if not has_json_output and skill_data.get("file_count", 0) > 3:
findings.append({
"skill_name": skill_name,
"dimension": "cost",
"severity": "low",
"category": "no_structured_output",
"title": "Sem output JSON estruturado",
"description": "Scripts que retornam JSON sao mais eficientes para o Claude processar "
"do que texto livre.",
"recommendation": "Adicionar opcao --json para output estruturado em scripts principais",
"effort": "low",
"impact": "medium",
})
score -= 5
return max(0.0, min(100.0, score)), findings