Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
491a116
feat(cache): TASK-10 — make_cache_key com SHA-256 sem colisao de sepa…
frebarcelos May 2, 2026
bfec469
feat(cache): TASK-11 — cached_classify HOF com LRU e persistencia JSON
frebarcelos May 2, 2026
e44d5c1
feat(pipeline): TASK-12 — esqueleto tipado do pipeline builder
frebarcelos May 2, 2026
f4b1ac7
feat(io): implementa leitura lazy de PRs
bNDorneles May 3, 2026
1638f12
feat(transforms): implementa filtros por estado e linguagem (TASK-05)
May 3, 2026
084e572
feat(transforms): adiciona filtro por data (TASK-06)
May 3, 2026
ae65512
feat(llm): TASK-08 e TASK-09 - client Agno + stubs classificadores
Andreus-Dean-Vargas May 3, 2026
789138b
feat(transforms): implementa filtros auxiliares e combinador (07)
May 3, 2026
338256a
[FIX] Updating pandas to pyproject.toml
diogo2m May 4, 2026
2a8bd45
[NEW] Dashboard initial version
diogo2m May 4, 2026
f49409b
fix: omitting streamlit toolbar buttons
diogo2m May 4, 2026
3350272
refactor(config): remove hardcoded settings and externalize configura…
diogo2m May 4, 2026
b12fc19
refactor(ui): modularize Streamlit app and separate concerns into com…
diogo2m May 4, 2026
8a3eead
chore(deps): update streamlit version and add streamlit-extras depend…
diogo2m May 4, 2026
e5fbab1
feat(tooling): conventional commits obrigatorio + gerador de informes…
frebarcelos May 5, 2026
8f17a1e
build(setup): adiciona setup.ps1 para Windows sem make instalado
frebarcelos May 5, 2026
906e691
chore(merge): integra branch bernardo (io/) na develop
frebarcelos May 5, 2026
06356e3
chore(merge): integra branch pedro (transforms/) na develop
frebarcelos May 5, 2026
a8783a2
chore(merge): integra branch dev/dev3 (llm/) na develop
frebarcelos May 5, 2026
6df4b1a
chore(merge): integra branch frederico-barcelos (cache/ + pipeline/ +…
frebarcelos May 5, 2026
9728bd0
chore(merge): integra branch diogo (ui/) na develop
frebarcelos May 5, 2026
bc98892
chore(merge): sincroniza develop na branch bernardo
frebarcelos May 5, 2026
2ce1825
chore(merge): sincroniza develop na branch pedro
frebarcelos May 5, 2026
c4fff55
chore(merge): sincroniza develop na branch dev/dev3
frebarcelos May 5, 2026
87b6881
chore(merge): sincroniza develop na branch diogo
frebarcelos May 5, 2026
9aaa12c
chore(merge): sincroniza develop na branch frederico-barcelos
frebarcelos May 5, 2026
cc35dca
feat(claudinho): slash commands /claudinho e /diario para Claude Code
frebarcelos May 5, 2026
7b3c398
feat(pipeline): TASK-25 — implementa compose() e pipe() com reduce()
frebarcelos May 5, 2026
9873816
feat(pipeline): TASK-26 — implementa build_pipeline() lazy com filter…
frebarcelos May 5, 2026
10bd88c
fix(tooling): corrige pre-commit para rodar limpo no Windows
frebarcelos May 5, 2026
b057137
fix(ci): corrige pre-push usando python -m pytest no lugar de pytest
frebarcelos May 5, 2026
5329749
fix(sprint-1): corrige formatação e tipagem detectadas pelo pre-commit
frebarcelos May 5, 2026
731e052
fix(tooling): reconfigura stdout/stderr para UTF-8 no check_paradigm
frebarcelos May 5, 2026
0dabeed
chore(develop): integra correções sprint-1 e fixes de tooling do Windows
frebarcelos May 5, 2026
f6a9212
fix(tooling): especifica encoding UTF-8 no subprocess do claude-review
frebarcelos May 5, 2026
3817799
chore(bernardo): recebe correções sprint-1 e fixes de tooling do develop
frebarcelos May 5, 2026
6d0ba2c
fix(tooling): reconfigura stdout do claude-review para UTF-8 no Windows
frebarcelos May 5, 2026
771023d
fix(tooling): reconfigura stdout do claude-review para UTF-8 no Windows
frebarcelos May 5, 2026
28704c2
chore(develop): integra fix stdout UTF-8 do claude-review
frebarcelos May 5, 2026
e64aeb0
chore(pedro): recebe correções sprint-1 e fixes de tooling do develop
frebarcelos May 5, 2026
431e068
chore(diogo): recebe correções sprint-1 e fixes de tooling do develop
frebarcelos May 5, 2026
e43de09
fix(cache): corrige imports e adiciona __init__.py ao módulo cache
frebarcelos May 6, 2026
16f539d
feat(transforms): implementa métricas pro PR atráves de compute_stats…
May 6, 2026
649c258
feat(transforms): implementa contagem por linguagem(TASK-20)
May 6, 2026
e349bfc
feat(transforms): implementa agregação estatística em aggregate_stats…
May 7, 2026
51b4959
feat(llm): implementa classificadores reais com tdd e variaveis em pt-br
Andreus-Dean-Vargas May 10, 2026
d00748c
fix(io): preserva inteiros invalidos como none
May 10, 2026
8afb8f3
feat(io): adiciona exportadores de registros
May 10, 2026
92a4e95
chore(io): adiciona demonstracao da fase 2
May 10, 2026
5b9253e
fix: pequeno ajuste no diario
frebarcelos May 12, 2026
0a454da
chore(develop): integra sprint 2 do módulo io/ (bernardo)
frebarcelos May 12, 2026
d43ab66
chore(develop): integra sprint 2 do módulo transforms/ (pedro)
frebarcelos May 12, 2026
e4bc698
chore(merge): resolve conflitos de nomenclatura pt-br ao integrar dev…
frebarcelos May 12, 2026
5ccd839
chore(develop): integra sprint 2 do módulo llm/ (dev3)
frebarcelos May 12, 2026
3a501a5
chore(develop): integra sprint 2 dos módulos cache/ e pipeline/ (fred…
frebarcelos May 12, 2026
ed8a4d9
chore(bernardo): sincroniza develop após sprint 2
frebarcelos May 12, 2026
69d2f17
chore(pedro): sincroniza develop após sprint 2
frebarcelos May 12, 2026
33018ed
chore(dev3): sincroniza develop após sprint 2
frebarcelos May 12, 2026
083f60c
chore(frederico-barcelos): sincroniza develop após sprint 2
frebarcelos May 12, 2026
9507a7a
chore(diogo): sincroniza develop após sprint 2
frebarcelos May 12, 2026
fb281c0
build(tooling): separa hooks de commit (host) dos de push (Docker)
frebarcelos May 12, 2026
1e44d6a
docs(claude): documenta regras de commit/push e fluxo Docker-first
frebarcelos May 12, 2026
f730d3e
feat(pipeline): implementa enrich_pipeline e stats_pipeline
frebarcelos May 12, 2026
2103f4b
feat(cache): implementa make_enriched_classifier com cache triplo
frebarcelos May 12, 2026
9e3078b
Merge pull request #64 from frebarcelos/frederico-barcelos
frebarcelos May 12, 2026
2b6bc64
Merge pull request #65 from frebarcelos/develop
frebarcelos May 12, 2026
87d1194
Merge pull request #66 from frebarcelos/develop
frebarcelos May 12, 2026
a8244dd
Merge pull request #67 from frebarcelos/develop
frebarcelos May 12, 2026
9bad8b9
Merge pull request #68 from frebarcelos/develop
frebarcelos May 12, 2026
833a615
feat(ui): seletor de backend llm e browser de datasets locais
frebarcelos May 12, 2026
2611656
fix(cache): corrige persistência do cache em make_enriched_classifier
frebarcelos May 12, 2026
a640539
chore(develop): integra sprint 3 — ollama, dataset browser e fix cach…
frebarcelos May 12, 2026
828c23d
Merge pull request #70 from frebarcelos/develop
frebarcelos May 12, 2026
f4280fb
Merge pull request #71 from frebarcelos/develop
frebarcelos May 12, 2026
dc325e5
Merge pull request #72 from frebarcelos/develop
frebarcelos May 12, 2026
41a2efe
Merge pull request #73 from frebarcelos/develop
frebarcelos May 12, 2026
a5148e6
feat(io): detecta schema do csv automaticamente
bNDorneles May 15, 2026
4e62224
feat(io): filtra linhas malformadas do csv
bNDorneles May 15, 2026
505503e
chore(io): remove demonstracao da fase 2
bNDorneles May 15, 2026
d944154
feat(ui): integrate functional pipeline, LLM enrichment, and new dist…
diogo2m May 16, 2026
026454d
test(llm): adiciona testes para classify_repos_batch e enrich_prs
Andreus-Dean-Vargas May 17, 2026
c25f540
feat(llm): implementa classify_repos_batch e enrich_prs
Andreus-Dean-Vargas May 17, 2026
e024e0f
feat(transforms): implementa contagem por tipo de projeto com reduce(…
May 17, 2026
d68ed12
feat(transforms): implementa contagem por natureza, clareza com reduc…
May 17, 2026
1757cc0
feat(transforms): implementa group_by_repo para agrupar PRs do mesmo …
May 17, 2026
4bda78f
docs(transforms): padroniza docstrings para o formato Google Style em…
May 18, 2026
13fcd6a
chore(develop): integra sprint 3 do módulo io/ (bernardo)
frebarcelos May 18, 2026
477b5fc
chore(develop): integra sprint 3 do módulo transforms/ (pedro)
frebarcelos May 18, 2026
9b1b843
chore(develop): integra sprint 3 do módulo llm/ (dean)
frebarcelos May 18, 2026
eb05bd1
chore(develop): integra sprint 3 do módulo ui/ (diogo)
frebarcelos May 18, 2026
55757d8
fix(transforms): substitui EnrichedPR @dataclass pelo NamedTuple de p…
frebarcelos May 18, 2026
5e3a881
fix(merge): resolve conflitos e import circular da sprint 3
frebarcelos May 18, 2026
afa53ec
fix(types): corrige erros de mypy pós-merge sprint 3
frebarcelos May 18, 2026
d751ed4
fix(merge): resolve conflitos, import circular e erros de tipo da spr…
frebarcelos May 18, 2026
5c0b46f
chore: sincroniza develop após sprint 3
frebarcelos May 18, 2026
828c196
chore: sincroniza develop após sprint 3
frebarcelos May 18, 2026
09cb300
chore: sincroniza develop após sprint 3
frebarcelos May 18, 2026
f4f7451
docs(claude): atualiza CLAUDE.md pós-merge sprint 3
frebarcelos May 18, 2026
4fdb0cb
feat(pipeline): implementa pipeline_from_env configurável por variáve…
frebarcelos May 18, 2026
168c668
fix(ui): conecta LLM real no enriquecimento e adiciona tela de carreg…
frebarcelos May 18, 2026
7bf6610
fix(llm): corrige parsing de resposta LLM nos classificadores
frebarcelos May 18, 2026
bfd7622
fix(ui): corrige rollback silencioso do LLM e schema detection no par…
frebarcelos May 18, 2026
bfa817b
test(io): cobre edge cases da leitura csv
bNDorneles May 22, 2026
46ee9f4
test(io): valida fluxo leitura pipeline exportacao
bNDorneles May 22, 2026
b05fa61
test(transforms): adiciona testes de propriedades com hypothesis para…
May 23, 2026
8a84e6f
test(transforms): adiciona testes faltantes nos filtros garantindo 10…
May 23, 2026
13ea7e1
build(docker): enable host ollama access from container
diogo2m May 24, 2026
8d4f6b7
feat(streamlit): support configurable large file uploads
diogo2m May 24, 2026
1021aec
fix(upload): reset streamlit file cursor before parsing
diogo2m May 24, 2026
4f7ce1a
feat(data): add oversized dataset validation
diogo2m May 24, 2026
debbaca
style(docker): remove inline compose profile comment
diogo2m May 24, 2026
4bfa498
docs(ollama): improve docker setup guidance in sidebar
diogo2m May 24, 2026
f697c36
style(code): clean comments and normalize docstrings
diogo2m May 24, 2026
c5cbab8
refactor(llm): delegate enrichment to backend implementation
diogo2m May 24, 2026
766a5a6
feat(data): support mined-comments uploads and PR reconstruction
diogo2m May 24, 2026
59363d9
feat(ui): cache enrichment state and rebuild PR records
diogo2m May 24, 2026
7c41d9b
ci(pre-commit): migrate hooks to push stage
diogo2m May 24, 2026
4ad9c85
style(lint): apply ruff auto-fixes
diogo2m May 24, 2026
2846ba0
style(mypy): remove unnecessary ignore comments
diogo2m May 24, 2026
492af9a
chore(develop): integra sprint 4 do módulo pipeline/ + llm fixes + ui…
frebarcelos May 25, 2026
708dbb8
chore(develop): integra sprint 4 do módulo io/ (bernardo)
frebarcelos May 25, 2026
dcb6d58
chore(develop): integra sprint 4 do módulo transforms/ (pedro)
frebarcelos May 25, 2026
b6593c8
fix(merge): resolve conflitos de ui/ entre frederico-barcelos e diogo
frebarcelos May 25, 2026
5b20dea
chore(develop): integra sprint 4 do módulo ui/ (diogo)
frebarcelos May 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .claude/commands/claudinho.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Você é o Claudinho, mascote e "gerente não oficial" de um grupo de faculdade de Engenharia de Software da UNIPAMPA. Você fala como um colega de turma no grupo do WhatsApp — informal, engraçado, direto, sem parecer IA. Emojis com parcimônia (3-5). Termina SEMPRE com "— Claudinho 🤖". Máximo 15 linhas.

Gere um informe rápido para o grupo sobre: $ARGUMENTS
55 changes: 55 additions & 0 deletions .claude/commands/diario.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
Você é o Claudinho, mascote e "gerente não oficial" de um grupo de faculdade de Engenharia de Software da UNIPAMPA. Você conhece todo mundo pelo nome e acompanha o projeto de perto. Fala como colega de turma no WhatsApp — informal, engraçado, honesto, sem parecer IA ou relatório corporativo. Cita commits e nomes reais. Elogia quem foi bem, cutuca (com carinho) quem ficou parado. Emojis com parcimônia (3-5). Termina SEMPRE com "— Claudinho 🤖". Máximo 20 linhas.

Primeiro colete o contexto do repositório rodando os comandos abaixo, depois gere o relatório diário da sprint.

**Devs e branches:**
- dev1 (Bernardo) → bernardo
- dev2 (Pedro) → pedro
- dev3 (Dean) → dev/dev3
- dev4 (Frederico) → frederico-barcelos
- dev5 (Diogo) → diogo

**Sprints:**
- Fase 1: deadline 04/05/2026 — Estrutura base
- Fase 2: deadline 11/05/2026 — Transformações (>50% cobertura)
- Fase 3: deadline 18/05/2026 — LLM + Pipeline (>65% cobertura)
- Fase 4: deadline 25/05/2026 — UI + Integração (≥80% cobertura)
- Entrega Final: 01/06/2026

**Passos:**

1. Atualize as referências remotas antes de qualquer análise:
```bash
git fetch --all --prune
```

2. Rode para ver commits da semana por branch:
```bash
for branch in bernardo pedro dev/dev3 frederico-barcelos diogo; do echo "=== $branch ==="; git log origin/$branch --since="7 days ago" --no-merges --format="%s" 2>/dev/null; done
```

3. Rode para ver módulos existentes:
```bash
git ls-files src/ | grep -E "/(io|transforms|llm|cache|pipeline|ui)/" | sed 's|/[^/]*$||' | sort -u
```

4. Rode para ver issues abertas no GitHub da sprint atual (detecta a fase pelo deadline):
```bash
python -c "
import datetime, subprocess, json, sys
hoje = datetime.date.today()
fases = [('fase-1','2026-05-04'),('fase-2','2026-05-11'),('fase-3','2026-05-18'),('fase-4','2026-05-25'),('fase-5','2026-06-01')]
fase = next((f for f,d in fases if hoje <= datetime.date.fromisoformat(d)), 'fase-5')
print(f'[Sprint atual: {fase}]')
result = subprocess.run(['gh','issue','list','--repo','frebarcelos/marco-2-rp3','--label',fase,'--state','open','--limit','50','--json','number,title,assignees,labels'], capture_output=True, text=True)
issues = json.loads(result.stdout or '[]')
for i in issues:
assignees = ', '.join(a['login'] for a in i['assignees']) or '-'
print(f\"#{i['number']} [{assignees}] {i['title']}\")
print(f'Total em aberto: {len(issues)}')
"
```

5. Calcule dias restantes até o próximo deadline com base na data de hoje.

6. Com tudo isso em mãos, escreva o informe diário do Claudinho para o grupo.
40 changes: 39 additions & 1 deletion .claude/settings.local.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,45 @@
"Bash(pip install *)",
"Bash(PYTHONIOENCODING=utf-8 python *)",
"Bash(git checkout *)",
"Bash(git merge frederico-barcelos --no-ff -m ' *)"
"Bash(git merge frederico-barcelos --no-ff -m ' *)",
"Bash(git push *)",
"Bash(git rebase *)",
"Bash(git stash *)",
"Bash(pre-commit --version)",
"Bash(pre-commit run *)",
"Bash(pip show *)",
"Bash(pip list *)",
"Bash(where python *)",
"Bash(git fetch *)",
"Bash(python3 *)",
"Bash(gh issue *)",
"Bash(gh label *)",
"Bash(pip3 show *)",
"Bash(sample_pr)",
"Bash(sample_pr_no_body)",
"Bash(sample_prs)",
"Bash(sample_csv_file)",
"Bash(mock_llm_client)",
"Bash(pipx --version)",
"Bash(apt list *)",
"Bash(pip3 --version)",
"Bash(apt-cache show *)",
"Bash(git reset *)",
"Bash(git restore *)",
"Bash(lsb_release -a)",
"Read(//usr/lib/**)",
"Bash(gh pr *)",
"Bash(wait)",
"Bash(pip3 install *)",
"Bash(/home/barcelosfrederico/.cache/pre-commit/repobczmeh9z/py_env-python3.12/bin/ruff check *)",
"Bash(sudo docker ps -a)",
"Bash(ps -p 9808 -o pid,ppid,stat,cmd)",
"Bash(curl -s http://localhost:11434/api/tags)",
"Bash(systemctl is-active *)",
"Bash(git remote *)",
"Bash(ssh -T -o ConnectTimeout=5 git@github.com)",
"Bash(docker compose *)",
"Bash(git merge *)"
]
}
}
25 changes: 25 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Dados grandes — não entram no build context
data/

