Files
webtecnicaandClaude Opus 5.5 2424a24c8b fix(kit): a guarda de ARM só considera instalação real
O #1775 separou instalação NOVA (recusa em não-x86_64) de instalação
existente (aviso, e o script segue até o build local), mas o critério de
"existente" lia o estado do DIRETÓRIO: compose E um `.env`. Um
`install.sh --yes` numa VPS ARM NOVA cujo `.env` chegou pronto — copiado de
outra máquina, gerado por automação, ou deixado por uma rodada que parou no
meio — passava como instalação existente e ia construir as imagens na própria
VPS, 15 a 25 minutos depois de a guarda ter recusado tudo o que devia.

O que passa a provar a instalação é o que ela DEIXOU: o marcador
.deskcomm-instalado, que o install.sh grava quando o app está saudável; um
contêiner do projeto Docker desta instalação, parado ou não, que é o caso de
quem instalou numa versão anterior; e o contêiner do Supabase single-server.
O filtro de contêiner é por projeto — o de outro programa na mesma VPS não
vale, e uma VPS com WordPress é a regra, não a exceção.

O volume do Postgres, sugerido na issue, NÃO entra: ele só existe no modo
single-server e some com o `down -v` que o próprio kit ensina como receita de
"recomeçar", então quem o encontrasse seria uma instalação derrubada.

A guarda só pergunta isso quando a arquitetura não é suportada — em amd64 o
veredito já é amd64, e perguntar chamaria o docker no topo do install.sh sem
necessidade. As duas receitas de "recomeçar" (o painel de recuperação e a do
banner final) apagam o marcador junto com o `.env`, e o `.gitignore` o
declara como estado da VPS.

A fixture do teste do #1775 passa a gravar o marcador: ela representa uma
instalação que já passou pelo instalador, e sem o marcador o `docker ps` do
dublê (que devolve vazio) faria aquela prova medir uma instalação NOVA.

Teste novo com 46 asserções em 7 seções: o caso da issue (.env + nada
instalado → recusa), os três sinais de instalação real, o que NÃO é prova
(contêiner de outro projeto, docker indisponível, ausência de .env), x86_64
sem tocar no docker, a fórmula do nome do projeto medida contra
nome_do_projeto_compose, o marcador, e a remoção do nome antigo.

Refs: #1778

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-27 01:29:19 -03:00

184 lines
6.0 KiB
Plaintext

