MÓDULO 4.2

Prompt 01 — Scaffold e Worktree

📚

Tópicos

6

⏱️

Minutos

50

🎯

Nível

Avançado

🔨

Tipo

Build

1

O que o Prompt 01 Entrega

Estrutura do plugin + worktree setup — a Camada de Isolamento completa

O primeiro prompt constrói apenas a Camada de Isolamento: o scaffold do plugin e a infraestrutura de git worktree. Não há lógica de revisão ainda — só o contêiner que vai receber a lógica nos próximos prompts.

💡 Deliverables do Prompt 01
1.claude.json com hooks registrados e slash command /pr-reviewer
2.hooks/stop-hook.sh — stub fail-open com ERR trap
3.scripts/setup-worktree.sh — cria worktree em /tmp/pr-review-$PR_NUMBER
4.scripts/cleanup-worktree.sh — remove worktree via EXIT trap
🔑 Por que Scaffold Primeiro

O scaffold define o contrato externo: como o plugin é invocado, quais hooks são registrados, onde ficam os scripts. Mudar isso depois exige refatorar os prompts 2-5. Acertar aqui é barato. Acertar no Prompt 04 significa reescrever tudo.

2

O Prompt 01 Completo

Cole este texto no Claude Code para construir a primeira camada

Este é o texto exato do primeiro prompt de build. Cole no Claude Code com o SPEC.md em contexto. Observe a estrutura: o que entregar, as restrições não-negociáveis e a verificação antes de avançar.

Prompt 01 — Cole no Claude Code

01_scaffold_and_worktree.md
Read SPEC.md if present — it's the source of truth.

You are building a Claude Code plugin called "pr-reviewer".
This is Prompt 01: build the scaffold and isolation layer only.
Do NOT implement any review logic yet.

**Deliver in this prompt:**

1. `claude.json` with:
   - Hook registration: Stop hook pointing to `hooks/stop-hook.sh`
   - Slash command: `/pr-reviewer <pr_number>` that sets PR_NUMBER
     env var and runs `scripts/setup-worktree.sh`

2. `hooks/stop-hook.sh` — fail-open stub:
   - `set -euo pipefail` + ERR trap that prints to stderr and exits 0
   - Reads PR_NUMBER from environment (exits 0 if not set)
   - Always returns `{"decision":"approve"}` for now
   - No review logic whatsoever

3. `scripts/setup-worktree.sh <pr_number>`:
   - Validates that PR_NUMBER is numeric
   - Checks if worktree already exists with `git worktree list`
   - If exists: reuses it (idempotent)
   - If not: `git worktree add /tmp/pr-review-$1 origin/$(gh pr view $1 --json headRefName -q .headRefName)`
   - On any failure: log to stderr, exit 0 (fail-open)
   - Sets WORKTREE_PATH=/tmp/pr-review-$1 in state (creates state/ dir)

4. `scripts/cleanup-worktree.sh <pr_number>`:
   - `git worktree remove --force /tmp/pr-review-$1 2>/dev/null || true`
   - Removes state/review.yaml if present
   - Always exits 0

**Constraints:**
- All scripts: `set -euo pipefail` + ERR trap (fail-open)
- setup-worktree.sh MUST be idempotent (safe to run twice)
- stop-hook.sh MUST return exit 0 on any error
- No hardcoded PR numbers anywhere

**Verification after delivery:**
- `claude --version` loads the plugin without error
- `bash -n hooks/stop-hook.sh` passes with no syntax errors
- `bash -n scripts/setup-worktree.sh` passes with no syntax errors
- `bash scripts/setup-worktree.sh 123` creates worktree at /tmp/pr-review-123
  (run in a real git repo with GitHub remote)
- Running setup-worktree.sh 123 twice does NOT error

Tell me the file count and the result of `bash -n` on each script.

O que está certo neste prompt

  • Referência explícita ao SPEC.md no início
  • Escopo limitado: "somente a camada de isolamento"
  • Restrições não-negociáveis explícitas
  • Verificação com comandos exatos a rodar

Armadilhas a evitar

  • Pedir lógica de revisão no Prompt 01
  • Omitir a instrução de fail-open no stop-hook
  • Não verificar idempotência do setup-worktree
  • Avançar para Prompt 02 sem rodar a verificação
3

Arquivos Gerados pelo Prompt 01

claude.json, hooks/ e scripts/ — responsabilidades e conteúdo esperado

Após o Prompt 01, você deve ter 4 arquivos novos. Cada um tem responsabilidade única e clara. Se o Claude gerou mais arquivos sem motivo, algo saiu do escopo.

claude.json

Manifest do plugin — registra hooks e slash commands

{
  "name": "pr-reviewer",
  "version": "0.1.0",
  "hooks": {
    "Stop": [{ "matcher": "", "hooks": ["bash hooks/stop-hook.sh"] }]
  },
  "commands": {
    "pr-reviewer": {
      "description": "Review a pull request",
      "command": "bash scripts/setup-worktree.sh $PR_NUMBER"
    }
  }
}

