# MEMORY.md — Memória Curada ## 🧠 Agente OpenClaw - Debian 12 container, `/root/.openclaw/workspace/` - Projeto ativo: `@pulse-libs/core` — 136/136 testes ✅ - Stack: React/Vue, TS strict, Vitest, Pino/Zod, tsup v8, Docker multi-stage ## ⚙️ Infra - Disco 76% (↑ de 66%), 87G total — **monitorar** (tendência de alta) - Sem systemd no container - Gitea: `git.octal.tec.br` → `localhost:3000` (Caddy proxy) — Docker Swarm stack `git` - User: Roberto (betotn91@gmail.com), SSH key em `~/.ssh/id_ed25519_gitea` - Repos Gitea: `pulse-memory`, `pulse-skills`, `pulse-docs`, `pulse-projects` — clonados via HTTPS ## 🐳 Docker Swarm — Stack Real (inventariado 2026-05-20) - **Node**: `s1` · ID `x3fm004yzn3j7pvhz0fuuskez` (Leader) · Docker 29.4.3 - **Cluster ID**: `plz2xbh64yzhgy88jb9stm0pc` - **22 containers** · **22 imagens** · **9 stacks** - **Stacks**: `bot`, `code`, `database`, `design`, `dock`, `git`, `pro`, `projects`, `proxy` - **Portainer CE v2.19.4** — https://dock.octal.tec.br — stack `dock` - **Admin portainer token**: `ptr_ZE3R0WgRB07W7moQ7rpX135MqZ+F8OMuYC9U7Rqa5dU=` ### Domínios / Rotas Caddy (confirmados) | Domínio | Stack | Service | Porta | |---|---|---|---| | `dock.octal.tec.br` | `dock` | `dock_portainer` | 9443/9000 | | `git.octal.tec.br` | `git` | `git_gitea` | 3000 | | `ai.octal.tec.br` | `bot` | `bot_beebot` | 18789 | | `manager.octal.tec.br` | `pro` | `pro_leantime` | 8080 | | `games.octal.tec.br` | `projects` | `projects_games-demo` | 80 | | `test.octal.tec.br` | `proxy` | `proxy_test-octal` | — | ### Serviços por Stack | Stack | #svc | Serviços ativos | |---|---|---| | `bot` | 2 | ✅ beebot (node:24), ✅ redis:7-alpine | | `code` | 1 | ✅ 8dcode | | `database` | 2 | ✅ mongo:8.0, ✅ mongo-express | | `design` | 7 | ✅ Penpot 2.15.3 *(backend+frontend+postgres+valkey+exporter+mcp+mailcatch)* | | `dock` | 2 | ✅ portainer-ce:2.19.4, ✅ agent:2.19.4 | | `git` | 1 | ✅ gitea:latest | | `pro` | 2 | ✅ leantime, ✅ mariadb:10.6 | | `projects` | 3 | ✅ games-demo, ✅ projects-landing, ⚠️ pulse-libs **0/1** (down) | | `proxy` | 2 | ✅ caddy-docker-proxy, ✅ test-octal | ### Redes Overlay | Rede | Subnet | GW | Containers | |---|---|---|---| | `ingress` | 10.0.0.0/24 | 10.0.0.1 | 3 | | `public` | 10.0.1.0/24 | 10.0.1.1 | 14 | | `dbn` | 10.0.2.0/24 | 10.0.2.1 | 2 | | `mongo-cluster` | 10.0.3.0/24 | 10.0.3.1 | 3 | | `pro_leantime_net` | 10.0.4.0/24 | 10.0.4.1 | 3 | | `design_internal` | 10.0.5.0/24 | 10.0.5.1 | 8 | | `proxy_proxy-net` | 10.0.6.0/24 | 10.0.6.1 | 0 | ## Docs externas coletadas - Portainer: https://docs.portainer.io/user/docker/stacks.md - Portainer add stack: https://docs.portainer.io/user/docker/stacks/add.md - Portainer edit stack: https://docs.portainer.io/user/docker/stacks/edit.md - Portainer full corpus: https://docs.portainer.io/llms-full.txt (truncado às 6k chars) - Armazenadas em `pulse-docs/docs/` ## 🔑 Lições High-Signal - `flat(Infinity)` quebra tsup DTS — usar `flat(2)` - `process.env` direto quebra SSR — `typeof window !== 'undefined'` - Backticks aninhadas em TS → usar `.replace()` por fora - Zod: `.transform(v => v.replace(...))` não `.replace()` direto - `vi.useFakeTimers()` não usar globalmente (quebra outros hooks) - `fireEvent.change` jsdom: `value` precisa `writable` via `Object.defineProperty` - `getByRole('textbox')` não funciona no jsdom puro — usar `container.querySelector` - Portainer API token `ptr_...` prefixo PTR — funciona para UI, não para endpoint `/api/endpoints` (401) → Senha admin necessário para login via POST `/api/auth` — não documentada em pulse-memory ## Decisões Recentes - `react.testing-library` e `vitest.jsdom.mocks` promoted → AGENTS.md (count≥3) - `tsup.flat2-not-flatinfinity` pattern criada - Docker Swarm proxy modelo replicado na stack `proxy` - Dominio live: `https://test.octal.tec.br` (Caddy + Let's Encrypt) - **Domínios mapeados via labels Caddy**: 6 confirmados (dock/git/ai/manager/games/test) - **pulse-memory clonado via HTTPS** (credenciais fornecidas pelo usuário)