Curso
Bem-vindo de volta! Estamos quase lá: O Slack está tocando, o Jira tem tíquetes, os testes são verdes e nossa CI bloqueia todos os PRs desleixados. A parte quatro é o esforço final, em que transformaremos o playground do fp-ts em algo que, em teoria, poderia ser indicado ao público.
Você pode acessar todos os tutoriais da série Devin aqui:
- Configuração e primeira solicitação pull (parte 1)
- Enviando uma fatia vertical com Devin (Parte 2)
- Integrações, testes e CI/CD (Parte 3)
- Segurança, implementação e manutenção (Parte 4)
Aqui está o plano para este quarto tutorial:
- Autorização: Não há mais UUIDs anônimos; vamos incluir credenciais NextAuth, cookies JWT e um GqlAuthGuard para que o progresso seja vinculado a usuários reais.
- Olhos na produção: Uma linha de código do Sentry no aplicativo Web, uma na API do Nest e todas as exceções aparecem no painel.
- Ativação por botão de pressão: O front-end é ativado no Vercel com URLs de visualização em cada PR. (Por enquanto, a API permanecerá local, mas vamos falsificar a produção com o Docker).
Também refletiremos sobre essa programação em pares com Devin e veremos onde ela se destaca e onde um ser humano ainda precisa arrumar as pontas soltas antes que o mundo veja o repositório. Você está pronto para a última etapa?
De UUID anônimo a usuários reais
O que pedi a Devin para fazer
Resumindo, pedi a Devin que eliminasse o fluxo de UUID anônimo e me fornecesse uma pilha de autenticação real:
- Provedor de credenciais NextAuth v6 em
apps/web
- NestJS AuthModule com hashing Argon2 e cookies JWT
- Migração do Prisma que adiciona uma tabela
User
e alteraProgress.sessionId
→userId
(não nulo) - Copie todas as linhas de progresso UUID existentes para um usuário de espaço reservado para que os alunos mantenham seus emblemas
- Não troque o Postgres pelo SQLite
O que você recebeu (em sua maioria, bom)
Aqui está um resumo dos resultados:
Camada |
Produção de Devin |
Banco de dados |
Eliminei a tabela |
Backend |
|
Front-end |
|
Segurança |
Argon2 (12 rodadas), validação de DTO via |
Testes |
Teste de unidade para |
Outra migração para o SQLite
Adivinhe o que eu vi aparecer novamente na pequena caixa de pensamento de Devin.
Migração bem-sucedida do PostgreSQL para o SQLite para desenvolvimento local 🥳
Exatamente o que eu havia dito a ele paranão fazer. O esquema do Prisma foi reescrito para o SQLite, e as cadeias de conexão e os tipos foram alterados (de TIMESTAMP para DATETIME). Eu o peguei no meio da sessão:
- Pausou a sessão.
git checkout main apps/api/prisma/schema.prisma
(restaurar o esquema do Postgres).- Excluiu o novo arquivo
dev.db
. npm run prisma:migrate --workspace=apps/api
para reaplicar as migrações do Postgres.- Retomou Devin; ele detectou a reversão e continuou sem reclamar.
Danos: 0,8 ACU e cerca de dez minutos.
Lista de verificação de mudança radical para colegas de equipe
Eu realmente aprecio as instruções que Devin coloca nos PRs. Aqui ele nos disse para fazê-lo:
# 1 Install new deps
npm install --workspaces
# 2 Run the Postgres migration
npm run prisma:migrate --workspace=apps/api
# 3 Restart everything
npm run dev:api & npm run dev:web
Visão geral da arquitetura
No wiki, encontrei este diagrama útil do nosso novo sistema de autenticação:
Com usuários reais instalados e o banco de dados firmemente de volta ao Postgres, estamos finalmente prontos para acompanhar o progresso genuíno do aluno, enviar compilações de visualização para o Vercel e detectar erros de tempo de execução com o Sentry.
Front-end no Vercel, links de visualização em cada PR
Com os logins seguros implementados, o próximo marco óbvio era mostrar ao mundo algo clicável. Decidimos implantar apenas o front-end Next.js por enquanto. A API e o Postgres permanecerão em meu computador local até escolhermos um host que caiba no orçamento.
Conexão manual de conta (0 ACUs)
Ainda não é possível conectar o Devin à minha conta pessoal da Vercel por meio de integrações nativas. Então, fiz isso manualmente, por meio do painel da Vercel:
- Fiz login no Vercel e cliquei em "New Project → Import Git Repository".
- Selecione o repositório
fp-ts-exercises
, deixe o comando de compilação comonpm run build --workspace apps/web
e clique em Deploy. - Você copiou os arquivos
VERCEL_PROJECT_ID
eVERCEL_TOKEN
resultantes para o GitHub Secrets.
Permita que Devin atualize o fluxo de trabalho de CI (0.4 ACU)
Seguindo minha orientação, Devin adicionou um único trabalho à parte inferior do fluxo de trabalho existente e uma pequena etapa do shell que enrola a URL gerada para o Slack:
- name: Deploy to Vercel
if: ${{ success() && github.event_name == 'pull_request' }}
run: npx vercel deploy --prod --token ${{ secrets.VERCEL_TOKEN }}
env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
Resultado
Enviar uma ramificação → CI green → Slack ping:
✅ Preview ready: https://fp-ts-exercises-git-my-branch.vercel.app
Ao abrir o link, você verá nosso playground, o fluxo de autenticação completo e o painel do aluno. Ainda não é necessário nenhum ajuste de ambiente no final da Vercel, porque o front-end conversa com minha API local em http://localhost:4000
.
Uma olhada mais de perto no sistema de segredos de Devin
Antes da integração com o Sentry, dei uma olhada no sistema de segredos do Devin para descobrir se deveria usá-lo. O Devin oferece um cofre "Secrets" integrado para que você possa fornecer ao agente chaves de API, URLs de banco de dados ou tokens OAuth sem verificá-los no Git e sem expô-los no bate-papo. Pense nisso como um equivalente leve aos segredos do GitHub Actions ou às variáveis de ambiente do Vercel, mas com escopo para os próprios espaços de trabalho em nuvem do Devin.
Recurso |
Como funciona |
Notas |
Escopo |
Os segredos abrangem três escopos: organização, repositório e sessão. |
Você pode tornar os segredos disponíveis no nível da organização, em todas as suas sessões. Se quiser adicionar segredos para um único repositório, você poderá especificá-los ao configurar o repositório.Se quiser que os segredos sejam específicos da sessão, você poderá fornecê-los nas configurações da sessão. |
Criptografia |
Armazenado no lado do servidor com AES-256 e TLS 1.3+ enquanto estiver em trânsito |
Todos os dados do cliente são criptografados com uma chave KMS (Key Management Service) personalizada, gerenciada pela AWS. |
Sem custo de ACU |
Adicionar, editar ou excluir um segredo é uma ação do plano de controle: 0 ACUs. Somente as tarefas que usam o segredo incorrem em créditos de computação. |
Bom lugar para guardar fichas de longa duração. |
Acesso aos prompts internos |
Use |
Exemplo: |
Limites de tamanho |
4 KB por chave, 100 chaves por equipe no nível principal. |
O suficiente para certificados PEM ou chaves privadas. |
Adicionar um segredo
Aqui estão as etapas que você precisa seguir para adicionar um segredo:
- Aberto Equipe → Segredos no painel de controle do Devin.
- Clique em "Adicionar segredo" e digite um nome (
SENTRY_DSN_WEB
) e seu valor. - Devin confirma o armazenamento; a chave agora está disponível em
$.SENTRY_DSN_WEB
.
Usando um segredo em uma tarefa
Tarefa: atualizar a API Sentry init; definir DSN para $SECRET.SENTRY_DSN_API
O Devin substitui o valor quando você escreve main.ts
. Na guia shell, você verá o DSN literal, mas o registro de bate-papo o oculta.
Prós e contras
Pros:
- Não há risco de vazamento de chaves em PRs ou registros de lapso de tempo.
- Os segredos com escopo de organização funcionam em todas as sessões: um upload, muitos usos.
- Custo zero de crédito para armazenar ou buscar.
Contras:
- As chaves não estão disponíveis localmente, a menos que você as copie para
.env
. Os testes realizados fora do Devin precisam de configuração manual. - Sem escopo por ambiente (por exemplo, "somente em produção"). Todas as sessões recebem todos os segredos.
Quando usá-lo
Acho mais fácil usar o cofre do Devin quando o próprio Devin precisa da chave (por exemplo, enviando para o Vercel, acessando um registro privado ou conectando o Sentry durante a compilação). Eu continuaria usando .env
/ GitHub Actions secrets para tudo o que também é executado em seu shell de desenvolvimento local ou executores de CI.
Integração do Devin com o Sentry
Aqui está o prompt que usei: Adicione o Sentry aos dois aplicativos para que todas as exceções apareçam no meu painel. Use variáveis de ambiente em .env
. Nenhum outro comportamento muda".
Trabalho de Devin (0,6 ACU, uma sessão)
Aqui está um resumo do resultado:
Pilha |
Arquivos tocados |
Código-chave |
Next.js (Web) |
|
|
NestJS (API) |
|
|
Andaime de Env |
Adicionados marcadores de posição a |
|
Testes |
Adicionado um Jest spy para afirmar que |
Minhas etapas manuais
Aqui estão as etapas que segui:
- Copiei DSNs do meu projeto Sentry para
.env
. - Reiniciei os dois servidores de desenvolvimento.
- Acesse
http://localhost:4000/graphql
com uma consulta deliberadamente ruim para verificar se funcionou. Um problema apareceu no Sentry em segundos.
Por que pulei o recurso de segredos de Devin
É por isso que eu pulei o recurso de segredos do Devin:
- Modelo mental mais simples: o mesmo arquivo
.env
em todos os lugares. - É mais fácil executar compilações de visualização no Vercel (essas variáveis de ambiente já estão definidas lá).
- Não há queima de ACU para operações de armazenamento secreto.
Reflexões: Onde o Devin brilha e onde ele tropeça
Há quatro partes do tutorial, esse repositório era uma pilha empoeirada de exercícios de fp-ts. Agora, ele tem:
- Base de código modernizada: Dependências mais recentes, configuração estrita do TS, regras do lint e do Prettier (Parte 1).
- Playground baseado em navegador: Next.js 14 + editor Sandpack com feedback Vitest ao vivo (Parte 2).
- NestJS + backend do Postgres: API GraphQL, migrações Prisma, anônimo → JWT, acompanhamento do progresso (Partes 2 e 4).
- Pipeline com luz verde: Fluxo de trabalho de CI que faz a ligação, verifica a digitação, executa o Jest e o Playwright e bloqueia cada PR com falha (Parte 3).
- Integrações de equipe: Pings de status do Slack, análise de rótulos do Jira e URLs de visualização em todas as ramificações (Parte 3).
- Observabilidade da produção: O Sentry foi conectado à Web e à API, capturando todas as exceções (Parte 4).
- A pré-visualização é implementada em: O Vercel cria uma URL compartilhável para cada pull request (Parte 4).
Gastamos cerca de ≈ 70 ACUs no total (~$157 no plano Core) e cerca de dois dias úteis de revisão prática.
O que Devin faz assustadoramente bem
É aqui que eu acho que Devin é muito bom:
Área |
Por que você me impressionou |
Infraestrutura padrão |
Scaffolds AuthModule, Dockerfiles, fluxos de trabalho YAML: gerados em minutos, sem bugs. |
Código de estrutura idiomática |
Os decoradores do NestJS, a configuração do NextAuth e as migrações do Prisma corresponderam aos documentos oficiais. |
Andaime de teste |
Os pacotes Unit e Playwright são compilados e executados fora do portão - não faltam stubs de casos extremos. |
Onde um humano ainda vence o agente
É nesse ponto que acho que Devin ainda precisa melhorar:
Ponto de dor |
Exemplo |
Polimento de recursos entre camadas |
O editor do Sandpack foi codificado para testes de stub; não entendeu SandpackTests nome do componente. |
Persistência de configuração |
Retornou ao SQLite por padrão 5 vezes, mesmo depois de explicitar "Must stay on Postgres". |
Nomeação / limpeza |
Os títulos de RP são modificados, os arquivos obsoletos permanecem, a menos que você diga ao Devin para excluí-los. |
Gosto e UX |
O painel parecia aceitável, mas o espaçamento, o texto e as cores ainda precisavam ser ajustados. |
Minha opinião
Os próprios documentos do Devin nunca prometeram um construtor de produtos. Eles delineiam um ponto ideal muito mais estreito e, em retrospecto, eu deveria ter ficado dentro dele. A página oficial "página "Quais são os pontos fortes de Devin? lista quatro usos de títulos:
Os documentos chamam de "experimental" o desenvolvimento de recursos que abrangem a interface do usuário, a API e os fluxos de dados. Elas são descritas como tarefas grandes e abertas em que o agente pode "exigir revisão e iteração humanas significativas". Isso é exatamente o que vimos quando o Sandpack codificou testes ou quando o painel parecia bom, mas não computava os dados de fato.
Portanto, como regra geral:
Use o Devin para qualquer coisa que um desenvolvedor sênior possa automatizar com um script e mantenha o volante para as tarefas que precisam de um senso de produto.
Conclusão
Chegamos ao final de nosso tutorial em quatro partes:
- Configuração e primeira solicitação pull (parte 1)
- Enviando uma fatia vertical com Devin (Parte 2)
- Integrações, testes e CI/CD (Parte 3)
- Segurança, implementação e manutenção (Parte 4)
Aqui estão algumas das próximas etapas que você pode seguir:
- Hospede a API para que as compilações de visualização (e os futuros usuários) tenham um back-end real.
- Certifique-se de que a funcionalidade principal funcione e corrija os 30 bugs que sei que estão lá
- Aperfeiçoe a interface do usuário
- Adicionar mais conteúdo e exercícios
- Liberar para as pessoas usarem!
Se você seguir o mesmo caminho, lembre-se: você pode deixar o agente colocar o concreto, mas você ainda precisa projetar a casa. Boa codificação!