Imagem de capa do projeto: NEXUS Meilisearch EM ANDAMENTO

Resumo técnico

Plugin NEXUS que integra o Meilisearch (search engine open-source, self-hosted em Docker) para busca full-text typo-tolerant sobre tarefas e plugins — com autocomplete, filtros (status, projeto, prioridade), sorting e indexação em lote ou pontual via auto-index, sem custo por busca.

Escopo executado

  • plugin.json: v1.0.0, slug meilisearch, categoria "Search" (aba Search & Discovery, ícone search, is_core: false).
  • Stack self-hosted: instância Meilisearch via Docker Compose exposta em http://127.0.0.1:7700 — sem custo por busca; Master Key configurável no painel.
  • Config (DB::getConfig('plugin.meilisearch')): api_url (default http://127.0.0.1:7700, rtrim '/'), master_key (nunca exposta — apenas master_key_masked substr(0,4)…substr(-4) + flag master_key_set), auto_index (true), enabled (true), indexes (['tasks','plugins']).
  • HTTP (meili_request) — cURL com método custom e Authorization: Bearer <key>; timeout 60s, connect 5s; erro extraído de data.message.
  • Health (meilisearch_dashboard) — /health (online = status 'available'), /version, /stats, /indexes?limit=50, buscas recentes (30) e último índice, tudo em um payload.
  • Índices (meili_ensure_index) — cria via POST /indexes com uid + primaryKey (409 = já existe), aplica PATCH /settings e aguarda cada task (poll /tasks/{uid} a cada 200ms).
  • - tasks: searchable title, description, notes, project, nexus_id, id · filterable status, project, priority, holding, type · sortable updated_at, created_at, priority, seq. - plugins: searchable name, slug, description, category, author · filterable category, active, type · sortable name, slug.

  • IDs seguros (meili_safe_id) — a primary key do Meilisearch aceita só [a-zA-Z0-9_-]; IDs NEXUS contêm . e viram _, com o nexus_id original preservado no doc (fallback doc_<md5>).
  • Documentos — tasks: id, nexus_id, seq, title, description (strip_tags, 8000), notes (2000), project, priority, status, holding, created_at, updated_at, type; plugins: name, slug, description, category, version, author, active, type.
  • Indexação (meilisearch_index) — what: all|tasks|plugins, limit opcional, upload em chunks de 500 docs aguardando cada task (timeout 90s); meta last_index (at, indexed, what, errors) persistida.
  • Auto-index (meili_index_one_task) — indexação pontual na API interna respeitando enabled + auto_index; a leitura de tarefa em si é no-op (legacy filter desativado — evita flooding do índice).
  • Busca (meilisearch_search) — q, index (whitelist tasks/plugins), limit 1–50 (default 20), offset, filtro AND com escaping (status/project strings, priority int, active bool), sort default :desc; hits de tasks retornam nexus_id como id (com meili_id guardado); buscas recentes deduplicadas por index|q (máx 40) e estimatedTotalHits + processingTimeMs no resultado.
  • Sugestões (meilisearch_suggest) — top 8–10; tasks com label #seq título (+ status/projeto), plugins com nome (slug) e valor = slug.
  • Fastr /search (meilisearch_fastr) — markdown no comentário: lista numerada (plugins nome (slug) — categoria; tasks #seq título — status · projeto + id:), rodapé _hits≈N · Xms_.
  • API: 6 actions (meilisearch_dashboard, meilisearch_search, meilisearch_suggest, meilisearch_index, meilisearch_settings_save, meilisearch_fastr).
  • UI Alpine.js (tab.php) — tema slate (cinza + acentos cyan-600), aba Search & Discovery; badge Online/Offline; 4 stats cards (Índices, Docs DB, Tasks idx, Plugins idx); 4 sub-abas (Busca, Índices, Indexar, Configurações); busca com highlight, dicas quando o índice está vazio, botão Indexar tudo e Master Key mascarada nas configurações.
  • Sem cron, sem migrations, sem modais e sem i18n (textos em português).

Stack e ferramentas

  • PHP 8 (sem framework)
  • MySQL 8 (config via DB::getConfig('plugin.meilisearch') + buscas recentes)
  • Alpine.js + Tailwind CSS (premium light, slate/cyan)
  • cURL (timeout 60s, connect 5s, Bearer auth)
  • Meilisearch API (self-hosted, http://127.0.0.1:7700 — /health, /version, /stats, /indexes, /tasks, /search)
  • Plugin NEXUS (PluginManager: tabs, API actions, Fastr, filters)

Tags operacionais

  • Meilisearch
  • Full-Text Search
  • Typo Tolerance
  • Autocomplete
  • Search Engine
  • Self-Hosted
  • Plugin NEXUS

Resultado operacional

  • Busca instantânea e tolerante a erros: typo-tolerance nativa do Meilisearch com destaque nos campos, filtros e sorting — sem custo de API.
  • Indexação em dois modos: lote completo (tasks/plugins/all, chunks de 500) ou pontual via auto-index a cada alteração de tarefa.
  • Zero exposição de segredo: Master Key nunca sai do backend (apenas máscara XXXX…XXXX no painel).
  • Retorno amigável: hits de tasks voltam com nexus_id como id (o meili_id sanitizado fica preservado).
  • Rastreabilidade: buscas recentes deduplicadas (30 no dashboard) e meta de cada indexação (last_index).
  • Slash /search no chat: resultados markdown no comentário com contagem e tempo de processamento.

Andamento no GitHub (issues)

Painel em tempo real com as issues mais recentes do repositório.

abertas (amostra): -- fechadas (amostra): -- base: -- ultimas issues

carregando andamento...

Resultados reais

Plugin NEXUS que integra o Meilisearch (search engine open-source, self-hosted em Docker) para busca full-text typo-tolerant sobre tarefas e plugins — com autocomplete, filtros (status, projeto, prioridade), sorting e indexação em lote ou pontual via auto-index, sem custo por busca.

Arquitetura e organização

Execução e operação

O projeto segue fluxo reprodutível de execução com validação técnica em ambiente de produção/similar.

Screenshots

Falar sobre este projeto

Aplique este modelo no seu ambiente e acelere a entrega com consistência técnica.