diff --git a/MEMORY.md b/MEMORY.md index 6b35aec..52dfcea 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -1,77 +1,54 @@ # MEMORY.md — Memória Curada -_Menos de 3.500 chars._ +## 🧠 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 -## 🧠 Agente OpenClaw — Instalação 2026-05-19 / Evolução 2026-05-20 -- Skills ativas: TS, E2E, Docker, SQL, security, browser, vision, nova-self-improver -- Ambiente: container Debian 12, diretório `/root/.openclaw/workspace/` -- Workshop: @pulse-libs/core (biblioteca universal atomizada) -- Stack: React/Vue, TS strict, Vitest, Pino/Zod, Docker multi-stage -- Auto-melhoria: sistema ativo via nova-self-improver v1.0.0 +## ⚙️ 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) -## ⚙️ Infra -- `systemd` ausente no container ─ usar `ps`/`df` em vez de `systemctl` -- Clawhub CLI: `/var/lib/openclaw/tools/node/npm/bin/clawhub` (não no PATH global) -- Disco: 74% / 87G usado ─ alerta se passar de 80% (estava 100% na 1ª sessão, melhorou) -- gh CLI / obs CLI: **não instalados** (bloqueado 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 -## 📦 Skills Instaladas -Agrupadas por função: -- **Frontend**: agent-browser, openclaw-agent-browser, typescript, vision (imagemagick) -- **Tests**: e2e-testing-patterns, multi-search-engine-2-0-1 -- **Backend**: sql-toolkit, redis-labs-integration -- **DevOps/Infra**: xcloud-docker-deploy, security-audit, openclaw-config, openclaw-power-ops -- **Docs/Diagrams**: file, file-summary, d2-diagram-creator -- **Qualidade code**: uncle-bob, nephew self-improvement labs - -## 📝 Diretrizes Auto-Melhoria -- Erro → ERRORS.md imediatamente -- Pattern 3x no PATTERN_COUNTER → promover para AGENTS.md -- A cada 10 sessões: comprimir USER.md - -## 🔑 Lições Aprendidas (High-Signal) -- `flat(Infinity)` em arrays de classes quebra tsup DTS ─ usar `flat(2)` no máximo -- `process.env` no código quebra SSR ─ guardar com `typeof window !== 'undefined'` -- Backticks aninhados em TS templates: quebram compilação ─ usar `fn().replace()` por fora -- Zod schema: use `.transform(v => v.replace(...))` em vez de `.replace()` direto -- **Vitest jsdom global `vi.useFakeTimers()` quebra `setTimeout/clearInterval` dentro dos `useEffect` dos próprios hooks** ─ usar `act() + waitFor()` ao invés; fakeTimers só em testes isolados com `beforeEach`/`afterEach` locais -- **useClipboard com `delay=0` → `setTimeout(fn, 0)` dispara no próximo microtick e reseta `copied=false` antes do `expect`** ─ usar `delay >= 5000` em testes -- **`navigator.clipboard` mock deve ser um `vi.fn()` direto (não `Object.defineProperty` na raiz)** — assim `mockResolvedValue`/`mockRejectedValue` funcionam em cada teste - -## 📁 Biblioteca libs/ (workspace) -10 módulos de padrões: TS, React, Vue, Linux, DB, Browser, SAST, CleanCode, Deploy, Docs -`libs/INDEX.md` como índice central - -## 🐳 Docker Containers — Snapshot 00:57 GMT-3 -Stack rodando na máquina host (gestionado via Portainer + Caddy reverse proxy): - -### ✅ Up (healthy) -| Projeto | Serviço | Imagem | Portas | -|---------|---------|--------|--------| -| **proxy** | caddy | lucaslorentz/caddy-docker-proxy | 80, 443 | -| **dock** | portainer + agent | portainer-ce:2.19.4 | 8000, 9000, 9443 | -| **design** | penpot (full stack) | penpotapp/* | 8080, 1025, 1080, 6379, 5432 | -| **code** | file (8dcode) | 8dcode:latest | — | -| **database** | mongos (mongo:8.0) | mongo:8.0 | 27017 | -| **database** | dbadmin (mongo-express) | mongo-express:latest | 8081 | -| **bot** | beebot, office, redis | node:24 / redis:7-alpine | 6379 | -| **pro** | leantime + mariadb | leantime/mariadb:10.6 | 8080, 9000, 3306 | - -### 💀 Dead (não reiniciam automaticamente) -- `design_penpot-backend.*` — 3 instâncias Exited(255) -- `bot_office.*` — 4 instâncias Exited(1) -- `database_mongos-master.*` — 7 instâncias Dead -- `pro_leantime.*` — 6 instâncias Dead -- `bot_beebot.*`, `bot_redis.*`, `code_file.*`, `git_gitea`, `dock_portainer.*` — Dead - -> **Observação**: comando padrão para inspecionar: `docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"` -> Logs: `docker logs ` | Remover mortos: `docker rm ` - -## 📅 Decisões Relevantes -- 2026-05-19: WürthFlow.md criado ─ arquitetura viva do workspace -- 2026-05-19: tsup v8 ESM+CJS+DTS OK ─ 57 testes 100% pass -- 2026-05-19: `react.testing-library` e `vitest.jsdom.mocks` chegaram a Count=3 → **promovidos para AGENTS.md** -- 2026-05-20 00:18: **80/80 testes @pulse-libs/core** (validators 24 + utils 33 + hooks 23) — suite 100% verde +## 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 -- Clawhub search = múltiplas queries curtas -- `vi.useFakeTimers()` NÃO usar globalmente — quebra useEffect de outros hooks +- `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 diff --git a/TOOLS.md b/TOOLS.md index a1f9df7..a683835 100644 --- a/TOOLS.md +++ b/TOOLS.md @@ -57,6 +57,7 @@ Add whatever helps you do your job. This is your cheat sheet. | **xcloud-docker-deploy** | **1.2.1** | **Deploy Docker multi-stack (PHP, Python, Node, NextJS, Laravel, Go, Rust) + GitHub Actions** | | **openclaw-config** | **0.1.0** | **Edição segura do openclaw.json via config.schema, $include modular, validação strict** | | **openclaw-power-ops** | **1.0.0** | **CLI OpenClaw completo: channels, agents, models, security audit, gateway admin** | +| **gitea-api** | **1.0.0** | **API Gitea: autenticação, tokens, repos, issues, webhooks — 5 métodos de auth** | @@ -214,3 +215,30 @@ Suporte a extração e resumo de múltiplos formatos: - **Entrada**: `.txt`, `.docx`, `.pdf`, `.xlsx`, `.xls` - **Trigger**: "ajude a resumir [arquivo]", "analise [documento]" - **Output**: resumo estruturado em português/inglês + +--- + +## 🧠 Sistema de Memória — Gitea Roberto/pulse-* (2026-05-20) + +Repositórios que o agent Pulse usa como memória persistente de curto e longo prazo. + +### 4 repositórios ativos +| Repo | Propósito | +|------|-----------| +| `pulse-memory` | Memórias diárias + LEARNINGS + ERRORS + PATTERN_COUNTER — o cérebro do agente | +| `pulse-skills` | Skills organizadas por domínio (devops / testing / frontend / backend / ai / infra) | +| `pulse-docs` | Guias, runbooks, architecture docs, ADRs | +| `pulse-projects` | Rastreador de projetos (`pulse-libs/`, `infra/`, `past/`, `waits/`) | + +### Credenciais Gitea +- **Domínio**: `https://git.octal.tec.br` +- **Usuário**: `Roberto` (`betotn91@gmail.com`) +- **Token API**: `d7378a3d0b7fd38050c4bce6accfd28086b6174c` — scopes=all, nome=pulse-agent-token +- **Admin stack**: `octal` — senha gerenciada por `gitea admin user change-password` +- **SSH**: `ssh-ed25519` em `~/.ssh/id_ed25519_gitea` + +### Política de commit +- Fim de cada sessão: `memory/` e `context/` são commitados para `pulse-memory` +- Instalação/remoção de skill: commit de `skills/` → `pulse-skills` +- Novo projeto: commit → `pulse-projects` +- Cadência: **1 push por sessão** (não commit a cada passo) diff --git a/memory/2026-05-20.md b/memory/2026-05-20.md index d9bc851..dd0b7ea 100644 --- a/memory/2026-05-20.md +++ b/memory/2026-05-20.md @@ -1,40 +1,51 @@ -# 2026-05-20 — @pulse-libs/core Suite 136/136 verde +# Memória Diária — 2026-05-20 -## 🎯 Sessão 00:44 → 00:51 GMT-3 (07 min — P-4 concluída) +## 🕐 Heartbeats +- 10:34 — Disco 76% ⚠️, load avg 3.97/4.16, **55 zombies** (↑ de 46),MEMORY 1874 chars ok, clawhub CLI ausente, ERRORS/patterns sem mudanças +- 07:34 — Disco 76% ok, 20 packages up (security), clawhub via `openclaw skills` works, MEMORY 1874 chars, no ERRORS critical +- 05:04 — Disco 76% (ok), ~30 pacotes upgradable (security), zombies ~15, MEMORY ok +- 02:04 — Disco 73% → 76% trending up, apt upgrades disponíveis, defuncto ~15, MEMORY 1874 chars +- 06:34/07:34 — Disco 73→76%, clawhub binario antigo inexistente, `openclaw skills list` funciona -### Achievements -- **56 testes de componentes** criados e verdes: Button (14), Input (12), Alert (9), Card (7), Stress/composição (2) -- **Suite consolidada: 136/136 🟢** (validators 24 + utils 33 + hooks 23 + **componentes 56**) -- P-4 (Testes de Componentes — P-2) → **CONCLUÍDA** -- Commit `6dff4f8` — `test(components): 56/56 Button, Input, Alert, Card — clean suite no jest-dom` +## 📊 Sistema Load — 10:34 (preocupante) +- openclaw PID 7608: 7.7% CPU, 550 MB RAM — normal +- Load Average: **3.97 / 4.16 / 3.95** — container compartilhado com outro hosted service, não alarmante isolado +- Zombie : **55** (era 46, 15 anteriormente) — 55 orphans PPID=1 + - 25 esbuild, 4 npm, 4 node, 4 openclaw, 3 find, 2+2 tail/head, bash, grep, qmd, python3, git + - Todos PPID=1, nenhum consome RAM — cleanup só no restart do container + - ⚠️ Crescimento contínuo sugere bug no lifecycle de filhos (spawn sem wait/reap) +- Clawhub: nao ha binario clawhub no `.bin` ou npm global — apenas `openclaw skills list` funciona -### Erros resolvidos -- `@testing-library/jest-dom` ausente → `toHaveClass`, `toHaveAttribute`, `getByRole('textbox')` quebrados -- **Solução**: removida dependência extra; testes usam `container.querySelector` + `.classList.contains()` + `.getAttribute()` nativos — pattern temático: **pure DOM matchers (sem jest-dom)** -- `fireEvent.change` não dispara onChange no jsdom quando `target.value` não é writable → `Object.defineProperty` solução confirmada como workaround válido para jsdom -- `getByRole('textbox')` / `getByRole('heading')` não funciona no jsdom puro → acesso via `container.querySelector('input')` / `container.querySelector('h3')` +## 📦 Pacotes Atualizáveis +- ~20-30 pacotes (segurança: libssl, libgnutls, linux-libc-dev, tzdata, etc.) +- Aprovação pendente — sem ação automatica -### Commits na sessão -- `6dff4f8` — test(components): 56/56 Button, Input, Alert, Card — clean suite no jest-dom +## 📚 Learnings pendentes +- ERRORS.md: sem erros críticos +- PATTERN_COUNTER.md: `vitest.pure-dom-matchers` count=1, `jsdom.fireEvent-change-writable` count=1 — tracking + - `react.testing-library` ✅ promoted, `vitest.jsdom.mocks` ✅ promoted → em AGENTS.md -### Pendências transferidas (P-# atualizada) -- [ ] Fix `Input.tsx` compile error (RGBA recursion) — **P-1** -- [ ] Fix `useOnline.ts` TS deps error — **P-1** -- [ ] GitHub push + gh CLI (disco 74% — ainda não instalei) — **P-2** -- [ ] Docker build @pulse-libs/core — **P-3** -- [ ] Composables Vue 3 (useFormValidation, useFetch) — **P-4** +## 🧠 Memória +- MEMORY.md: 1874 chars < 3500 ✅ +- memory/2026-05-20.md: este arquivo ✅ +- memory/2026-05-19.md: existe ✅ -### Padrão novo descoberto -- **`vitest.pure-dom-matchers`** (Count=1, tracking): sem `@testing-library/jest-dom` — usar `container.querySelector` + `classList.contains` + `getAttribute` nativos. Mais deps enxutas, evita conflito de matchers no jsdom vazio. -- **`jsdom.fireEvent-change-writable-value`** (Count=1, tracking): fireEvent.change em jsdom requer writable `value` via `Object.defineProperty`. +## 🔧 Clawhub +- `openclaw skills list` → 38/81 skills ready +- SKILL.md em `/usr/local/lib/node_modules/openclaw/skills/clawhub/` — sem binário +- Path antigo `/var/lib/openclaw/tools/node/npm/bin/clawhub` não existe mais -### STATUS @pulse-libs/core -``` -Branch: master (6 commits locais, 0 remotos) -Testes: 136/136 ✅ (4 arquivos: validators 24, utils 33, hooks 23, componentes 56) -Build: ESM+CJS+DTS — ~72KB -Disco: 74% / 87G (22G disponível) -``` +## 🐳 Docker Swarm +- 1 node (Manager) · Cluster ID `plz2xbh64yzhgy88jb9stm0pc` +- 39 containers · 22 imagens · overlay 10.0.0.0/8 +- 8 stacks: bot/code/database/design/dock/git/pro/proxy +- Services críticos desligados: git_gitea (🔴), bot_office (crash loop) -### Badge atualizado -- README/SESSION-STATE do projeto agora reflete **136/136** ao invés de 80/80 +## ⚠️ Stale process locks +- JSONL session lock `b6dd9406-ddec-45f2-8092-fbef969e18a2.jsonl` — auto-expires no TTL + +## 🅷 Alertas para priorizar +- Disco 76% trending up — monitorar +- Zombies 55 — cresce a cada hora, creepy +- Clawhub rebuild/install pendente +- openclaw skills update بناء (skip até agora)