feat(gestao): adiciona plugin gestao (agents, skills, knowledge e metadados do projeto)
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
---
|
||||
name: knowledge
|
||||
description: Router de conhecimento unificado. Classifica pergunta por tipo e encaminha para fonte certa (Hub granular/NLM/Context7/CC memory/Mem0/Desk CRM/Git). v3.1.0
|
||||
layer: wiki
|
||||
---
|
||||
|
||||
# /knowledge — Router Unificado v3.1.0
|
||||
|
||||
> **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 Mem0 complementar (nao alicerce).
|
||||
> Racional: `plans/atomic-fluttering-flame.md`
|
||||
|
||||
## Principio
|
||||
|
||||
**Classificar pergunta → fonte certa.** Nao e fallback linear, nao e "Familia A depois B". E routing directo por tipo.
|
||||
|
||||
---
|
||||
|
||||
## Router principal (8 tipos)
|
||||
|
||||
### 1. Facto rapido (ID, path, comando, credencial)
|
||||
|
||||
**Sinais:** "qual e o ID de", "path para", "comando para", "porta do"
|
||||
|
||||
**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)
|
||||
|
||||
**QR routing por keyword:**
|
||||
|
||||
| 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. **Mem0** — `mcp__mem_search_memories(query)` [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-eal
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,239 @@
|
||||
# Workflow de Sincronização - /kb-sync
|
||||
|
||||
Documentação do processo de sincronização automática do índice de conhecimento.
|
||||
|
||||
---
|
||||
|
||||
## Visão Geral
|
||||
|
||||
```
|
||||
┌─────────────────┐
|
||||
│ /kb-sync │
|
||||
└────────┬────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ Listar Dify │ ← mcp__dify-kb__dify_kb_list_datasets
|
||||
│ Datasets │
|
||||
└────────┬────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ Ler sources │ ← config/sources.json
|
||||
│ .json │
|
||||
└────────┬────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ Comparar e │
|
||||
│ Detectar │
|
||||
│ Alterações │
|
||||
└────────┬────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ Actualizar │
|
||||
│ sources.json │
|
||||
└────────┬────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ Reportar │
|
||||
│ Alterações │
|
||||
└─────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Processo Detalhado
|
||||
|
||||
### 1. Obter Datasets Actuais
|
||||
|
||||
```
|
||||
MCP: mcp__dify-kb__dify_kb_list_datasets
|
||||
Params:
|
||||
- limit: 100
|
||||
- page: 1 (iterar se has_more)
|
||||
```
|
||||
|
||||
**Resposta esperada:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"datasets": [
|
||||
{
|
||||
"id": "uuid",
|
||||
"name": "Nome do Dataset",
|
||||
"description": "...",
|
||||
"document_count": 123,
|
||||
"word_count": 456789,
|
||||
"created_at": "2025-01-25T..."
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"total": 73,
|
||||
"has_more": false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Ler Índice Actual
|
||||
|
||||
Ler `config/sources.json` e extrair:
|
||||
- `dify_datasets` - mapeamento actual
|
||||
- `last_sync` - última sincronização
|
||||
- `total_datasets` - contagem anterior
|
||||
|
||||
### 3. Comparar e Detectar
|
||||
|
||||
#### Datasets Novos
|
||||
```python
|
||||
novos = []
|
||||
for dataset in dify_response:
|
||||
slug = slugify(dataset.name)
|
||||
if slug not in sources.dify_datasets:
|
||||
novos.append({
|
||||
"slug": slug,
|
||||
"id": dataset.id,
|
||||
"name": dataset.name,
|
||||
"docs": dataset.document_count
|
||||
})
|
||||
```
|
||||
|
||||
#### Datasets Removidos
|
||||
```python
|
||||
removidos = []
|
||||
dify_ids = [d.id for d in dify_response]
|
||||
for slug, info in sources.dify_datasets.items():
|
||||
if info.id not in dify_ids:
|
||||
removidos.append(slug)
|
||||
```
|
||||
|
||||
#### Datasets Alterados
|
||||
```python
|
||||
alterados = []
|
||||
for dataset in dify_response:
|
||||
slug = slugify(dataset.name)
|
||||
if slug in sources.dify_datasets:
|
||||
old = sources.dify_datasets[slug]
|
||||
if old.docs != dataset.document_count:
|
||||
alterados.append({
|
||||
"slug": slug,
|
||||
"old_docs": old.docs,
|
||||
"new_docs": dataset.document_count
|
||||
})
|
||||
```
|
||||
|
||||
### 4. Actualizar sources.json
|
||||
|
||||
```python
|
||||
# Actualizar metadados
|
||||
sources.version = increment_minor(sources.version)
|
||||
sources.updated = now()
|
||||
sources.last_sync = now()
|
||||
sources.total_datasets = len(dify_response)
|
||||
|
||||
# Remover datasets eliminados
|
||||
for slug in removidos:
|
||||
del sources.dify_datasets[slug]
|
||||
|
||||
# Actualizar existentes e adicionar novos
|
||||
for dataset in dify_response:
|
||||
slug = slugify(dataset.name)
|
||||
sources.dify_datasets[slug] = {
|
||||
"id": dataset.id,
|
||||
"name": dataset.name,
|
||||
"docs": dataset.document_count
|
||||
}
|
||||
|
||||
# Escrever ficheiro
|
||||
write_json("config/sources.json", sources)
|
||||
```
|
||||
|
||||
### 5. Gerar Relatório
|
||||
|
||||
```markdown
|
||||
## Sync Concluído - 2026-01-25 15:30
|
||||
|
||||
| Métrica | Valor |
|
||||
|---------|-------|
|
||||
| **Total Datasets** | 73 |
|
||||
| **Anterior** | 74 |
|
||||
| **Novos** | 0 |
|
||||
| **Removidos** | 1 |
|
||||
| **Actualizados** | 5 |
|
||||
|
||||
### Datasets Removidos
|
||||
- Demo Teste Agosto 2025
|
||||
|
||||
### Datasets Actualizados
|
||||
| Dataset | Docs Antes | Docs Depois |
|
||||
|---------|------------|-------------|
|
||||
| marketing-digital | 81 | 85 |
|
||||
| crocoblock-kb | 403 | 410 |
|
||||
|
||||
### Datasets Novos
|
||||
(nenhum)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Slugify
|
||||
|
||||
Função para converter nome do dataset em slug consistente:
|
||||
|
||||
```javascript
|
||||
function slugify(name) {
|
||||
return name
|
||||
.toLowerCase()
|
||||
.normalize('NFD')
|
||||
.replace(/[\u0300-\u036f]/g, '') // Remove acentos
|
||||
.replace(/[^a-z0-9]+/g, '-') // Substitui não-alfanum
|
||||
.replace(/^-+|-+$/g, ''); // Remove hífens início/fim
|
||||
}
|
||||
```
|
||||
|
||||
**Exemplos:**
|
||||
- "Marketing Digital" → "marketing-digital"
|
||||
- "SEO (Search Engine Optimization)" → "seo-search-engine-optimization"
|
||||
- "TI (Tecnologia da Informação)" → "ti-tecnologia-da-informacao"
|
||||
|
||||
---
|
||||
|
||||
## Frequência Recomendada
|
||||
|
||||
| Cenário | Frequência |
|
||||
|---------|------------|
|
||||
| Uso normal | Semanal |
|
||||
| Após criar datasets | Imediato |
|
||||
| Após remover datasets | Imediato |
|
||||
| Debugging | Conforme necessário |
|
||||
|
||||
---
|
||||
|
||||
## Erros Comuns
|
||||
|
||||
| Erro | Causa | Solução |
|
||||
|------|-------|---------|
|
||||
| MCP timeout | Muitos datasets | Paginar requests |
|
||||
| JSON inválido | Corrupção | Restaurar de backup |
|
||||
| ID não encontrado | Dataset removido | Executar /kb-sync |
|
||||
| Duplicados | Nomes similares | Verificar slugs manualmente |
|
||||
|
||||
---
|
||||
|
||||
## Backup Automático
|
||||
|
||||
Antes de cada sync, criar backup:
|
||||
```
|
||||
config/sources.json.bak
|
||||
```
|
||||
|
||||
Restaurar se necessário:
|
||||
```bash
|
||||
cp config/sources.json.bak config/sources.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*Workflow v1.0 | 2026-01-25*
|
||||
@@ -0,0 +1,266 @@
|
||||
# Workflow de Pesquisa - /knowledge
|
||||
|
||||
Documentação detalhada do processo de pesquisa e routing.
|
||||
|
||||
---
|
||||
|
||||
## Fluxo Principal
|
||||
|
||||
```
|
||||
┌─────────────┐
|
||||
│ Pergunta │
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────┐
|
||||
│ Analisar │ ← Extrair keywords, identificar tema
|
||||
│ Termo │
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────┐
|
||||
│ Routing │ ← Consultar config/sources.json
|
||||
│ Tema │
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────┐
|
||||
│ Pesquisar │ ← Fonte primária
|
||||
│ Fonte 1 │
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────┐ ┌─────────────┐
|
||||
│ Resultados │ NO │ Pesquisar │
|
||||
│ Suficientes?├────►│ Fonte 2 │
|
||||
└──────┬──────┘ └──────┬──────┘
|
||||
│ YES │
|
||||
▼ ▼
|
||||
┌─────────────┐ ┌─────────────┐
|
||||
│ Agregar │◄────┤ Fonte 3 │
|
||||
│ Resultados │ │ (se neces.) │
|
||||
└──────┬──────┘ └─────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────┐
|
||||
│ Detectar │ ← Se resultados insuficientes
|
||||
│ Lacunas │
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────┐
|
||||
│ Resposta │
|
||||
│ Estruturada │
|
||||
└─────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Fase 1: Análise do Termo
|
||||
|
||||
### Extracção de Keywords
|
||||
```
|
||||
Input: "como configurar crocoblock filters no elementor"
|
||||
Keywords: [crocoblock, filters, elementor, configurar]
|
||||
Tema detectado: wordpress
|
||||
```
|
||||
|
||||
### Regras de Detecção
|
||||
1. Corresponder keywords com `routing[tema].keywords`
|
||||
2. Se múltiplos temas, usar o mais específico
|
||||
3. Se nenhum tema, usar pesquisa genérica (todas as fontes)
|
||||
|
||||
---
|
||||
|
||||
## Fase 2: Routing
|
||||
|
||||
### Consulta ao Mapeamento
|
||||
```javascript
|
||||
// Pseudocódigo
|
||||
tema = detectarTema(keywords)
|
||||
sources = routing[tema].sources
|
||||
|
||||
// Ordenar por prioridade
|
||||
fonte1 = sources[0] // Primária
|
||||
fonte2 = sources[1] // Secundária
|
||||
fonte3 = sources[2] // Terciária
|
||||
```
|
||||
|
||||
### Prioridades por Tipo
|
||||
| Tipo de Pergunta | Fonte Primária | Porque |
|
||||
|------------------|----------------|--------|
|
||||
| Técnico/Como fazer | Context7 | Docs actualizados |
|
||||
| Negócio/Clientes | Supabase | Contexto recente |
|
||||
| Procedimento | WikiJS | Documentação interna |
|
||||
| Conhecimento geral | Dify KB | RAG temático |
|
||||
| Histórico/Decisão | Supabase | Memória longo prazo |
|
||||
|
||||
---
|
||||
|
||||
## Fase 3: Pesquisa
|
||||
|
||||
### Dify KB
|
||||
```
|
||||
MCP: mcp__dify-kb__dify_kb_retrieve_segments
|
||||
Params:
|
||||
- dataset_id: [obtido de sources.json]
|
||||
- query: [termo original]
|
||||
- top_k: 5
|
||||
```
|
||||
|
||||
### WikiJS
|
||||
```
|
||||
MCP: mcp__wikijs__search_pages
|
||||
Params:
|
||||
- query: [termo]
|
||||
Filtrar por paths relevantes do routing
|
||||
```
|
||||
|
||||
### Supabase
|
||||
```
|
||||
MCP: mcp__mem_search_memories
|
||||
Params:
|
||||
- query: [termo]
|
||||
Filtrar por tags do routing
|
||||
```
|
||||
|
||||
### Context7
|
||||
```
|
||||
MCP: mcp__context7__resolve-library-id
|
||||
MCP: mcp__context7__get-library-docs
|
||||
Params:
|
||||
- libraryName: [biblioteca detectada]
|
||||
- topic: [termo específico]
|
||||
```
|
||||
|
||||
### Filesystem
|
||||
```
|
||||
Grep em paths do routing:
|
||||
- /media/ealmeida/Dados/Hub/ (Obsidian vault)
|
||||
- /media/ealmeida/Dados/GDrive/Projectos/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Fase 4: Agregação
|
||||
|
||||
### Critérios de Suficiência
|
||||
- **Suficiente**: ≥1 resultado relevante com conteúdo útil
|
||||
- **Parcial**: Resultados tangenciais, precisa complemento
|
||||
- **Insuficiente**: 0 resultados ou irrelevantes
|
||||
|
||||
### Formatação de Resposta
|
||||
```markdown
|
||||
## Resultado: [termo pesquisado]
|
||||
|
||||
### Fonte: [Nome da Fonte]
|
||||
[Conteúdo encontrado, formatado e resumido]
|
||||
|
||||
### Fonte: [Segunda Fonte] (se aplicável)
|
||||
[Conteúdo complementar]
|
||||
|
||||
### Relacionado
|
||||
- [[Link interno 1]]
|
||||
- [[Link interno 2]]
|
||||
|
||||
### Acções Sugeridas (se aplicável)
|
||||
- [ ] Criar documentação sobre X
|
||||
- [ ] Actualizar Y com esta informação
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Fase 5: Detecção de Lacunas
|
||||
|
||||
### Triggers
|
||||
1. **Zero resultados** em todas as fontes
|
||||
2. **Tema recorrente** (3+ pesquisas similares sem resultado)
|
||||
3. **Resultado desactualizado** (>6 meses)
|
||||
4. **Decisão importante** sem registo
|
||||
|
||||
### Acção Automática
|
||||
```markdown
|
||||
> [!warning] Lacuna Detectada
|
||||
> O tema "[X]" não tem documentação adequada.
|
||||
>
|
||||
> **Sugestão:**
|
||||
> - Criar dataset Dify: `[nome-sugerido]`
|
||||
> - Ou página WikiJS: `[path-sugerido]`
|
||||
> - Ou guardar em Supabase (se decisão/contexto)
|
||||
```
|
||||
|
||||
### Registo de Lacunas
|
||||
Adicionar a `config/sources.json` → `gaps`:
|
||||
```json
|
||||
{
|
||||
"gaps": {
|
||||
"dify_missing": ["novo-tema"],
|
||||
"wikijs_missing": ["novo-path"],
|
||||
"detected_at": "2026-01-25"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Comandos Especiais
|
||||
|
||||
### /kb-save [tema]
|
||||
```
|
||||
1. Receber conteúdo a guardar
|
||||
2. Analisar tipo:
|
||||
- Decisão → Supabase (tag: decisao)
|
||||
- Procedimento → WikiJS
|
||||
- Conhecimento → Dify KB
|
||||
3. Formatar com metadata
|
||||
4. Guardar na fonte adequada
|
||||
5. Confirmar com referência
|
||||
```
|
||||
|
||||
### /kb-gaps
|
||||
```
|
||||
1. Ler config/sources.json → gaps
|
||||
2. Listar lacunas conhecidas
|
||||
3. Sugerir prioridades baseado em:
|
||||
- Frequência de pesquisa
|
||||
- Impacto no trabalho
|
||||
- Esforço de criação
|
||||
```
|
||||
|
||||
### /kb-new [tema]
|
||||
```
|
||||
1. Criar dataset no Dify KB
|
||||
2. Adicionar estrutura base
|
||||
3. Actualizar sources.json com novo ID
|
||||
4. Remover de gaps.dify_missing
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Métricas de Qualidade
|
||||
|
||||
### Pesquisa Bem Sucedida
|
||||
- [ ] Resultado relevante encontrado
|
||||
- [ ] Fonte adequada usada
|
||||
- [ ] Resposta formatada correctamente
|
||||
- [ ] Links internos incluídos
|
||||
|
||||
### Detecção de Lacunas
|
||||
- [ ] Lacuna identificada quando apropriado
|
||||
- [ ] Sugestão de acção clara
|
||||
- [ ] Lacuna registada para futuro
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
| Problema | Causa | Solução |
|
||||
|----------|-------|---------|
|
||||
| MCP timeout | Servidor lento | Retry com delay |
|
||||
| Dataset não encontrado | ID inválido | Actualizar sources.json |
|
||||
| Resultados irrelevantes | Keywords mal detectadas | Refinar routing |
|
||||
| Muitas lacunas | Tema novo | Criar conteúdo base |
|
||||
|
||||
---
|
||||
|
||||
*Workflow v1.0 | 2026-01-25*
|
||||
@@ -0,0 +1,308 @@
|
||||
# /knowledge - Routing Guide v2.0.0
|
||||
|
||||
Mapeamento completo de categorias para notebooks NotebookLM.
|
||||
Dify KB removido em 06-03-2026. NotebookLM e a fonte primaria.
|
||||
|
||||
---
|
||||
|
||||
## Regras de Routing
|
||||
|
||||
1. **Classificar tema** da query usando keywords
|
||||
2. **Seleccionar 1-3 notebooks** por ordem de relevancia
|
||||
3. **Query sequencial** ate score >70
|
||||
4. **Enriquecer** com Mem0/Context7/Local se necessario
|
||||
5. **Reportar lacunas** se score <50
|
||||
|
||||
---
|
||||
|
||||
## Codigo de Routing
|
||||
|
||||
### Analise de Query
|
||||
|
||||
```javascript
|
||||
function classificarTema(query) {
|
||||
const temas = {
|
||||
wordpress: /wordpress|elementor|woocommerce|plugin|wp-cli|theme|widget|gutenberg/i,
|
||||
wordpress_seguranca: /seguranca\s*wp|malware|hardening|wordfence|sucuri/i,
|
||||
kivicare: /kivicare|ehr|clinica|medico|consulta/i,
|
||||
marketing: /marketing|digital|campanha|ads|publicidade|growth|funil/i,
|
||||
seo: /seo|keywords|ranking|google|search|organic|serp|indexacao/i,
|
||||
copywriting: /copywriting|persuasao|texto|headline|cta|conversao/i,
|
||||
social_media: /social\s*media|branding|instagram|facebook|linkedin|tiktok/i,
|
||||
video: /video|producao|youtube|monetizacao|canal/i,
|
||||
podcast: /podcast|audio|episodio/i,
|
||||
ecommerce: /ecommerce|loja\s*online|marketplace|shopify/i,
|
||||
programacao: /codigo|api|php|react|node|python|javascript|typescript|programacao/i,
|
||||
claude: /claude|claude\s*code|mcp|anthropic/i,
|
||||
mcp_dev: /mcp\s*server|mcp\s*dev|protocolo\s*mcp/i,
|
||||
ai_tools: /ai\s*editor|cursor|copilot|github\s*copilot/i,
|
||||
opensource: /open\s*source|foss|self-hosted/i,
|
||||
n8n: /n8n|automacao|workflow\s*automation/i,
|
||||
perfex: /perfex|perfexcrm|desk\s*crm/i,
|
||||
cwp: /cwp|centos|servidor\s*web|cpanel|hosting/i,
|
||||
cloud: /cloud|infraestrutura|devops|docker|kubernetes/i,
|
||||
proxmox: /proxmox|virtualizacao|vm|container\s*lxc/i,
|
||||
design: /design|branding\s*visual|ai\s*design|canva/i,
|
||||
uiux: /ui|ux|interface|usabilidade|wireframe|prototipo/i,
|
||||
tipografia: /tipografia|cores|paleta|web\s*design|fonte/i,
|
||||
gestao: /gestao\s*projectos|agile|scrum|kanban|sprint/i,
|
||||
operacoes: /operacoes|processos|kpi|workflow|sop/i,
|
||||
estrategia: /estrategia|empreendedorismo|negocio|plano/i,
|
||||
transformacao: /transformacao\s*digital|ia\s*negocio|inovacao/i,
|
||||
obsidian: /obsidian|vault|notas|pkm/i,
|
||||
decisao: /decisao|porque|contexto|historico/i,
|
||||
reonic: /reonic|solar\s*crm/i,
|
||||
carstuff: /carstuff|automovel/i,
|
||||
solar: /solar|fotovoltaico|engenharia\s*solar/i,
|
||||
zaia: /zaia|chatbot|whatsapp\s*bot/i,
|
||||
pessoal: /jung|taoismo|adhd|phda|autismo|kintsugi|estoicismo|somatica/i
|
||||
};
|
||||
|
||||
const matches = [];
|
||||
for (const [tema, pattern] of Object.entries(temas)) {
|
||||
if (pattern.test(query)) matches.push(tema);
|
||||
}
|
||||
|
||||
return matches.length > 0 ? matches : ['geral'];
|
||||
}
|
||||
```
|
||||
|
||||
### Notebooks por Tema
|
||||
|
||||
```javascript
|
||||
const notebookRouting = {
|
||||
// --- WordPress e Web ---
|
||||
wordpress: [
|
||||
"fb2f26bd-8cb0-4d4c-bafc-4f1ebb51c51d", // WordPress Config CLI (268 fontes)
|
||||
"5be0d1a6-00f2-4cd9-b835-978cb7721601", // WordPress e Elementor (88)
|
||||
"bd06acff-4b9d-44aa-b3f7-60434bbd6b49" // Documentacao WooCommerce (3)
|
||||
],
|
||||
wordpress_seguranca: [
|
||||
"5f60adfd-2435-4725-8c12-9c11c5f51d75" // Ciberseguranca WordPress (95)
|
||||
],
|
||||
kivicare: [
|
||||
"78621405-a5bc-433f-856f-296260a80bd9" // KiviCare EHR WP (145)
|
||||
],
|
||||
|
||||
// --- Marketing e Conteudo ---
|
||||
marketing: [
|
||||
"4c595973-ba10-420a-a3bf-e4389e424ad3", // Marketing Digital PT (189)
|
||||
"76647e0f-3ae2-4c00-a0a8-f457aebf5655" // Marketing Digital Avancado (78)
|
||||
],
|
||||
seo: [
|
||||
"4c595973-ba10-420a-a3bf-e4389e424ad3" // Marketing Digital PT (189)
|
||||
],
|
||||
copywriting: [
|
||||
"7b8fec17-d34f-4e3f-a8c6-8231e51f6323" // Copywriting e Persuasao (50)
|
||||
],
|
||||
social_media: [
|
||||
"9053d0e8-dd39-460b-b5ea-e67af3e9a675" // Social Media e Branding (51)
|
||||
],
|
||||
video: [
|
||||
"058a896e-6c9a-4e51-ae7d-9adb2738bc5f", // Producao de Video e Youtube (49)
|
||||
"60a209a7-e205-4d57-a6f3-fef3de61e87a" // YouTube Monetizacao e Compliance (30)
|
||||
],
|
||||
podcast: [
|
||||
"a5bef96b-a1af-4293-9979-5da46f8d2301" // Podcast Descomplicar (33)
|
||||
],
|
||||
ecommerce: [
|
||||
"226e384e-d4bc-48f4-bb82-7927360436cc", // E-commerce Pratico (63)
|
||||
"8a430cf2-ed99-413d-b4bf-a1400deaf49e" // E-Commerce Portugal (24)
|
||||
],
|
||||
|
||||
// --- Desenvolvimento ---
|
||||
programacao: [
|
||||
"24947ffa-0019-448a-a340-2f4a275d2eb1" // Programacao (53)
|
||||
],
|
||||
claude: [
|
||||
"2876d1fe-5cea-4d98-8140-b0e1a81c6bc4", // Claude Code (132)
|
||||
"0be6f45b-8fd5-4a5e-8f80-e36a6f516ded" // Claude Code mini (2)
|
||||
],
|
||||
mcp_dev: [
|
||||
"73102308-70ef-403e-9be9-eae0cfc62d55", // Desenvolvimento de MCPs (22)
|
||||
"2876d1fe-5cea-4d98-8140-b0e1a81c6bc4" // Claude Code (132)
|
||||
],
|
||||
ai_tools: [
|
||||
"57d9c6c9-48ba-4d83-8f71-cc890f348a53" // AI Code Editors (20)
|
||||
],
|
||||
opensource: [
|
||||
"cabf9821-c1ff-44cb-9bfd-59bda3599792" // Open Source Software and Platforms (163)
|
||||
],
|
||||
n8n: [
|
||||
"f2c809b8-1cb5-4dd0-aa7e-be2cfb6704d1" // n8n (66)
|
||||
],
|
||||
perfex: [
|
||||
"df4688bb-c2c0-4aba-98c1-38c3b50a353c", // Perfex CRM (191)
|
||||
"80606de8-2783-4d36-b08d-5825e6f9a8da" // Dev PerfexCRM (44)
|
||||
],
|
||||
|
||||
// --- Infraestrutura ---
|
||||
cwp: [
|
||||
"0ded7bd6-69b3-4c76-b327-452396bf7ea7" // CWP (214)
|
||||
],
|
||||
cloud: [
|
||||
"f9a79b5a-649f-4443-afaf-7ff562b6c2e7" // Cloud e Infraestrutura TI (146)
|
||||
],
|
||||
proxmox: [
|
||||
"276ccdde-6b95-42a3-ad96-4e64d64c8d52" // Proxmox (120)
|
||||
],
|
||||
|
||||
// --- Design ---
|
||||
design: [
|
||||
"b568b13b-0eed-48c9-b513-5c5b7ec0b102" // Design Profissional AItomatizado (244)
|
||||
],
|
||||
uiux: [
|
||||
"081ca512-8279-4850-b2b9-dff090267482" // UI/UX Design (28)
|
||||
],
|
||||
tipografia: [
|
||||
"f97a0d2b-a5b3-4640-b941-3cbb184b1b81" // Tipografia e Cor para Web (41)
|
||||
],
|
||||
|
||||
// --- Gestao e Estrategia ---
|
||||
gestao: [
|
||||
"0c9c079c-a426-486c-99eb-1564d42d37ad", // Gestao de Projectos e Agile (44)
|
||||
"f9dc59c2-718b-4b12-bd06-095d4bfa3e34" // Gestao de Operacoes (41)
|
||||
],
|
||||
operacoes: [
|
||||
"f9dc59c2-718b-4b12-bd06-095d4bfa3e34" // Gestao de Operacoes (41)
|
||||
],
|
||||
estrategia: [
|
||||
"79d43410-0e29-4be1-881d-84db6bdc239a", // Estrategia e Empreendedorismo (107)
|
||||
"ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8" // Transformacao Digital e IA (73)
|
||||
],
|
||||
transformacao: [
|
||||
"ab876d0d-12a8-43d9-bc62-59c1c8e9d0f8", // Transformacao Digital e IA (73)
|
||||
"929ef67b-c131-4f01-abd0-8b078491a6b7", // AI Automation Stack (5)
|
||||
"f4be0e3f-4d9e-4c5c-a743-9f14427f2e43" // AI Agents Intensive Course (5)
|
||||
],
|
||||
|
||||
// --- Sistema e Produtividade ---
|
||||
obsidian: [
|
||||
"ebee9fe1-78fd-4f85-8938-f19f3ea32131" // Obsidian + Claude (117)
|
||||
],
|
||||
decisao: [], // Mem0 primeiro, depois Obsidian notebook
|
||||
|
||||
// --- Produtos e Clientes ---
|
||||
reonic: [
|
||||
"b7e61158-0717-4582-8ef2-0301be3c73ae" // Reonic (131)
|
||||
],
|
||||
carstuff: [
|
||||
"90f0bc77-b5e4-4ddd-a07c-013a1a30b247" // CarStuff (25)
|
||||
],
|
||||
solar: [
|
||||
"03d54e00-aefa-45dc-ba01-f3864a7c3112", // Solar FV Engenharia (5)
|
||||
"0082bcaf-1e17-4b84-87cc-2256b1719b55" // OpenSolar (4)
|
||||
],
|
||||
zaia: [
|
||||
"087d76f1-e929-49da-9e3c-4edc22b42b3f" // Zaia (28)
|
||||
],
|
||||
|
||||
// --- Pessoal ---
|
||||
pessoal: [
|
||||
"d5c67d7f-7fe8-4542-9e5c-22403f3193ee", // Jung (41)
|
||||
"8c6c8257-bda2-433c-bf55-f40d98bfde8f", // Emanuel Almeida (36)
|
||||
"aea85baf-9ddf-4d79-bf07-81391a275b09", // Taoism (28)
|
||||
"a4ff3fd7-fb7c-49a1-94ff-0433193e2338", // ADHD (17)
|
||||
"66eff78e-318f-4a8b-a3c7-039a4124b1ad", // Autismo (14)
|
||||
"6dcd08e8-79d9-4ae0-b6bf-b2ee96717bf2", // Essencia de Heroi (13)
|
||||
"82a95c2f-be56-4c4a-a96f-96f6677a6991", // Auto Kintsugi (10)
|
||||
"3410893b-16a3-4178-9091-42650a41086f", // Psicologia Somatica (10)
|
||||
"4b986ad4-49da-4604-a423-4fcdf20dd9da" // Marcus Aurelius / Stoic (3)
|
||||
],
|
||||
|
||||
// --- Fallback generico ---
|
||||
geral: [
|
||||
"ebee9fe1-78fd-4f85-8938-f19f3ea32131", // Obsidian + Claude (sistema)
|
||||
"79d43410-0e29-4be1-881d-84db6bdc239a" // Estrategia (amplo)
|
||||
]
|
||||
};
|
||||
```
|
||||
|
||||
### Pesquisa Sequencial
|
||||
|
||||
```javascript
|
||||
async function pesquisar(query) {
|
||||
const temas = classificarTema(query);
|
||||
let resultados = [];
|
||||
|
||||
// 1. Recolher notebooks unicos (max 3)
|
||||
const notebookIds = new Set();
|
||||
for (const tema of temas) {
|
||||
const ids = notebookRouting[tema] || notebookRouting.geral;
|
||||
ids.forEach(id => notebookIds.add(id));
|
||||
}
|
||||
const notebooks = [...notebookIds].slice(0, 3);
|
||||
|
||||
// 2. Query NotebookLM sequencial
|
||||
for (const id of notebooks) {
|
||||
const resultado = await mcp__notebooklm__notebook_query({
|
||||
notebook_id: id,
|
||||
query: query
|
||||
});
|
||||
|
||||
const score = avaliarRelevancia(resultado, query);
|
||||
if (score > 70) {
|
||||
return { resultado, fonte: `NotebookLM (${id})`, score };
|
||||
}
|
||||
if (score > 30) {
|
||||
resultados.push({ resultado, id, score });
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Enriquecer com outras fontes
|
||||
const mem0 = await mcp__mem_search_memories({
|
||||
query
|
||||
});
|
||||
if (mem0.length > 0) resultados.push({ resultado: mem0, fonte: 'Mem0' });
|
||||
|
||||
// 4. Context7 para temas dev
|
||||
if (temas.some(t => ['programacao', 'claude', 'mcp_dev', 'wordpress'].includes(t))) {
|
||||
// Tentar resolver biblioteca
|
||||
const lib = await mcp__plugin_context7_context7__resolve_library_id({
|
||||
libraryName: extractLibName(query)
|
||||
});
|
||||
if (lib) {
|
||||
const docs = await mcp__plugin_context7_context7__query_docs({
|
||||
context7CompatibleLibraryID: lib.id,
|
||||
topic: query
|
||||
});
|
||||
resultados.push({ resultado: docs, fonte: 'Context7' });
|
||||
}
|
||||
}
|
||||
|
||||
// 5. Resultado
|
||||
if (resultados.length === 0) {
|
||||
// Lacuna detectada
|
||||
await mcp__mem_save_memory({
|
||||
text: `LACUNA: Query "${query}" sem informacao. Temas: ${temas.join(', ')}`
|
||||
});
|
||||
return { lacuna: true, query, temas };
|
||||
}
|
||||
|
||||
return {
|
||||
resultados: resultados.sort((a, b) => (b.score || 0) - (a.score || 0)),
|
||||
fonte: 'multiplas'
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Fontes Complementares (Fallback)
|
||||
|
||||
| Fonte | MCP | Quando Usar |
|
||||
|-------|-----|-------------|
|
||||
| **Mem0** | mem0 | Decisoes, contexto, historico sessoes |
|
||||
| **Context7** | context7 | Docs bibliotecas externas (npm, pip, etc.) |
|
||||
| **Docs Locais** | filesystem (Grep/Glob) | Codigo em /Dev/, docs em /Hub/ |
|
||||
|
||||
---
|
||||
|
||||
## Estatisticas
|
||||
|
||||
- **58 notebooks** (49 profissional + 9 pessoal)
|
||||
- **~3200 fontes** total
|
||||
- **32 temas** mapeados
|
||||
- **Limite:** 500 notebooks, 300 fontes/notebook (Plus)
|
||||
|
||||
Inventario completo: `~/.claude/projects/-media-ealmeida-Dados-Hub/memory/notebooklm-inventory.md`
|
||||
Reference in New Issue
Block a user