diff --git a/core-tools/skills/metrics/SKILL.md b/core-tools/skills/metrics/SKILL.md index 6dff43e..29155e7 100644 --- a/core-tools/skills/metrics/SKILL.md +++ b/core-tools/skills/metrics/SKILL.md @@ -36,6 +36,43 @@ Complementa `/reflect` (qualitativo) com dados quantitativos, `/worklog` com met | `/metrics --roi` | ROI por cliente/projecto | | `/metrics --export` | Exportar JSON/CSV | | `/metrics --alerts` | Listar alertas activos | +| `/metrics --tools` | **Telemetria local de tool calls (ver secção Local Tool Telemetry)** | + +--- + +## Local Tool Telemetry (G3.1-B) + +Desde 08-04-2026 há captura universal de **todas** as tool calls do Claude Code via hook PostToolUse (`~/.claude/hooks/telemetry-posttool-hook.sh`). Complementa a telemetria Desk CRM com dados locais imediatos. + +**Ficheiro:** `~/.claude-work/tool-invocations.jsonl` (1 linha por tool call: ts, session, tool_use_id, tool_name, success, error) + +**Agregador:** `/media/ealmeida/Dados/Dev/ClaudeDev/tool-metrics.py` + +```bash +# Overview últimas 24h +python3 /media/ealmeida/Dados/Dev/ClaudeDev/tool-metrics.py + +# Só hoje +python3 /media/ealmeida/Dados/Dev/ClaudeDev/tool-metrics.py --today + +# Últimos 7 dias +python3 /media/ealmeida/Dados/Dev/ClaudeDev/tool-metrics.py --last 7d + +# Filtrar por sessão +python3 /media/ealmeida/Dados/Dev/ClaudeDev/tool-metrics.py --session + +# Output JSON (para pipeline/grafos) +python3 /media/ealmeida/Dados/Dev/ClaudeDev/tool-metrics.py --json +``` + +**Output:** total de invocations, sessões únicas, top 20 tools (contagem + %), falhas por tool com amostras de erro, top 5 sessões por volume. + +**Limitações conhecidas:** +- Duration não é capturada (harness não entrega duration no hook payload). Apenas contagem e success/failure. +- Tokens não capturáveis via hooks (não estão no payload). +- Só captura tool calls que chegam ao PostToolUse — tool calls bloqueados por hooks PreToolUse não aparecem. + +Ver `04-Stack/CHANGELOG.md` bloco 08-04-2026 sessão 2 para contexto do gap e decisão de scope. ### Agregacoes Disponiveis diff --git a/crm-ops/skills/proposta-visual/SKILL.md b/crm-ops/skills/proposta-visual/SKILL.md index ff5c4f4..53e2c7a 100644 --- a/crm-ops/skills/proposta-visual/SKILL.md +++ b/crm-ops/skills/proposta-visual/SKILL.md @@ -116,6 +116,18 @@ Mostra: "750 EUR + IVA" + "Investimento único · prazo 1-2 semanas" | Import de componentes SVG (``, ``) | Crasha web worker do PDFDownloadLink | Implementar gráficos inline com `` | | `Font.register` com fontes locais/CDN em multi-página | Falha silenciosa | Usar Helvetica/Helvetica-Bold (built-in) | | `href` vazio no PDFDownloadLink | PDF não gerou — verificar consola | Cache do browser — Ctrl+Shift+R | +| `width: "100%"` em bars/elementos dentro de flex container | Não resolve — fica invisível | Usar `alignSelf: "stretch"` no elemento e no container pai | +| Imagens com path absoluto (`/home/...`) | react-pdf não acede ao filesystem local | Colocar em `public/assets/` e referenciar como `"assets/foto.png"` (sem `/` inicial) | +| `borderBottomWidth` no header + `borderTopWidth` em componente filho | Duplica a linha dourada visualmente | Usar apenas `borderTopWidth: 2` no próprio header; remover `borderBottom` | + +**Hifenização:** Para desactivar em todo o PDF, adicionar ao ``: +```jsx +hyphenationCallback={(word) => [word]} +``` + +**Ícones no PDF:** Usar `PDFIcons.jsx` (`src/pdf/sections/`) com `Svg/Path/Circle/Line/Polyline` de `@react-pdf/renderer`. NÃO importar lucide-react nos componentes PDF — crasha o worker. + +**Ícones na web:** Usar `lucide-react`. Padrão: `FALLBACK_ICONS[i % FALLBACK_ICONS.length]` para rotação automática por índice quando o JSON não tem campo `icon`. ### 6. Página 360° (service360) — contextualizar @@ -132,6 +144,64 @@ Se `service360` for `null`, a secção não aparece. As condições estão numa página PDF separada (não na mesma que o roadmap) para evitar corte entre páginas. O componente `PDFWorkDone` retorna um Fragment com 2 Pages. +### 8. Apresentação 16:9 — PDFPresentation.jsx + +Existe um segundo output PDF em formato 1920×1080 (slides), activado por um botão "Apresentação 16:9" no canto inferior direito da proposta web. + +**Ficheiros envolvidos:** +- `src/pdf/PDFPresentation.jsx` — documento completo com todos os slides +- `src/pdf/sections/PDFSlide.jsx` — wrapper de slide (Page 1440×810pt, header com logo, rodapé com numeração) + +**Dimensões:** 1920×1080 @ 72dpi → `[1440, 810]` em pontos (unidade do react-pdf). + +**Estrutura de slides:** + +| Slide | Componente | Dados | +|-------|-----------|-------| +| Capa | `SlideCover` | `data.title`, `client`, `date`, `company` | +| Diagnóstico | `SlideProblem` | `context.description`, `context.diagnosis` | +| Descomplicar 360° | `Slide360` | `educationSections` com `label:"Descomplicar 360°"` | +| Educação | `SlideEducation` | restantes `educationSections` | +| Soluções | `SlideService360` | `service360.areas` | +| Previsão de leads | `SlideLeadForecast` | `leadForecast` | +| Preços | `SlidePricing` | `plans` | +| Roadmap | `SlideRoadmap` | `roadmap` | +| Contacto | `SlideContact` | `company`, `client.contact` | + +**Helper components internos (PDFPresentation.jsx):** +- `GoldLine` — linha dourada decorativa +- `Tag` — label uppercase dourado (fontSize 13) +- `SlideTitle` — título principal do slide (fontSize 52 default) +- `SlideBody` — corpo do slide (fontSize 19) +- `Card` — caixa de conteúdo com border esquerda dourada (title 16, body 14) +- `CardGrid` — wrapper flexWrap para cards + +**Tamanhos de referência para legibilidade em sala:** +- Tag: 13pt | SlideTitle: 42-58pt | SlideBody: 19pt +- Card title: 16pt | Card body: 14pt +- Cover logo: height 120 (3× maior que header normal) + +**Separação Slide360 vs SlideEducation:** +```jsx +const slide360 = educationSections?.find(s => s.label?.toLowerCase().includes("360")) +const otherSections = educationSections?.filter(s => !s.label?.toLowerCase().includes("360")) +``` + +**Botão no App.jsx:** +```jsx +} + fileName={`apresentacao-descomplicar-${...}.pdf`} +> + {({ loading }) => } + +``` + +**PROIBIÇÕES específicas do 16:9:** +- NÃO usar `gap` em `flexWrap` (mesmo bug do A4) +- NÃO usar `rgba()` em `borderColor` +- Manter `hyphenationCallback` no `` do PDFPresentation também + --- ## Protocolo @@ -342,6 +412,7 @@ rm -f /tmp/propostas-dist.tar.gz |------|---------|------|------| | `ljm-360-61a8aecc` | A Loja da Maria | 360° (mensal) | 2026-03-20 | | `ccv-bookeo-a3f7c1d2` | Carvoeiro Caves | Migração técnica (único) | 2026-03-23 | +| `pbk-autoridade-local-2026` | Equipa Sérgio Oliveira e Paula Barros · KW Portugal | SEO + conteúdo hiperlocal (mensal) | 2026-04-27 | --- @@ -366,12 +437,26 @@ rm -f /tmp/propostas-dist.tar.gz - Checklist pré-build e teste PDF obrigatório - Condições comerciais em página PDF separada +### v2.2.0 (2026-04-27) +- Formato 16:9 documentado: `PDFPresentation.jsx` + `PDFSlide.jsx` +- Regra 8 adicionada: estrutura de slides, dimensões, helper components, tamanhos de referência +- Separação Slide360 vs SlideEducation por label +- Botão "Apresentação 16:9" no App.jsx documentado +- Proibições específicas 16:9 adicionadas + +### v2.1.0 (2026-04-27) +- Novos bugs react-pdf documentados: `width:"100%"` em flex, paths absolutos em imagens, `borderBottom` duplicado +- Hifenização: `hyphenationCallback` no `` +- Padrão de ícones: `PDFIcons.jsx` para PDF, lucide-react para web, fallback por índice +- Proposta `pbk-autoridade-local-2026` adicionada ao registo +- Healing Log com 5 erros reais corrigidos + ### v1.0.0 (2026-03-23) - Versão inicial --- -**Versão:** 2.0.0 | **Data:** 2026-03-23 +**Versão:** 2.2.0 | **Data:** 2026-04-27 --- @@ -380,7 +465,11 @@ rm -f /tmp/propostas-dist.tar.gz Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar. ```jsonl -{"date":"","issue":"","fix":"","source":"user|auto"} +{"date":"2026-04-27","issue":"Barras de gráfico invisíveis no PDF","fix":"width:'100%' não funciona em flex containers — substituir por alignSelf:'stretch' no container e na barra","source":"user"} +{"date":"2026-04-27","issue":"Linha dourada duplicada no topo das páginas","fix":"PDFPage tinha borderBottomWidth no header E os componentes filhos tinham borderTopWidth — remover borderBottom do header, manter apenas borderTopWidth:2","source":"user"} +{"date":"2026-04-27","issue":"Foto do gestor de conta não aparece no PDF","fix":"react-pdf não carrega paths absolutos do filesystem — copiar para public/assets/ e referenciar sem / inicial","source":"user"} +{"date":"2026-04-27","issue":"Border verde em vez de dourado no PDF","fix":"rgba() em borderColor renderiza verde — usar hex sólido (#D4A020)","source":"user"} +{"date":"2026-04-27","issue":"Hifenização indesejada no PDF","fix":"Adicionar hyphenationCallback={(word) => [word]} ao ","source":"user"} ``` *Adicionar nova linha após cada erro corrigido.* diff --git a/dev-tools/skills/pdf/SKILL.md b/dev-tools/skills/pdf/SKILL.md index 11ca557..0dbd19d 100644 --- a/dev-tools/skills/pdf/SKILL.md +++ b/dev-tools/skills/pdf/SKILL.md @@ -766,7 +766,7 @@ def extract_text_with_ocr(pdf_path): | Propostas | `/media/ealmeida/Dados/Hub/03-Propostas/` | | Arquivo clientes | `/media/ealmeida/Dados/GDrive/Arquivo_de_Clientes/` | | Knowledge Base | `/media/ealmeida/Dados/Hub/06-Operacoes/Knowledge-Base/PDFs/` | -| Backups | `/media/ealmeida/Dados/GDrive/Backups/` | +| Backups | `/media/ealmeida/Externo/LocalBackups/` (espelhado p/ GDrive via rclone) | | Temporarios | `~/.claude-work/` (limpar ao concluir) | ### MCPs relevantes diff --git a/gestao/skills/clip-agent/SKILL.md b/gestao/skills/clip-agent/SKILL.md index cf07aa1..8e9e583 100644 --- a/gestao/skills/clip-agent/SKILL.md +++ b/gestao/skills/clip-agent/SKILL.md @@ -194,12 +194,67 @@ UPDATE agents SET adapter_config = adapter_config || '{"dangerouslySkipPermissio WHERE id = '{{AGENT_ID}}'; ``` -**Nota sobre modelos e adapters:** O adapter `claude_local` já não é usado para agentes heartbeat. Distribuição actual: -- 1 agente (CEO) usa `gemini_local` com `gemini-2.5-pro` -- 50 agentes usam `gemini_local` com `gemini-2.5-flash` -- 13 agentes usam `opencode_local` com `openrouter/x-ai/grok-4.1-fast` +**Política de adapters por nível (actualizado 07-04-2026):** `opencode_local` foi **completamente removido** (modelos indisponíveis). Distribuição actual: +- **C-Level (5)** — CEO, CDO, CFO, CGO, CTO: `claude_local` com `claude-sonnet-4-6` (decisão estratégica, exige raciocínio premium) +- **Especialistas/Directores (59)**: `gemini_local` com `gemini-2.5-flash` (execução, custo baixo) +- **Analyst on-demand (1)** — Reality Checker: `process` com `claude-sonnet-4-6` (sem heartbeat) -**Agentes analyst/read-only (ex: Reality Checker):** usar `adapter_type: process` com `adapter_config.model: "claude-sonnet-4-6"` e `instructionsBundleMode: "external"`. Estes agentes são invocados manualmente (heartbeat desactivado), não consomem budget em modo autónomo. +**Configurar `claude_local` (template canónico — C-Level):** +```json +{ + "cwd": "/media/ealmeida/Dados/Hub/04-Stack/02.06-Clip", + "model": "claude-sonnet-4-6", + "command": "claude", + "dangerouslySkipPermissions": true, + "timeoutSec": 900, + "graceSec": 20, + "instructionsFilePath": "" +} +``` +Modelos válidos: `claude-opus-4-6`, `claude-sonnet-4-6`, `claude-haiku-4-6`, `claude-sonnet-4-5-20250929`, `claude-haiku-4-5-20251001`. + +**Configurar `gemini_local` (template canónico):** +```json +{ + "cwd": "/media/ealmeida/Dados/Hub/04-Stack/02.06-Clip", + "yolo": true, + "model": "gemini-2.5-flash", + "command": "/home/ealmeida/.paperclip/gemini-wrapper.sh", + "sandbox": false, + "newSession": true, + "instructionsFilePath": "" +} +``` + +Campos: +- `command` — wrapper Gemini CLI local em `/home/ealmeida/.paperclip/gemini-wrapper.sh` +- `model` — `gemini-2.5-flash` (default) ou `gemini-2.5-pro` (CEO/tarefas pesadas) +- `yolo: true` — auto-aprovar comandos (equivalente a `dangerouslySkipPermissions` do claude_local) +- `sandbox: false` — sem sandbox de filesystem +- `newSession: true` — sessão nova por run +- `cwd` — `/media/ealmeida/Dados/Hub/04-Stack/02.06-Clip` (NUNCA usar Hub raiz) +- `instructionsFilePath` — path absoluto para AGENTS.md + +**Migrar agente para gemini_local (SQL):** +```sql +UPDATE agents +SET adapter_type = 'gemini_local', + adapter_config = jsonb_build_object( + 'cwd', COALESCE(adapter_config->>'cwd', '/media/ealmeida/Dados/Hub/04-Stack/02.06-Clip'), + 'yolo', true, + 'model', 'gemini-2.5-flash', + 'command', '/home/ealmeida/.paperclip/gemini-wrapper.sh', + 'sandbox', false, + 'newSession', true, + 'instructionsFilePath', adapter_config->>'instructionsFilePath' + ), + updated_at = NOW() +WHERE id = '{{AGENT_ID}}'; +``` + +**Nota sobre API REST vs SQL:** O endpoint `PATCH /api/agents/:id` valida `adapterType` contra enum desactualizada que não inclui `gemini_local` (devolve HTTP 400). Workaround actual: SQL directo na BD Paperclip (`postgres://paperclip:paperclip@localhost:54329/paperclip`). Quando a validação for actualizada, preferir sempre API com header `User-Agent: node` (Cloudflare bloqueia `curl/*`). + +**Agentes analyst/read-only (ex: Reality Checker):** usar `adapter_type: process` com `adapter_config.model: "claude-sonnet-4-6"` e `instructionsBundleMode: "external"`. Estes agentes são invocados manualmente (heartbeat desactivado por design), não consomem budget em modo autónomo. ### Passo 7b: Sessão e tokens (INC-12) diff --git a/gestao/skills/clip-skill/SKILL.md b/gestao/skills/clip-skill/SKILL.md index e81eaa6..3c40651 100644 --- a/gestao/skills/clip-skill/SKILL.md +++ b/gestao/skills/clip-skill/SKILL.md @@ -25,13 +25,12 @@ Skills no Paperclip funcionam como **injecção de contexto em runtime**: - Atribuição é por agente via `adapter_config.paperclipSkillSync.desiredSkills` (array de slugs) - Skills instaladas na empresa ficam em `company_skills` — só as atribuídas ao agente são injectadas -**Distribuição actual de adapters:** -- 1 agente (CEO): `gemini_local` com `gemini-2.5-pro` -- 50 agentes: `gemini_local` com `gemini-2.5-flash` -- 13 agentes: `opencode_local` com `openrouter/x-ai/grok-4.1-fast` -- Agentes analyst/passive (ex: Reality Checker): `process` com `claude-sonnet-4-6` (sem heartbeat, sem skills) +**Distribuição actual de adapters (07-04-2026):** +- 5 C-Level (CEO/CDO/CFO/CGO/CTO): `claude_local` com `claude-sonnet-4-6` (raciocínio estratégico) +- 59 especialistas/directores: `gemini_local` com `gemini-2.5-flash` (execução, baixo custo) +- 1 analyst (Reality Checker): `process` com `claude-sonnet-4-6` (on-demand, sem heartbeat, sem skills) -O adapter `claude_local` já não é usado para agentes heartbeat. +`opencode_local` foi **removido** (modelos indisponíveis). Política: C-Level = claude_local sonnet-4-6, restantes = gemini_local. Templates em `/clip-agent`. ## Modo lista (sem argumentos) diff --git a/gestao/skills/daily-digest/SKILL.md b/gestao/skills/daily-digest/SKILL.md index 209295d..027a2ca 100644 --- a/gestao/skills/daily-digest/SKILL.md +++ b/gestao/skills/daily-digest/SKILL.md @@ -40,11 +40,7 @@ Em paralelo: mcp__desk-crm-v3__get_estimates({ status: 4, limit: 20 }) Estimates com status "To Do" -6. ESTIMATES ACEITES - mcp__desk-crm-v3__get_estimates({ status: 3, limit: 10 }) - Destaques de valor - -7. AGENDA DO DIA +6. AGENDA DO DIA mcp__google-workspace__calendar_get_events({ user_google_email: "emanuelalmeidaa@gmail.com", time_min: "YYYY-MM-DDT00:00:00Z", @@ -75,7 +71,6 @@ Em paralelo: ### Leads + Propostas - Leads novos: X - Propostas pendentes: Y -- Estimates aceites: Z (destaque: [cliente] [valor] EUR) ### Agenda - HH:MM - [Evento] diff --git a/gestao/skills/knowledge/SKILL.md b/gestao/skills/knowledge/SKILL.md index 9e81352..5a76749 100644 --- a/gestao/skills/knowledge/SKILL.md +++ b/gestao/skills/knowledge/SKILL.md @@ -1,188 +1,225 @@ --- name: knowledge -description: Router de conhecimento Família A/B. Família A (operacional interna) consultada em paralelo para qualquer pergunta sobre processos, projectos, decisões, histórico. Família B (NotebookLM externa) só para conhecimento conceptual/teórico. v2.2.0 +description: Router de conhecimento unificado. Classifica pergunta por tipo e encaminha para fonte certa (Hub granular/NLM/Context7/CC memory/Supabase/Desk CRM/Git). v3.1.0 --- -# /knowledge — Router Família A/B v2.2.0 +# /knowledge — Router Unificado v3.1.0 -> **Correcção arquitectural 08-04-2026:** a v2.0.0 tratava NotebookLM como fonte primária. Isso estava errado — NotebookLM não vê operações, não vê estado real, só tem ebooks e transcripts. Em `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/feedback_knowledge-router-arquitectura.md` está o racional completo. -> **v2.2.0 (13-04-2026):** LightRAG removido da Família A — serviço com 0 documentos desactivado. Família A passa a 4 fontes: Supabase, CC memory, Hub, Desk CRM. +> **Reescrita 13-04-2026:** v2.2.0 usava modelo Familia A/B com NLM restrito a "externo". +> v3.0.0 classifica por tipo de pergunta (8 rotas), adiciona Hub granular +> (QR/KB/APIs/Manuais/PROCs/Troubleshooting), reclassifica NLM como referencia +> tecnica primaria, e torna Supabase complementar (nao alicerce). +> Racional: `plans/atomic-fluttering-flame.md` -## Princípio de routing +## Principio -**Não é fallback linear.** É router por tipo de pergunta: +**Classificar pergunta → fonte certa.** Nao e fallback linear, nao e "Familia A depois B". E routing directo por tipo. -- **Operacional / processual / histórico / decisões / projectos / código interno** → **Família A em paralelo**, consolidar com citação de origem. -- **Conceptual / teórico / externo / research / mercado / ebooks** → **Família B (NotebookLM)** com routing por tema (tabela em baixo). -- **Ambíguo** → perguntar ao utilizador qual o tipo. +--- -## Família A — Operacional interna (paralelo, complementares) +## Router principal (8 tipos) -| Fonte | Tool | Conteúdo | -|-------|------|----------| -| **memory-supabase** | `mcp__memory-supabase__search_memories(query, threshold=0.7, limit=10)` | Memórias persistentes cross-sessão com embeddings. Decisões, contexto, lacunas anteriores. | -| **Memória CC cross-projecto** | `Grep` recursivo em `~/.claude/projects/*/memory/*.md` | **110 ficheiros em 34 projectos.** Harness só carrega automaticamente a memória do `cwd` — este grep é **obrigatório** para não perder contexto de outros projectos. | -| **Obsidian / Hub** | `Grep` em `/media/ealmeida/Dados/Hub/**/*.md` | PROCs, QRs, INDEX, frontmatter, procedimentos, histórico. | -| **Desk CRM** | `mcp__desk-crm-v3__*` (tasks, projects, tickets, customers) | Fonte de verdade operacional: tarefas, projectos, clientes, tickets, horas. | +### 1. Facto rapido (ID, path, comando, credencial) -### Workflow Família A +**Sinais:** "qual e o ID de", "path para", "comando para", "porta do" -``` -1. Classificar pergunta como operacional (default para queries internas) -2. Disparar em PARALELO (mesma mensagem, vários tool calls): - - mcp__memory-supabase__search_memories(query, threshold=0.65, limit=8) [graceful se MCP indisponível] - - Grep ~/.claude/projects/*/memory/*.md - - Grep Hub/**/*.md (limitar a pastas relevantes quando possível) - - Desk CRM search (se query menciona cliente/projecto/tarefa) -3. Consolidar resposta citando origem de cada fragmento -4. Se Família A insuficiente → perguntar ao utilizador ou escalar para Família B -``` +**Fontes (sequencial — parar ao primeiro hit):** +1. `Grep` em `/media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/Quick-Reference/QR-*.md` +2. `Grep` em `~/.claude/projects/*/memory/*.md` (cross-projecto) -**Nota sobre graceful fallback:** as tools `mcp__*` podem estar indisponíveis em sessões específicas por razões de auto-discovery do harness. Se a chamada falhar com "No such tool available", continuar o paralelismo com as outras fontes e reportar a lacuna no output final. +**QR routing por keyword:** -### Formato de resposta Família A +| Keywords | Ficheiro | +|----------|----------| +| servidor, ip, porta, ssh | QR-Servidores.md | +| cwp, virtualhost, conta cwp | QR-CWP.md | +| site cwp, dominio cwp | QR-Sites-CWP.md | +| easypanel, servico, container | QR-EasyPanel.md | +| desk, tabela, campo bd, relacao | QR-Desk-BD.md | +| staff id, project id, category id | QR-IDs-Frequentes.md | +| moloni, serie, imposto, metodo | QR-Moloni.md | +| path, directorio, pasta | QR-Paths-Locais.md | +| backup, rota backup, destino | QR-Backups.md | +| sync, syncthing, rsync | QR-Sync-Ficheiros.md | +| script, claudedev | QR-Scripts.md | +| credencial, password, api key | QR-Credenciais.md | +| rank math, seo wp-cli | QR-RankMath-WP-CLI.md | +| capa, cover, podcast imagem | QR-Cover-Generator.md | +| alurin, desktop, laptop | QR-Alurin-Desktop.md | + +### 2. Como funciona X / Como fazer Y (referencia tecnica) + +**Sinais:** "como funciona", "como configurar", "como fazer", "melhores praticas", "tutorial", "deep dive" + +**Fontes (paralelo — consolidar):** +1. **Hub Knowledge-Base** — `Grep` em `/media/ealmeida/Dados/Hub/06-Operacoes/Knowledge-Base/*.md` (preferir ficheiro local se existir match directo) +2. **NotebookLM** — max 2 notebooks por query (routing por tema abaixo) +3. **Hub Manuais** — `Grep` em `/media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/Manuais/**/*.md` +4. **Context7** — `resolve-library-id` → `query-docs` (para frameworks/bibliotecas com docs oficiais) +5. **CC memory cross-projecto** — `Grep` em `~/.claude/projects/*/memory/*.md` +6. **Supabase** — `search_memories(query, threshold=0.5, limit=5)` [graceful se indisponivel] + +**Prioridade por tipo de tema:** +- Framework/biblioteca com docs oficiais (Next.js, React, Laravel...) → **KB local primeiro** + **Context7** + NLM +- Stack interna (CWP, Perfex, n8n...) → **NLM primeiro** (fonte mais densa para estes) + KB +- Conceito generico (design patterns, boas praticas...) → **NLM primeiro** + +**NLM routing por tema (top 15):** + +| Tema | Notebook | ID | +|------|----------|----| +| Claude Code, skills, hooks, plugins | Claude Code | `2876d1fe-5cea-4d98-8140-b0e1a81c6bc4` | +| CWP, servidor, hosting, virtualhost | CWP | `0ded7bd6-69b3-4c76-b327-452396bf7ea7` | +| WordPress, WP-CLI, temas, config | WordPress Config CLI | `fb2f26bd-8cb0-4d4c-bafc-4f1ebb51c51d` | +| Elementor, widgets, templates | WordPress e Elementor | `5be0d1a6-00f2-4cd9-b835-978cb7721601` | +| Seguranca WP, malware, hardening | Ciberseguranca WordPress | `5f60adfd-2435-4725-8c12-9c11c5f51d75` | +| Perfex/Desk CRM, modulos, hooks | Perfex CRM | `df4688bb-c2c0-4aba-98c1-38c3b50a353c` | +| n8n, automacoes, workflows | n8n | `f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1` | +| Marketing digital, SEO, ads, funil | Marketing Digital PT | `4c595973-ba10-420a-a3bf-e4389e424ad3` | +| AI agents, orquestracao, MCPs | AI Agents e Orquestracao | `bc480d68-5835-415e-82bc-4583f36b8c29` | +| Proxmox, VMs, clustering, HA | Proxmox | `276ccdde-6b95-42a3-ad96-4e64d64c8d52` | +| Design, branding, visual, automacao | Design Profissional | `b568b13b-0eed-48c9-b513-5c5b7ec0b102` | +| UI/UX, WCAG, acessibilidade | UI/UX Design | `081ca512-8279-4850-b2b9-dff090267482` | +| Gestao operacoes, KPIs, agencia | Gestao Operacoes | `f9dc59c2-718b-4b12-bd06-095d4bfa3e34` | +| Remotion, video programatico | Remotion | `f2b75baa-1ab1-48d3-8f7c-a6a9e516934c` | +| Obsidian, vault, Claude workflow | Obsidian + Claude | `ebee9fe1-78fd-4f85-8938-f19f3ea32131` | +| Programacao, padroes, api design | Programacao | `24947ffa-0019-448a-a340-2f4a275d2eb1` | +| Copywriting, persuasao, texto | Copywriting e Persuasao | `7b8fec17-d34f-4e3f-a8c6-8231e51f6323` | +| Video, producao, youtube | Producao de Video e Youtube | `058a896e-6c9a-4e51-ae7d-9adb2738bc5f` | +| WooCommerce, loja, produtos | Documentacao WooCommerce | `bd06acff-4b9d-44aa-b3f7-60434bbd6b49` | + +> Inventario completo 65 notebooks: `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/notebooklm-inventory.md` + +**Hub KB: ficheiros locais densos (usar quando match directo):** + +| Keywords | Ficheiro KB | +|----------|-------------| +| next.js, app router, server components | `Next.js 14_15 App Router Deep Dive.md` | +| php, laravel | `PHP 8+ e Laravel 11_12_ Pesquisa Profunda.md` | +| core web vitals, ga4, performance | `Core Web Vitals, GA4, Performance Web.md` | +| n8n, automacao | `Base-Conhecimento-n8n.md` | +| perfex crm, modulos | `Base-Conhecimento-Perfex-CRM.md` | +| remotion, video codigo | `Base-Conhecimento-Remotion-Video.md` | +| ui, ux, design systems | `Base-Conhecimento-UI-UX-Design-Systems.md` | +| tipografia, cor, web design | `Base-Conhecimento-Web-Design-Tipografia-Cor.md` | +| youtube, video producao | `Base-Conhecimento-Video-YouTube.md` | +| openrouter, modelos ai | `OpenRouter-Matrix-v1.1.md` | +| postfix, email security | `Postfix Email Security Best Practices.md` | +| wcag, acessibilidade | `Relatório Acessibilidade Web WCAG 2.2.md` | +| gestao, operacoes, agencia | `Gestao-Operacoes-Agencias-Marketing-Tecnologia.md` | + +**Context7 para docs oficiais:** usar `resolve-library-id` → `query-docs` quando a pergunta e sobre uma biblioteca/framework com documentacao oficial actualizada (Next.js, React, Tailwind, Laravel, etc). Context7 tem docs mais frescos que NLM. + +### 3. API / implementacao (endpoint, payload, autenticacao) + +**Sinais:** "endpoint", "API de", "payload", "autenticacao", "integrar com" + +**Fontes (sequencial — Read directo do ficheiro):** + +| Keywords | Ficheiro em `Hub/06-Operacoes/Documentacao/APIs/` | +|----------|----------------------------------------------------| +| perfex, desk crm api | Perfex-CRM-API.md | +| cwp api, cwp endpoint | CWP-API.md | +| whatsms, sms api | WhatSMS-API.md + WhatSMS-Admin-API.md | +| paperclip api | Paperclip-API.md | +| dify api | Dify-API.md | +| bookstack api | BookStack-API.md | +| mcp desenvolvimento | MCP-Dev-Manual.md | + +Se API nao listada → NLM notebook relevante + Context7. + +### 4. Processo / procedimento (como fazemos X internamente) + +**Sinais:** "procedimento", "como fazemos", "PROC", "workflow interno", "passo-a-passo" + +**Fontes:** +1. `Grep` em `/media/ealmeida/Dados/Hub/06-Operacoes/Procedimentos/**/*.md` (38 PROCs) +2. `Grep` em `/media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/Manuais/**/*.md` + +**Departamentos PROC:** + +| Tema | Pasta | +|------|-------| +| Comercial, CRM, catalogo | D1-Comercial/ | +| Suporte, tickets | D2-Suporte/ | +| Contabilidade, facturas | D3-Contabilidade/ | +| RH | D4-RH/ | +| Design | D5-Design/ | +| Marketing, conteudo | D6-Marketing/ | +| Tecnologia, MCP, Claude, infra | D7-Tecnologia/ | +| Multi-departamental | Cross-Departamental/ | + +### 5. Troubleshooting (erro, problema, nao funciona) + +**Sinais:** "erro", "nao funciona", "problema com", "fix para", "troubleshoot" + +**Fontes (paralelo):** +1. `Grep` em `/media/ealmeida/Dados/Hub/06-Operacoes/Documentacao/Troubleshooting/*.md` +2. CC memory cross-projecto — `Grep` em `~/.claude/projects/*/memory/*.md` +3. Supabase — `search_memories(query, threshold=0.5, limit=5)` [graceful] +4. NLM notebook relevante (contexto tecnico) + +### 6. Estado actual (quem, quando, quanto, aberto/fechado) + +**Sinais:** nome de cliente, "#" + numero, "tarefas abertas", "horas", "facturas", "tickets" + +**Fontes:** Directo ao **Desk CRM** via MCP: +- `get_tasks`, `get_projects`, `get_tickets`, `get_customers` +- `get_timesheets`, `get_invoices`, `get_estimates` + +**NLM e Hub NAO entram** — nao veem estado vivo. + +### 7. Decisao / historico (porque fizemos X, quando decidimos Y) + +**Sinais:** "decisao", "porque fizemos", "historico de", "quando decidimos", "ultima vez que" + +**Fontes (paralelo):** +1. **Supabase** — `search_memories(query, threshold=0.5, limit=8)` [graceful] +2. **CC memory cross-projecto** — `Grep` em `~/.claude/projects/*/memory/*.md` +3. **Desk CRM discussions** — `get_discussion_comments` (#31 worklogs, #32 reflexoes, #33 accoes) +4. **Git log** — `git log --oneline --grep="keyword"` nos repos relevantes + +### 8. Codigo / projecto (o que mudou, como esta o repo) + +**Sinais:** "changelog", "ultimo commit", "o que mudou em", "estado do repo" + +**Fontes:** +1. `Read` CHANGELOG.md do projecto +2. `git log` do repo +3. CC memory do projecto especifico + +--- + +## Classificador de pergunta (heuristica) + +| Sinal | Tipo | +|-------|------| +| ID, path, porta, comando concreto | **1. Facto rapido** | +| "como funciona", "como configurar", "melhores praticas" | **2. Referencia tecnica** | +| "endpoint", "API", "payload" | **3. API** | +| "procedimento", "PROC", "como fazemos internamente" | **4. Processo** | +| "erro", "nao funciona", "problema" | **5. Troubleshooting** | +| Cliente, tarefa #N, ticket, factura, horas | **6. Estado actual** | +| "decisao", "porque", "historico", "ultima vez" | **7. Decisao/historico** | +| "changelog", "commit", "repo" | **8. Codigo** | +| **Ambiguo** | **Perguntar ao utilizador** | + +--- + +## Formato de resposta ```markdown ## [pergunta] -**memory-supabase:** [excerto] _(id N, tags)_ -**memory/:** [excerto] _(ficheiro)_ -**Hub:** [excerto] _(caminho:linha)_ -**Desk CRM:** [excerto] _(task #N, projecto #M)_ +**[Fonte 1]:** [excerto] _(origem especifica)_ +**[Fonte 2]:** [excerto] _(origem especifica)_ -**Síntese:** [consolidação em 2-3 frases citando as fontes mais fortes] +**Sintese:** [consolidacao em 2-3 frases citando as fontes mais fortes] ``` -**Regra:** nunca responder sem citar fonte. Se 0 fontes, dizer "sem hits em Família A" explicitamente. +Origens possiveis: `QR:ficheiro`, `NLM:notebook`, `KB:ficheiro`, `API:ficheiro`, `PROC:codigo`, `Manual:ficheiro`, `Troubleshooting:ficheiro`, `memory/projecto:ficheiro`, `Supabase:id`, `Desk CRM:task #N`, `Git:commit` ---- - -## Família B — Conhecimento externo (NotebookLM) - -**Quando usar:** só para perguntas **conceptuais, teóricas, de research externo ou mercado**. Nunca para operacional. - -Exemplos de queries Família B: -- "Quais são as melhores práticas de Core Web Vitals em 2025?" -- "Como funciona o algoritmo de ranking do YouTube Shorts?" -- "Arquétipos de Jung aplicados a branding" -- "Stoicismo na gestão de equipas" - -**Workflow Família B:** - -1. Classificar tema → tabela de routing -2. Consultar **max 3 notebooks** (performance) -3. `mcp__notebooklm-mcp__notebook_query({ notebook_id, query })` -4. Se score <70 → fallback a Context7 (docs bibliotecas) - -### Routing por tema (65 notebooks) - -> Inventário completo: `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/notebooklm-inventory.md` - -**WordPress/Web** - -| Keywords | Notebook | ID | -|----------|----------|----| -| wordpress, wp-cli, config | WordPress Config CLI | `fb2f26bd-8cb0-4d4c-bafc-4f1ebb51c51d` | -| elementor, templates, widgets | WordPress e Elementor | `5be0d1a6-00f2-4cd9-b835-978cb7721601` | -| woocommerce, loja, produtos | Documentacao WooCommerce | `bd06acff-4b9d-44aa-b3f7-60434bbd6b49` | -| kivicare, ehr, clinica | KiviCare EHR WP | `78621405-a5bc-433f-856f-296260a80bd9` | -| seguranca wp, malware, hardening | Ciberseguranca WordPress | `5f60adfd-2435-4725-8c12-9c11c5f51d75` | - -**Marketing e Conteúdo** - -| Keywords | Notebook | ID | -|----------|----------|----| -| marketing, digital, campanha, funil | Marketing Digital PT | `4c595973-ba10-420a-a3bf-e4389e424ad3` | -| marketing avancado, ads, growth | Marketing Digital Avancado | `76647e0f-3ae2-4c00-a0a8-f457aebf5655` | -| seo, keywords, ranking, serp | Marketing Digital PT | `4c595973-ba10-420a-a3bf-e4389e424ad3` | -| copywriting, persuasao, texto | Copywriting e Persuasao | `7b8fec17-d34f-4e3f-a8c6-8231e51f6323` | -| social media, branding, instagram | Social Media e Branding | `9053d0e8-dd39-460b-b5ea-e67af3e9a675` | -| video, producao, youtube | Producao de Video e Youtube | `058a896e-6c9a-4e51-ae7d-9adb2738bc5f` | -| youtube, monetizacao, compliance | YouTube Monetizacao e Compliance | `60a209a7-e205-4d57-a6f3-fef3de61e87a` | -| podcast, audio | Podcast Descomplicar | `a5bef96b-a1af-4293-9979-5da46f8d2301` | -| ecommerce, loja online | E-commerce Pratico | `226e384e-d4bc-48f4-bb82-7927360436cc` | -| ecommerce portugal, marketplace | E-Commerce Portugal | `8a430cf2-ed99-413d-b4bf-a1400deaf49e` | - -**Desenvolvimento / Código (externo)** - -| Keywords | Notebook | ID | -|----------|----------|----| -| programacao externa, padroes, api design | Programacao | `24947ffa-0019-448a-a340-2f4a275d2eb1` | -| claude code, mcp dev externo | Claude Code | `2876d1fe-5cea-4d98-8140-b0e1a81c6bc4` | -| mcp protocolo | Desenvolvimento de MCPs | `73102308-70ef-403e-9be9-eae0cfc62d55` | -| ai editor, cursor, copilot | AI Code Editors | `57d9c6c9-48ba-4d83-8f71-cc890f348a53` | -| github trends | GitHub Trends | `922b7532-ddf3-4dba-9d3c-6d5f83b89378` | -| open source, foss | Open Source Software and Platforms | `cabf9821-c1ff-44cb-9bfd-59bda3599792` | -| n8n, workflow automacao | n8n | `f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1` | -| perfex dev, hooks externos | Dev PerfexCRM | `80606de8-2783-4d36-b08d-5825e6f9a8da` | -| remotion, video code | Remotion | `f2b75baa-1ab1-48d3-8f7c-a6a9e516934c` | - -> **Nota:** código do projecto (`/Dev/*`, plugins locais, MCPs desenvolvidos internamente) é **Família A** (grep Hub + filesystem), não Família B. - -**Infraestrutura** - -| Keywords | Notebook | ID | -|----------|----------|----| -| cwp externo | CWP | `0ded7bd6-69b3-4c76-b327-452396bf7ea7` | -| cloud, devops patterns | Cloud e Infraestrutura TI | `f9a79b5a-649f-4443-afaf-7ff562b6c2e7` | -| proxmox | Proxmox | `276ccdde-6b95-42a3-ad96-4e64d64c8d52` | - -**Design/UX** - -| Keywords | Notebook | ID | -|----------|----------|----| -| design, branding externo | Design Profissional AItomatizado | `b568b13b-0eed-48c9-b513-5c5b7ec0b102` | -| ui, ux, wcag | UI/UX Design | `081ca512-8279-4850-b2b9-dff090267482` | -| tipografia, cores | Tipografia e Cor para Web | `f97a0d2b-a5b3-4640-b941-3cbb184b1b81` | - -**Gestão e Estratégia** - -| Keywords | Notebook | ID | -|----------|----------|----| -| gestao projectos, agile, scrum | Gestao de Projectos e Agile | `0c9c079c-a426-486c-99eb-1564d42d37ad` | -| operacoes externas, kpi | Gestao de Operacoes | `f9dc59c2-718b-4b12-bd06-095d4bfa3e34` | -| estrategia, empreendedorismo | Estrategia e Empreendedorismo | `79d43410-0e29-4be1-881d-84db6bdc239a` | -| transformacao digital, ia negocio | Transformacao Digital e IA | `ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8` | -| ai automation stack | AI Automation Stack | `929ef67b-c131-4f01-abd0-8b078491a6b7` | -| ai agents curso | AI Agents Intensive Course | `f4be0e3f-4d9e-4c5c-a743-9f14427f2e43` | - -**Produtos externos / Mercado** - -| Keywords | Notebook | ID | -|----------|----------|----| -| zaia, chatbot | Zaia | `087d76f1-e929-49da-9e3c-4edc22b42b3f` | -| zender, whatsapp api | Zender 3 | `7095e5fa-1465-4496-b1a3-48f2e6e07f79` | -| solar, fotovoltaico | Solar FV Engenharia | `03d54e00-aefa-45dc-ba01-f3864a7c3112` | -| opensolar | OpenSolar | `0082bcaf-1e17-4b84-87cc-2256b1719b55` | - -**Pessoal / SelfRescueProtocol** (só se explicitamente pessoal) - -| Keywords | Notebook | ID | -|----------|----------|----| -| jung, arquetipos | Jung | `d5c67d7f-7fe8-4542-9e5c-22403f3193ee` | -| taoismo, wu wei | Taoism | `aea85baf-9ddf-4d79-bf07-81391a275b09` | -| adhd, phda | ADHD | `a4ff3fd7-fb7c-49a1-94ff-0433193e2338` | -| autismo | Autismo | `66eff78e-318f-4a8b-a3c7-039a4124b1ad` | -| heroi, jornada | Essencia de Heroi | `6dcd08e8-79d9-4ae0-b6bf-b2ee96717bf2` | -| kintsugi | Auto Kintsugi | `82a95c2f-be56-4c4a-a96f-96f6677a6991` | -| somatica, trauma | Psicologia Somatica | `3410893b-16a3-4178-9091-42650a41086f` | -| estoicismo | Marcus Aurelius / Stoic | `4b986ad4-49da-4604-a423-4fcdf20dd9da` | - ---- - -## Classificador de pergunta (heurística) - -Usar estes sinais para decidir Família A vs B: - -| Sinal na pergunta | Família | -|---|---| -| Nome de cliente, projecto, tarefa #N, ticket #N | **A** | -| "quando", "histórico", "última vez", "decisão", "porque fizemos" | **A** | -| Nome de ficheiro, path, skill, plugin, MCP interno | **A** | -| "como funciona (abstracto)", "melhores práticas", "teoria de" | **B** | -| Nome de biblioteca externa + versão | **B** (+ Context7) | -| Pessoal explícito (jung, adhd, estoicismo, …) | **B** pessoal | -| Ambíguo | **perguntar** | +**Regra:** nunca responder sem citar fonte. Se 0 fontes, dizer explicitamente. --- @@ -190,69 +227,69 @@ Usar estes sinais para decidir Família A vs B: | Comando | Uso | |---------|-----| -| `/knowledge [pergunta]` | Router automático A/B com paralelismo | +| `/knowledge [pergunta]` | Router automatico por tipo | | `/kb [pergunta]` | Alias curto | -| `/kb-save [conteúdo]` | Guardar na fonte adequada (Supabase se decisão/solução, Hub se processual, NotebookLM source_add se externo) | -| `/kb-gaps` | Listar lacunas detectadas em `memory-supabase` | +| `/kb-save [conteudo]` | Guardar na fonte adequada (ver abaixo) | +| `/kb-gaps` | Listar lacunas detectadas em Supabase | --- ## Gravar conhecimento (/kb-save) -Router inverso por tipo: - | Tipo | Destino | Tool | -|---|---|---| -| Decisão / contexto / solução técnica | memory-supabase | `mcp__memory-supabase__save_memory` com tags | -| Procedimento operacional | Hub/06-Operacoes/Procedimentos/ | `Write` PROC-*.md | -| Conhecimento externo | NotebookLM notebook adequado | `mcp__notebooklm-mcp__source_add` | +|------|---------|------| +| Decisao / solucao tecnica / workaround | Supabase | `save_memory` com tags `[tipo, dominio, projecto?, data]` | +| Feedback / regra estavel | CC memory | `Write` em `~/.claude/projects/*/memory/` | +| Procedimento operacional | Hub PROCs | `Write` PROC-*.md | +| Referencia rapida (ID, path) | Hub QR | `Edit` QR-*.md | +| Conhecimento externo | NotebookLM | `source_add` no notebook adequado | --- -## Detecção e reporte de lacunas +## Deteccao de lacunas -Quando query retorna 0 hits úteis em Família A (o caso relevante) ou <30% score em Família B: +Quando 0 hits uteis em todas as fontes consultadas para o tipo: ```javascript mcp__memory-supabase__save_memory({ - content: `LACUNA: "${query}" — Família A 0 hits, classificada como ${classificacao}.`, - tags: ["lacuna-kb", classificacao], - metadata: { query, timestamp, source_families: ["A","B"] } + content: `LACUNA: "${query}" — tipo ${tipo}, 0 hits`, + tags: ["lacuna-kb", tipo, dominio] }); ``` -Depois sugerir acção: criar PROC, guardar no Supabase, adicionar fonte ao notebook NotebookLM adequado. +Sugerir accao: criar PROC, actualizar QR, adicionar fonte a NLM, guardar em Supabase. --- ## Regras operacionais -1. **Família A é default.** Só escalar para B quando classificador sinalizar externo. -2. **Paralelismo obrigatório em Família A.** Todas as tools na mesma mensagem (regra global #1: "NEVER run independent tool calls sequentially"). -3. **Grep cross-projecto obrigatório** em `~/.claude/projects/*/memory/*.md` — o harness só carrega a memória do `cwd`, este grep compensa esse gap. -4. **Nunca responder sem citar fonte.** Se 0 hits, dizer explicitamente. -5. **Max 3 notebooks** por query Família B. -6. **PT-PT sempre** na consolidação. -7. **Se a pergunta é sobre estado presente** (tarefas abertas, tickets, horas, facturas), ir **directo ao Desk CRM**, não a NotebookLM. +1. **Classificar primeiro, consultar depois.** Nao despejar todas as fontes para todas as perguntas. +2. **Paralelismo obrigatorio** dentro de cada tipo quando ha multiplas fontes. +3. **Grep cross-projecto obrigatorio** para tipos 2, 5, 7 — `~/.claude/projects/*/memory/*.md`. +4. **Nunca responder sem citar fonte.** +5. **Max 2 notebooks NLM** por query (performance). +6. **Supabase sempre graceful** — se indisponivel ou 0 resultados, continuar com outras fontes. +7. **Estado presente = Desk CRM directo** — nunca NLM/Hub para tarefas/facturas/tickets. +8. **PT-PT sempre.** --- ## Anti-patterns -- ❌ Começar por NotebookLM para perguntas operacionais (era o erro da v2.0.0) -- ❌ Só consultar o `cwd` e ignorar memory cross-projecto -- ❌ Responder sem citar fonte -- ❌ Chamar Família A em série — tem de ser paralelo -- ❌ Classificar "como funciona o nosso router /knowledge?" como Família B (é Família A — é sobre infra interna) -- ❌ Fallback linear A→B quando a pergunta é claramente externa (vai directo a B) +- Consultar NLM para "quantas tarefas abertas tem o projecto X" (estado vivo → Desk CRM) +- Fazer grep generico em `Hub/**/*.md` quando a pergunta e claramente sobre um QR especifico +- Consultar Supabase como unica fonte (usar como complemento, nao alicerce) +- Classificar "como funciona o nosso router /knowledge" como referencia externa (e interno → CC memory + Hub) +- Ignorar CC memory cross-projecto (harness so carrega cwd) +- Disparar 5 fontes para um facto rapido que esta num QR (sequencial, parar ao hit) --- -## Referências +## Referencias -- `references/routing-guide.md` — mapeamento detalhado de routing (pendente v2.1 — actualizar) -- `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/feedback_knowledge-router-arquitectura.md` — decisão arquitectural -- `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/notebooklm-inventory.md` — inventário completo 65 notebooks +- `~/.claude/plans/atomic-fluttering-flame.md` — plano RAG-System completo +- `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/feedback_knowledge-router-arquitectura.md` — decisao arquitectural +- `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/notebooklm-inventory.md` — inventario 65 notebooks NLM --- @@ -260,12 +297,14 @@ Depois sugerir acção: criar PROC, guardar no Supabase, adicionar fonte ao note ```jsonl {"date":"2026-04-08","issue":"v2.0.0 tratava NotebookLM como fonte primaria para tudo","fix":"v2.1.0 router Familia A/B — NotebookLM so para externo","source":"user"} -{"date":"2026-04-08","issue":"v2.1.0 assumia FastMCP file-based (11 tools lightrag_*) apos migracao temporaria da outra sessao","fix":"v2.1.1 restaurado para LightRAG-HKU completo com 17 tools originais (query_document, insert_document, get_pipeline_status, etc), UI em rag.descomplicar.pt, PG storage 331 docs","source":"user"} -{"date":"2026-04-13","issue":"LightRAG com 0 documentos — servico sem utilidade a consumir recursos","fix":"v2.2.0 removido LightRAG da Familia A — 4 fontes restantes: Supabase, CC memory, Hub, Desk CRM","source":"user"} -{"date":"2026-04-08","issue":"memoria Claude Code fragmentada em ~/.claude/projects/*/memory/ (101 ficheiros, 34 projectos)","fix":"grep cross-projecto obrigatorio no router Familia A","source":"user"} -{"date":"2026-04-08","issue":"mcp__memory-supabase__search_memories pode estar indisponivel no harness","fix":"graceful fallback no router — continuar paralelismo com outras fontes e reportar lacuna","source":"auto"} +{"date":"2026-04-08","issue":"v2.1.0 assumia FastMCP file-based (11 tools lightrag_*)","fix":"v2.1.1 restaurado LightRAG-HKU 17 tools","source":"user"} +{"date":"2026-04-13","issue":"LightRAG com 0 docs, servico sem utilidade","fix":"v2.2.0 removido LightRAG da Familia A","source":"user"} +{"date":"2026-04-08","issue":"memoria CC fragmentada por projecto","fix":"grep cross-projecto obrigatorio","source":"user"} +{"date":"2026-04-13","issue":"Supabase degradado (stats/paginacao/embeddings raw)","fix":"MCP reparado — stats, paginacao e sanitize embeddings corrigidos. 6 registos com credentials eliminados","source":"fase-2"} +{"date":"2026-04-13","issue":"v2.2.0 modelo A/B subestimava Hub e NLM para queries operacionais","fix":"v3.0.0 router por tipo (8 rotas), Hub granular (QR/KB/APIs/Manuais/PROCs/Troubleshooting), NLM referencia tecnica primaria, Supabase complementar","source":"plano RAG-System"} +{"date":"2026-04-13","issue":"v3.0.0 nao tinha routing para frameworks (Next.js foi ao notebook errado), KB local subutilizado","fix":"v3.1.0 prioridade por tipo de tema (KB local > Context7 > NLM para frameworks), 13 ficheiros KB mapeados, 4 notebooks NLM adicionados, Context7 como fonte para docs oficiais","source":"testes fase 5"} ``` --- -**v2.2.0** | 13-04-2026 | LightRAG removido (0 docs, serviço desactivado). Família A: 4 fontes — Supabase, CC memory, Hub, Desk CRM +**v3.1.0** | 13-04-2026 | KB local mapeado (13 ficheiros), Context7 para docs oficiais, prioridade por tipo de tema, 19 notebooks NLM diff --git a/gestao/skills/onboarding/SKILL.md b/gestao/skills/onboarding/SKILL.md index 86a50f6..08e472f 100644 --- a/gestao/skills/onboarding/SKILL.md +++ b/gestao/skills/onboarding/SKILL.md @@ -9,15 +9,17 @@ tools: [mcp__desk-crm-v3__create_task, mcp__desk-crm-v3__add_task_checklist_item # Skill: /onboarding -Checklist e automacao de onboarding de novo colaborador. Baseado em PROC-Onboarding.md (RH-001). +Checklist e automacao de onboarding de novo colaborador. Baseado em PROC-D4-RH-001-Onboarding-Colaborador.md. --- ## Referencia -Procedimento completo em: `Hub/06-Operacoes/Procedimentos/D4-RH/PROC-Onboarding.md` +Procedimento completo em: `Hub/06-Operacoes/Procedimentos/D4-RH/PROC-D4-RH-001-Onboarding-Colaborador.md` Esta skill executa os passos — o PROC define as regras. +**Agent associado:** `hr-specialist` (criado 08-04-2026) — executor autónomo para onboarding completo, gestão de contratos e férias. + --- ## Processo diff --git a/gestao/skills/reflect/SKILL.md b/gestao/skills/reflect/SKILL.md index 8fe3170..04bea72 100644 --- a/gestao/skills/reflect/SKILL.md +++ b/gestao/skills/reflect/SKILL.md @@ -1,7 +1,6 @@ --- name: reflect description: Alias de /worklog. Auto-reflexão e registo de trabalho unificado. /reflect = /worklog (mesmo resultado). /reflect view = ver últimos registos. /reflect deep = análise profunda com histórico → Discussão #32. /reflect week = revisão semanal → Discussão #32. Usar quando "reflect", "reflexão", "análise", "melhoria", "insight". -context: fork --- # /reflect - Alias de /worklog diff --git a/gestao/skills/today/prompts/execute.md b/gestao/skills/today/prompts/execute.md index 7997ab7..edfce75 100644 --- a/gestao/skills/today/prompts/execute.md +++ b/gestao/skills/today/prompts/execute.md @@ -1,38 +1,92 @@ -# /today - Checkup Diario (Orquestrador) +# /today v11.0 - Checkup Diario (Orquestrador) -Executa o checkup diario invocando sub-skills em sequencia. +Executa o checkup diario lendo logs locais dos agentes + recolhe dados frescos. + +> NOTA CRITICA: CT 102 abatido em 20-04-2026. Os agentes cron correm como systemd user timers +> no desktop. NUNCA usar ssh_execute(server="dev"). Ler logs locais via tail/journalctl. ## Passo 1: Verificar data e ultima execucao ``` -mcp__mcp-time__current_time +mcp__mcp-time__current_time → data, dia da semana mcp__memory-supabase__search_memories("today checkup YYYY-MM-DD") -Se ja existe → perguntar se quer re-executar +Se ja existe hoje → perguntar se quer re-executar ``` -## Passo 2: Fase 1 - Auto-processamento (silencioso) +## Passo 2: Fase 1 - Ler logs locais dos agentes (silencioso) -Invocar em sequencia: -1. `/ticket-triage` → processa tickets abertos -2. `/imap-triage` → processa emails IMAP -3. `/auto-expense` → cria despesas dos resultados anteriores -4. `/cleanup-downloads` → se >10 ficheiros em Transferencias +Base: /media/ealmeida/Dados/Dev/claude_automations_dev/ -## Passo 3: Fase 2 - Recolha de dados (silencioso) +```bash +# IMAP Triage +tail -20 /media/ealmeida/Dados/Dev/claude_automations_dev/imap-triage/imap-triage.log +cat ~/.claude-work/today-imap-$(date +%d-%m-%Y).json 2>/dev/null -Invocar: -1. `/daily-digest` → metricas do dia -2. `/tasks-overview` → tarefas e workflows +# Ticket Triage +tail -30 /media/ealmeida/Dados/Dev/claude_automations_dev/ticket-triage/ticket-triage.log 2>/dev/null -## Passo 4: Rotinas especiais +# Auto-Expense +tail -20 /media/ealmeida/Dados/Dev/claude_automations_dev/auto-expense/auto-expense.log 2>/dev/null -- Segunda: planeamento semanal + `/wp-update` -- Sexta: sugerir manutencao WordPress -- Sabado/Domingo: `/infra-check` +# Infra Check +tail -30 /media/ealmeida/Dados/Dev/claude_automations_dev/infra-check/infra-check.log 2>/dev/null -## Passo 5: Dashboard final +# AikTop Tasks +tail -20 /media/ealmeida/Dados/Dev/claude_automations_dev/aiktop-tasks/aiktop-tasks.log 2>/dev/null -Agregar resultados de todas as sub-skills. -Criar nota Obsidian em `00-Inbox/DD-MM-YYYY-checkup.md`. -Guardar em Supabase. -Limpar temporarios `~/.claude-work/today-*.json`. +# WP Update (apenas se segunda-feira) +tail -50 /media/ealmeida/Dados/Dev/claude_automations_dev/wp-update/wp-update.log 2>/dev/null + +# Intelligence pipeline (status) +tail -15 /media/ealmeida/Dados/Dev/claude_automations_dev/daily-selector/daily-selector.log 2>/dev/null +tail -10 /media/ealmeida/Dados/Dev/claude_automations_dev/intelligence-publisher/intelligence-publisher.log 2>/dev/null +``` + +Verificar estado systemd para confirmar ultima execucao: +```bash +journalctl --user -u imap-triage.service -u ticket-triage.service -u auto-expense.service \ + -u infra-check.service -u aiktop-tasks.service --since "8 hours ago" \ + --no-pager -n 5 --output=short-precise +``` + +Para cada agente: verificar se correu nas ultimas 8h (infra: 24h), detectar erros. +Adicionar alertas criticos a "Requer Atencao Urgente". + +## Passo 3: Fase 2 - Recolha de dados frescos (silencioso) + +Invocar em paralelo: +1. `/daily-digest` → timer, tickets, facturas, leads, propostas, agenda +2. `/tasks-overview` → tarefas overdue/pendentes/em curso + workflows sugeridos + +Verificar `~/Transferencias` — se >10 ficheiros, invocar `/cleanup-downloads`. + +## Passo 4: Fase 2b - Specs e Sprints activos (silencioso) + +```bash +find /media/ealmeida/Dados/Dev -name "SPEC.md" -maxdepth 4 2>/dev/null +find /media/ealmeida/Dados/Dev -name "SPRINT.md" -maxdepth 4 2>/dev/null +``` + +Para cada encontrado: ler frontmatter (primeiras 15 linhas), filtrar status != "completed"/"archived". +Extrair: titulo, status, progresso done/total. + +## Passo 5: Rotinas especiais por dia + +- Segunda: planeamento semanal (tarefas + capacidade) +- Sexta: sugerir manutencao semanal + +## Passo 6: Dashboard final + guardar + +Agregar todos os resultados e mostrar dashboard (formato no SKILL.md). + +Criar nota Obsidian: +- Path: `/media/ealmeida/Dados/Hub/00-Inbox/DD-MM-YYYY-checkup.md` (formato DD-MM-YYYY) +- Frontmatter: title, date, type: checkup, status: active + +Guardar em Supabase: +``` +mcp__memory-supabase__save_memory({ + content: "Checkup diario DD-MM-YYYY - X tickets, Y tarefas, cron OK/FALHA", + tags: ["today", "checkup", "DD-MM-YYYY"] +}) +``` diff --git a/infraestrutura/skills/backup-strategies/SKILL.md b/infraestrutura/skills/backup-strategies/SKILL.md index 5611b27..beb38a5 100644 --- a/infraestrutura/skills/backup-strategies/SKILL.md +++ b/infraestrutura/skills/backup-strategies/SKILL.md @@ -50,10 +50,12 @@ RTO (Recovery Time Objective) - **2** tipos de media diferentes (disco local + cloud) - **1** copia offsite (protege contra desastres locais) -**Implementacao Descomplicar:** -1. **Producao:** Servidor CWP (176.9.3.158) -2. **Backup local:** NAS Synology ou disco externo -3. **Backup offsite:** Google Drive + S3 (Wasabi) +**Implementacao Descomplicar (estado real — fonte de verdade: `Hub/05-Projectos/SistemaBackups/`):** +1. **Producao:** Servidor CWP (VM 100) + EasyPanel (VM 101) no cluster Proxmox +2. **Backup:** Proxmox vzdump → PBS (6TB) + MySQL hourly + rsync servidores → cluster +3. **Offsite:** **pendente** (regra 3-2-1 em 2-1-0; decisao Hetzner Storage Box / Backblaze B2 / Wasabi). Insync/rclone→GDrive estao mortos — nao assumir como activos. + +> Esta skill cobre conceitos genericos (RPO/RTO, GFS, 3-2-1). Para o estado e topologia reais do sistema Descomplicar, consultar sempre `Hub/05-Projectos/SistemaBackups/AUDITORIA-Backups-2026-06-08.md`. --- diff --git a/infraestrutura/skills/cwp/SKILL.md b/infraestrutura/skills/cwp/SKILL.md index 61d115d..2e0363b 100644 --- a/infraestrutura/skills/cwp/SKILL.md +++ b/infraestrutura/skills/cwp/SKILL.md @@ -9,6 +9,26 @@ Skill unificada para o servidor **CWP Principal `176.9.3.158`** (MCP `ssh-unifie **REGRA #38 — ZERO INVENÇÃO:** NUNCA improvisar comandos. Verificar estado actual ANTES de alterar. Pesquisar wiki CWP se necessário. Usar APENAS scripts oficiais (`/scripts/*` e `/scripts/cwp_api`). Se não souber: PERGUNTAR. +--- + +## 0. GATE OBRIGATÓRIO — checklist pré-intervenção CWP + +> **Antes de QUALQUER alteração em CWP (SSL, email/Postfix/Dovecot, nginx/Apache, CSF, PHP), correr este checklist. Padrão recorrente de edições manuais desnecessárias = causa de incidentes repetidos (#3992).** + +1. **CONSULTAR PRIMEIRO** (Regra 53 — LLM Wiki obrigatório): + - `PROC-CWP-SSL.md` (D7 Infraestrutura) — para SSL/certificados. + - `PROC-Email-Antispam-CWP.md` (D7 Infraestrutura) — para email/Postfix/DKIM/antispam. + - NotebookLM CWP `0ded7bd6-69b3-4c76-b327-452396bf7ea7` + `~/wiki/` se o caso não estiver nos PROCs. +2. **VERIFICAR ESTADO ACTUAL** (read-only) antes de tocar — ver secção relevante abaixo (ex.: `openssl s_client` para SSL, `postqueue -p` para email). +3. **SCRIPT NATIVO, NUNCA EDIÇÃO MANUAL.** Se existe `/scripts/*` para a tarefa, usar esse. Editar Postfix/Dovecot/vhosts/certs à mão é anti-pattern (sobrescrito em updates + causa-raiz de drift). + - **SSL de email partido → `sh /scripts/mail_rebuild_sni_certs`** (NÃO editar `main.cf`/`master.cf` manualmente). + - Certs web → acme.sh nativo (§6). Webservers → `cwp_api webservers rebuild_*` (§7). Permissões pós-SSH → `cwp_api account fix_perms` (§1). +4. **EMAIL EM PRODUÇÃO = ZERO RISCO:** não mexer em `master.cf`/postscreen nem reiniciar Postfix sem necessidade comprovada. Mudança mínima, testada, reversível. +5. **HDD 4TB — sem comandos cegos:** NUNCA `du`/`find` genéricos em `/home` (bloqueia horas, iowait >30%). Caminhos específicos sempre. +6. **VALIDAR + DOCUMENTAR:** confirmar o efeito (secção "Validação" relevante) e registar o que se descobriu (memória/PROC) se for novo. + +> Se os passos 1-3 não resolvem e seria preciso editar à mão: **PARAR e perguntar**. A edição manual é o último recurso, não o primeiro. + ## Documentação base - Wiki: https://wiki.centos-webpanel.com/cwp-admin-api , /cwp-scripts , /csf-firewall-command-line diff --git a/project-manager/.claude-plugin/plugin.json b/project-manager/.claude-plugin/plugin.json index 24c2ebc..ec91010 100644 --- a/project-manager/.claude-plugin/plugin.json +++ b/project-manager/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "project-manager", - "description": "Spec-driven project management with flexible sprints, scope validation, and NotebookLM-powered discovery. Prevents wasted work by forcing alignment before coding. 6 skills, 2 agents, 1 hook.", + "description": "Spec-driven project management with flexible sprints, scope validation, and NotebookLM-powered discovery. Prevents wasted work by forcing alignment before coding. 7 skills, 2 agents, 1 hook.", "version": "1.1.0", "author": { "name": "Descomplicar - Crescimento Digital", diff --git a/wordpress/skills/wp-cli/references/commands.md b/wordpress/skills/wp-cli/references/commands.md index 635be01..176713d 100644 --- a/wordpress/skills/wp-cli/references/commands.md +++ b/wordpress/skills/wp-cli/references/commands.md @@ -311,7 +311,7 @@ find /home/USER/public_html -name "*.php" -newer /home/USER/public_html/wp-confi ```bash #!/bin/bash PATH_WP="/home/USER/public_html" -BACKUP_DIR="/media/ealmeida/Dados/GDrive/Backups/WP" +BACKUP_DIR="/media/ealmeida/Externo/LocalBackups/WP" DATE=$(date +%Y%m%d_%H%M) SITE=$(basename $(dirname $PATH_WP))