spec-first-claude 0.8.0-beta.1 → 0.8.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-first-claude",
3
- "version": "0.8.0-beta.1",
3
+ "version": "0.8.0-beta.3",
4
4
  "description": "Spec-first workflow kit for Claude Code — AI-driven development with specs, not guesswork",
5
5
  "bin": {
6
6
  "spec-first-claude": "bin/cli.js"
@@ -8,6 +8,51 @@
8
8
 
9
9
  ---
10
10
 
11
+ ## 0.8.0-beta.3 (2026-05-11) — Working directory blindado
12
+
13
+ Esclarecimento crítico em brownfield (e em qualquer cenário com múltiplos
14
+ repos em `projetos/`): o cwd do agente **nunca muda** — é sempre a raiz SFW.
15
+ Repos clonados são alvo de trabalho, não ambiente de trabalho. Evita conflito
16
+ entre regras SFW e regras do time do repo legado (`CLAUDE.md`, `.cursorrules`,
17
+ `AGENTS.md` etc. internos ao repo).
18
+
19
+ ### Adicionado
20
+
21
+ - **Regra inviolável #7** em `rules.md`: "Working directory é a raiz SFW"
22
+ - **Seção "Working Directory — raiz SFW é a casa do agente"** em `rules.md`:
23
+ tabela do que faz/não faz, fronteira clara entre operacional/descritivo/histórico
24
+ - **Bloco "Working Directory"** no topo de `CLAUDE.md` (Claude kit) e
25
+ `copilot-instructions.md` (Copilot kit) — antes de qualquer outra seção
26
+ - **Aviso reforçado no Passo 3 do `/sfw-onboard`** (logo após clone):
27
+ usar `git -C projetos/<repo>` em vez de `cd`; não carregar arquivos de
28
+ instrução internos do repo legado (`CLAUDE.md`, `.cursorrules`, `AGENTS.md`)
29
+
30
+ ### Por quê
31
+
32
+ Repo legado pode ter próprio `CLAUDE.md` ou `copilot-instructions.md` que
33
+ conflita com SFW. Sem regra explícita, agente pode confundir "padrões
34
+ observados" (descritivos, TRD §1.6) com "regras invioláveis" (prescritivas,
35
+ `rules.md`). Resultado: bagunça. Fronteira agora é explícita.
36
+
37
+ ---
38
+
39
+ ## 0.8.0-beta.2 (2026-05-11) — Auth check pré-clone
40
+
41
+ `/sfw-onboard` agora verifica autenticação git **antes** de tentar clonar,
42
+ detectando SSH vs HTTPS e testando ssh-agent / credential helper / GH CLI.
43
+ Falha cedo com mensagem específica em vez de erro genérico do `git clone`.
44
+
45
+ ### Adicionado
46
+
47
+ - Passo 0 do `/sfw-onboard`: verificação proativa de auth
48
+ - SSH: `ssh-add -l` (agent vazio?) + `ssh -T git@<host>` (chave autorizada?)
49
+ - HTTPS: `git config credential.helper` + `gh auth status` + `git ls-remote`
50
+ - 6 mensagens de erro específicas (ssh-agent off, agent vazio, chave não
51
+ autorizada, sem helper nem GH CLI, GH CLI deslogado, falha desconhecida)
52
+ - Nota Windows/PowerShell sobre ssh-agent + alternativas (GH CLI, PAT)
53
+
54
+ ---
55
+
11
56
  ## 0.8.0-beta.1 (2026-05-11) — Brownfield onboarding
12
57
 
13
58
  Skill nova `/sfw-onboard` pra assumir aplicações **já existentes**. Lê o
@@ -41,11 +41,77 @@ execução adiciona uma entry em `projetos.yaml` e merge aditivo no TRD.
41
41
  | # | Validação | Se falhar |
42
42
  |---|-----------|-----------|
43
43
  | 1 | `<git-url>` informado | Parar → "Informe a URL do repositório. Ex: /sfw-onboard https://github.com/org/app.git" |