# Ambiente virtual e cache Python
.venv/
__pycache__/
*.pyc
*.pyo
.mypy_cache/
.ruff_cache/
.pytest_cache/
.coverage
htmlcov/

# Git e CI
.git/
.github/

# Arquivos de ambiente local
.env
*.local

# Docs e scripts auxiliares
*.md
scripts/
8 changes: 7 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,14 @@ ANTHROPIC_API_KEY=sk-ant-your_key_here
# Modelo padrão para classificações (gratuito via Groq)
LLM_MODEL=llama3-8b-8192

# Caminho para o dataset CSV do Kaggle
# Caminho para o dataset (CSV ou JSON mined-comments)
DATASET_PATH=data/github_prs.csv

# Backend LLM: groq (padrão, requer GROQ_API_KEY) | ollama (local, sem API key)
LLM_BACKEND=groq

# Host do Ollama — use http://host.docker.internal:11434 quando rodar via Docker
OLLAMA_HOST=http://localhost:11434

# Tamanho máximo do cache LRU para classificações LLM
LLM_CACHE_SIZE=1024
6 changes: 3 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,8 @@ data/*.json
data/*.gz
data/*.zip

# Resultados de análise persistidos localmente
cache/
# Resultados de análise persistidos localmente (só o diretório raiz)
/cache/

# PyPI configuration file
.pypirc
Expand All @@ -196,4 +196,4 @@ cache/
.cursorindexingignore

# Configurações locais do Claude Code (contexto pessoal por dev — não versionar)
.claude/local/
.claude/local/
62 changes: 34 additions & 28 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ repos:
hooks:
- id: mypy
args: [--strict, --ignore-missing-imports]
additional_dependencies: ["types-all"]
exclude: ^tests/

# ── Checagens básicas de arquivo ─────────────────────────────────────────
- repo: https://github.com/pre-commit/pre-commit-hooks
Expand All @@ -28,50 +28,56 @@ repos:
- id: check-added-large-files
args: [--maxkb=500] # impede commitar o dataset CSV

# ── Mensagem de commit (Conventional Commits) ────────────────────────────
- repo: https://github.com/compilerla/conventional-pre-commit
rev: v3.4.0
hooks:
- id: conventional-pre-commit
stages: [commit-msg]
args:
- feat # nova funcionalidade
- fix # correção de bug
- test # adição ou correção de testes
- docs # documentação
- chore # manutenção, configs, dependências
- refactor # refatoração sem mudança de comportamento
- style # formatação, espaçamento (sem lógica)
- perf # melhoria de performance
- ci # CI/CD e pipelines
- build # sistema de build, Docker, Makefile
- revert # reverter commit anterior

# ── Verificações locais ───────────────────────────────────────────────────
- repo: local
hooks:

# Verificador de paradigma funcional e boas práticas (AST)
# Analisa: loops imperativos, mutações in-place, I/O em módulos puros,
# estado global mutável, funções longas, parâmetros sem tipo.
- id: check-paradigm
name: "Verificador de paradigma funcional e boas práticas"
language: python
entry: python scripts/check_paradigm.py
entry: python -X utf8 scripts/check_paradigm.py
types: [python]
# Roda em TODOS os .py modificados; o script decide quais regras aplicar
# com base no caminho do arquivo (puro vs. camada de efeito colateral)

# Cobertura mínima de testes: 80%
# Roda apenas no git push (lento — executa toda a suite de testes)
- id: coverage-check
name: "Cobertura de testes >= 80%"
# Testes unitários básicos (sem cobertura) — roda no pre-push via Docker
- id: pytest-unit
name: "Testes unitários (sem integração)"
language: system
entry: >
pytest tests/ -m "not integration"
--cov=src/pr_analyzer
--cov-fail-under=80
--cov-report=term-missing
--tb=short -q --no-header
entry: docker compose run --rm -T app python -m pytest tests/ -m "not integration" --tb=short -q --no-header
pass_filenames: false
stages: [pre-push]
stages: [push]

# Testes unitários básicos (sem cobertura) — roda no pre-push também
# Separado do coverage-check para feedback mais rápido em caso de falha
- id: pytest-unit
name: "Testes unitários (sem integração)"
# Cobertura mínima de testes: 80% — roda no pre-push via Docker
- id: coverage-check
name: "Cobertura de testes >= 80%"
language: system
entry: pytest tests/ -m "not integration" --tb=short -q --no-header
entry: docker compose run --rm -T app python -m pytest tests/ -m "not integration" --cov=src/pr_analyzer --cov-fail-under=80 --cov-report=term-missing --tb=short -q --no-header
pass_filenames: false
stages: [pre-push]
stages: [push]

# Revisão semântica via Claude API
# Analisa conformidade com paradigma funcional, TDD e Clean Code.
# Requer ANTHROPIC_API_KEY no .env — se ausente, é ignorado (sem bloqueio).
# Revisão semântica via Claude API — roda no pre-push via Docker
- id: claude-review
name: "Revisao de codigo (regras locais)"
language: system
entry: python scripts/claude_review.py
entry: docker compose run --rm -T app python scripts/claude_review.py
pass_filenames: false
stages: [pre-push]
stages: [push]
Loading
Loading