neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Auditor de codebases JavaScript/TypeScript com IA: importe um repositório do GitHub (ou envie um ZIP) e receba uma nota de saúde por categoria, uma lista priorizada de problemas, um explorador que explica cada arquivo e um chat que responde com base no código real (RAG). codedriven é uma aplicação Next.js 16 (App Router) que faz o papel de um revisor sênior: importa um repositório, mede o código com regras determinísticas, pede a um LLM uma revisão de arquitetura, segurança e performance, e junta tudo numa nota por categoria com os problemas priorizados.README 전문 보기 ↗
Auditor de codebases JavaScript/TypeScript com IA: importe um repositório do GitHub (ou envie um ZIP) e receba uma nota de saúde por categoria, uma lista priorizada de problemas, um explorador que explica cada arquivo e um chat que responde com base no código real (RAG).
Acesse: nextjs-codedriven.vercel.app
codedriven é uma aplicação Next.js 16 (App Router) que faz o papel de um revisor sênior: importa um repositório, mede o código com regras determinísticas, pede a um LLM uma revisão de arquitetura, segurança e performance, e junta tudo numa nota por categoria com os problemas priorizados.
Todo pull request roda a análise sobre este repositório e sobre dois apps propositalmente vulneráveis (OWASP NodeGoat e Juice Shop, com as vulnerabilidades anotadas). Ele falha se a análise piorar (evals/README.md).
A nota determinística deixa as categorias do LLM no valor-base, para ser comparável entre resultados. A linha tracejada é a mesma medida com a fórmula da v1.
/data diz o que vai para o LLM e o que fica guardado.| Camada | Tecnologia |
|---|---|
| Framework | Next.js 16 (App Router, Server Actions, proxy.ts), React 19 |
| Linguagem | TypeScript 5, zod 4 |
| UI | Tailwind CSS 4, shadcn/ui (Base UI) |
| Autenticação | Auth.js (NextAuth v5, sessões JWT): email e senha, GitHub, Google |
| Banco de dados | Neon Postgres + pgvector, Drizzle ORM (migrations versionadas) |
| Execução assíncrona | Vercel Workflows (análise e importação como runs duráveis) |
| Arquivos | Neon Object Storage (ZIP enviado por POST assinado) |
| LLM | AI SDK 7 + Groq (gpt-oss-120b, Zero Data Retention) |
| Embeddings | @huggingface/transformers + ONNX (all-MiniLM-L6-v2, 384 dimensões), em CPU |
| Parsing de código | Tree-sitter (JS, TS, TSX) |
| Integração GitHub | GitHub App (contents e metadata, só leitura) |
| Billing | Stripe |
| Observabilidade | Sentry (erros e traces, sem PII nem código do usuário), logs JSON com correlation id |
| Testes | Vitest (unidade, componentes, integração em Postgres real), Playwright (E2E) |
| Regras de arquitetura | dependency-cruiser no CI |
| Entrega | Vercel (Hobby), GitHub Actions, OSV-Scanner |
flowchart LR
User(["Usuário"])
Visitor(["Visitante<br/>link público"])
subgraph Vercel["Vercel"]
App["codedriven<br/>Next.js 16"]
WF["Vercel Workflows<br/>análise durável"]
Cron["Cron diário<br/>reaper + retenção"]
end
DB[("Neon Postgres<br/>+ pgvector")]
Bucket[("Neon Object Storage<br/>ZIPs enviados")]
Groq["Groq<br/>LLM"]
HF["Hugging Face Hub<br/>modelo de embeddings"]
GH["GitHub<br/>login + GitHub App"]
Google["Google<br/>login"]
Stripe["Stripe<br/>checkout + webhook"]
Sentry[["Sentry"]]
User --> App
Visitor --> App
App --> WF
Cron --> App
App --> DB
WF --> DB
User -- ZIP por POST assinado --> Bucket
WF --> Bucket
WF -- revisão --> Groq
App -- chat e explicações --> Groq
WF -- cold start --> HF
App --> GH
WF -- zipball, token de 1 h --> GH
App --> Google
App <--> Stripe
App -.-> Sentry
WF -.-> Sentry
O sistema é um monólito modular (ADR-001): um único deploy Next.js, com o domínio dividido em módulos. Clean Architecture e DDD entram só onde há regra de negócio.
flowchart TB
subgraph Entrega["Entrega"]
Pages["Pages e route handlers<br/>src/app"]
Actions["Server actions<br/>src/lib/actions"]
Proxy["proxy.ts<br/>sessão + CSP com nonce"]
end
subgraph Modulos["Módulos — src/modules"]
direction LR
Identity["identity"]
Projects["projects"]
Ingestion["ingestion"]
Analysis["analysis"]
Chat["chat"]
Billing["billing"]
end
Lib["src/lib<br/>Auth.js, pipeline, arquivos, GitHub, rate limit"]
Shared["src/shared<br/>logger, redação, env, CSP, tracing"]
DB[("Postgres + pgvector")]
Pages --> Modulos
Actions --> Modulos
Pages --> Lib
Modulos --> Lib
Modulos --> Shared
Lib --> Shared
Modulos --> DB
Lib --> DB
Cada módulo tem a mesma forma (convenção, ADR-002):
src/modules/<módulo>/
├── domain/ # regras em TypeScript puro: sem banco, sem framework, sem process.env
├── application/ # use cases e as portas que eles usam
├── infrastructure/ # implementações: Drizzle, Stripe, GitHub, ONNX
├── index.ts # API pública pura: tipos e regras
└── server.ts # API pública de servidor: use cases ligados ao banco ("server-only")
| Módulo | Responsabilidade |
|---|---|
| identity | Conta, cadastro, credenciais, instalações do GitHub App (só ids), exclusão de conta |
| projects | Ciclo de vida do projeto (queued → processing → completed/failed), importação, link público |
| ingestion | Embeddings e armazenamento vetorial, atrás das portas Embedder e VectorStore |
| analysis | Métricas, uma regra por heurística, amostragem para o LLM, verificação de evidência, fórmula da nota |
| chat | Política do prompt (código como dado) e recuperação de contexto |
| billing | Planos, cota diária com lock transacional (withQuota), Stripe atrás de uma camada anticorrupção |
As regras são verificadas no CI (npm run lint:arch, baseline de violações: 0):
domain/ não importa infraestrutura nem frameworks;index.ts e server.ts podem ser importados;src/app não toca o banco;Uma porta só existe quando há duas implementações ou um teste precisa de um fake.
sequenceDiagram
autonumber
actor U as Usuário
participant A as Server action / rota
participant B as billing
participant W as Vercel Workflow
participant G as GitHub App
participant L as Groq
participant D as Postgres
U->>A: importar repositório
A->>A: sessão, zod, dono da instalação
A->>B: withQuota (lock, checagem, uso)
B->>D: cria o projeto
A->>W: dispara o run e responde na hora
W->>G: token de 1 h, só leitura, só este repositório
G-->>W: zipball
W->>D: arquivos extraídos
W->>D: chunks (Tree-sitter) e embeddings em lotes
W->>W: métricas e regras determinísticas
W->>L: amostra do código em blocos de dados
L-->>W: achados com a linha citada
W->>W: descarta achado sem evidência, agrupa, calcula a nota
W->>D: relatório
U->>A: acompanha o progresso
FatalError), e um run que morre sem gravar a falha é encerrado pelo reaper.Os fluxos de chat, link público, billing e observabilidade estão em docs/architecture.md.
proxy.ts. Toda consulta filtra pelo userId da sessão, com testes de IDOR em Postgres real.Report-Only enquanto os relatórios são revisados (TD-34); framing bloqueado.As decisões ficam em docs/decisions/, cada uma com contexto, alternativas e consequências:
| ADR | Decisão |
|---|---|
| 001 | Monólito modular com Clean Architecture e DDD seletivos |
| 002 | Convenção dos módulos e regras de arquitetura no CI |
| 003 | Cota de uso do plano: lock, checagem e uso numa transação; falha nossa devolve |
| 004 | Custo do LLM: orçamento diário de tokens por plano, teto por chamada, kill switch no banco |
| 005 | Vercel Workflows como job runner da importação e da análise |
| 006 | Embeddings em runtime serverless (ONNX em CPU, cache por hash) |
| 007 | GitHub App só de leitura no lugar do OAuth App com escopo repo |
| 008 | Retenção de 90 dias para o código e exclusão de conta de ponta a ponta |
| 009 | Evals em dois níveis: determinístico obrigatório e LLM real quando a análise muda |
| 010 |
nextjs-codedriven/
├── src/
│ ├── app/ # Pages, route handlers e o link público (/r/<token>)
│ ├── components/ # UI: ui/ (shadcn), shared/ e pastas por feature
│ ├── modules/ # identity, projects, ingestion, analysis, chat, billing
│ ├── lib/ # Auth.js, server actions, pipeline, arquivos, GitHub, rate limit
│ ├── shared/ # logger, redação, env, CSP, tracing, prompt-data
│ ├── db/ # Schema do Drizzle
│ └── proxy.ts # Sessão das páginas protegidas + CSP com nonce
├── drizzle/ # Migrations versionadas
├── evals/ # Evals da análise, do chat e do LLM (casos, repositórios, resultados)
├── e2e/ # Playwright
├── scripts/ # Gráfico de dogfooding, medição de cobertura
└── docs/
├── decisions/ # ADRs
├── runbooks/ # Migrations, GitHub App, object storage, kill switch do LLM
├── retros/ # Retrospectivas por fase
├── architecture.md # Como o sistema é hoje
├── baseline.md # O "antes" medido
├── roadmap-v2.md # Fases, escopo e critérios de saída
└── technical-debt.md # Dívida técnica (TD-xx)
543 testes unitários em 58 arquivos, 180 de integração em 20 arquivos (Postgres real e descartável) e 7 E2E (Playwright, na build de produção).
CI obrigatório para merge:
LLM eval com o modelo real, quando o prompt ou a análise mudam:
Cada versão do prompt fica registrada com o resultado que a mediu (evals/prompts.lock.json).
Medição antes de otimizar: todo número da documentação tem data e método (baseline, resultados das fases 3, 5 e 6).
| Comando | Descrição |
|---|---|
npm run dev | Servidor de desenvolvimento |
npm run build / start | Build e servidor de produção |
npm run lint / lint:arch / typecheck | ESLint, regras de arquitetura, tipos |
npm test | Testes unitários e de componentes (Vitest) |
npm run test:integration | Integração em Postgres local e descartável (recusa hosts remotos) |
npm run test:e2e | Playwright |
npm run eval / eval:chart | Evals da análise e do chat; gráfico de dogfooding |
npm run measure:coverage | Cobertura real (v8) de unidade + integração |
npm run db:generate / db:migrate / db:studio | Migrations e studio do Drizzle |
Integração local com Docker:
docker run -d --rm --name it-pg -e POSTGRES_USER=app -e POSTGRES_PASSWORD=app \
-e POSTGRES_DB=app -p 5432:5432 pgvector/pgvector:0.8.6-pg18
DATABASE_URL="postgresql://app:app@localhost:5432/app" npm run test:integration
Pré-requisitos: Node.js 24, npm e um Postgres 16+ com a extensão pgvector (um projeto gratuito do Neon serve).
npm ci
cp .env.example .env.local # preencha os valores
npm run db:migrate
npm run dev # http://localhost:3000
O .env.example documenta cada variável e diz quais são opcionais. Login com GitHub ou Google, importação pelo GitHub App, billing e object storage podem ficar desligados no desenvolvimento local. A configuração de cada integração está nos runbooks.
Use um banco de desenvolvimento (por exemplo, uma branch do Neon), nunca o de produção: migrations e dados locais vão para onde o
.env.localapontar (runbook de migrations).
O registro de dívida técnica tem a lista completa, com gravidade e destino. As que mais afetam a leitura das notas:
max-lines-per-function, pela fatia de funções longas. Arquitetura, segurança e performance partem de um valor fixo menos os achados: arquitetura, por exemplo, não passa de 88 nem sem achados. O plano de calibração, com metas medidas, está no TD-50.Report-Only até os relatórios do Sentry ficarem limpos (TD-34).Construído a partir do tutorial AliSadeghi-dev/AI-Code-Analyzer, adaptado de Prisma para Drizzle ORM + Neon. A v1 (tag v1-tutorial) acrescentou uma camada de segurança; a v2 acrescentou arquitetura modular, execução durável, testes, evals e operação em produção.
| Fórmula da nota: achados agrupados, penalidade decrescente, testes calibrados |
| 011 | ZIP enviado direto ao object storage até o job processá-lo |