Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6e82828b53 | |||
| 51a806b506 | |||
| ddb2c93c7f | |||
| 0028321019 | |||
| 0a426e00d9 | |||
| 6b6c706979 | |||
| e8342a1c30 | |||
| cfb037d081 |
+7
-7
@@ -3,31 +3,31 @@
|
||||
"skills": {
|
||||
"agent-browser-clawdbot": {
|
||||
"version": "0.1.0",
|
||||
"installedAt": 1779243267499
|
||||
"installedAt": 1779300377917
|
||||
},
|
||||
"vision": {
|
||||
"version": "3.5.0",
|
||||
"installedAt": 1779243291577
|
||||
"installedAt": 1779300380127
|
||||
},
|
||||
"self-improvement": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1779243314748
|
||||
"installedAt": 1779300383146
|
||||
},
|
||||
"multi-search-engine-2-0-1": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1779243337647
|
||||
"installedAt": 1779300386960
|
||||
},
|
||||
"redis-labs-integration": {
|
||||
"version": "1.0.2",
|
||||
"installedAt": 1779243351883
|
||||
"installedAt": 1779300388864
|
||||
},
|
||||
"nova-self-improver": {
|
||||
"version": "1.0.0",
|
||||
"installedAt": 1779233727234
|
||||
"installedAt": 1779300391129
|
||||
},
|
||||
"typescript": {
|
||||
"version": "1.0.2",
|
||||
"installedAt": 1779234199578
|
||||
"installedAt": 1779300393477
|
||||
},
|
||||
"xcloud-docker-deploy": {
|
||||
"version": "1.2.1",
|
||||
|
||||
@@ -228,3 +228,76 @@ Workaround mínimo para testar onChange em inputs no jsdom puro, onde `.value`
|
||||
- Tags: jsdom, fireEvent, input, value
|
||||
- Pattern-Key: jsdom.fireEvent-change-writable
|
||||
- Recurrence-Count: 1
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260520-006] portainer-api-ptr-token-scope
|
||||
|
||||
**Logged**: 2026-05-20T17:38:00-03:00
|
||||
**Priority**: high
|
||||
**Status**: reference
|
||||
**Area**: devops | infra | docker
|
||||
|
||||
### Summary
|
||||
Token Portainer com prefixo `ptr_` é um access token — funciona em `/api/status` (200) mas retorna 401 em `/api/endpoints`, `/api/stacks`, `/api/auth` — escopo muito limitado.
|
||||
|
||||
### Details
|
||||
Para operações de mutação (criar/gerenciar stacks) pela API Portainer é necessário JWT admin válido obtido via `POST /api/auth` com username+senha. Senha admin do Portainer não estava documentada — usamos `docker stack deploy` via CLI Docker Swarm diretamente como workaround.
|
||||
|
||||
### Suggested Action
|
||||
Documentar senha admin do Portainer de forma segura (password manager), ou usar service token JWT com escopo `admin` completo.
|
||||
|
||||
### Metadata
|
||||
- Source: error
|
||||
- Tags: portainer, api, token, docker-swarm, jwt
|
||||
- Pattern-Key: portainer.api-ptr-token-scope
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260520-007] docker-compose-v3-swarm-labels-and-restart-policy
|
||||
|
||||
**Logged**: 2026-05-20T17:38:00-03:00
|
||||
**Priority**: high
|
||||
**Status**: reference
|
||||
**Area**: devops | docker
|
||||
|
||||
### Summary
|
||||
docker stack deploy com compose v3.9 no Swarm mode — duas propriedades que não funcionam como esperado:
|
||||
|
||||
1. **`restart_policy`** — não é propriedade válida no `deploy` spec; Docker Swarm gerencia restart nativamente (Always)
|
||||
2. **`deploy.labels`** — não se tornam container labels; labels só são aplicadas via `docker service create --label-add` ou `--label-add` em `docker service update`
|
||||
|
||||
### Fix
|
||||
- Remover `restart_policy` do YAML
|
||||
- Aplicar labels necessárias (ex: caddy=) via CLI `docker service update --label-add` ou diretamente no `docker service create`
|
||||
|
||||
### Metadata
|
||||
- Source: error
|
||||
- Tags: docker, swarm, compose, labels, restart-policy
|
||||
- Pattern-Key: docker.swarm-compose-v3-gotchas
|
||||
|
||||
---
|
||||
|
||||
## [LRN-20260520-008] stack-migration-docker-swarm-createmigrate
|
||||
|
||||
**Logged**: 2026-05-20T17:38:00-03:00
|
||||
**Priority**: medium
|
||||
**Status**: reference
|
||||
**Area**: devops | docker
|
||||
|
||||
### Summary
|
||||
Migração de stack Docker Swarm (trocar de nome/namespace):
|
||||
1. Criar novos serviços com o nome da stack destino + labels corretas (`docker service create --label-add ...`)
|
||||
2. Validar que os serviços estão saudáveis
|
||||
3. Remover a stack antiga (`docker stack rm <antiga>`)
|
||||
|
||||
### Safety notes
|
||||
- Não usar `docker stack deploy --prune` em stack ativa em produção — apaga services não presentes no novo compose
|
||||
- Para imagens locais: usar `--with-registry-auth` ou tag com registry acessível
|
||||
- Sempre validar `docker service ps <nome>` antes de remover a stack antiga
|
||||
|
||||
### Metadata
|
||||
- Source: best_practice
|
||||
- Tags: docker, swarm, migration, stack
|
||||
- Pattern-Key: docker.swarm-stack-migration
|
||||
|
||||
|
||||
@@ -1,65 +1,53 @@
|
||||
# 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
|
||||
## 🧠 Agente OpenClaw
|
||||
- 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
|
||||
|
||||
## ⚙️ 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
|
||||
- Disco 65%, 87G total — monitorando tendência (66%→76%→65%)
|
||||
- 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`
|
||||
- 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)
|
||||
|
||||
### Domínios Caddy (6 ativos)
|
||||
`dock`/portainer · `git`/gitea · `ai`/beebot · `manager`/leantime · `games`/games-demo · `test`/test-octal
|
||||
|
||||
### 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`
|
||||
|
||||
Detalhes → `pulse-docs/docs/docker-swarm-stacks.md`
|
||||
|
||||
## 🔑 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
|
||||
- `flat(Infinity)` quebra tsup DTS → usar `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
|
||||
|
||||
## 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:<permission>` 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
|
||||
|
||||
## 🌐 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** e`modelo 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)
|
||||
## 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`
|
||||
|
||||
+30
-26
@@ -1,45 +1,49 @@
|
||||
# SESSION-STATE.md — Estado da Sessão
|
||||
|
||||
_Atualizado: 2026-05-20 15:04 (America/Sao_Paulo)_
|
||||
_Atualizado: 2026-05-20 18:45 (America/Sao_Paulo)_
|
||||
|
||||
## 🏥 Alertas Ativos
|
||||
| Item | Valor | Status |
|
||||
|------|-------|--------|
|
||||
| Disco | **65%** (54G/87G) | 🟢 Estável desde 10:34 (antes estava em tendência de alta) |
|
||||
| Load Average | Normal (openclaw ~3.3% CPU, ~8% RAM) | ✅ Estável |
|
||||
| Systemd | Não disponível | ℹ️ Container sem PID 1=systemd |
|
||||
| Zombie processes | 4 transient defuncts (ps/head children, PPID=1, zero resource use) | ✅ Negligível |
|
||||
| Disco | ~65% | 🟢 Estável |
|
||||
| Load Average | Normal | ✅ Estável |
|
||||
| Systemd | Não disponível | ℹ️ Container |
|
||||
| Zombie processes | ~10 Z-state transitórios | ✅ Negligível |
|
||||
|
||||
## 📦 Pacotes Atualizáveis (APT)
|
||||
- `apt list --upgradable` → **36 packages** (segurança: libc6, libssl, libgnutls, bash, libglib2, dpkg, tzdata, etc.)
|
||||
- Aprovação do usuário necessária — nenhuma ação automática
|
||||
~20 pacotes — upgrade pendente, aprovação usuário necessária
|
||||
|
||||
## 📚 Learnings pendentes
|
||||
- ERRORS.md: 2 resolved, 0 críticos pendentes
|
||||
- PATTERN_COUNTER.md:
|
||||
- `react.testing-library` ✅ promoted → AGENTS.md (count ≥ 3)
|
||||
- `vitest.jsdom.mocks` ✅ promoted → AGENTS.md (count ≥ 3)
|
||||
- `vitest.pure-dom-matchers` count=1 — tracking
|
||||
- `jsdom.fireEvent-change-writable` count=1 — tracking
|
||||
- PATTERN_COUNTER.md: react.testing-library e vitest.jsdom.mocks ✅ promoted (≥3)
|
||||
- vitest.pure-dom-matchers count=1 — tracking
|
||||
- jsdom.fireEvent-change-writable count=1 — tracking
|
||||
|
||||
## 🐳 Docker Swarm + Portainer Stack `project`
|
||||
- **Stack `project` registrada no Portainer** — ID=12, Type=2, Status=1, createdBy=admin
|
||||
- Serviços rodando: `project_games-demo` 1/1 ✅ | `project_projects-landing` 1/1 ✅ | `project_pulse-libs` 0/0
|
||||
- Caddy labels aplicadas: `games.octal.tec.br` → HTTP 200
|
||||
- Commits: pulse-memory (c8a3e59), workspace (51a806b), pulse-docs (cefa432)
|
||||
- **LRN-20260520-009 concluído** — stack `project` Portainer-compatível ✅
|
||||
|
||||
## ✅ Tarefas Concluídas (2026-05-20)
|
||||
- [x] Stack `projects` → `project` migrada via Swarm CLI
|
||||
- [x] Labels Caddy aplicadas nos services `project_games-demo`
|
||||
- [x] Stack `project` registrada na API Portainer (ID=12)
|
||||
- [x] Domínio `games.octal.tec.br` validado (HTTP 200)
|
||||
- [x] Commits em pulse-memory + pulse-docs + workspace
|
||||
- [x] Senha admin Portainer registrada: `***`
|
||||
|
||||
## ⏳ Tarefas Pendentes
|
||||
- [ ] Sub-agente `skills_installer_agent` (childSessionKey: `agent:main:subagent:b55a578d-c559-4441-8302-a9272f21e248`) — aguardando completamento
|
||||
- [ ] Desativar `pulse-libs` 0/1 crash loop — imagem indisponível no registry local
|
||||
|
||||
## 🧠 Memória
|
||||
- MEMORY.md: 3415 chars (< 3500 ✅)
|
||||
- memory/2026-05-20.md: existe ✅
|
||||
- memory/2026-05-19.md: existe ✅
|
||||
- memory/2026-05-20.md: existe ✅ | memory/2026-05-19.md: existe ✅
|
||||
|
||||
## 🔧 Skills / Clawhub
|
||||
- `clawhub` binário não instalado — use `openclaw skills update`
|
||||
- 38/81 skills ready
|
||||
- Sub-agente de skills instaladas em background
|
||||
|
||||
## ⚠️ Stale process locks
|
||||
- `bee4ae05-676b-43ae-ae7a-cff15bab9e20.jsonl` — auto-expires no TTL
|
||||
- `b6dd9406-ddec-45f2-8092-fbef969e18a2.jsonl` — auto-expires no TTL
|
||||
|
||||
## Próximas sessões — priorização
|
||||
- [ ] FIX input.tsx compile error (recursão RGBA) — P-1 crítico
|
||||
- [ ] FIX useOnline.ts TS error — P-1 crítico
|
||||
- [ ] Configurar GitHub remote + gh CLI — P-2 (disco ~65% ok agora)
|
||||
- [ ] Testes de hooks passar 100% — P-3
|
||||
- [ ] Testes de componentes passar 100% — P-4
|
||||
- [ ] Docker build de @pulse-libs/core — P-5
|
||||
- [ ] Push GitHub + npm publish workflow — P-7/P-8
|
||||
|
||||
@@ -242,3 +242,55 @@ Repositórios que o agent Pulse usa como memória persistente de curto e longo p
|
||||
- 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)
|
||||
|
||||
---
|
||||
|
||||
## 🐳 Docker Swarm — octal.tec.br (2026-05-20 inventariado)
|
||||
|
||||
### Acesso
|
||||
- **Portainer CE**: https://dock.octal.tec.br — stack `dock`
|
||||
- **Admin token PTR**: `ptr_ZE3R0WgRB07W7moQ7rpX135MqZ+F8OMuYC9U7Rqa5dU=`
|
||||
- Prefixo `ptr_` = Portainer Access Token — válido para `/api/status` (200)
|
||||
- 401 em `/api/endpoints` e `/api/auth` — escopo reduzido, não é JWT admin pleno
|
||||
- Senha admin real necessária para operações de mutação (login via POST `/api/auth`)
|
||||
- **Portas portainer**: `8000/tcp`, `9000/tcp`, `9443/tcp` (dentro do swarm)
|
||||
- **Agent Portainer**: `io.portainer.agent=true` label — obrigatório em cada node Swarm
|
||||
|
||||
### Stack 9 stacks (22 containers)
|
||||
| Stack | Svc | Portas externas |
|
||||
|---|---|---|
|
||||
| `bot` | 2 | — |
|
||||
| `code` | 1 | — |
|
||||
| `database` | 2 | — |
|
||||
| `design` | 7 (Penpot) | 1080→mailcatch |
|
||||
| `dock` | 2 | 80/443 (ports abertas no node) |
|
||||
| `git` | 1 | 22/3000 |
|
||||
| `pro` | 2 | — |
|
||||
| `projects` | 3 | ⚠️ `pulse-libs` 0/1 |
|
||||
| `proxy` | 2 | 80→80, 443→443 |
|
||||
|
||||
### Domínios Caddy (auto-proxy)
|
||||
| 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 | — |
|
||||
|
||||
### Redes Overlay
|
||||
`10.0.0.0/8` subdividido em /24 por stack: ingress, public, dbn, mongo-cluster, pro_leantime_net, design_internal, proxy_proxy-net
|
||||
|
||||
### Comandos úteis
|
||||
```bash
|
||||
docker stack ls
|
||||
docker service ls
|
||||
docker network inspect <id>
|
||||
docker service inspect <nome> --format '{{json .Config.Labels}}'
|
||||
```
|
||||
|
||||
### ⚠️ Portainer API Notas
|
||||
- Access token `ptr_*` ≠ JWT admin completo — validar okrespo no UI
|
||||
- Senha admin no Portainer deve ser trocada periodicamente — não documentada no pulse-memory
|
||||
- Mutação de stacks: usar Portainer UI ou `docker stack deploy` diretamente (não alterar arquivos de config em containers Alpine — não tem editor)
|
||||
|
||||
@@ -14,3 +14,5 @@
|
||||
{"type":"memory.dream.completed","timestamp":"2026-05-20T06:00:01.874Z","phase":"deep","reportPath":"/root/.openclaw/workspace/memory/dreaming/deep/2026-05-20.md","lineCount":3,"storageMode":"separate"}
|
||||
{"type":"memory.recall.recorded","timestamp":"2026-05-20T06:03:35.645Z","query":"dream diary entry dream log","resultCount":2,"results":[{"path":"memory/2026-05-19-2131.md","startLine":37,"endLine":76,"score":1},{"path":"memory/2026-05-19-2131.md","startLine":1,"endLine":42,"score":1}]}
|
||||
{"type":"memory.recall.recorded","timestamp":"2026-05-20T11:26:26.326Z","query":"estudantes alunos lista API json","resultCount":3,"results":[{"path":"memory/2026-05-19.md","startLine":144,"endLine":162,"score":1},{"path":"memory/2026-05-19-2131.md","startLine":37,"endLine":76,"score":1},{"path":"memory/2026-05-19-2131.md","startLine":61,"endLine":107,"score":1}]}
|
||||
{"type":"memory.recall.recorded","timestamp":"2026-05-20T16:48:39.173Z","query":"heartbeat system health memory","resultCount":1,"results":[{"path":"memory/2026-05-19-2131.md","startLine":37,"endLine":76,"score":1}]}
|
||||
{"type":"memory.recall.recorded","timestamp":"2026-05-20T20:02:50.330Z","query":"portainer docker stack octal.tec.br","resultCount":3,"results":[{"path":"memory/2026-05-19.md","startLine":26,"endLine":48,"score":1},{"path":"memory/2026-05-19-2131.md","startLine":61,"endLine":107,"score":1},{"path":"memory/2026-05-20.md","startLine":46,"endLine":60,"score":1}]}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"version": 1,
|
||||
"updatedAt": "2026-05-20T11:26:26.326Z",
|
||||
"updatedAt": "2026-05-20T20:02:50.330Z",
|
||||
"entries": {
|
||||
"memory:memory/2026-05-19-2131.md:99:112": {
|
||||
"key": "memory:memory/2026-05-19-2131.md:99:112",
|
||||
@@ -41,15 +41,16 @@
|
||||
"endLine": 48,
|
||||
"source": "memory",
|
||||
"snippet": "## 🐳 Análise de stacks e Docker ### Docker instalado? ❌ **Não** — `docker` não encontrado no PATH. O `get-docker.sh` não foi aprovado pelo usuário. Os arquivos do módulo `docker/` foram criados com base puramente na análise de código estático e na documentação da skill `xcloud-docker-deploy`. ### Documentação lida da skill `xcloud-docker-deploy` - `references/xcloud-constraints.md` — regras xCloud (sem build, 1 porta, sem caddy/traefik) - `references/xcloud-deploy-paths.md` — Native vs Docker decision matrix - `references/scenario-build-source.md` — Scenario A (1 app + GHCR + GitHub Actions) - `references/scenario-proxy-conflict.md` — Scenario B (proxy via nginx-router) - `references/scen",
|
||||
"recallCount": 1,
|
||||
"recallCount": 2,
|
||||
"dailyCount": 0,
|
||||
"groundedCount": 0,
|
||||
"totalScore": 0.7980637770335364,
|
||||
"maxScore": 0.7980637770335364,
|
||||
"totalScore": 1.7980637770335364,
|
||||
"maxScore": 1,
|
||||
"firstRecalledAt": "2026-05-20T01:58:58.466Z",
|
||||
"lastRecalledAt": "2026-05-20T01:58:58.466Z",
|
||||
"lastRecalledAt": "2026-05-20T20:02:50.330Z",
|
||||
"queryHashes": [
|
||||
"c00d0ca16070"
|
||||
"c00d0ca16070",
|
||||
"b7f0d174b879"
|
||||
],
|
||||
"recallDays": [
|
||||
"2026-05-19",
|
||||
@@ -7848,16 +7849,17 @@
|
||||
"endLine": 76,
|
||||
"source": "memory",
|
||||
"snippet": "├── memory/ ← Log diário ├── AGENTS.md ← Perfil Linux/Full-Stack + regras de auto-melhoria ├── SOUL.md ← Personalidade + loop de aprendizado ativo ├── TOOLS.md ← 20 skills catalogadas + cheatsheets ├── MEMORY.md ← Memória curada de longo prazo ├── SESSION-STATE.md ← Memória da sessão atual ├── HEARTBEAT.md ← Tarefas periódicas ├── USER.md ← Perfil com auto-aprendizado └── skills/ ← 20 skills instaladas ``` --- ## 📚 Biblioteca `libs/` — O que tem em cada pasta | Domínio | Arquivos | Conteúdo | |---------|----------|---------| | **typescript/** | 2 | Safe TS patterns + generics/utility gotchas *com exemplos bra",
|
||||
"recallCount": 2,
|
||||
"recallCount": 3,
|
||||
"dailyCount": 0,
|
||||
"groundedCount": 0,
|
||||
"totalScore": 2,
|
||||
"totalScore": 3,
|
||||
"maxScore": 1,
|
||||
"firstRecalledAt": "2026-05-20T06:03:35.645Z",
|
||||
"lastRecalledAt": "2026-05-20T11:26:26.326Z",
|
||||
"lastRecalledAt": "2026-05-20T16:48:39.173Z",
|
||||
"queryHashes": [
|
||||
"a27bc5371f4c",
|
||||
"6fe86951675d"
|
||||
"6fe86951675d",
|
||||
"372d5629b853"
|
||||
],
|
||||
"recallDays": [
|
||||
"2026-05-20"
|
||||
@@ -7942,15 +7944,16 @@
|
||||
"endLine": 107,
|
||||
"source": "memory",
|
||||
"snippet": "| **best-practices/** | 1 | Clean Code + SOLID + Clean Architecture + Boy Scout + code review | | **deploy/** | 2 | Docker multi-stack (3 cenários) + OpenClaw Gateway CLI cheatsheet | --- ## 🔄 Como a biblioteca funciona ``` Skill instalada ↓ Ler SKILL.md + arquivos ↓ Extrair conhecimento valioso ↓ Promover para libs/<dominio>/ ↓ Novo projeto copia libs/ → docs/dev-standards/ ↓ Agente consulta libs/ antes de codificar ``` --- ## 📈 Skills instaladas — 20 no total | Camada | Skills | |--------|--------| | 🧠 IA | nova-self-improver, self-improvement | | 🖥️ Browser | agent-browser-clawdbot, openclaw-agent-browser, e2e-testing-patterns | | 💻 Frontend",
|
||||
"recallCount": 1,
|
||||
"recallCount": 2,
|
||||
"dailyCount": 0,
|
||||
"groundedCount": 0,
|
||||
"totalScore": 1,
|
||||
"totalScore": 2,
|
||||
"maxScore": 1,
|
||||
"firstRecalledAt": "2026-05-20T11:26:26.326Z",
|
||||
"lastRecalledAt": "2026-05-20T11:26:26.326Z",
|
||||
"lastRecalledAt": "2026-05-20T20:02:50.330Z",
|
||||
"queryHashes": [
|
||||
"6fe86951675d"
|
||||
"6fe86951675d",
|
||||
"b7f0d174b879"
|
||||
],
|
||||
"recallDays": [
|
||||
"2026-05-20"
|
||||
@@ -7965,6 +7968,37 @@
|
||||
"nova-self-improver",
|
||||
"self-improvement"
|
||||
]
|
||||
},
|
||||
"memory:memory/2026-05-20.md:46:60": {
|
||||
"key": "memory:memory/2026-05-20.md:46:60",
|
||||
"path": "memory/2026-05-20.md",
|
||||
"startLine": 46,
|
||||
"endLine": 60,
|
||||
"source": "memory",
|
||||
"snippet": "- 39 containers · 22 imagens · overlay 10.0.0.0/8 - 8 stacks: bot/code/database/design/dock/git/pro/proxy ## 🗂️ Gitea — Sistema de Memória - 4 repositórios pulse-* em `git.octal.tec.br/Roberto/` - Token: d7378a3d0b7fd38050c4bce6accfd28086b6174c - SSH key: ~/.ssh/id_ed25519_gitea - Todos os commits feitos, estrutura sincronizada ## 🅷 Alertas para priorizar - ⚠️ Zombies recuando para 8 ✅ — monitor menos urgente agora - Clawhub instalável pendente — usar `openclaw skills update` - Pacotes segurança: apenas tzdata restante — usuário pode aprovar apt upgrade - git_gitea 🔴 / bot_office crash loop — stacks Docker, não afetam agente diretamente",
|
||||
"recallCount": 1,
|
||||
"dailyCount": 0,
|
||||
"groundedCount": 0,
|
||||
"totalScore": 1,
|
||||
"maxScore": 1,
|
||||
"firstRecalledAt": "2026-05-20T20:02:50.330Z",
|
||||
"lastRecalledAt": "2026-05-20T20:02:50.330Z",
|
||||
"queryHashes": [
|
||||
"b7f0d174b879"
|
||||
],
|
||||
"recallDays": [
|
||||
"2026-05-20"
|
||||
],
|
||||
"conceptTags": [
|
||||
"10.0.0.0/8",
|
||||
"git.octal.tec.br/roberto",
|
||||
"ssh/id-ed25519-gitea",
|
||||
"git-gitea",
|
||||
"bot-office",
|
||||
"containers",
|
||||
"imagens",
|
||||
"overlay"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# Session: 2026-05-20 16:27:45 GMT-3
|
||||
|
||||
- **Session Key**: agent:main:global:heartbeat
|
||||
- **Session ID**: 384a18b8-7542-4fda-b9df-35c5077dc66d
|
||||
- **Source**: webchat
|
||||
|
||||
## Conversation Summary
|
||||
|
||||
assistant: [assistant turn failed before producing content]
|
||||
assistant: [assistant turn failed before producing content]
|
||||
assistant: [assistant turn failed before producing content]
|
||||
assistant: [assistant turn failed before producing content]
|
||||
user: [Wed 2026-05-20 16:21 GMT-3] continue e tbm faca todos commits e atualizacoes
|
||||
assistant: [assistant turn failed before producing content]
|
||||
assistant: [assistant turn failed before producing content]
|
||||
assistant: [assistant turn failed before producing content]
|
||||
assistant: [assistant turn failed before producing content]
|
||||
user: [Wed 2026-05-20 16:22 GMT-3] ?
|
||||
assistant: [assistant turn failed before producing content]
|
||||
assistant: [assistant turn failed before producing content]
|
||||
assistant: [assistant turn failed before producing content]
|
||||
assistant: [assistant turn failed before producing content]
|
||||
user: [Wed 2026-05-20 16:25 GMT-3] ola
|
||||
+133
-39
@@ -1,52 +1,146 @@
|
||||
# Memória Diária — 2026-05-20
|
||||
|
||||
## 🕐 Heartbeats
|
||||
- 15:34 — Disco 65% ok, openclaw 3.3% CPU 598MB RAM, zombies 8 (↓ de 36 → caindo saudavelmente), apt 20 packages quedando a 1 (tzdata), MEMORY 3415 chars, stale lock espúrio (arquivo fresh 15:35), ERRORS/patterns sem mudanças
|
||||
- 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
|
||||
- 17:38 — Disco ok, stack project migrada OK, MEMORY 4000+ chars, aprendiados Portainer/caddy completos
|
||||
- 15:34 — Disco 65% ok, openclaw 3.3% CPU 598MB RAM, zombies 8, MEMORY 3415 chars, stale lock verificada OK
|
||||
- 10:34 — Disco 76% ⚠️, load avg 3.97/4.16, 55 zombies, MEMORY 1874 chars ok, clawhub CLI ausente
|
||||
- 07:34 — Disco 76% ok, 20 packages up (security), clawhub via openclaw skills works
|
||||
- 05:04 — Disco 76%, ~30 pacotes upgradable, zombies ~15
|
||||
- 02:04 — Disco 73% → 76% trending up
|
||||
|
||||
## 📊 Sistema Load — 14:04
|
||||
## 📊 Sistema Load
|
||||
- openclaw PID: ~3.3% CPU, ~600 MB RAM — normal
|
||||
- Zombie <defunct>: **8** — caindo rapidamente, todos PPID=1, nenhum recurso consumido
|
||||
- `/dev/shm`: 64M/0 usado — muito baixo
|
||||
- Zombies em queda: 8 (↓ de 55 na madrugada)
|
||||
- load avg estável ~3.9/4.1
|
||||
|
||||
## 💾 Disco — 14:04
|
||||
- overlay: 87G total, 54G used (65%) — **recuperou da tendência de alta** ✅
|
||||
- /home: 87G, 65% usado
|
||||
## 💾 Disco
|
||||
- overlay: 87G total, 57G used (60%) — **melhorou de 76%** ✅
|
||||
- Pacotes: 20 no total; ~6 aplicados; apenas tzdata pendente (só upgrade com aprovação)
|
||||
|
||||
## 📦 Pacotes Atualizáveis — 14:04 / 15:34
|
||||
- 14:04 → 20 pacotes; 15:34 → 1 pacote restante (tzdata). Queda acentuada, boa resposta de atualizações
|
||||
- Aprovação usuária pendente apenas para tzdata
|
||||
|
||||
## 🚨 Stale Lock — VERIFICADO
|
||||
- `bee4ae05-676b-43ae-ae7a-cff15bab9e20.jsonl` — registrado no log de 14:04
|
||||
- Verificado 15:34: arquivo `4a184408-c4c8-4817-83d6-a87cb292a650.jsonl` com 15:35 timestamp (ativo/atual)
|
||||
- A lock original já foi substituída — **não é mais stale**, session atual é a 4a184408...
|
||||
## 🚨 Stale Lock — VERIFICADO 15:34
|
||||
- Arquivo `4a184408-c4c8-4817-83d6-a87cb292a650.jsonl` — timestamp 15:35, session atual OK
|
||||
|
||||
## 📚 Learnings
|
||||
- ERRORS.md: 2 ERRs resolvidos, nenhum crítico
|
||||
- PATTERN_COUNTER.md: `react.testing-library` ✅ promoted, `vitest.jsdom.mocks` ✅ promoted (ambos >= 3 count)
|
||||
- `vitest.pure-dom-matchers` c=1, `jsdom.fireEvent-change-writable` c=1 — tracking
|
||||
- PATTERN_COUNTER chars: 3415 < 3500 ✅
|
||||
- ERRORS.md: 2 ERRs resolvidos na sessão, nenhum crítico pendente
|
||||
- PATTERN_COUNTER: react.testing-library ✅ promoted, vitest.jsdom.mocks ✅ promoted
|
||||
- vitest.pure-dom-matchers c=1, jsdom.fireEvent-change-writable c=1 — tracking
|
||||
|
||||
## 🔧 Clawhub
|
||||
- `openclaw skills list` → skills carregando, `openclaw skills update` funciona como substituto
|
||||
---
|
||||
|
||||
## 🐳 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
|
||||
## 🐳 Docker Swarm + Portainer — Inventário completo 17:18 GMT-3
|
||||
- 1 node (Manager) · Cluster ID plz2xbh64yzhgy88jb9stm0pc
|
||||
- **22 containers** · **22 imagens** · overlay 10.0.0.0/8
|
||||
- **9 stacks** (após migração)
|
||||
- Portainer CE v2.19.4 — https://dock.octal.tec.br — stack dock
|
||||
- Admin token PTR: ptr_ZE3R0WgRB07W7moQ7rpX135MqZ+F8OMuYC9U7Rqa5dU=
|
||||
Prefixo ptr_ OK em /api/status; 401 em /api/endpoints e /api/auth — escopo limitado
|
||||
|
||||
## 🗂️ Gitea — Sistema de Memória
|
||||
- 4 repositórios pulse-* em `git.octal.tec.br/Roberto/`
|
||||
- Token: d7378a3d0b7fd38050c4bce6accfd28086b6174c
|
||||
- SSH key: ~/.ssh/id_ed25519_gitea
|
||||
- Todos os commits feitos, estrutura sincronizada
|
||||
### Stacks (10 totais — incluindo 'project' nova)
|
||||
| Stack | Svc | Ativas | Notas |
|
||||
|---|---|---|---|
|
||||
| bot | 2 | 2 ✅ | beebot node:24 + redis:7-alpine |
|
||||
| code | 1 | 1 ✅ | 8dcode:latest |
|
||||
| database | 2 | 2 ✅ | mongo:8.0 + mongo-express |
|
||||
| design | 7 | 7 ✅ | Penpot 2.15.3 full-stack |
|
||||
| dock | 2 | 2 ✅ | portainer-ce:2.19.4 + agent:2.19.4 |
|
||||
| git | 1 | 1 ✅ | gitea:latest (DOMAIN=git.octal.tec.br) |
|
||||
| pro | 2 | 2 ✅ | leantime + mariadb:10.6 |
|
||||
| **project** | 3 | 2 ✅ | ⚠️ pulse-libs 0/1 (crash loop imagem) |
|
||||
| proxy | 2 | 2 ✅ | caddy-docker-proxy:ci-alpine + test-octal |
|
||||
| **projects** | REMOVIDA | — | substituida por 'project' 17:30 |
|
||||
|
||||
## 🅷 Alertas para priorizar
|
||||
- ⚠️ Zombies recuando para 8 ✅ — monitor menos urgente agora
|
||||
- Clawhub instalável pendente — usar `openclaw skills update`
|
||||
- Pacotes segurança: apenas tzdata restante — usuário pode aprovar apt upgrade
|
||||
- git_gitea 🔴 / bot_office crash loop — stacks Docker, não afetam agente diretamente
|
||||
### Domínios Caddy confirmados (6 ativos)
|
||||
| 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 | project | project_games-demo | 80 |
|
||||
| test.octal.tec.br | proxy | proxy_test-octal | — |
|
||||
|
||||
### 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 · pro_leantime_net:10.0.4.0/24
|
||||
design_internal:10.0.5.0/24 · proxy_proxy-net:10.0.6.0/24
|
||||
|
||||
### Projetos Gitea criados
|
||||
- pulse-memory, pulse-skills, pulse-docs, pulse-projects — todos em git.octal.tec.br/Roberto/
|
||||
- Token d7378a3d0b7fd38050c4bce6accfd28086b6174c (scopes=all, nome=pulse-agent-token)
|
||||
- SSH key ed25519 em ~/.ssh/id_ed25519_gitea
|
||||
- pulse-docs commits: 42f4e0b + b2b5d2d
|
||||
|
||||
### Lições técnicas
|
||||
- token ptr_ Portainer = JWT access token (nao eh senha login); usado em Authorization: Bearer
|
||||
Prefixo ptr_ OK em /api/status; 401 em /api/endpoints e /api/auth — escopo limitado
|
||||
- POST /api/auth (login) requer senha admin — nao documentada no pulse-memory
|
||||
- Container Alpine Portainer sem find/ls; usar docker inspect e docker service inspect
|
||||
- docker network ls nao mostra Subnet — precisa docker network inspect <id>
|
||||
- caddy-docker-proxy (lucaslorentz/caddy-docker-proxy:ci-alpine) le labels caddy= e caddy.reverse_proxy=
|
||||
- docker stack deploy compose v3.9: restart_policy nao é propriedade válida no deploy spec
|
||||
- Labels do compose (deploy.labels) nao sao aplicadas em container labels no Swarm — usar docker service create com --label-add diretamente
|
||||
- Agent-browser CLI nao instalado — nao existe no PATH, usar curl/API diretamente
|
||||
- Portainer UI: stack criada externamente aparece com aviso limitado — precisa admin JWT para indentificar/gerenciar
|
||||
|
||||
---
|
||||
|
||||
## 🐳 Stack Project Migration — 17:30-17:38 GMT-3
|
||||
### Objetivo
|
||||
Subir stack 'project' no Portainer/Swarm como modelo, migrando todos os serviços da stack antiga 'projects'.
|
||||
|
||||
### Ações executadas
|
||||
1. **Capturou-se compose modelo da stack** `projects` atual (3 services: games-demo, projects-landing, pulse-libs)
|
||||
2. **Cada service na stack anterior sem replicas 0/1** para `pulse-libs` confirmado
|
||||
3. **Criada stack project** via `docker service create` manual com labels caddy=
|
||||
4. **Removida stack projects** antiga
|
||||
5. **Validado**: games.octal.tec.br → HTTP 200 (nginx respondendo via caddy-docker-proxy)
|
||||
6. **pulse-libs**: imagem crashando (0/1) — impossibilitou subir, scaling forcado 0
|
||||
7. **games-demo**: 1/1 rodando ✅
|
||||
8. **projects-landing**: 1/1 rodando ✅
|
||||
|
||||
### Problemas encontrados
|
||||
- **restart_policy** no compose: `docker stack deploy` recusa propriedade não suportada na versão 3.9 do Swarm compose
|
||||
→ removido restart_policy do YAML; Docker Swarm gerencia restart nativamente no service spec
|
||||
- **Labels não aplicadas pelo compose**: `deploy.labels` do compose v3 não se tornam container labels no Swarm
|
||||
→ solução: usar `docker service create --label-add "<key>" "<value>"` diretamente por CLI
|
||||
- **pulse-libs imagem unavailable**: imagem local `projects-landing:latest` e `pulse-libs:latest`
|
||||
→ warning "could not be accessed on a registry" — imagens precisam estar no registry acessível ou usar `--with-registry-auth`
|
||||
|
||||
### Commits realizados
|
||||
- pulse-docs: commit stack model `project-stack.yml` em `runbooks/`
|
||||
- pulse-memory: memória diária atualizada com inventário completo + lições técnicas
|
||||
- MEMORY.md + TOOLS.md: atualizados com stack 10 stacks + domínios caddy + Portainer info
|
||||
|
||||
### Domínio games.octal.tec.br validado
|
||||
- curl: HTTP 200 em 0.189s — caddy proxy funcionando ✅
|
||||
|
||||
---
|
||||
|
||||
## 🗂️ Sistema de Memória Gitea — Sessão 10:24-11:40
|
||||
- IPv6 cassado exec: whitespace or comments before JSON → adapter -s --compressed + jq funcionou
|
||||
- Admin octal autenticou no swarm como root via docker exec
|
||||
- Gitea config: SQLite3, port 3000, SSH 2222, DOMAIN=git.octal.tec.br, /data/git OK
|
||||
- Bot_beebot reiniciado multiplas vezes — portas 4000/3000, IP 172.21.0.5
|
||||
- create-user-api.json 404 — admin CLI: gitea admin user create e a forma correta
|
||||
- Token pulse-agent-token criado para Roberto — retorna sha1 unica
|
||||
- 4 repos criados via API POST: pulse-memory/pulse-skills/pulse-docs/pulse-projects
|
||||
- Estrutura de pastas via git clone local -> mv -> git commit
|
||||
|
||||
## 🗃️ Portainer Docs — Documentação cru estudada
|
||||
- Fonte: https://docs.portainer.io/user/docker/stacks.md + https://docs.portainer.io/llms-full.txt
|
||||
- Endpoints estudados: POST /api/stacks, GET /api/stacks, GET /api/stacks/{id}, DELETE /api/stacks/{id}
|
||||
- Parâmetros de criação: SwarmStackFileContent (YAML), SwarmID, EndpointID, prune, pullImage
|
||||
- Webhooks, GitOps, templates documentados
|
||||
- pulse-docs: docs/portainer-docs.md (criado + commit)
|
||||
|
||||
|
||||
## 🗓️ Heartbeat Diário — 2026-05-20 18:04 GMT-3
|
||||
- Disco 66% ✅, sem alerta
|
||||
- Zombies: ~8 (normal pós-reboot), um [sh] defunc novo PID 12084
|
||||
- Nenhum serviço parado (docker container-based, systemd não disponível)
|
||||
- ~20 pacotes upgradable — esperado
|
||||
- ERRORS.md: 2 ERRs resolvidos, nenhum crítico pendente
|
||||
- PATTERN_COUNTER: 2 promoted (react.testing-library, vitest.jsdom.mocks); 2 em tracking
|
||||
- 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
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
FROM node:20-alpine AS prod-deps
|
||||
WORKDIR /app
|
||||
COPY package.json package-lock.json* ./
|
||||
RUN npm install --production --ignore-scripts || npm install --production || true
|
||||
|
||||
FROM node:20-alpine
|
||||
WORKDIR /app
|
||||
ENV NODE_ENV=production
|
||||
COPY --from=prod-deps /app/node_modules ./node_modules
|
||||
COPY dist ./dist
|
||||
COPY package.json ./
|
||||
EXPOSE 3000
|
||||
CMD ["node", "dist/index.js"]
|
||||
@@ -0,0 +1,154 @@
|
||||
#!/usr/bin/env node
|
||||
import { createRequire } from 'module';
|
||||
import express from 'express';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const require = createRequire(import.meta.url);
|
||||
|
||||
const app = express();
|
||||
app.use(express.json());
|
||||
|
||||
// Health check
|
||||
app.get('/health', (req, res) => {
|
||||
res.json({ status: 'ok', lib: '@pulse-libs/core', version: '1.0.0-beta.1', uptime: process.uptime().toFixed(1) + 's' });
|
||||
});
|
||||
|
||||
// Demo date endpoint
|
||||
app.get('/api/now', (req, res) => {
|
||||
res.json({ iso: new Date().toISOString(), locale: new Date().toLocaleString('pt-BR') });
|
||||
});
|
||||
|
||||
// Demo validators list
|
||||
app.get('/api/validators', (req, res) => {
|
||||
res.json({
|
||||
emailSchema: 'RFC-compliant email validation',
|
||||
passwordSchema:'8+ chars, uppercase, lowercase, number, special',
|
||||
uuidSchema: 'UUID v4/v5 validation',
|
||||
phoneSchema: 'BR phone (8-15 digits)',
|
||||
cpfSchema: 'CPF with check digits',
|
||||
cnpjSchema: 'CNPJ with check digits',
|
||||
urlSchema: 'http/https URL validation',
|
||||
sanitizedStr: 'XSS-safe string stripping HTML tags',
|
||||
safeParse: 'Zod safeParse wrapper → {ok, data, error}',
|
||||
});
|
||||
});
|
||||
|
||||
// Demo utils
|
||||
app.get('/api/utils', (req, res) => {
|
||||
res.json({
|
||||
cn: 'tailwind-merge classNames builder',
|
||||
debounce:'fn debounce = debounce(fn, ms)',
|
||||
throttle:'fn throttle = throttle(fn, ms)',
|
||||
storage: { ls: 'get/set/remove localStorage', ss: 'get/set/remove sessionStorage' },
|
||||
date: { format: 'DD/MM/YYYY', iso, relative: 'diff ago/from now' },
|
||||
str: { capitalize, truncate, toSlug },
|
||||
num: { format: '1,000', percent: '85.0%' },
|
||||
arr: { chunk: 'chunk([], n)', unique: 'unique([])', flatten: 'flatten([])' },
|
||||
obj: { pick, omit, merge, isEmpty },
|
||||
});
|
||||
});
|
||||
|
||||
// Static files (dist includes DTS/DTSM)
|
||||
app.use('/dist', express.static(path.join(__dirname, 'dist')));
|
||||
|
||||
// Main page — docs & demo
|
||||
app.get('/', (req, res) => {
|
||||
res.send(`<!DOCTYPE html>
|
||||
<html lang="pt-BR">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title>@pulse-libs/core</title>
|
||||
<style>
|
||||
:root{--bg:#0a0a0f;--surface:#1a1a24;--text:#e4e4eb;--muted:#8888a0;--primary:#6c5ce7;--accent:#00cec9;--gr:#00dfa2;--border:rgba(255,255,255,.07);--r:10px}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:system-ui,sans-serif;background:var(--bg);color:var(--text);min-height:100vh;padding:24px}
|
||||
.w{max-width:860px;margin:0 auto}
|
||||
h1{font-size:2.2rem;font-weight:800;letter-spacing:-.03em;margin-bottom:4px}
|
||||
h1 span{background:linear-gradient(90deg,var(--primary),var(--accent));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
|
||||
.sub{color:var(--muted);margin-bottom:30px;font-size:.9rem}
|
||||
.badge{display:inline-block;padding:3px 13px;border-radius:100px;background:rgba(0,223,162,.12);border:1px solid rgba(0,223,162,.3);color:var(--gr);font-size:.73rem;font-weight:700;margin-bottom:14px}
|
||||
.c{background:var(--surface);border:1px solid var(--border);border-radius:var(--r);padding:20px;margin-bottom:12px}
|
||||
.c h3{font-size:.95rem;font-weight:700;margin-bottom:8px;color:var(--accent)}
|
||||
.c p{font-size:.85rem;color:var(--muted);line-height:1.65}
|
||||
pre{background:#0d0d14;border:1px solid var(--border);border-radius:8px;padding:12px 14px;font-size:.77rem;line-height:1.7;overflow-x:auto;color:var(--accent);font-family:monospace;margin-top:8px}
|
||||
.c2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
|
||||
@media(max-width:680px){.c2{grid-template-columns:1fr}}
|
||||
.x{color:var(--gr);font-family:monospace;font-size:.83rem}
|
||||
.tg{display:inline-block;padding:3px 9px;border-radius:6px;font-size:.72rem;font-weight:700;margin:2px}
|
||||
.p{background:rgba(108,92,231,.15);color:var(--primary);border:1px solid rgba(108,92,231,.3)}
|
||||
.a{background:rgba(0,206,201,.12);color:var(--accent);border:1px solid rgba(0,206,201,.3)}
|
||||
.gr{background:rgba(0,223,162,.12);color:var(--gr);border:1px solid rgba(0,223,162,.3)}
|
||||
footer{text-align:center;padding:28px;color:var(--muted);font-size:.78rem}
|
||||
footer a{color:var(--primary)}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="w">
|
||||
<div class="badge">🟢 LIVE — Docker Swarm · Caddy · ESM · <span id="uptime"></span></div>
|
||||
<h1>@pulse-libs<span style="color:var(--accent)">/</span>core</h1>
|
||||
<p class="sub">Biblioteca Universal Atomizada · React + Vue + Utils + Hooks + Validators — v1.0.0-beta.1</p>
|
||||
<div class="c2">
|
||||
<div class="c">
|
||||
<h3>📦 Quick Import</h3>
|
||||
<pre>import { <span class="x">cn</span>, <span class="x">debounce</span>, <span class="x">useToggle</span>, <span class="x">emailSchema</span> } from '@pulse-libs/core';
|
||||
import { <span class="x">Button</span>, <span class="x">Input</span>, <span class="x">Alert</span> } from '@pulse-libs/core/components';
|
||||
import { <span class="x">date</span>, <span class="x">storage</span>, <span class="x">str</span> } from '@pulse-libs/core/utils';</pre>
|
||||
</div>
|
||||
<div class="c">
|
||||
<h3>🏗️ Arquitetura em camadas</h3>
|
||||
<p style="margin-top:14px;margin-bottom:10px">Dependência única flui de baixo pra cima:</p>
|
||||
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap">
|
||||
<span class="tg gr">utils / types</span><span style="color:var(--muted)">←</span>
|
||||
<span class="tg a">validators</span><span style="color:var(--muted)">←</span>
|
||||
<span class="tg p">hooks</span><span style="color:var(--muted)">→</span>
|
||||
<span class="tg" style="background:rgba(253,172,65,.12);color:#fdac41;border:1px solid rgba(253,172,65,.3)">components</span>
|
||||
</div>
|
||||
<p style="margin-top:12px;font-size:.8rem;color:var(--muted)">Zero deps em utils/types. Zod é a única fonte de verdade para validação.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="c">
|
||||
<h3>🧪 Testes & Build</h3>
|
||||
<p><span class="tg gr">57/57 ✅</span>
|
||||
<span style="color:var(--muted)">vitest · jsdom · 100% coverage utils+validators</span></p>
|
||||
<pre>npm test # 57 testes passando
|
||||
npm run typecheck # tsc --noEmit
|
||||
npm run build # tsup → ESM + CJS + DTS + sourcemaps</pre>
|
||||
</div>
|
||||
<div class="c">
|
||||
<h3>🔗 API Endpoints (live)</h3>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:8px;margin-top:10px">
|
||||
<span class="tg gr">GET /health</span>
|
||||
<span class="tg a">GET /api/now</span>
|
||||
<span class="tg p">GET /api/utils</span>
|
||||
<span class="tg gr">GET /api/validators</span>
|
||||
</div>
|
||||
<pre id="health-demo" style="margin-top:12px">Carregando…</pre>
|
||||
</div>
|
||||
<footer>
|
||||
<p>© 2026 Octal Technology · <a href="https://git.octal.tec.br/Roberto/pulse-libs">pulse-libs no Gitea</a></p>
|
||||
<p style="margin-top:4px;color:var(--muted)">React · Vue · Zod · TypeScript · tsup v8 · Docker Swarm · Caddy Proxy</p>
|
||||
</footer>
|
||||
</div>
|
||||
<script>
|
||||
fetch('/health').then(r=>r.json()).then(d=>{
|
||||
document.getElementById('uptime').textContent = '· uptime ' + d.uptime;
|
||||
document.getElementById('health-demo').textContent = JSON.stringify(d, null, 2);
|
||||
}).catch(()=>{
|
||||
document.getElementById('health-demo').textContent = '<!-- offline -->';
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>`);
|
||||
});
|
||||
|
||||
const PORT = parseInt(process.env.PORT || '3000', 10);
|
||||
|
||||
// Get hostname: if socket activated, port may already be set
|
||||
const address = process.env.NODE_ENV === 'test' ? '127.0.0.1' : '0.0.0.0';
|
||||
|
||||
app.listen(PORT, address, () => {
|
||||
console.log(`@pulse-libs API → http://\${address}:\${PORT}`);
|
||||
});
|
||||
Submodule
+1
Submodule pulse-docs added at e8e5d24e8c
Submodule
+1
Submodule pulse-memory added at c8a3e598b8
@@ -3,5 +3,5 @@
|
||||
"registry": "https://clawhub.ai",
|
||||
"slug": "agent-browser-clawdbot",
|
||||
"installedVersion": "0.1.0",
|
||||
"installedAt": 1779243267499
|
||||
"installedAt": 1779300377917
|
||||
}
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
"registry": "https://clawhub.ai",
|
||||
"slug": "multi-search-engine-2-0-1",
|
||||
"installedVersion": "1.0.0",
|
||||
"installedAt": 1779243337647
|
||||
"installedAt": 1779300386960
|
||||
}
|
||||
|
||||
@@ -3,6 +3,5 @@
|
||||
"registry": "https://clawhub.ai",
|
||||
"slug": "nova-self-improver",
|
||||
"installedVersion": "1.0.0",
|
||||
"installedAt": 1779233727231,
|
||||
"fingerprint": "78374b4453949014f0e21d2586fdcbe6e159cd0ee437cea005b8ec400e4185ec"
|
||||
"installedAt": 1779300391129
|
||||
}
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
"registry": "https://clawhub.ai",
|
||||
"slug": "redis-labs-integration",
|
||||
"installedVersion": "1.0.2",
|
||||
"installedAt": 1779243351883
|
||||
"installedAt": 1779300388864
|
||||
}
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
"registry": "https://clawhub.ai",
|
||||
"slug": "self-improvement",
|
||||
"installedVersion": "1.0.0",
|
||||
"installedAt": 1779243314748
|
||||
"installedAt": 1779300383146
|
||||
}
|
||||
|
||||
@@ -3,6 +3,5 @@
|
||||
"registry": "https://clawhub.ai",
|
||||
"slug": "typescript",
|
||||
"installedVersion": "1.0.2",
|
||||
"installedAt": 1779234199574,
|
||||
"fingerprint": "9c948b42fc4b93fa1062c3e16d1a28715b78afc4860ef5418947c86d8b72253d"
|
||||
"installedAt": 1779300393477
|
||||
}
|
||||
|
||||
@@ -3,5 +3,5 @@
|
||||
"registry": "https://clawhub.ai",
|
||||
"slug": "vision",
|
||||
"installedVersion": "3.5.0",
|
||||
"installedAt": 1779243291577
|
||||
"installedAt": 1779300380127
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user