# Dependencies
node_modules/
# Sem a barra tambem: `node_modules/` casa so com diretorio, e um SYMLINK
# chamado node_modules (worktree apontando para a instalacao principal) passa
# batido e vai parar no commit. Aconteceu no PR #83.
node_modules
.pnp
.pnp.js
# Build artifacts
.next/
out/
dist/
build/
.turbo/
.vercel/
# Env — ignora todo .env*, exceto os templates de exemplo
.env*
!.env.example
!.env.hostgator.example
!.env.voip.example
# Asterisk — credenciais reais do trunk SIP/ARI (módulo VoIP, migration 0231),
# nunca comitar. Templates ficam em asterisk/*.conf.example.
asterisk/pjsip.conf
asterisk/ari.conf
# Testing & coverage
coverage/
.nyc_output/
playwright-report/
test-results/
e2e-artifacts/
# IDE / OS
.DS_Store
.vscode/*
!.vscode/extensions.json
!.vscode/settings.recommended.json
.idea/
# Logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# TypeScript
*.tsbuildinfo
next-env.d.ts
# Supabase local
supabase/.temp/
supabase/.branches/
# Epic executor (skill artifacts)
.epic-executor/
# Candidatos a golden set (F3-09/F3-11): os DOIS caminhos que os gravam em runtime — o
# near-miss do matcher de skills e a divergência do classificador de etapa — escrevem o
# TEXTO do lead no arquivo, para curadoria humana. É registro de dado do titular, não
# artefato do produto: versionado, um `git add -A` publica conversa de cliente no repo, e no
# clone de todo mundo, de onde ela não sai mais. A curadoria é local.
# Ignora os dois prefixos que o engine grava, e não a pasta: a spec 15 (§11.1) reserva este
# diretório para os goldens, que são curados à mão e não carregam texto de cliente.
lib/agent-engine/golden-candidates/skill-miss_*.json
lib/agent-engine/golden-candidates/stage-divergence_*.json
# Claude Code harness artifacts (scheduled tasks lock, etc)
# gov-loop: agents/ e commands/ são maquinaria versionada do loop e PRECISAM
# viajar com o repo (merge de gov/setup → main); o resto de .claude/ segue local.
# skills/: mesma razão — a doutrina (sistema-vivo) é maquinaria de arquitetura.
# Skill fora do git não alcança quem clona nem o próximo sistema; seria uma
# "tela sem porta" no vocabulário da própria doutrina que ela carrega.
.claude/
!.claude/
.claude/*
!.claude/agents/
!.claude/commands/
# settings.json: só o hook de início de sessão dos guias (fala apenas em clone de contribuidor)
!.claude/settings.json
# skills/: allowlist por PREFIXO — só as deste repo. Liberar a pasta inteira
# arrastaria skills locais de outros apps (Lina etc.) para o versionamento.
# `.claude/skills/` é ESPELHO gerado de `.agents/skills/` (fonte única, lida
# por Codex/Cursor/OpenCode/Antigravity); `pnpm skills:sync` regrava e
# `tests/unit/skills-embutidas.test.ts` reprova divergência — inclusive uma
# skill nova que este arquivo esconda do `git add`.
!.claude/skills/
.claude/skills/*
!.claude/skills/sistema-vivo/
!.claude/skills/deskcomm-*/
# Local docker volumes (WAHA)
.waha-data/
.epic-executor/
.playwright-mcp/
# Sentry Config File
.env.sentry-build-plugin
inbox-with-real-msgs.png
.e2e-creds.json
.e2e-agente-mcp.json
test-results/
playwright-report/
.vercel
deskcommcrm-setup-kit.zip
# gov-loop — estado operacional fica FORA do git (a resposta do humano na inbox
# e a linha 'started' do sessions.log não podem sujar o working tree; a guarda de
# chão limpo do LOOP.md os stasharia). loop/checkpoints/evidence/ NÃO é ignorado:
# screenshot de checkpoint é evidência versionada.
loop/inbox.items.md
loop/sessions.log
loop/logs/
loop/locks/
loop/STOP
loop/run-session.sh
.superpowers/
# graphify (análise local de knowledge graph)
graphify-out/
# Lockfiles de OUTRO gerenciador. O `pnpm-lock.yaml` é o único versionado, e
# não é preferência de estilo: os pisos de segurança do projeto vivem em
# `pnpm.overrides` do package.json, que o npm e o bun NÃO leem. Um `bun install`
# aqui move `overrides` para o topo do package.json (formato bun/npm), o pnpm
# deixa de enxergá-lo, e o `pnpm-lock.yaml` perde o bloco `overrides` inteiro —
# `path-to-regexp@6.1.0` volta para a árvore com `pnpm audit` ainda verde.
# Aconteceu em 2026-08-26. Ignorar o lock não impede o estrago; impede que ele
# viaje no commit sem ninguém notar.
package-lock.json
bun.lock
bun.lockb
yarn.lock
.e2e-invite.json
.e2e-owner.json
.e2e-invite-url.json
.superpowers/evidence/
evidence/.sonda-score-residuo.json
# sessão reusada pelas jornadas (contém tokens)
.auth/
# QA em VPS: guarda segredo TOTP da conta de teste (repo e publico)
.qa-vps/
# Backups do install/update: env-*.bak é uma CÓPIA INTEIRA do .env — service
# role key, secrets de webhook e a chave de cifra dos tokens. O padrão `.env*`
# acima não os alcança porque eles vivem num diretório, com outro prefixo.
backups/
# Marcas de execução do kit (agent.sh / update.sh)
.update.lock
.deskcomm-site-url-avisado
# Marcador que o install.sh grava quando a instalação termina com o app no ar,
# e que a guarda de arquitetura (#1042/#1266) lê para distinguir instalação NOVA
# de instalação existente numa VPS ARM (#1778). É estado da máquina de quem
# instalou, nunca entra no repositório — igual ao `.env` que mora ao lado dele.
.deskcomm-instalado
# Dump de banco de QA. A doutrina já estava escrita duas linhas acima e só o
# PADRÃO faltava: `backups/` não casa com `.qa-backups/`, e um dump de 1,1 MB de
# um Supabase local chegou a um PR de contribuidor por causa disso (#600). O
# conteúdo daquele era sintético, mas um dump carrega hash de senha, refresh
# token e o jwt_secret da instância — e história de git público é PERMANENTE:
# commit posterior de remoção não tira o blob.
.qa-backups/
*.dump
docker-compose.override.yml
.prova/
# Marca do kit: a senha das rotinas que vazou no log já foi trocada (#1054)
.deskcomm-segredo-do-cron-trocado
# Bytecode do Python: a suíte roda scripts em experiments/ e regrava o .pyc a cada
# rodada. Versionado, ele sujava a árvore de quem rodava os testes.
__pycache__/
*.pyc
# Runtime do instalador single-server: Supabase self-hosted, credenciais e dados.
.runtime/