Worker agent em Go que:
- lê tasks do Todoist com label configurada (ex:
ai:do) - mapeia cada lista/projeto do Todoist para um repositório GitHub
- baixa/atualiza o repositório
- usa a API da OpenAI (modelo Codex) para implementar a task com leitura/edição de arquivos do repositório
- quando há múltiplas tasks do mesmo repositório no mesmo polling, processa em lote em uma única chamada de IA
- commit/push e abre PR automaticamente
- se a task tiver label
@build, o commit incluipush-ver:{última_tag} - valida que o PR foi criado no GitHub
- adiciona label
ai:codingao iniciar e troca paraai:pr-doneao finalizar - comenta as tasks relacionadas no Todoist
- quando o PR é mergeado, fecha automaticamente a task no Todoist
- ao fechar a task por PR mergeado, cria um commit vazio no branch base com
push-ver:{versão_sem_build}(ex:0.0.0) - evita reprocessamento no polling (ignora tasks com
ai:coding/ai:pr-donee não processa o mesmotask.IDduas vezes no mesmo processo) - salva em comentários da task apenas o summary da IA e os paths dos arquivos editados
- Go 1.26+
gitno PATH- token do Todoist
- token do GitHub com permissão de
repo
Crie config.json:
{
"worker": {
"poll_interval_seconds": 60,
"work_root": "/tmp/codenite-work",
"dry_run": false,
"comment_on_task": true
},
"task_source": {
"provider": "todoist",
"todoist": {
"token": "TODOIST_TOKEN",
"label": "ai:do"
}
},
"ai": {
"provider": "codex",
"model": "gpt-5.2-codex",
"env": {
"OPENAI_API_KEY": "${OPENAI_API_KEY}"
}
},
"vcs": {
"provider": "github",
"github": {
"token": "GITHUB_TOKEN",
"draft": true
}
},
"repositories": {
"123456789": {
"repo": "marcelors27/chroma-monorepo",
"base_branch": "main"
},
"987654321": {
"repo": "marcelors27/chroma-monorepo",
"base_branch": "develop"
}
}
}repositories mapeia project_id do Todoist para owner/repo do GitHub.
go run ./cmd/worker -config ./config.json -onceLoop contínuo:
go run ./cmd/worker -config ./config.json- o worker lista arquivos versionados do repositório clonado
- a IA escolhe quais arquivos ler para contexto
- o worker envia o conteúdo desses arquivos para a IA
- a IA retorna alterações de arquivos e o worker aplica no filesystem local
- Configure a variável de ambiente
OPENAI_API_KEYno serviço do Railway. - Em
ai.env, mapeie${OPENAI_API_KEY}. - O worker expande
${...}usando o ambiente do processo noconfig.json(incluindo tokens).
Isso facilita trocar o provedor de IA depois sem mexer no core do worker.
- O repositório já contém
railway.jsonusando build porDockerfile. - Configure as env vars no serviço Railway:
OPENAI_API_KEYGITHUB_TOKENTODOIST_TOKENWORKER_CONFIG_JSON(JSON do config em uma linha)
Exemplo de WORKER_CONFIG_JSON:
{"worker":{"poll_interval_seconds":60,"work_root":"/tmp/codenite-work","dry_run":false,"comment_on_task":true},"task_source":{"provider":"todoist","todoist":{"token":"${TODOIST_TOKEN}","label":"ai:do"}},"ai":{"provider":"codex","model":"gpt-5.2-codex","env":{"OPENAI_API_KEY":"${OPENAI_API_KEY}"}},"vcs":{"provider":"github","github":{"token":"${GITHUB_TOKEN}","draft":true}},"repositories":{"123456789":{"repo":"marcelors27/chroma-monorepo","base_branch":"main"}}}Arquivo auxiliar com exemplo de env:
.env.railway.example
- novas fontes de task implementando
TaskSource - novos provedores de IA implementando
AIProvider - novos provedores de VCS implementando
VCSProvider