44
- | 2 | `git` instalado no PATH | Parar → "Git não encontrado no PATH" |
45
- | 3 | URL acessível (auth do user) | Parar "Falha ao clonar. Configure SSH/PAT antes de rodar /sfw-onboard" |
44
+ | 2 | `git` instalado no PATH (`git --version`) | Parar → "Git não encontrado no PATH" |
45
+ | 3 | **Auth git pré-verificada** (ver passo 0) | Parar com instrução específica conforme tipo de URL |
46
46
  | 4 | `--branch` e `--tag` não usados juntos | Parar → "Use --branch OU --tag, não ambos" |
47
47
  | 5 | Scope `onboard_<repo>` não está em `analyzing` | Se sim → "Onboarding anterior incompleto. Rode novamente pra retomar" |
48
48
 
49
+ ### Passo 0 — Verificar autenticação ANTES de clonar
50
+
51
+ Detectar tipo de URL e testar auth proativamente. Falhar cedo com mensagem
52
+ clara é melhor que esperar o `git clone` quebrar sem contexto.
53
+
54
+ **Detectar tipo de URL**:
55
+
56
+ | Padrão | Tipo |
57
+ |--------|------|
58
+ | `git@<host>:<org>/<repo>.git` | SSH |
59
+ | `ssh://git@<host>/...` | SSH |
60
+ | `https://<host>/...` | HTTPS |
61
+
62
+ **Se SSH** — testar agente + conectividade:
63
+
64
+ ```bash
65
+ # 1. ssh-agent rodando com chave carregada?
66
+ ssh-add -l
67
+ # Saída esperada: linha(s) com fingerprint. Se "The agent has no identities",
68
+ # user precisa rodar `ssh-add ~/.ssh/id_ed25519` (ou similar).
69
+ # Se "Could not open a connection to your authentication agent",
70
+ # user precisa iniciar o ssh-agent.
71
+
72
+ # 2. Host autenticável? (extrair host da URL, ex: github.com)
73
+ ssh -T -o StrictHostKeyChecking=accept-new -o BatchMode=yes git@<host>
74
+ # GitHub retorna exit 1 com "Hi <user>! You've successfully authenticated"
75
+ # GitLab/Bitbucket têm mensagens análogas.
76
+ # Exit 255 ou "Permission denied (publickey)" → chave não autorizada.
77
+ ```
78
+
79
+ **Se HTTPS** — testar credential helper ou GH CLI:
80
+
81
+ ```bash
82
+ # 1. Git credential helper configurado?
83
+ git config --get credential.helper
84
+ # Vazio → user usa GH CLI ou vai ser perguntado credencial no clone.
85
+
86
+ # 2. (Se host = github.com) GH CLI autenticado?
87
+ gh auth status --hostname github.com
88
+ # Exit 0 + "Logged in to github.com" → ok
89
+ # Exit 1 → não logado
90
+
91
+ # 3. Alternativa: tentar ls-remote sem clonar (mais leve que clone)
92
+ GIT_TERMINAL_PROMPT=0 git ls-remote --heads <git-url> HEAD
93
+ # Exit 0 → auth ok
94
+ # Exit ≠ 0 + "Authentication failed" → credencial ausente/inválida
95
+ # Exit ≠ 0 + "could not read Username" → terminal prompt bloqueado, sem credential helper
96
+ ```
97
+
98
+ **Mensagens de erro específicas**:
99
+
100
+ | Cenário | Mensagem |
101
+ |---------|----------|
102
+ | SSH sem ssh-agent | "ssh-agent não está rodando. Inicie com `eval $(ssh-agent)` (Linux/Mac) ou `Start-Service ssh-agent` (Windows)" |
103
+ | SSH agent vazio | "Nenhuma chave SSH carregada. Rode `ssh-add ~/.ssh/id_ed25519` (ajuste o nome se diferente)" |
104
+ | SSH host nega | "Chave SSH não autorizada em `<host>`. Verifique se a chave pública está cadastrada em `<host>/settings/keys` (GitHub) ou equivalente" |
105
+ | HTTPS sem helper nem GH CLI | "Credencial HTTPS não configurada. Opções: (1) `gh auth login` se host=github.com; (2) configurar credential helper (`git config --global credential.helper manager`); (3) usar URL SSH (`git@<host>:...`)" |
106
+ | HTTPS GH CLI deslogado | "GH CLI não autenticado. Rode `gh auth login` e tente novamente" |
107
+ | `ls-remote` falha por motivo desconhecido | "Falha ao acessar o repo: `<stderr do ls-remote>`. Verifique a URL e suas credenciais" |
108
+
109
+ **Sucesso**: log breve "Auth OK ({tipo})" e prosseguir para o Passo 1.
110
+
111
+ > **Nota Windows/PowerShell**: comandos `ssh-add`, `ssh -T`, `gh`, `git`
112
+ > assumem disponíveis no PATH. Em ambientes sem ssh-agent nativo (Windows
113
+ > antigo), instruir uso do GH CLI ou HTTPS+PAT.
114
+
49
115
  ## Passos
