From 8aa77a5ac3a7f22baf7d3fd681f7b62ab1d3d9bd Mon Sep 17 00:00:00 2001 From: Pulse Agent Date: Wed, 20 May 2026 19:39:59 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20dev=20environment=20full-stack=20+=20Ob?= =?UTF-8?q?sidian=20vault=20+=20agentes=20paralelos=20=E2=80=94=2019:07?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MEMORY.md | 112 ++++++++++++++++++++++++++++++------------- memory/2026-05-20.md | 29 +++++++++++ 2 files changed, 108 insertions(+), 33 deletions(-) diff --git a/MEMORY.md b/MEMORY.md index 6177f83..a1b05ae 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -1,53 +1,99 @@ -# MEMORY.md — Memória Curada +# MEMORY.md — Memória Curada do Pulse ## 🧠 Agente OpenClaw +- Nome: **Pulse** · IDENTITY.md - Debian 12 container, `/root/.openclaw/workspace/` - Projeto: `@pulse-libs/core` — 136/136 testes ✅ | React/Vue, TS strict, Vitest, Pino/Zod, tsup v8, Docker multi-stage +- Skills instaladas: 12+ (typescript, e2e-testing, xcloud-docker-deploy, openclaw-power-ops, etc.) +- Nova Self-Improver ativa — loop de aprendizado contínuo ## ⚙️ Infra -- Disco 65%, 87G total — monitorando tendência (66%→76%→65%) -- Sem systemd (container Docker) +- Disco 65%, 87G total — monitorando estabilidade +- Sem systemd — container Docker - Gitea: `git.octal.tec.br` → `localhost:3000` (Caddy) — Swarm stack `git` - User: Roberto (betotn91@gmail.com), SSH `~/.ssh/id_ed25519_gitea` - Repos: `pulse-memory`, `pulse-skills`, `pulse-docs`, `pulse-projects` — clonados via HTTPS -## 🐳 Docker Swarm + Portainer (inventariado 2026-05-20) -- Node `s1` (Leader, Docker 29.4.3) · Cluster `plz2xbh64yzhgy88jb9stm0pc` -- 22 containers · overlay 10.0.0.0/8 -- **10 stacks**: bot/code/database/design/dock/git/project/proxy -- Portainer CE v2.19.4 — https://dock.octal.tec.br — stack `dock` +## 🐳 Docker Swarm (11 stacks — atualizado 2026-05-20) +- Node `s1` Leader, Docker 29.4.3 · Cluster `plz2xbh64yzhgy88jb9stm0pc` +- 22 containers · overlay `10.0.0.0/8` +- **11 stacks**: `bot`, `code`, `database`, `design`, `dev`, `dock`, `git`, `pro`, `project`, `proxy`, `(code)` +- Portainer CE v2.19.4 — https://dock.octal.tec.br - Senha admin: **`***`** — login via `/api/auth` retorna JWT HS256 -- Stack `project` (ID=12) registrada via API Portainer (`type=2&endpointId=1&method=string`) — SwarmStack gerenciável -- ⚠️ `pulse-libs` 0/1 replicas (crash — imagem não disponível no registry) +- ⚠️ Rede `public` tem `Attachable=false`: + - stacks criadas via `docker stack deploy` CLI funcionam OK + - stacks criadas via Portainer API são **bloqueadas** com `PermissionDenied` + - stack `project` no Swarm via CLI — NÃO aparece no Portainer UI (funcional, mas não gerenciável) -### Domínios Caddy (6 ativos) -`dock`/portainer · `git`/gitea · `ai`/beebot · `manager`/leantime · `games`/games-demo · `test`/test-octal +### Domínios Caddy (8 ativos — atualizado 2026-05-20) +`dock`/portainer · `git`/gitea · `ai`/beebot · `manager`/leantime · `games`/games-demo · `test`/test-octal · `board`/taskboard · `api`/dev-backend · `frontend`/Vite ### Redes Overlay -`ingress:10.0.0.0/24 | public:10.0.1.0/24 | dbn:10.0.2.0/24` -`mongo-cluster:10.0.3.0/24 | leantime:10.0.4.0/24 | design:10.0.5.0/24 | proxy:10.0.6.0/24` +`ingress:10.0.0.0/24 | public:10.0.1.0/24 | dbn:10.0.2.0/24 | mongo-cluster:10.0.3.0/24 | leantime:10.0.4.0/24 | design:10.0.5.0/24 | proxy:10.0.6.0/24` -Detalhes → `pulse-docs/docs/docker-swarm-stacks.md` +### Template Canônico +- `pulse-docs/runbooks/swarm-stack-template.yml` — modelo oficial +- Rede: `public` (externa no compose) · Names sem prefixo · Caddy labels via CLI +- Detalhes → `pulse-docs/docs/docker-swarm-stacks.md` + +## 🚀 Dev Environment Full-Stack (nova — 2026-05-20) +Stack Swarm `dev` com ambiente completo de desenvolvimento: + +| Serviço | URL | Porta | Tipo | +|---------|-----|-------|------| +| TaskBoard | `board.octal.tec.br` | 80/443 | Kanban + logs em tempo real | +| Backend API | `api.octal.tec.br` | 3001 | Node + tsx watch (hot reload) | +| Frontend HMR | `frontend.octal.tec.br` | 5173 | Vite + React (hot reload) | +| Redis | fila `dev-tasks` | 6379 | Fila de tarefas + pub/sub | + +### Agentes Paralelos (5 workers no Swarm) +| Agente | Réplicas | Papel | +|--------|----------|-------| +| `agent-frontend` | 2 | Frontend specialist (React + Vite) | +| `agent-backend` | 2 | Backend specialist (Node + tsx) | +| `agent-devops` | 1 | DevOps (Docker, Swarm, deploy) | + +### Protocolo de Task Queue +- Fila: `BLPOP dev-tasks` — 60s timeout +- Canal pub/sub: `dev-logs` — logs agregados em tempo real +- Registro de agente: `HSET agent: status role started_at current_task` +- Task: `SET task:` + `RPUSH task-queue ` + +## 📝 Obsidian Vault +- Caminho: `/root/Obsidian-Pulse/` +- Estrutura: Inbox, Projetos, Docker, Dev, Codex, Logs, Memorias, Templates +- Skill: [[🛠️ obsidian-vault-linker]] instalada ## 🔑 Lições High-Signal -- `flat(Infinity)` quebra tsup DTS → usar `flat(2)` +- `flat(Infinity)` quebra tsup DTS → `flat(2)` - `process.env` direto quebra SSR → `typeof window !== 'undefined'` - Backticks aninhadas TS → `.replace()` por fora -- Zod: `.transform(v => v.replace(...))` não `.replace()` direto -- `vi.useFakeTimers()` não usar globalmente -- `fireEvent.change` jsdom: `value` precisa `writable` -- `getByRole('textbox')` brook no jsdom puro → `container.querySelector` -- Portainer `ptr_` token ≠ JWT admin — /api/status OK, /api/endpoints 401 -- `docker stack deploy` compose v3: `restart_policy` não é propriedade válida no deploy spec -- `deploy.labels` do compose não vira container labels no Swarm → `docker service create --label` diretamente -- imagens locais (sem registry): warning "could not be accessed on a registry" — usar `--with-registry-auth` -- `agent-browser` CLI não estava instalado no PATH — usar `curl`/API diretamente +- Zod `.transform()` para transformações de schema +- Portainer `ptr_` token ≠ JWT admin — usar senha admin para mutação +- `docker stack deploy` compose v3: `restart_policy` não é propriedade válida +- `deploy.labels` do compose não vira container labels → `docker service update --label-add` +- Rede `public` `Attachable=false` → stacks CLI OK, Portainer API bloqueia +- Agentes paralelos com Redis BLPOP funcionam como time full-stack -## Decisões Recentes -- `react.testing-library` (≥3) + `vitest.jsdom.mocks` (≥3) → promoted AGENTS.md -- `tsup.flat2-not-flatinfinity` pattern criada -- caddy-docker-proxy modelo replicado na stack `proxy` -- 6 domínios Caddy mapeados via labels | `https://test.octal.tec.br` live -- Stack `projects` removida → `project` criada (games-demo + projects-landing OK, pulse-libs 0/1) -- `docker stack deploy` preferido para migrations em massa; `docker service update --label-add` limitado -- docs Portainer cru salvos em `pulse-docs/docs/portainer-docs.md` +## 🗺️ Stacks Swarm (11 — incluindo dev) +| Stack | Criada por | Portas | Domínios | +|-------|------------|--------|----------| +| `git` | Portainer API | — | `git.octal.tec.br` | +| `bot` | Portainer API | — | `ai.octal.tec.br` | +| `database` | Portainer API | — | — | +| `design` | Portainer API | — | — | +| `dev` | `docker stack deploy` (nova) | http | `board / api / frontend` | +| `dock` | Portainer API | 80/443 | `dock.octal.tec.br` | +| `code` | Portainer API | — | — | +| `pro` | Portainer API | — | `manager.octal.tec.br` | +| `project` | `docker stack deploy` CLI | 80 | `games.octal.tec.br` | +| `proxy` | Portainer API | 80 | `test.octal.tec.br` | + +## Repositórios Gitea +| Repo | Propósito | URL | +|------|-----------|-----| +| `pulse-memory` | Memórias diárias + LEARNINGS + ERRORS | https://git.octal.tec.br/Roberto/pulse-memory | +| `pulse-skills` | Skills organizadas por domínio | https://git.octal.tec.br/Roberto/pulse-skills | +| `pulse-docs` | Guias, runbooks, ADRs | https://git.octal.tec.br/Roberto/pulse-docs | +| `pulse-projects` | Rastreador de projetos | https://git.octal.tec.br/Roberto/pulse-projects | +| **pulse-dev** | **Nova stack + código (commit em workspace)** | — | diff --git a/memory/2026-05-20.md b/memory/2026-05-20.md index 2234b5a..f879850 100644 --- a/memory/2026-05-20.md +++ b/memory/2026-05-20.md @@ -144,3 +144,32 @@ Subir stack 'project' no Portainer/Swarm como modelo, migrando todos os serviço - MEMORY.md: 2973 chars (<3500) ✅ - memória diária 2026-05-20.md existente com inventário completo - clawhub CLI inexistente (npx clawhub requer slug); via openclaw skills funciona + +## 🔥 19:07-19:45 — Dev Environment Full-Stack + Obsidian Vault + +### What was built +1. **TaskBoard** — React standalone (8 colunas: status, agentes, logs, Caddy, Redis) +2. **Backend API** — Express + tsx watch + Redis tasks/agents/health (porta 3001) +3. **3 Agentes workers** — FE (2replicas), BE (2replicas), DevOps (1replica), todos BLPOP loop +4. **Vault Obsidian** — `/root/Obsidian-Pulse/` com estrutura Inbox/Projetos/Docker/Dev/Codex/Logs/Memorias/Templates +5. **Skill obsidian-vault-linker** — já instalada e documentada no SKILL.md + +### Stack dev Swarm +- Stack `dev` criada com `docker stack deploy -c runbooks/dev-stack.yml dev` (CLI — não Portainer) +- Domínios Caddy: `board.octal.tec.br`, `api.octal.tec.br`, `frontend.octal.tec.br` +- Caddy labels aplicadas via `docker service update --label-add` + +### Token Vault Obsidian +- Caminho: `/root/Obsidian-Pulse/` +- Config: `.obsidian/app.json` + `search.json` +- Skill: obsidian-vault-linker (arquivo SKILL.md + 28 skills instaladas no total) + +### Dados +- TaskBoard: standalone HTML — não precisa de npm build +- Agentes: ioredis BLPOP 60s, ciclo claim → process → done → idle +- Redis PUB/SUB para logs agregados em tempo real + +### Commits pendentes +- pulse-memory: memória diária 2026-05-20 atualizada +- workspace local: MEMORY.md, TOOLS.md +- pulse-docs: dev-stack.yml, dev-environment.md