Files
pulse-memory/MEMORY.md
T

4.2 KiB

MEMORY.md — Memória Curada

🧠 Agente OpenClaw — 2026-05-19 / 2026-05-20

  • Workspace: Debian 12 container, /root/.openclaw/workspace/
  • Projeto ativo: @pulse-libs/core (lib universal atomizada) — 136/136 testes
  • Stack: React/Vue, TS strict, Vitest, Pino/Zod, tsup v8, Docker multi-stage
  • Clawhub path: /var/lib/openclaw/tools/node/npm/bin/clawhub (não no PATH global)
  • Sem systemd no container — usar ps/df diretamente

⚙️ Infra & Saúde

  • Disco: 73% / 87G — limite alerta 80%
  • systemctl não disponível (container sem systemd)
  • gh/obs CLIs: não instalados (bloqueadas por disco)

🔑 Lições High-Signal

  • flat(Infinity) em arrays de classes quebra tsup DTS — usar flat(2)
  • process.env direto quebra SSR — guardar com typeof window !== 'undefined'
  • Backticks aninhadas em TS templates quebram compilação — usar .replace() por fora
  • Zod: usar .transform(v => v.replace(...)) em vez de .replace() direto
  • vi.useFakeTimers() não usar globalmente — quebra useEffect de outros hooks
  • fireEvent.change no jsdom precisa writable value via Object.defineProperty
  • getByRole('textbox') não funciona no jsdom puro — usar container.querySelector
  • navigator.clipboard mock deve ser vi.fn() direto (não Object.defineProperty)
  • useClipboard com delay=0 reseta copied=false antes do expect — usar delay >= 5000 em testes
  • Pattern vitest.pure-dom-matchers: sem @testing-library/jest-dom, usar .classList.contains() e .getAttribute() nativos

Decisões Relevantes

  • WürthFlow.md criado como arquitetura viva do workspace
  • tsup v8 ESM+CJS+DTS confirmado funcionando
  • react.testing-library e vitest.jsdom.mocks chegaram a count=3 → promovidas para AGENTS.md
  • Clawhub search = múltiplas queries curtas, sempre
  • Ignorar SUSPICIOUS skills por padrão
  • agent-browser CLI não instalado como binário separado — usar openclaw agent run ou curl via automation

🔧 DevOps → Gitea (2026-05-20)

  • Gitea rodando em git.octal.tec.br via Docker Swarm (stack git)
  • Caddy proxy: git.octal.tec.brlocalhost:3000 (Gitea container)
  • Usuário criado: Roberto (betotn91@gmail.com)
  • Skill gitea-api criada em skills/gitea-api/SKILL.md
  • Autenticação API: 5 métodos (Basic, Basic+OTP, Token header, token query, access_token query)
  • Scopes: read/write:<permission> ou allwrite implica read
  • Endpoint token: POST /api/v1/users/:name/tokensrequer Basic Auth + senha, retorna sha1 apenas uma vez
  • Endpoint listar tokens: GET /api/v1/users/:name/tokens — sha1 sempre vazio na listagem

🧠 Sistema de Memória Gitea — Roberto/pulse-* (2026-05-20)

  • 4 repositórios criados em git.octal.tec.br/Roberto/:
    • pulse-memory — memórias diárias + learnings + errors + pattern_counter
    • pulse-skills — skills organizadas por domínio (devops/testing/frontend/backend/ai/infra)
    • pulse-docs — guias, runbooks, specs do sistema Pulse
    • pulse-projects — rastreador de projetos (pulse-libs/, infra/, past/)
  • Token API: d7378a3d0b7fd38050c4bce6accfd28086b6174c (pulse-agent-token, scopes=all)
  • Chave SSH: ssh-ed25519 AAAAC3... em ~/.ssh/id_ed25519_gitea
  • Commit cadência: sync de memória local → Gitea a cada fim de sessão
  • Porto Gitea na infra: localhost:3000git.octal.tec.br via Caddy

🌐 Docker Swarm — Stack Proxy & Caddy (2026-05-20)

  • Dominio LIVE: https://test.octal.tec.br — HTTP 200 + HTTPS ativo (Let's Encrypt)
  • Modelo funcionando: stack proxy com caddy + test-octal, rede public, labels Caddy
  • Labels: caddy=<domain> + caddy.reverse_proxy={{upstreams <porta>}} — Caddy auto-descobre e configura
  • Erros evitados: bind mount em Docker Swarm rejeita paths arbitrarios — usar imagem custom OU config
  • Stack git emodelo 100%, stack proxy replicou o modelo
  • Runbook completo: pulse-docs/runbook/DOCKER-SWARM-RUNBOOK.md + RECOVERY-COMMANDS.md
  • Stack proxy: nginx_image custom test-octal:latest + Caddy com labels + Let's Encrypt automatico
  • Stack proxy deploy: docker stack deploy -c /opt/proxy-stack-v4.yml proxy
  • Config Caddy: /opt/caddy/Caddyfile — nao usado por auto-discovery (labels suficientes)