feat: adiciona 12 plugins Descomplicar ao marketplace
Plugins: automacao, crm-ops, design-media, dev-tools, gestao, infraestrutura, marketing, negocio, perfex-dev, project-manager, wordpress + hello-plugin (existente). Totais: 83 skills, 44 agents, 12 datasets.json Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
600
gestao/skills/knowledge/SKILL.md
Normal file
600
gestao/skills/knowledge/SKILL.md
Normal file
@@ -0,0 +1,600 @@
|
||||
---
|
||||
name: knowledge
|
||||
description: >
|
||||
Unified knowledge management with intelligent routing across Dify KB, WikiJS, Supabase, Context7 and local docs. Detects gaps and suggests content creation.
|
||||
Use when searching documentation, looking for best practices, researching solutions, or when user mentions
|
||||
"how to", "documentation", "knowledge base", "search docs", "find information", "best practices", "procedures", "guides".
|
||||
author: Descomplicar® Crescimento Digital
|
||||
version: 1.1.0
|
||||
user_invocable: true
|
||||
tags: [knowledge, kb, dify, wikijs, supabase, context7, search, documentation]
|
||||
desk_task: 1474
|
||||
allowed-tools: Read, Grep, mcp__dify-kb__dify_kb_retrieve_segments, mcp__wikijs__search_pages, mcp__memory-supabase__search_memories, mcp__context7__get-library-docs
|
||||
category: productivity
|
||||
quality_score: 85
|
||||
updated: "2026-02-04T18:00:00Z"
|
||||
---
|
||||
|
||||
# /knowledge - Gestão Unificada de Conhecimento
|
||||
|
||||
Pesquisa inteligente com routing automático entre todas as fontes de conhecimento.
|
||||
|
||||
## Arquitectura
|
||||
|
||||
```
|
||||
Pergunta → Router → Fonte Adequada → Resultado Agregado
|
||||
↓
|
||||
Detecta Lacunas → Sugere Criação
|
||||
```
|
||||
|
||||
| Fonte | MCP | Tipo de Conhecimento |
|
||||
|-------|-----|---------------------|
|
||||
| **Dify KB** | dify-kb | RAG, 74 datasets temáticos |
|
||||
| **WikiJS** | wikijs | Documentação estruturada, procedimentos |
|
||||
| **Supabase** | memory-supabase | Memória sessões, decisões, contexto |
|
||||
| **Context7** | context7 | Docs bibliotecas externas |
|
||||
| **Docs Locais** | filesystem | Ficheiros GDrive, Obsidian |
|
||||
|
||||
---
|
||||
|
||||
## Comandos
|
||||
|
||||
| Comando | Uso |
|
||||
|---------|-----|
|
||||
| `/knowledge [termo]` | Pesquisa inteligente com routing |
|
||||
| `/kb [termo]` | Alias curto |
|
||||
| `/kb-sync` | Sincronizar índice com Dify KB (actualiza IDs e docs) |
|
||||
| `/kb-save [tema]` | Guardar conhecimento na fonte adequada |
|
||||
| `/kb-gaps` | Listar lacunas identificadas |
|
||||
| `/kb-new [tema]` | Criar novo dataset Dify |
|
||||
|
||||
---
|
||||
|
||||
## Routing por Tema
|
||||
|
||||
### Marketing e Conteúdo
|
||||
```
|
||||
Tema: marketing, SEO, copywriting, redes sociais
|
||||
1ª Fonte: Dify (Marketing Digital, SEO, Neil Patel, Copywriting)
|
||||
2ª Fonte: WikiJS (estratégias)
|
||||
3ª Fonte: Supabase (decisões passadas)
|
||||
```
|
||||
|
||||
### WordPress e Web
|
||||
```
|
||||
Tema: WordPress, Elementor, WooCommerce, plugins
|
||||
1ª Fonte: Dify (WordPress, Elementor, Crocoblock)
|
||||
2ª Fonte: Context7 (docs oficiais)
|
||||
3ª Fonte: Docs Locais (código)
|
||||
```
|
||||
|
||||
### CRM e Clientes
|
||||
```
|
||||
Tema: clientes, Perfex, projectos, facturação
|
||||
1ª Fonte: Supabase (contexto recente)
|
||||
2ª Fonte: Dify (PerfexCRM)
|
||||
3ª Fonte: WikiJS (procedimentos)
|
||||
```
|
||||
|
||||
### Desenvolvimento
|
||||
```
|
||||
Tema: código, API, PHP, React, Node
|
||||
1ª Fonte: Context7 (docs bibliotecas)
|
||||
2ª Fonte: Dify (TI, Dev Software)
|
||||
3ª Fonte: Docs Locais (projectos)
|
||||
```
|
||||
|
||||
### Infraestrutura
|
||||
```
|
||||
Tema: servidor, CWP, Linux, deploy
|
||||
1ª Fonte: WikiJS (procedimentos)
|
||||
2ª Fonte: Dify (TI, CWP, Linux)
|
||||
3ª Fonte: Supabase (configurações)
|
||||
```
|
||||
|
||||
### Estratégia e Gestão
|
||||
```
|
||||
Tema: estratégia, projectos, processos
|
||||
1ª Fonte: Dify (Estratégia, Gestão Projetos)
|
||||
2ª Fonte: WikiJS (planos)
|
||||
3ª Fonte: Supabase (decisões)
|
||||
```
|
||||
|
||||
### Decisões e Contexto
|
||||
```
|
||||
Tema: decisão, porque, contexto, histórico
|
||||
1ª Fonte: Supabase (memória longo prazo)
|
||||
2ª Fonte: Obsidian (notas)
|
||||
3ª Fonte: Dify (Data Lake)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Workflow Completo
|
||||
|
||||
### Passo 1: Análise do Termo
|
||||
|
||||
```javascript
|
||||
// Input: "/knowledge como configurar crocoblock filters"
|
||||
|
||||
function analisarQuery(query) {
|
||||
const keywords = {
|
||||
tecnico: /código|api|php|react|node|servidor|linux|deploy|git/i,
|
||||
wordpress: /wordpress|elementor|crocoblock|woocommerce|plugin/i,
|
||||
marketing: /seo|marketing|copywriting|redes sociais|instagram/i,
|
||||
crm: /cliente|perfex|crm|facturação|orçamento/i,
|
||||
estrategia: /estratégia|plano|decisão|porque|contexto/i,
|
||||
procedimento: /como|tutorial|guia|passo a passo|procedimento/i
|
||||
};
|
||||
|
||||
for (const [categoria, pattern] of Object.entries(keywords)) {
|
||||
if (pattern.test(query)) {
|
||||
return categoria;
|
||||
}
|
||||
}
|
||||
|
||||
return 'geral'; // Default se não detectar categoria
|
||||
}
|
||||
|
||||
const categoria = analisarQuery(query); // 'wordpress'
|
||||
```
|
||||
|
||||
### Passo 2: Determinar Fontes Prioritárias
|
||||
|
||||
```javascript
|
||||
const routing = {
|
||||
wordpress: [
|
||||
{ fonte: 'dify', datasets: ['crocoblock-kb', 'elementor', 'wordpress'] },
|
||||
{ fonte: 'context7', libraries: ['elementor', 'woocommerce'] },
|
||||
{ fonte: 'docs-locais', paths: ['/Projectos/*/wp-content/'] }
|
||||
],
|
||||
marketing: [
|
||||
{ fonte: 'dify', datasets: ['marketing-digital', 'seo', 'copywriting'] },
|
||||
{ fonte: 'wikijs', tags: ['marketing', 'estrategia'] },
|
||||
{ fonte: 'supabase', tags: ['decisao', 'marketing'] }
|
||||
],
|
||||
crm: [
|
||||
{ fonte: 'supabase', tags: ['cliente', 'crm'] },
|
||||
{ fonte: 'dify', datasets: ['perfexcrm'] },
|
||||
{ fonte: 'wikijs', tags: ['procedimento', 'crm'] }
|
||||
],
|
||||
tecnico: [
|
||||
{ fonte: 'context7', libraries: ['auto-detect'] },
|
||||
{ fonte: 'dify', datasets: ['ti', 'desenvolvimento-software'] },
|
||||
{ fonte: 'docs-locais', paths: ['/Dev/'] }
|
||||
],
|
||||
estrategia: [
|
||||
{ fonte: 'supabase', tags: ['decisao', 'contexto'] },
|
||||
{ fonte: 'obsidian', folders: ['01-Projectos/', '02-Areas/'] },
|
||||
{ fonte: 'dify', datasets: ['data-lake-descomplicar'] }
|
||||
],
|
||||
procedimento: [
|
||||
{ fonte: 'wikijs', all: true },
|
||||
{ fonte: 'dify', datasets: ['procedimentos'] },
|
||||
{ fonte: 'obsidian', folders: ['03-Recursos/Procedimentos/'] }
|
||||
]
|
||||
};
|
||||
|
||||
const fontes_prioritarias = routing[categoria];
|
||||
```
|
||||
|
||||
### Passo 3: Pesquisa Sequencial
|
||||
|
||||
```javascript
|
||||
async function pesquisar(query, categoria) {
|
||||
const fontes = routing[categoria];
|
||||
let resultados = [];
|
||||
|
||||
for (const fonte of fontes) {
|
||||
let resultado;
|
||||
|
||||
switch (fonte.fonte) {
|
||||
case 'dify':
|
||||
// Pesquisar em paralelo nos datasets
|
||||
const promessas = fonte.datasets.map(ds_id =>
|
||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
||||
dataset_id: resolverDatasetID(ds_id),
|
||||
query: query,
|
||||
top_k: 3
|
||||
})
|
||||
);
|
||||
resultado = await Promise.all(promessas);
|
||||
break;
|
||||
|
||||
case 'wikijs':
|
||||
resultado = await mcp__wikijs__search_pages({ query });
|
||||
break;
|
||||
|
||||
case 'supabase':
|
||||
resultado = await mcp__memory-supabase__search_memories({
|
||||
query,
|
||||
tags: fonte.tags
|
||||
});
|
||||
break;
|
||||
|
||||
case 'context7':
|
||||
// Detectar bibliotecas mencionadas no query
|
||||
const libs = detectarBibliotecas(query);
|
||||
resultado = await Promise.all(
|
||||
libs.map(lib => mcp__context7__get-library-docs({ library: lib }))
|
||||
);
|
||||
break;
|
||||
|
||||
case 'docs-locais':
|
||||
// Grep nos paths
|
||||
resultado = await Grep({
|
||||
pattern: extrairKeywords(query).join('|'),
|
||||
path: fonte.paths[0],
|
||||
output_mode: 'content'
|
||||
});
|
||||
break;
|
||||
|
||||
case 'obsidian':
|
||||
// Pesquisa nos folders
|
||||
resultado = await Promise.all(
|
||||
fonte.folders.map(folder =>
|
||||
Grep({
|
||||
pattern: extrairKeywords(query).join('|'),
|
||||
path: `/media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/${folder}`,
|
||||
output_mode: 'content'
|
||||
})
|
||||
)
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
// Avaliar relevância
|
||||
const relevante = avaliarRelevancia(resultado, query);
|
||||
|
||||
if (relevante.score > 70) {
|
||||
// Resultado suficiente, parar pesquisa
|
||||
return { resultados: relevante.data, fonte: fonte.fonte };
|
||||
} else if (relevante.score > 30) {
|
||||
// Adicionar mas continuar pesquisando
|
||||
resultados.push({ ...relevante, fonte: fonte.fonte });
|
||||
}
|
||||
}
|
||||
|
||||
// Retornar agregado se nenhuma fonte teve score >70
|
||||
return {
|
||||
resultados: agregrarResultados(resultados),
|
||||
fonte: 'multiplas',
|
||||
lacuna: resultados.length === 0
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### Passo 4: Resposta Estruturada
|
||||
|
||||
```markdown
|
||||
## Resultado: como configurar crocoblock filters
|
||||
|
||||
### Encontrado em Dify KB (Crocoblock)
|
||||
|
||||
**Configuração Filters JetEngine:**
|
||||
|
||||
1. Criar Query Builder no JetEngine
|
||||
2. Definir filtros (taxonomy, meta fields, search)
|
||||
3. Criar Filter Widget no Elementor
|
||||
4. Conectar filtro ao Listing Grid
|
||||
5. Configurar AJAX para loading dinâmico
|
||||
|
||||
**Documentação oficial:** [link]
|
||||
|
||||
### Relacionado
|
||||
|
||||
- [[JetEngine-Query-Builder|Guia Query Builder]]
|
||||
- Dify KB: Elementor > Filtros Dinâmicos
|
||||
- WikiJS: Procedimentos > Crocoblock Setup
|
||||
|
||||
### Qualidade da Resposta
|
||||
|
||||
✅ Completo (score: 85/100)
|
||||
📊 3 segments de Dify KB
|
||||
🔗 2 links relacionados
|
||||
⏱️ Tempo de pesquisa: 1.2s
|
||||
```
|
||||
|
||||
### Passo 5: Detectar e Reportar Lacunas
|
||||
|
||||
```javascript
|
||||
if (resultado.lacuna || resultado.score < 50) {
|
||||
// Registar lacuna
|
||||
await mcp__memory-supabase__save_memory({
|
||||
content: `LACUNA: Query "${query}" não encontrou informação adequada.`,
|
||||
metadata: {
|
||||
type: 'lacuna-kb',
|
||||
categoria: categoria,
|
||||
query: query,
|
||||
score: resultado.score,
|
||||
date: new Date().toISOString()
|
||||
}
|
||||
});
|
||||
|
||||
// Sugerir criação de conteúdo
|
||||
console.log(`
|
||||
> [!warning] Lacuna Detectada
|
||||
> Tema "${query}" tem informação insuficiente (score: ${resultado.score}).
|
||||
>
|
||||
> **Sugestões:**
|
||||
> - [ ] Criar dataset Dify: "${categoria}-${extrairTema(query)}"
|
||||
> - [ ] Criar página WikiJS: "Procedimentos/${extrairTema(query)}"
|
||||
> - [ ] Guardar em Supabase se for decisão importante
|
||||
`);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## MCPs Disponíveis
|
||||
|
||||
### Dify KB
|
||||
```
|
||||
mcp__dify-kb__dify_kb_list_datasets # Listar datasets
|
||||
mcp__dify-kb__dify_kb_retrieve_segments # Pesquisar (dataset_id, query)
|
||||
mcp__dify-kb__dify_kb_create_dataset # Criar dataset
|
||||
mcp__dify-kb__dify_kb_create_document_text # Adicionar documento
|
||||
```
|
||||
|
||||
### WikiJS
|
||||
```
|
||||
mcp__wikijs__search_pages # Pesquisar (query)
|
||||
mcp__wikijs__get_page_by_id # Obter página
|
||||
mcp__wikijs__get_all_pages # Listar todas
|
||||
```
|
||||
|
||||
### Supabase Memory
|
||||
```
|
||||
mcp__memory-supabase__search_memories # Pesquisar (query)
|
||||
mcp__memory-supabase__save_memory # Guardar (content, metadata)
|
||||
mcp__memory-supabase__get_all_memories # Listar todas
|
||||
```
|
||||
|
||||
### Context7
|
||||
```
|
||||
mcp__context7__resolve-library-id # Resolver biblioteca
|
||||
mcp__context7__get-library-docs # Obter docs
|
||||
```
|
||||
|
||||
### Filesystem (Docs Locais)
|
||||
```
|
||||
Grep/Glob em:
|
||||
- /media/ealmeida/Dados/GDrive/Cloud/EAL/Planeamento/ (Obsidian vault)
|
||||
- /media/ealmeida/Dados/GDrive/Projectos/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Datasets Dify Principais
|
||||
|
||||
### Por Categoria
|
||||
| Categoria | Datasets | Total Docs |
|
||||
|-----------|----------|------------|
|
||||
| Marketing | Marketing Digital, SEO, Copywriting, Neil Patel | 200+ |
|
||||
| WordPress | WordPress, Elementor, Crocoblock | 470+ |
|
||||
| Gestão | Gestão Projetos, Estratégia, Produtividade | 50+ |
|
||||
| Técnico | TI, Dev Software, Linux, AWS | 130+ |
|
||||
| Clientes | ESP, SNT, Espiral Senior | 140+ |
|
||||
|
||||
### IDs Frequentes
|
||||
Ver mapeamento completo em: `config/sources.json`
|
||||
|
||||
---
|
||||
|
||||
## Detecção de Lacunas
|
||||
|
||||
### Quando Detectar
|
||||
- Pesquisa retorna 0 resultados
|
||||
- Resultados irrelevantes para o contexto
|
||||
- Tema recorrente sem documentação
|
||||
- Decisão importante não registada
|
||||
|
||||
### Acção Sugerida
|
||||
```markdown
|
||||
> [!warning] Lacuna Detectada
|
||||
> Tema "[X]" não tem documentação adequada.
|
||||
>
|
||||
> Sugestão:
|
||||
> - [ ] Criar dataset Dify: [nome sugerido]
|
||||
> - [ ] Criar página WikiJS: [path sugerido]
|
||||
> - [ ] Guardar em Supabase: [se for decisão/contexto]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Lacunas Conhecidas
|
||||
|
||||
### Datasets Dify em Falta
|
||||
- [ ] Claude Code (boas práticas, skills, hooks)
|
||||
- [ ] MCP Servers (configuração, troubleshooting)
|
||||
- [ ] Obsidian (workflows, plugins, templates)
|
||||
- [ ] Git/Gitea (workflows, CI/CD)
|
||||
- [ ] EasyPanel (deploy, containers)
|
||||
|
||||
### Páginas WikiJS em Falta
|
||||
- [ ] Arquitectura do Sistema (Stack completo)
|
||||
- [ ] Guia MCPs Disponíveis
|
||||
- [ ] Procedimentos de Backup
|
||||
- [ ] Onboarding Novos Projectos
|
||||
|
||||
---
|
||||
|
||||
## Sincronização (/kb-sync)
|
||||
|
||||
O comando `/kb-sync` actualiza automaticamente o índice de datasets Dify.
|
||||
|
||||
### O que faz
|
||||
1. Lista todos os datasets via `mcp__dify-kb__dify_kb_list_datasets`
|
||||
2. Compara com `config/sources.json`
|
||||
3. Actualiza IDs, nomes e contagem de documentos
|
||||
4. Detecta datasets novos (não mapeados)
|
||||
5. Detecta datasets removidos
|
||||
6. Actualiza timestamp `last_sync`
|
||||
|
||||
### Quando usar
|
||||
- Após criar/remover datasets no Dify
|
||||
- Periodicamente (semanal recomendado)
|
||||
- Quando pesquisas falham por ID inválido
|
||||
|
||||
### Output esperado
|
||||
```markdown
|
||||
## Sync Concluído
|
||||
|
||||
**Datasets:** 73 (anterior: 74)
|
||||
**Actualizados:** 5
|
||||
**Novos:** 0
|
||||
**Removidos:** 1 (Demo Teste Agosto 2025)
|
||||
|
||||
### Alterações
|
||||
| Dataset | Mudança |
|
||||
|---------|---------|
|
||||
| marketing-digital | docs: 81 → 85 |
|
||||
| crocoblock-kb | docs: 403 → 410 |
|
||||
```
|
||||
|
||||
### Estrutura do sources.json
|
||||
```json
|
||||
{
|
||||
"version": "1.1.0",
|
||||
"updated": "2026-01-25T15:30:00Z",
|
||||
"last_sync": "2026-01-25T15:30:00Z",
|
||||
"total_datasets": 73,
|
||||
"dify_datasets": {
|
||||
"nome-slug": {
|
||||
"id": "uuid-do-dify",
|
||||
"name": "Nome Original",
|
||||
"docs": 123
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Workflow Guardar Conhecimento
|
||||
|
||||
### /kb-save [tema]
|
||||
```
|
||||
1. Analisar tipo de conhecimento
|
||||
2. Determinar destino:
|
||||
- Decisão/Contexto → Supabase
|
||||
- Procedimento → WikiJS
|
||||
- Conhecimento temático → Dify KB
|
||||
3. Formatar conteúdo
|
||||
4. Guardar com metadata adequada
|
||||
5. Confirmar gravação
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Exemplos de Uso
|
||||
|
||||
### Pesquisa Técnica
|
||||
```
|
||||
/kb como configurar crocoblock filters
|
||||
→ Dify (Crocoblock) → Context7 (docs) → resultado agregado
|
||||
```
|
||||
|
||||
### Pesquisa Contexto
|
||||
```
|
||||
/kb porque escolhemos easypanel
|
||||
→ Supabase (decisões) → Obsidian (notas) → resultado
|
||||
```
|
||||
|
||||
### Pesquisa Procedimento
|
||||
```
|
||||
/kb como fazer backup wordpress
|
||||
→ WikiJS (procedimentos) → Dify (WordPress) → resultado
|
||||
```
|
||||
|
||||
### Guardar Decisão
|
||||
```
|
||||
/kb-save decisão
|
||||
"Escolhemos Remotion para vídeos porque..."
|
||||
→ Supabase com tags: [decisão, video, remotion]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Referências
|
||||
|
||||
- [[03-Recursos/Indice-Conhecimento]] - Inventário completo de fontes
|
||||
- [[StackUpdate]] - Roadmap do sistema
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Datasets Dify (Consulta Obrigatória)
|
||||
|
||||
Esta skill já faz routing automático para datasets Dify, mas em caso de dúvidas técnicas sobre a própria gestão de conhecimento:
|
||||
|
||||
| Dataset | ID | Prioridade |
|
||||
|---------|----|-----------:|
|
||||
| **Data Lake Descomplicar** | `b4e233d6-0d78-42f6-aef4-a56280600fe8` | 1 |
|
||||
| **Dify** | `44d1517b-65b8-4d81-8253-5683ff0b8830` | 2 |
|
||||
| **Obsidian + Claude Code** | `e38a510f-ca93-4407-8b44-c4c66efe01f8` | 2 |
|
||||
|
||||
### Como Consultar
|
||||
|
||||
```javascript
|
||||
// Pesquisar no Data Lake geral
|
||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
||||
dataset_id: "b4e233d6-0d78-42f6-aef4-a56280600fe8",
|
||||
query: "[termo de pesquisa]"
|
||||
})
|
||||
|
||||
// Configuração e uso do Dify
|
||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
||||
dataset_id: "44d1517b-65b8-4d81-8253-5683ff0b8830",
|
||||
query: "dataset segment retrieval"
|
||||
})
|
||||
|
||||
// Integração Obsidian + Claude
|
||||
mcp__dify-kb__dify_kb_retrieve_segments({
|
||||
dataset_id: "e38a510f-ca93-4407-8b44-c4c66efe01f8",
|
||||
query: "vault workflow dataview"
|
||||
})
|
||||
```
|
||||
|
||||
### Quando Consultar
|
||||
|
||||
- Configurar novo dataset Dify
|
||||
- Optimizar estratégia de retrieval
|
||||
- Integrar Obsidian com Claude Code
|
||||
- Criar workflows de gestão de conhecimento
|
||||
|
||||
---
|
||||
|
||||
## Checklist de Pesquisa
|
||||
|
||||
Antes de responder ao utilizador:
|
||||
|
||||
- [ ] Categoria correctamente identificada
|
||||
- [ ] Fontes prioritárias consultadas
|
||||
- [ ] Score de relevância >70 (ou >30 agregado)
|
||||
- [ ] Lacunas detectadas e reportadas
|
||||
- [ ] Resultados formatados correctamente
|
||||
- [ ] Links relacionados incluídos
|
||||
|
||||
---
|
||||
|
||||
## Changelog
|
||||
|
||||
### v1.1.0 (2026-02-03)
|
||||
- **Workflow completo** - 5 passos detalhados com código
|
||||
- **Routing inteligente** - Mapeamento categoria → fontes
|
||||
- **Pesquisa paralela** - Múltiplos datasets Dify simultâneos
|
||||
- **Score de relevância** - Avaliação automática (0-100)
|
||||
- **Detecção de lacunas** - Auto-report e sugestões
|
||||
- **Checklist** - Validação antes de responder
|
||||
|
||||
### v1.0.0 (2026-01-25)
|
||||
- Versão inicial
|
||||
- Routing manual por tema
|
||||
- Datasets Dify mapeados
|
||||
- Integração com 5 fontes
|
||||
|
||||
---
|
||||
|
||||
**Versão**: 1.1.0 | **Data**: 2026-02-03 | **Autor**: Descomplicar®
|
||||
1740
gestao/skills/knowledge/config/sources.json
Normal file
1740
gestao/skills/knowledge/config/sources.json
Normal file
File diff suppressed because it is too large
Load Diff
0
gestao/skills/knowledge/config/sources.json.tmp
Normal file
0
gestao/skills/knowledge/config/sources.json.tmp
Normal file
239
gestao/skills/knowledge/docs/sync-workflow.md
Normal file
239
gestao/skills/knowledge/docs/sync-workflow.md
Normal file
@@ -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*
|
||||
266
gestao/skills/knowledge/docs/workflow.md
Normal file
266
gestao/skills/knowledge/docs/workflow.md
Normal file
@@ -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__memory-supabase__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/GDrive/Cloud/EAL/Planeamento/ (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*
|
||||
Reference in New Issue
Block a user