hooks/stop-hook.sh

Stub fail-open — será substituído no Prompt 03

#!/usr/bin/env bash
set -euo pipefail
trap 'echo "[pr-reviewer] ERR on line $LINENO" >&2; exit 0' ERR

# Stub: always approve (no review logic yet)
printf '{"decision":"approve"}\n'
Por que o stub é tão simples

O stub existe para que o plugin seja válido e carregável desde o Prompt 01. Cada prompt subsequente substitui pedaços dele com lógica real, verificando que o comportamento esperado ainda funciona antes de avançar.

4

Como o Worktree Funciona

git worktree add + cleanup garantido via EXIT trap

Um git worktree é um segundo working directory ligado ao mesmo repositório. Diferente de um clone, ele compartilha o histórico e objetos do repositório original — sem duplicar dados. É o mecanismo correto para trabalhar com múltiplas branches simultaneamente.

🌳 Fluxo Completo do Worktree
# 1. Obter nome da branch do PR
BRANCH=$(gh pr view $PR_NUMBER --json headRefName -q .headRefName)

# 2. Criar worktree em /tmp (isolado do working tree atual)
git worktree add /tmp/pr-review-$PR_NUMBER origin/$BRANCH

# 3. Trabalhar no worktree (revisar código)
cd /tmp/pr-review-$PR_NUMBER
git diff origin/main...HEAD

# 4. Cleanup GARANTIDO — o EXIT trap chama isso mesmo se o script falhar
trap 'git worktree remove --force /tmp/pr-review-$PR_NUMBER 2>/dev/null || true' EXIT

# Verificar worktrees ativos
git worktree list
⚠️ Por que --force no Remove

Sem --force, o git worktree remove falha se o worktree tem arquivos modificados não commitados. Como o plugin opera no worktree (lendo diff, criando arquivos temporários), --force garante que o cleanup sempre funciona.

5

Fail-Open no Setup

O que acontece se o worktree já existe ou o setup falha

O setup-worktree.sh deve ser idempotente e fail-open. Idempotente significa que rodar duas vezes produz o mesmo resultado que uma. Fail-open significa que qualquer falha resulta em exit 0 — nunca bloqueia o usuário.

1

Worktree já existe

Verificar com git worktree list | grep "/tmp/pr-review-$PR_NUMBER". Se encontrar: reutiliza e continua. Não tenta criar novamente.

2

Branch não existe no remote

O gh pr view falha. O ERR trap captura, loga no stderr e faz exit 0. O usuário vê a mensagem de erro mas o Claude Code continua funcionando normalmente.

3

Disco cheio ou permissão negada

Falha de infraestrutura. O ERR trap captura, loga o motivo e retorna exit 0. A revisão não acontece, mas o usuário não fica bloqueado.

6

Verificação Antes do Prompt 02

Testes obrigatórios — não avance sem estes passarem

A verificação do Prompt 01 é a mais importante do projeto — é aqui que você confirma que a base está sólida. Bugs no scaffold são baratos aqui. Baratos no Prompt 01. Caros no Prompt 04.

1

claude --version

Deve carregar o plugin pr-reviewer sem erros. Se falhar, o claude.json tem problema de sintaxe.

2

bash -n hooks/stop-hook.sh && bash -n scripts/setup-worktree.sh && bash -n scripts/cleanup-worktree.sh

Lint de sintaxe bash. Deve passar sem output — erros de sintaxe aparecem como mensagens de erro.

3

bash scripts/setup-worktree.sh 999

Em um repo com PR #999 no GitHub: deve criar worktree em /tmp/pr-review-999. Verificar com `git worktree list`.

4

bash scripts/setup-worktree.sh 999 && bash scripts/setup-worktree.sh 999

Rodar duas vezes não deve erro. Confirma idempotência.

5

bash scripts/cleanup-worktree.sh 999 && git worktree list

Após cleanup, o worktree não deve aparecer mais na lista. Confirma que o remove funciona.

Sem PR real? Use um repo de teste

Crie um repo de teste no GitHub com um PR aberto. Os testes 3, 4 e 5 precisam de um PR real porque usam gh pr view. Um PR com um arquivo modificado qualquer é suficiente para validar o scaffold.

Resumo do Módulo 4.2

Prompt 01 aplicado — scaffold + camada de isolamento completa
Git worktree — checkout isolado com EXIT trap e cleanup garantido
Idempotência verificada — setup-worktree.sh seguro para rodar múltiplas vezes
Fail-open confirmado — qualquer falha resulta em exit 0, nunca bloqueia

Próximo Módulo:

4.3 — Prompt 02: A Máquina de Estados — estado YAML atômico e lockfile