50
116
 
51
117
  ### 1. Resolver nome do scope e path
@@ -84,6 +150,17 @@ git pull --ff-only
84
150
 
85
151
  Capturar `commit_hash` resultante (`git rev-parse HEAD`) — vai pro snapshot.
86
152
 
153
+ > ⚠️ **Working directory NÃO muda**. O agente continua operando da raiz SFW.
154
+ > Use `git -C projetos/<repo-name> <comando>` em vez de `cd`. Comandos que
155
+ > precisam executar dentro do repo (linters, tree, etc.) usam path explícito
156
+ > ou flag `-C` equivalente.
157
+ >
158
+ > **NÃO carregar** `CLAUDE.md`, `.github/copilot-instructions.md`, `.cursorrules`,
159
+ > `AGENTS.md` ou qualquer arquivo de instrução que exista DENTRO de
160
+ > `projetos/<repo-name>/` — esses pertencem ao time do repo legado e não fazem
161
+ > parte do contrato SFW. Padrões relevantes serão extraídos pelo Patterns Reader
162
+ > e documentados em TRD §1.6.
163
+
87
164
  ### 4. Criar `.context.md`
88
165
 
89
166
  ```yaml
@@ -332,7 +409,8 @@ Se `--name` diferentes → scopes separados (raro, mas suportado).
332
409
 
333
410
  | Erro | Ação |
334
411
  |------|------|
335
- | URL não acessível | Parar, sugerir checar SSH/PAT |
412
+ | Auth falha (capturado no Passo 0) | Parar com mensagem específica conforme cenário (ver tabela do Passo 0) |
413
+ | Clone falha mesmo com auth OK | Reportar `stderr` do git; verificar se a URL e branch existem |
336
414
  | Repo vazio | Parar — "Nada a onboardar" |
337
415
  | Nenhum reader produziu fragmento (stack desconhecida) | Parar — "Stack não reconhecida. Detalhe TRD manualmente ou peça suporte" |
338
416
  | `projetos/<repo-name>/` já existe e NÃO é clone do mesmo URL | Parar — "Path já em uso por outro repo. Use --name pra dar outro nome" |
@@ -32,6 +32,43 @@ As regras abaixo são o padrão do framework. O time pode:
32
32
  4. **Sem invenção**: Se `specs/` não especifica, o coder NÃO assume — para e reporta
33
33
  5. **Entregáveis contínuos**: Toda feature é faseada em entregáveis incrementais. Cada fase entrega valor ao usuário e pode ir para produção independentemente. Nunca "tudo ou nada" — sempre "pequeno e constante"
34
34
  6. **Nunca na main**: Todo código é desenvolvido em branch própria. Merge apenas via PR aprovado pelo usuário
35
+ 7. **Working directory é a raiz SFW**: O agente opera SEMPRE a partir da raiz do projeto SFW (onde estão `.claude/`, `docs/`, `specs/`, `workspace/`, `projetos.yaml`). Repos em `projetos/<repo>/` são **alvo de trabalho**, NUNCA **ambiente de trabalho** (ver seção abaixo)
36
+
37
+ ## Working Directory — raiz SFW é a casa do agente
38
+
39
+ > **Regra crítica em projetos com `/sfw-onboard` ou múltiplos repos**: o cwd
40
+ > da IA não muda. Tudo é referenciado a partir da raiz SFW.
41
+
42
+ ### O que o agente FAZ
43
+
44
+ - ✅ Trabalha com cwd = raiz SFW (onde rodou `init`)
45
+ - ✅ Lê código com caminho relativo: `projetos/api/src/Controllers/UserController.cs`
46
+ - ✅ Escreve código com caminho relativo: idem
47
+ - ✅ Roda git **dentro** do repo target via `git -C projetos/api <comando>` (não com `cd`)
48
+ - ✅ Consulta `rules.md`, `docs/`, `specs/`, `.claude/` SEMPRE da raiz SFW
49
+ - ✅ Em brownfield: consulta TRD §1.6 Padrões Observados (na raiz SFW) antes de implementar
50
+
51
+ ### O que o agente NÃO FAZ
52
+
53
+ - ❌ NÃO troca cwd pra `projetos/<repo>/` (nem implícita nem explicitamente)
54
+ - ❌ NÃO lê `CLAUDE.md` que exista DENTRO do repo legado em `projetos/<repo>/` (esse é do time do repo, não nosso)
55
+ - ❌ NÃO lê `.github/copilot-instructions.md` DENTRO do repo legado (idem)
56
+ - ❌ NÃO segue convenções/regras documentadas em `projetos/<repo>/.cursor/`, `projetos/<repo>/.github/`, `projetos/<repo>/AGENTS.md` ou similares
57
+ - ❌ NÃO carrega `.env`, `.cursorrules` ou config files do repo legado como "regras vivas"
58
+
59
+ ### Por quê
60
+
61
+ - Repo legado pode ter próprio `CLAUDE.md` / `.github/copilot-instructions.md` que **conflita** com SFW
62
+ - "Padrões observados" (TRD §1.6, descritivos) ≠ "regras invioláveis" (este arquivo, prescritivas) — se misturar, vira bagunça
63
+ - A "verdade operacional" do agente é sempre a raiz SFW; código nos `projetos/` é objeto de leitura/escrita
64
+
65
+ ### Fronteira clara
66
+
67
+ | Camada | Localização | Quem manda |
68
+ |--------|-------------|------------|
69
+ | Operacional (como o agente trabalha) | Raiz SFW: `.claude/`, `rules.md`, `docs/`, `specs/` | **SFW** |
70
+ | Descritiva (como o código existe) | `projetos/<repo>/` + TRD §1.6 (na raiz SFW) | Refletida no TRD pelo `/sfw-onboard` |
71
+ | Histórica do repo legado | `projetos/<repo>/README.md`, `CHANGELOG.md`, ADRs internos | Contexto opcional, não regra |
35
72
 
36
73
  ## Convenções de Código
37
74
 
@@ -49,6 +49,31 @@ Se algum command não for encontrado → avisar o usuário.
49
49
 
50
50
  ---
51
51
 
52
+ ## Working Directory — onde o agente trabalha
53
+
54
+ > ⚠️ **Crítico** — não mude isso.
55
+
56
+ O cwd do agente é a **raiz deste projeto SFW** (onde estão `.claude/`, `docs/`,
57
+ `specs/`, `workspace/`, `projetos.yaml`). Repos clonados em `projetos/<repo>/`
58
+ são **alvo de trabalho**, NUNCA **ambiente de trabalho**.
59
+
60
+ | Faz | NÃO faz |
61
+ |-----|---------|
62
+ | Lê/escreve código via path relativo: `projetos/api/src/...` | Troca cwd pra `projetos/<repo>/` |
63
+ | Roda git: `git -C projetos/api <comando>` | Lê `CLAUDE.md` que exista DENTRO de `projetos/<repo>/` |
64
+ | Lê regras de `rules.md` da raiz SFW | Lê `.github/copilot-instructions.md` do repo legado |
65
+ | Lê padrões do TRD §1.6 (na raiz SFW) | Carrega `.cursor/`, `AGENTS.md`, `.cursorrules` do repo legado |
66
+
67
+ **Por quê**: repos legados (`/sfw-onboard`) podem ter próprias regras/convenções
68
+ que conflitam com SFW. A verdade operacional é sempre a raiz SFW — código nos
69
+ `projetos/` é objeto de leitura/escrita, não fonte de regras vivas. Padrões do
70
+ repo legado, quando relevantes, foram **descritos** no TRD §1.6 pelo `/sfw-onboard`.
71
+
72
+ Detalhamento completo em `.claude/rules.md` (Regra Inviolável #7 + seção
73
+ "Working Directory").
74
+
75
+ ---
76
+
52
77
  ## Identidade do Projeto
53
78
 
54
79
  Este é um projeto que utiliza desenvolvimento **spec-first** assistido por IA.