whatsapp-docs-mcp 1.0.0 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,17 +1,124 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeText = normalizeText;
3
4
  exports.searchInContent = searchInContent;
4
5
  exports.extractTitle = extractTitle;
5
6
  exports.extractDescription = extractDescription;
6
7
  exports.extractExcerpt = extractExcerpt;
7
8
  exports.calculateRelevance = calculateRelevance;
8
9
  /**
9
- * Busca textual simples em conteúdo markdown
10
+ * Normaliza texto removendo acentos e convertendo para minúsculas
10
11
  */
11
- function searchInContent(content, query) {
12
- const normalizedQuery = query.toLowerCase().trim();
13
- const normalizedContent = content.toLowerCase();
14
- return normalizedContent.includes(normalizedQuery);
12
+ function normalizeText(text) {
13
+ return text.normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase();
14
+ }
15
+ /**
16
+ * Divide texto em palavras, considerando underscores, hífens e espaços como separadores
17
+ */
18
+ function splitIntoWords(text) {
19
+ return text
20
+ .replace(/[_\-\s]+/g, ' ') // Substitui underscores, hífens e múltiplos espaços por espaço
21
+ .split(/\s+/)
22
+ .filter(w => w.length > 0);
23
+ }
24
+ /**
25
+ * Remove sufixos comuns para melhor matching (plural, etc)
26
+ */
27
+ function normalizeWord(word) {
28
+ // Remove sufixos comuns de plural em inglês
29
+ if (word.length > 3) {
30
+ if (word.endsWith('s') && !word.endsWith('ss')) {
31
+ return word.slice(0, -1);
32
+ }
33
+ if (word.endsWith('es')) {
34
+ return word.slice(0, -2);
35
+ }
36
+ if (word.endsWith('ies')) {
37
+ return word.slice(0, -3) + 'y';
38
+ }
39
+ }
40
+ return word;
41
+ }
42
+ /**
43
+ * Busca textual melhorada em conteúdo markdown
44
+ * Busca por palavras individuais e considera nome do arquivo
45
+ * Melhorado para considerar underscores/hífens e usar lógica mais flexível
46
+ */
47
+ function searchInContent(content, query, filePath) {
48
+ const normalizedQuery = normalizeText(query.trim());
49
+ const normalizedContent = normalizeText(content);
50
+ const normalizedFilePath = filePath ? normalizeText(filePath) : '';
51
+ // Busca no nome do arquivo primeiro (maior relevância) - busca exata
52
+ if (filePath && normalizedFilePath.includes(normalizedQuery)) {
53
+ return true;
54
+ }
55
+ // Divide query em palavras considerando underscores/hífens
56
+ const queryWords = splitIntoWords(normalizedQuery).filter(w => w.length > 2);
57
+ // Se query tem múltiplas palavras, usa lógica mais flexível
58
+ if (queryWords.length > 1) {
59
+ // Primeiro tenta encontrar todas as palavras (AND)
60
+ const allWordsFound = queryWords.every(word => {
61
+ const normalizedWord = normalizeWord(word);
62
+ return normalizedContent.includes(word) ||
63
+ normalizedContent.includes(normalizedWord) ||
64
+ normalizedFilePath.includes(word) ||
65
+ normalizedFilePath.includes(normalizedWord);
66
+ });
67
+ if (allWordsFound) {
68
+ return true;
69
+ }
70
+ // Se não encontrou todas, tenta encontrar palavras-chave principais
71
+ // Considera que se encontrar pelo menos 2 palavras principais, é relevante
72
+ const mainWords = queryWords.filter(w => w.length >= 4); // Palavras com 4+ caracteres são mais importantes
73
+ if (mainWords.length >= 2) {
74
+ const foundMainWords = mainWords.filter(word => {
75
+ const normalizedWord = normalizeWord(word);
76
+ return normalizedContent.includes(word) ||
77
+ normalizedContent.includes(normalizedWord) ||
78
+ normalizedFilePath.includes(word) ||
79
+ normalizedFilePath.includes(normalizedWord);
80
+ });
81
+ // Se há apenas 2 palavras principais, precisa encontrar ambas
82
+ // Se há 3 ou mais, precisa encontrar pelo menos 2/3 (arredondado para cima)
83
+ const requiredMainWords = mainWords.length === 2
84
+ ? 2 // Exige ambas quando há apenas 2
85
+ : Math.ceil(mainWords.length * 2 / 3); // Pelo menos 2/3 quando há 3+
86
+ if (foundMainWords.length >= requiredMainWords) {
87
+ return true;
88
+ }
89
+ }
90
+ // Fallback especial: busca por palavras no nome do arquivo quando há correspondência forte
91
+ // Isso ajuda com casos como "typing_indicators.md" quando busca por "typing indicator"
92
+ const wordsInFilePath = splitIntoWords(normalizedFilePath);
93
+ // Verifica quais palavras da query estão no arquivo ou no conteúdo
94
+ const foundWords = new Set();
95
+ queryWords.forEach((qw, idx) => {
96
+ const normalizedQw = normalizeWord(qw);
97
+ // Verifica no nome do arquivo
98
+ const inFile = wordsInFilePath.some(fw => {
99
+ const normalizedFw = normalizeWord(fw);
100
+ return fw === qw || fw === normalizedQw || normalizedFw === qw || normalizedFw === normalizedQw ||
101
+ fw.includes(qw) || fw.includes(normalizedQw) || normalizedFw.includes(qw) || normalizedFw.includes(normalizedQw) ||
102
+ (normalizedQw.length >= 4 && (normalizedQw.includes(fw) || qw.includes(fw) || normalizedQw.includes(normalizedFw)));
103
+ });
104
+ // Verifica no conteúdo
105
+ const inContent = normalizedContent.includes(qw) || normalizedContent.includes(normalizedQw);
106
+ if (inFile || inContent) {
107
+ foundWords.add(idx);
108
+ }
109
+ });
110
+ // Se encontrou pelo menos 2 palavras (no arquivo ou conteúdo), retorna true
111
+ if (foundWords.size >= 2) {
112
+ return true;
113
+ }
114
+ return false;
115
+ }
116
+ // Busca simples para query de uma palavra
117
+ const normalizedQueryWord = normalizeWord(normalizedQuery);
118
+ return normalizedContent.includes(normalizedQuery) ||
119
+ normalizedContent.includes(normalizedQueryWord) ||
120
+ normalizedFilePath.includes(normalizedQuery) ||
121
+ normalizedFilePath.includes(normalizedQueryWord);
15
122
  }
16
123
  /**
17
124
  * Extrai título do arquivo markdown (primeiro # ou nome do arquivo)
@@ -56,10 +163,16 @@ function extractDescription(content, maxLength = 200) {
56
163
  * Extrai trecho relevante ao redor da busca
57
164
  */
58
165
  function extractExcerpt(content, query, contextLines = 3) {
59
- const normalizedQuery = query.toLowerCase();
166
+ const normalizedQuery = normalizeText(query);
60
167
  const lines = content.split('\n');
168
+ // Busca por palavras individuais também
169
+ const queryWords = normalizedQuery.split(/\s+/).filter(w => w.length > 2);
61
170
  for (let i = 0; i < lines.length; i++) {
62
- if (lines[i].toLowerCase().includes(normalizedQuery)) {
171
+ const normalizedLine = normalizeText(lines[i]);
172
+ // Verifica se linha contém query completa ou todas as palavras
173
+ const matchesQuery = normalizedLine.includes(normalizedQuery) ||
174
+ (queryWords.length > 0 && queryWords.every(word => normalizedLine.includes(word)));
175
+ if (matchesQuery) {
63
176
  const start = Math.max(0, i - contextLines);
64
177
  const end = Math.min(lines.length, i + contextLines + 1);
65
178
  const excerpt = lines.slice(start, end).join('\n');
@@ -74,18 +187,64 @@ function extractExcerpt(content, query, contextLines = 3) {
74
187
  return lines.slice(0, 5).join('\n').substring(0, 300);
75
188
  }
76
189
  /**
77
- * Calcula relevância simples baseada em ocorrências
190
+ * Calcula relevância melhorada baseada em ocorrências, nome do arquivo e título
78
191
  */
79
- function calculateRelevance(content, query) {
80
- const normalizedQuery = query.toLowerCase();
81
- const normalizedContent = content.toLowerCase();
82
- const words = normalizedQuery.split(/\s+/).filter(w => w.length > 2);
192
+ function calculateRelevance(content, query, filePath) {
193
+ const normalizedQuery = normalizeText(query);
194
+ const normalizedContent = normalizeText(content);
195
+ const normalizedFilePath = filePath ? normalizeText(filePath) : '';
196
+ const queryWords = splitIntoWords(normalizedQuery).filter(w => w.length > 2);
83
197
  let score = 0;
84
- words.forEach(word => {
85
- const occurrences = (normalizedContent.match(new RegExp(word, 'g')) || []).length;
86
- score += occurrences;
198
+ // Bônus alto se encontra no nome do arquivo (busca exata)
199
+ if (filePath && normalizedFilePath.includes(normalizedQuery)) {
200
+ score += 50;
201
+ }
202
+ // Bônus se palavras do nome do arquivo correspondem à query
203
+ if (filePath) {
204
+ const fileWords = splitIntoWords(normalizedFilePath);
205
+ queryWords.forEach(qw => {
206
+ const normalizedQw = normalizeWord(qw);
207
+ fileWords.forEach(fw => {
208
+ if (fw === qw || fw === normalizedQw || fw.includes(qw) || qw.includes(fw)) {
209
+ score += 15;
210
+ }
211
+ });
212
+ });
213
+ }
214
+ // Bônus se encontra no título (primeiro H1)
215
+ const h1Match = content.match(/^#\s+(.+)$/m);
216
+ if (h1Match) {
217
+ const normalizedTitle = normalizeText(h1Match[1]);
218
+ if (normalizedTitle.includes(normalizedQuery)) {
219
+ score += 30;
220
+ }
221
+ // Bônus adicional se cada palavra da query está no título
222
+ queryWords.forEach(word => {
223
+ const normalizedWord = normalizeWord(word);
224
+ if (normalizedTitle.includes(word) || normalizedTitle.includes(normalizedWord)) {
225
+ score += 5;
226
+ }
227
+ });
228
+ }
229
+ // Conta ocorrências de cada palavra no conteúdo
230
+ queryWords.forEach(word => {
231
+ const normalizedWord = normalizeWord(word);
232
+ const contentMatches = (normalizedContent.match(new RegExp(word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')) || []).length;
233
+ const normalizedMatches = (normalizedContent.match(new RegExp(normalizedWord.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')) || []).length;
234
+ score += (contentMatches + normalizedMatches) * 2;
235
+ // Bônus adicional se palavra está no nome do arquivo
236
+ if (normalizedFilePath.includes(word) || normalizedFilePath.includes(normalizedWord)) {
237
+ score += 10;
238
+ }
87
239
  });
88
- // Normaliza para 0-1
89
- return Math.min(1, score / 10);
240
+ // Se query de uma palavra, também conta ocorrências da query completa
241
+ if (queryWords.length === 0 && normalizedQuery.length > 2) {
242
+ const normalizedQueryWord = normalizeWord(normalizedQuery);
243
+ const fullMatches = (normalizedContent.match(new RegExp(normalizedQuery.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')) || []).length;
244
+ const normalizedFullMatches = (normalizedContent.match(new RegExp(normalizedQueryWord.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')) || []).length;
245
+ score += (fullMatches + normalizedFullMatches) * 2;
246
+ }
247
+ // Normaliza para 0-100
248
+ return Math.min(100, score);
90
249
  }
91
250
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/utils/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/utils/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.d.ts","sourceRoot":"","sources":["../../src/utils/search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const search_1 = require("./search");
5
+ (0, vitest_1.describe)('normalizeText', () => {
6
+ (0, vitest_1.it)('deve remover acentos de texto', () => {
7
+ (0, vitest_1.expect)((0, search_1.normalizeText)('áudio')).toBe('audio');
8
+ (0, vitest_1.expect)((0, search_1.normalizeText)('ÁUDIO')).toBe('audio');
9
+ (0, vitest_1.expect)((0, search_1.normalizeText)('mensagem')).toBe('mensagem');
10
+ (0, vitest_1.expect)((0, search_1.normalizeText)('Mensagem')).toBe('mensagem');
11
+ });
12
+ (0, vitest_1.it)('deve converter para minúsculas', () => {
13
+ (0, vitest_1.expect)((0, search_1.normalizeText)('AUDIO')).toBe('audio');
14
+ (0, vitest_1.expect)((0, search_1.normalizeText)('Audio')).toBe('audio');
15
+ });
16
+ (0, vitest_1.it)('deve tratar textos com e sem acentos como iguais', () => {
17
+ (0, vitest_1.expect)((0, search_1.normalizeText)('áudio')).toBe((0, search_1.normalizeText)('audio'));
18
+ (0, vitest_1.expect)((0, search_1.normalizeText)('Mensagem')).toBe((0, search_1.normalizeText)('mensagem'));
19
+ });
20
+ });
21
+ (0, vitest_1.describe)('searchInContent', () => {
22
+ const sampleContent = 'É possível usar a API para enviar mensagens de voz e mensagens de áudio básicas.';
23
+ (0, vitest_1.it)('deve encontrar query simples no conteúdo', () => {
24
+ (0, vitest_1.expect)((0, search_1.searchInContent)(sampleContent, 'áudio')).toBe(true);
25
+ (0, vitest_1.expect)((0, search_1.searchInContent)(sampleContent, 'audio')).toBe(true);
26
+ (0, vitest_1.expect)((0, search_1.searchInContent)(sampleContent, 'mensagens')).toBe(true);
27
+ });
28
+ (0, vitest_1.it)('deve encontrar query no nome do arquivo', () => {
29
+ const filePath = 'mensagens/tipos_de_mensagens/audio_messages.md';
30
+ (0, vitest_1.expect)((0, search_1.searchInContent)('conteúdo qualquer', 'audio', filePath)).toBe(true);
31
+ (0, vitest_1.expect)((0, search_1.searchInContent)('conteúdo qualquer', 'áudio', filePath)).toBe(true);
32
+ });
33
+ (0, vitest_1.it)('deve encontrar múltiplas palavras (AND)', () => {
34
+ const content = 'mensagens de áudio podem ser enviadas';
35
+ // "audio" e "mensagens" estão ambas no conteúdo
36
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'audio mensagens')).toBe(true);
37
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'mensagens audio')).toBe(true);
38
+ // "video" não está no conteúdo
39
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'video mensagens')).toBe(false);
40
+ });
41
+ (0, vitest_1.it)('deve retornar false quando não encontra', () => {
42
+ (0, vitest_1.expect)((0, search_1.searchInContent)(sampleContent, 'vídeo')).toBe(false);
43
+ (0, vitest_1.expect)((0, search_1.searchInContent)(sampleContent, 'imagem')).toBe(false);
44
+ });
45
+ (0, vitest_1.it)('deve ignorar palavras muito curtas', () => {
46
+ const content = 'teste de busca';
47
+ // Palavras com menos de 3 caracteres são ignoradas
48
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'de')).toBe(true); // Mas ainda busca a string completa
49
+ });
50
+ (0, vitest_1.it)('deve encontrar typing indicator no arquivo typing_indicators.md', () => {
51
+ const content = `# Indicadores de digitação
52
+
53
+ Quando você recebe um webhook de mensagens indicando uma mensagem recebida, é possível usar o valor message.id para marcar a mensagem como lida e exibir um indicador de digitação. Dessa forma, o usuário do WhatsApp saberá que você está escrevendo uma resposta.
54
+
55
+ O indicador de digitação será removido depois que você responder ou após 25 segundos.
56
+
57
+ "typing_indicator": {
58
+ "type": "text"
59
+ }`;
60
+ const filePath = 'mensagens/recursos_adicionais/typing_indicators.md';
61
+ // Deve encontrar com diferentes variações da query
62
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'typing indicator', filePath)).toBe(true);
63
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'typing indicator digitando', filePath)).toBe(true);
64
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'typing indicator digitando typing', filePath)).toBe(true);
65
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'indicador digitação', filePath)).toBe(true);
66
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'indicadores de digitação', filePath)).toBe(true);
67
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'typing_indicators', filePath)).toBe(true);
68
+ });
69
+ (0, vitest_1.it)('deve encontrar typing indicator mesmo quando algumas palavras não estão no conteúdo', () => {
70
+ const content = `# Indicadores de digitação
71
+ É possível usar o valor message.id para marcar a mensagem como lida e exibir um indicador de digitação.`;
72
+ const filePath = 'mensagens/recursos_adicionais/typing_indicators.md';
73
+ // Mesmo que a query tenha palavras extras, deve encontrar porque o arquivo tem "typing_indicators" no nome
74
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'typing indicator digitando typing', filePath)).toBe(true);
75
+ });
76
+ (0, vitest_1.it)('deve considerar underscores e hífens como separadores', () => {
77
+ const content = 'Conteúdo sobre indicadores de digitação';
78
+ const filePath1 = 'mensagens/recursos_adicionais/typing_indicators.md';
79
+ const filePath2 = 'mensagens/recursos_adicionais/typing-indicators.md';
80
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'typing indicator', filePath1)).toBe(true);
81
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'typing indicator', filePath2)).toBe(true);
82
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'typing_indicators', filePath1)).toBe(true);
83
+ });
84
+ (0, vitest_1.it)('deve encontrar gravação de áudio', () => {
85
+ const content = `# Mensagens de áudio
86
+ É possível usar a API para enviar mensagens de voz e mensagens de áudio básicas.
87
+ As mensagens de áudio podem ser gravadas e enviadas.
88
+ Você pode gravar áudio usando a API para recording messages.
89
+ A gravação de áudio é suportada pela API.`;
90
+ const filePath = 'mensagens/tipos_de_mensagens/audio.md';
91
+ // "audio" está no conteúdo e no nome do arquivo, então deve encontrar
92
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'audio gravadas', filePath)).toBe(true);
93
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'audio gravar', filePath)).toBe(true);
94
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'recording audio', filePath)).toBe(true);
95
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'audio recording', filePath)).toBe(true);
96
+ // "gravação" e "audio" estão ambos no conteúdo
97
+ (0, vitest_1.expect)((0, search_1.searchInContent)(content, 'gravação audio', filePath)).toBe(true);
98
+ });
99
+ });
100
+ (0, vitest_1.describe)('calculateRelevance', () => {
101
+ const sampleContent = `# Mensagens de áudio
102
+
103
+ É possível usar a API para enviar mensagens de voz e mensagens de áudio básicas.
104
+ As mensagens de áudio são suportadas pela API.`;
105
+ (0, vitest_1.it)('deve dar alta relevância quando encontra no nome do arquivo', () => {
106
+ const filePath = 'mensagens/tipos_de_mensagens/audio_messages.md';
107
+ const relevance = (0, search_1.calculateRelevance)(sampleContent, 'audio', filePath);
108
+ (0, vitest_1.expect)(relevance).toBeGreaterThan(50);
109
+ });
110
+ (0, vitest_1.it)('deve dar relevância quando encontra no título', () => {
111
+ const relevance = (0, search_1.calculateRelevance)(sampleContent, 'áudio', 'outro_arquivo.md');
112
+ (0, vitest_1.expect)(relevance).toBeGreaterThan(30);
113
+ });
114
+ (0, vitest_1.it)('deve dar maior relevância para queries mais relevantes', () => {
115
+ const filePath = 'mensagens/tipos_de_mensagens/audio_messages.md';
116
+ const relevanceAudio = (0, search_1.calculateRelevance)(sampleContent, 'audio', filePath);
117
+ const relevanceVideo = (0, search_1.calculateRelevance)(sampleContent, 'video', filePath);
118
+ (0, vitest_1.expect)(relevanceAudio).toBeGreaterThan(relevanceVideo);
119
+ });
120
+ (0, vitest_1.it)('deve retornar 0 para conteúdo não relacionado', () => {
121
+ const content = 'Conteúdo sobre vídeos e imagens';
122
+ const relevance = (0, search_1.calculateRelevance)(content, 'audio', 'outro.md');
123
+ (0, vitest_1.expect)(relevance).toBe(0);
124
+ });
125
+ (0, vitest_1.it)('deve considerar múltiplas ocorrências', () => {
126
+ const content = 'áudio áudio áudio áudio';
127
+ const relevance = (0, search_1.calculateRelevance)(content, 'audio', 'test.md');
128
+ (0, vitest_1.expect)(relevance).toBeGreaterThan(0);
129
+ });
130
+ (0, vitest_1.it)('deve dar alta relevância para typing indicator no arquivo correto', () => {
131
+ const content = `# Indicadores de digitação
132
+ É possível usar o valor message.id para marcar a mensagem como lida e exibir um indicador de digitação.
133
+ "typing_indicator": {
134
+ "type": "text"
135
+ }`;
136
+ const filePath = 'mensagens/recursos_adicionais/typing_indicators.md';
137
+ const relevance1 = (0, search_1.calculateRelevance)(content, 'typing indicator', filePath);
138
+ const relevance2 = (0, search_1.calculateRelevance)(content, 'typing indicator digitando', filePath);
139
+ const relevance3 = (0, search_1.calculateRelevance)(content, 'indicador digitação', filePath);
140
+ // Todas devem ter relevância alta porque o arquivo corresponde
141
+ (0, vitest_1.expect)(relevance1).toBeGreaterThan(30);
142
+ (0, vitest_1.expect)(relevance2).toBeGreaterThan(20);
143
+ (0, vitest_1.expect)(relevance3).toBeGreaterThan(20);
144
+ });
145
+ (0, vitest_1.it)('deve considerar palavras com underscore no cálculo de relevância', () => {
146
+ const content = 'Conteúdo sobre typing indicators';
147
+ const filePath = 'mensagens/recursos_adicionais/typing_indicators.md';
148
+ const relevance = (0, search_1.calculateRelevance)(content, 'typing indicator', filePath);
149
+ (0, vitest_1.expect)(relevance).toBeGreaterThan(30); // Deve dar bônus por estar no nome do arquivo
150
+ });
151
+ });
152
+ (0, vitest_1.describe)('extractTitle', () => {
153
+ (0, vitest_1.it)('deve extrair título H1', () => {
154
+ const content = '# Título Principal\n\nConteúdo aqui';
155
+ (0, vitest_1.expect)((0, search_1.extractTitle)(content, 'test.md')).toBe('Título Principal');
156
+ });
157
+ (0, vitest_1.it)('deve extrair título H2 se não houver H1', () => {
158
+ const content = '## Título Secundário\n\nConteúdo aqui';
159
+ (0, vitest_1.expect)((0, search_1.extractTitle)(content, 'test.md')).toBe('Título Secundário');
160
+ });
161
+ (0, vitest_1.it)('deve usar nome do arquivo como fallback', () => {
162
+ const content = 'Conteúdo sem título';
163
+ (0, vitest_1.expect)((0, search_1.extractTitle)(content, 'audio_messages.md')).toBe('audio messages');
164
+ });
165
+ (0, vitest_1.it)('deve normalizar nome do arquivo', () => {
166
+ const content = 'Conteúdo sem título';
167
+ (0, vitest_1.expect)((0, search_1.extractTitle)(content, 'tipos-de-mensagens.md')).toBe('tipos de mensagens');
168
+ });
169
+ });
170
+ (0, vitest_1.describe)('extractExcerpt', () => {
171
+ const content = `Linha 1
172
+ Linha 2
173
+ Linha 3 com áudio
174
+ Linha 4
175
+ Linha 5`;
176
+ (0, vitest_1.it)('deve extrair trecho ao redor da busca', () => {
177
+ const excerpt = (0, search_1.extractExcerpt)(content, 'áudio');
178
+ (0, vitest_1.expect)(excerpt).toContain('áudio');
179
+ (0, vitest_1.expect)(excerpt.split('\n').length).toBeGreaterThan(1);
180
+ });
181
+ (0, vitest_1.it)('deve encontrar com normalização', () => {
182
+ const excerpt = (0, search_1.extractExcerpt)(content, 'audio');
183
+ (0, vitest_1.expect)(excerpt).toContain('áudio');
184
+ });
185
+ (0, vitest_1.it)('deve limitar tamanho do excerpt', () => {
186
+ const longContent = 'a\n'.repeat(200) + 'linha com audio\n' + 'b\n'.repeat(200);
187
+ const excerpt = (0, search_1.extractExcerpt)(longContent, 'audio');
188
+ (0, vitest_1.expect)(excerpt.length).toBeLessThanOrEqual(303); // 300 + '...'
189
+ });
190
+ (0, vitest_1.it)('deve retornar primeiras linhas como fallback', () => {
191
+ const contentWithoutMatch = 'Linha 1\nLinha 2\nLinha 3';
192
+ const excerpt = (0, search_1.extractExcerpt)(contentWithoutMatch, 'xyz');
193
+ (0, vitest_1.expect)(excerpt.length).toBeGreaterThan(0);
194
+ });
195
+ });
196
+ //# sourceMappingURL=search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.js","sourceRoot":"","sources":["../../src/utils/search.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,qCAMkB;AAElB,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,IAAA,eAAM,EAAC,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAA,eAAM,EAAC,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAA,eAAM,EAAC,IAAA,sBAAa,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnD,IAAA,eAAM,EAAC,IAAA,sBAAa,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,IAAA,eAAM,EAAC,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAA,eAAM,EAAC,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,IAAA,eAAM,EAAC,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,IAAA,sBAAa,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAA,sBAAa,EAAC,UAAU,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,aAAa,GAAG,kFAAkF,CAAC;IAEzG,IAAA,WAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,QAAQ,GAAG,gDAAgD,CAAC;QAClE,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,mBAAmB,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,mBAAmB,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,uCAAuC,CAAC;QACxD,gDAAgD;QAChD,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,+BAA+B;QAC/B,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,OAAO,GAAG,gBAAgB,CAAC;QACjC,mDAAmD;QACnD,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,oCAAoC;IACzF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,OAAO,GAAG;;;;;;;;EAQlB,CAAC;QACC,MAAM,QAAQ,GAAG,oDAAoD,CAAC;QAEtE,mDAAmD;QACnD,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,4BAA4B,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpF,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,mCAAmC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3F,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,0BAA0B,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,OAAO,GAAG;wGACoF,CAAC;QACrG,MAAM,QAAQ,GAAG,oDAAoD,CAAC;QAEtE,2GAA2G;QAC3G,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,mCAAmC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,OAAO,GAAG,yCAAyC,CAAC;QAC1D,MAAM,SAAS,GAAG,oDAAoD,CAAC;QACvE,MAAM,SAAS,GAAG,oDAAoD,CAAC;QAEvE,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,OAAO,GAAG;;;;0CAIsB,CAAC;QACvC,MAAM,QAAQ,GAAG,uCAAuC,CAAC;QAEzD,sEAAsE;QACtE,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,+CAA+C;QAC/C,IAAA,eAAM,EAAC,IAAA,wBAAe,EAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,MAAM,aAAa,GAAG;;;+CAGuB,CAAC;IAE9C,IAAA,WAAE,EAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,QAAQ,GAAG,gDAAgD,CAAC;QAClE,MAAM,SAAS,GAAG,IAAA,2BAAkB,EAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvE,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,SAAS,GAAG,IAAA,2BAAkB,EAAC,aAAa,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACjF,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,QAAQ,GAAG,gDAAgD,CAAC;QAClE,MAAM,cAAc,GAAG,IAAA,2BAAkB,EAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5E,MAAM,cAAc,GAAG,IAAA,2BAAkB,EAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE5E,IAAA,eAAM,EAAC,cAAc,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,OAAO,GAAG,iCAAiC,CAAC;QAClD,MAAM,SAAS,GAAG,IAAA,2BAAkB,EAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACnE,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,yBAAyB,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAA,2BAAkB,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAClE,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,OAAO,GAAG;;;;EAIlB,CAAC;QACC,MAAM,QAAQ,GAAG,oDAAoD,CAAC;QAEtE,MAAM,UAAU,GAAG,IAAA,2BAAkB,EAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC7E,MAAM,UAAU,GAAG,IAAA,2BAAkB,EAAC,OAAO,EAAE,4BAA4B,EAAE,QAAQ,CAAC,CAAC;QACvF,MAAM,UAAU,GAAG,IAAA,2BAAkB,EAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QAEhF,+DAA+D;QAC/D,IAAA,eAAM,EAAC,UAAU,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACvC,IAAA,eAAM,EAAC,UAAU,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACvC,IAAA,eAAM,EAAC,UAAU,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,OAAO,GAAG,kCAAkC,CAAC;QACnD,MAAM,QAAQ,GAAG,oDAAoD,CAAC;QAEtE,MAAM,SAAS,GAAG,IAAA,2BAAkB,EAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC5E,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,8CAA8C;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,OAAO,GAAG,qCAAqC,CAAC;QACtD,IAAA,eAAM,EAAC,IAAA,qBAAY,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,uCAAuC,CAAC;QACxD,IAAA,eAAM,EAAC,IAAA,qBAAY,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,qBAAqB,CAAC;QACtC,IAAA,eAAM,EAAC,IAAA,qBAAY,EAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,OAAO,GAAG,qBAAqB,CAAC;QACtC,IAAA,eAAM,EAAC,IAAA,qBAAY,EAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,OAAO,GAAG;;;;QAIV,CAAC;IAEP,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,OAAO,GAAG,IAAA,uBAAc,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,IAAA,eAAM,EAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,OAAO,GAAG,IAAA,uBAAc,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,IAAA,uBAAc,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACrD,IAAA,eAAM,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc;IACjE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;QACxD,MAAM,OAAO,GAAG,IAAA,uBAAc,EAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAA,eAAM,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whatsapp-docs-mcp",
3
- "version": "1.0.0",
3
+ "version": "1.0.3",
4
4
  "description": "MCP server for WhatsApp Business API documentation - Access comprehensive WhatsApp Business API docs through Model Context Protocol",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -11,7 +11,11 @@
11
11
  "build": "tsc",
12
12
  "start": "node dist/index.js",
13
13
  "dev": "tsx watch src/index.ts",
14
- "prepublishOnly": "npm run build"
14
+ "test": "vitest",
15
+ "test:ui": "vitest --ui",
16
+ "test:run": "vitest run",
17
+ "test:coverage": "vitest run --coverage",
18
+ "prepublishOnly": "npm run build && npm run test:run"
15
19
  },
16
20
  "keywords": [
17
21
  "mcp",
@@ -44,7 +48,9 @@
44
48
  },
45
49
  "devDependencies": {
46
50
  "@types/node": "^20.11.0",
51
+ "@vitest/ui": "^4.0.16",
52
+ "tsx": "^4.7.0",
47
53
  "typescript": "^5.3.3",
48
- "tsx": "^4.7.0"
54
+ "vitest": "^4.0.16"
49
55
  }
50
56
  }