diff --git a/docs/plans/ops1-simplify-dry-pos.md b/docs/plans/ops1-simplify-dry-pos.md new file mode 100644 index 0000000..00285cc --- /dev/null +++ b/docs/plans/ops1-simplify-dry-pos.md @@ -0,0 +1,54 @@ +# Plano: Pós-OPS1 — consolidar parseArgs e extrair cascata `checks` em workflow reutilizável + +Status: rascunho +Atualizado em: 2026-08-20 +Issue: OPS1-DRY (sucessora de #17 OPS1) +Priority: P3 +Appetite: ~1 sessão leve (fill-in) + +## Intenção + +Débitos de DRY encontrados no review do OPS1 (simplify reviewers), que ficaram +para trás para não misturar refactor com a migração de CI: + +1. **parseArgs duplicado em 4 scripts.** `scripts/pr.mjs`, `scripts/github-pr-automerge.mjs` + e `scripts/configure-branch-protection.mjs` têm cópias locais; `scripts/lib/agent-forgejo.mjs` + exporta outro idêntico (flagsWithValue + positional + kebab→camel). Consolidar num + `scripts/lib/cli.mjs` único e importar nos 4 — sem tocar a semântica (fail-closed nos + flags sem valor, positional, prefixo `--`). +2. **Cascata `checks` duplicada em `ci.yml` e no `verify` do `deploy.yml`.** O mesmo + fluxo (checkout → setup-bun → install → lint → build → unit → playwright → e2e) em + dois arquivos; risco de drift (ex.: esquecer `playwright install` em um dos dois). + Extrair numa reusable workflow (`workflow_call`) chamada pelos dois, preservando o + nome do job `checks` em `ci.yml` (o required-check literal `checks` não pode mudar). + +## O que NÃO negociar + +- O literal `checks` (required check + auto-merge) — com reusable workflow, o job + `checks` fica declarado em `ci.yml` (o check-run `CI / checks` é inalterado). +- Comportamento/política do parser (as 3 variantes hoje divergem só em + flagsWithValue/positional — unificar com o superset; cada chamador filtra). + +## Fases + +1. `parseArgs` em `cli.mjs` + importar em `pr.mjs`, `github-pr-automerge.mjs`, + `configure-branch-protection.mjs`, `agent-forgejo.mjs` (remover as cópias). Gate: + `bun run test:unit`. +2. Reusable workflow `checks` (workflow_call) + `ci.yml` e `deploy.yml` `verify` + passando a usá-la. Gate: `bun run gate` + validação ao vivo (PR → check `checks`). + +## Rabbit holes / fora de escopo + +- Não mudar o comportamento do parser (só mover/consolidar). +- Não mesclar DRY com UX. +- `agent-forgejo.mjs` (tracker) só troca o parseArgs — nada da lógica de claim. + +## Já resolvido no simplify (não reabrir) + +- Nada do OPS1-DRY foi resolvido — é o próprio conteúdo pós-review diferido. + +## Aceite + +- Zero `parseArgs` duplicado (busca por `const parseArgs` → 1 em cli.mjs). +- `ci.yml` e `deploy.yml` `verify` usam o mesmo `workflow_call`; um PR validado mostra + o check-run `CI / checks` idêntico. \ No newline at end of file diff --git a/docs/plans/remover-fluxo-forgejo.md b/docs/plans/remover-fluxo-forgejo.md new file mode 100644 index 0000000..0c1f4e8 --- /dev/null +++ b/docs/plans/remover-fluxo-forgejo.md @@ -0,0 +1,52 @@ +# Plano: Pós-OPS1 Fase 2 — remover arquivos do fluxo Forgejo (workflows/scripts mortos) + +Status: rascunho +Atualizado em: 2026-08-20 +Issue: OPS1-F2 (sucessora de #17 OPS1) +Priority: P2 +Appetite: ~1 sessão (remoção + fixups de consumidores + docs) + +## Intenção + +O fluxo GitHub Actions (OPS1, validado ao vivo: PRs #1/#3 no GitHub — CI `checks` +verde → auto-merge nativo → flips via API → deploy manual `workflow_dispatch`) é a +única via de CI/PR/deploy no repo. Os arquivos do fluxo Forgejo ficam **dormentes** +desde o cutover e devem sair do tree — é a Fase 2 prometida no impl plan do OPS1. + +## O que NÃO negociar + +- Tracker no Forgejo (Issues/labels/claims/flips via API): `forgejo-api.mjs`, + `agent-*.mjs`, `issue.mjs`, `forgejo-issue-transition.mjs`, + `agent-promote-related-on-merge.mjs` **ficam**; `.forgejo/worktree.env` fica + (consumido pelo provisionamento de worktree — fora do escopo `workflows/*`). +- Desligar o runner do Forgejo é passo manual do runbook (fora do código). +- `ci.yml` de main não volta (deploy = dispatch manual). +- Nunca fechar o tracker (anti-goal do OPS1). + +## O que remover + +- `.forgejo/workflows/*` (4 arquivos: ci.yml, issue-done-on-main-merge.yml, + plan-issue-ready-on-main-merge.yml, agent-pr-ready-automerge.yml). +- `scripts/forgejo-pr-automerge.mjs` (poll automerger da era Forgejo — substituído + pelo auto-merge nativo + `github-pr-automerge.mjs`). +- Doc residuais que descrevem o fluxo Forgejo (varredura por `forgejo-pr-automerge`, + `.forgejo/workflows`, "rsync homeserver:" etc.). + +## Rabbit holes / fora de escopo + +- Não deletar scripts do tracker (item NÃO negociar) nem `.forgejo/worktree.env`. +- Não editar `docs/plans/*` já congelado (história; a narrativa "dormentes até a + Fase 2" permanece). +- Rollback continua sendo git history / PR reversível (não manter arquivos). + +## Já resolvido no simplify (não reabrir) + +- Resistência de reverter a Fase 2 foi mudada para "rollback = git history" (o main + congelado do Forgejo ainda tem a árvore pré-cutover). + +## Aceite + +- `git grep` por `forgejo-pr-automerge|.forgejo/workflows` em scripts/workflows + vivo → zero hits (fora do tracker e do env file). +- `bun run gate` limpo; um PR inteiro validado no GitHub depois da remoção + (CI + merge + flip). \ No newline at end of file