# 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.br` → `localhost: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:` ou `all` — `write` implica `read` - Endpoint token: `POST /api/v1/users/:name/tokens` — **requer 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:3000` → `git.octal.tec.br` via Caddy