@houtini/voice-analyser 1.2.1 → 1.3.0

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.
package/dist/index.js CHANGED
@@ -3,147 +3,87 @@
3
3
  * Voice Analysis MCP Server
4
4
  * Automatic tone-of-voice analysis from published writing corpus
5
5
  */
6
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
7
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
- import { CallToolRequestSchema, ListToolsRequestSchema, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
8
+ import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
9
+ import * as z from 'zod';
9
10
  import { collectCorpus } from './tools/collect-corpus.js';
10
11
  import { analyzeCorpus } from './tools/analyze-corpus.js';
11
- import { generateNarrativeGuide } from './tools/generate-narrative-guide.js';
12
- const server = new Server({
12
+ import { generateStyleGuide } from './tools/generate-narrative-guide-v3.js';
13
+ const server = new McpServer({
13
14
  name: 'voice-analysis-server',
14
- version: '1.0.0',
15
- }, {
16
- capabilities: {
17
- tools: {},
15
+ version: '1.2.1',
16
+ });
17
+ // Register tools using new SDK API
18
+ server.registerTool('collect_corpus', {
19
+ title: 'Collect Corpus',
20
+ description: 'Crawl sitemap and collect clean writing corpus from published articles',
21
+ inputSchema: {
22
+ sitemap_url: z.string().describe('URL to XML sitemap (e.g., https://example.com/post-sitemap.xml)'),
23
+ output_name: z.string().describe('Corpus identifier/name (e.g., "richard-baxter")'),
24
+ output_dir: z.string().describe('Directory to store corpus files (e.g., "C:/dev/corpus")'),
25
+ max_articles: z.number().optional().default(100).describe('Maximum articles to process (default: 100)'),
26
+ article_pattern: z.string().optional().describe('Optional regex to filter URLs'),
27
+ },
28
+ }, async ({ sitemap_url, output_name, output_dir, max_articles, article_pattern }) => {
29
+ try {
30
+ const result = await collectCorpus({
31
+ sitemap_url,
32
+ output_name,
33
+ output_dir,
34
+ max_articles,
35
+ article_pattern,
36
+ });
37
+ return {
38
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
39
+ };
40
+ }
41
+ catch (error) {
42
+ throw new McpError(ErrorCode.InternalError, `Corpus collection failed: ${error instanceof Error ? error.message : String(error)}`);
43
+ }
44
+ });
45
+ server.registerTool('analyze_corpus', {
46
+ title: 'Analyze Corpus',
47
+ description: 'Perform linguistic analysis on collected corpus (vocabulary, sentence structure, voice markers)',
48
+ inputSchema: {
49
+ corpus_name: z.string().describe('Name of corpus to analyze'),
50
+ corpus_dir: z.string().describe('Directory where corpus is stored'),
51
+ analysis_type: z.enum(['full', 'quick', 'vocabulary', 'syntax']).optional().default('full').describe('Type of analysis to perform (default: full)'),
18
52
  },
53
+ }, async ({ corpus_name, corpus_dir, analysis_type }) => {
54
+ try {
55
+ const result = await analyzeCorpus({
56
+ corpus_name,
57
+ corpus_dir,
58
+ analysis_type,
59
+ });
60
+ return {
61
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
62
+ };
63
+ }
64
+ catch (error) {
65
+ throw new McpError(ErrorCode.InternalError, `Corpus analysis failed: ${error instanceof Error ? error.message : String(error)}`);
66
+ }
19
67
  });
20
- // Register tools
21
- server.setRequestHandler(ListToolsRequestSchema, async () => ({
22
- tools: [
23
- {
24
- name: 'collect_corpus',
25
- description: 'Crawl sitemap and collect clean writing corpus from published articles',
26
- inputSchema: {
27
- type: 'object',
28
- properties: {
29
- sitemap_url: {
30
- type: 'string',
31
- description: 'URL to XML sitemap (e.g., https://example.com/post-sitemap.xml)'
32
- },
33
- output_name: {
34
- type: 'string',
35
- description: 'Corpus identifier/name (e.g., "richard-baxter")'
36
- },
37
- output_dir: {
38
- type: 'string',
39
- description: 'Directory to store corpus files (e.g., "C:/dev/corpus")'
40
- },
41
- max_articles: {
42
- type: 'number',
43
- description: 'Maximum articles to process (default: 100)',
44
- default: 100
45
- },
46
- article_pattern: {
47
- type: 'string',
48
- description: 'Optional regex to filter URLs'
49
- }
50
- },
51
- required: ['sitemap_url', 'output_name', 'output_dir'],
52
- },
53
- },
54
- {
55
- name: 'analyze_corpus',
56
- description: 'Perform linguistic analysis on collected corpus (vocabulary, sentence structure, voice markers)',
57
- inputSchema: {
58
- type: 'object',
59
- properties: {
60
- corpus_name: {
61
- type: 'string',
62
- description: 'Name of corpus to analyze'
63
- },
64
- corpus_dir: {
65
- type: 'string',
66
- description: 'Directory where corpus is stored'
67
- },
68
- analysis_type: {
69
- type: 'string',
70
- enum: ['full', 'quick', 'vocabulary', 'syntax'],
71
- description: 'Type of analysis to perform (default: full)',
72
- default: 'full'
73
- },
74
- },
75
- required: ['corpus_name', 'corpus_dir'],
76
- },
77
- },
78
- {
79
- name: 'generate_narrative_guide',
80
- description: 'Generate NARRATIVE voice immersion guide focused on examples, patterns, and flow rather than statistics. Teaches voice through immersion, not compliance.',
81
- inputSchema: {
82
- type: 'object',
83
- properties: {
84
- corpus_name: {
85
- type: 'string',
86
- description: 'Name of analyzed corpus'
87
- },
88
- corpus_dir: {
89
- type: 'string',
90
- description: 'Directory where corpus is stored'
91
- }
92
- },
93
- required: ['corpus_name', 'corpus_dir'],
94
- },
95
- },
96
- ],
97
- }));
98
- // Tool handlers
99
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
68
+ server.registerTool('generate_style_guide', {
69
+ title: 'Generate Style Guide',
70
+ description: 'Generate EXECUTABLE style guide focused on prescriptive rules with do/don\'t examples. Teaches voice through clear instructions, validation checklists, and corpus statistics.',
71
+ inputSchema: {
72
+ corpus_name: z.string().describe('Name of analyzed corpus'),
73
+ corpus_dir: z.string().describe('Directory where corpus is stored'),
74
+ },
75
+ }, async ({ corpus_name, corpus_dir }) => {
100
76
  try {
101
- switch (request.params.name) {
102
- case 'collect_corpus': {
103
- const params = request.params.arguments;
104
- const result = await collectCorpus(params);
105
- return {
106
- content: [
107
- {
108
- type: 'text',
109
- text: JSON.stringify(result, null, 2)
110
- }
111
- ]
112
- };
113
- }
114
- case 'analyze_corpus': {
115
- const params = request.params.arguments;
116
- const result = await analyzeCorpus(params);
117
- return {
118
- content: [
119
- {
120
- type: 'text',
121
- text: JSON.stringify(result, null, 2)
122
- }
123
- ]
124
- };
125
- }
126
- case 'generate_narrative_guide': {
127
- const params = request.params.arguments;
128
- const result = await generateNarrativeGuide(params);
129
- return {
130
- content: [
131
- {
132
- type: 'text',
133
- text: JSON.stringify(result, null, 2)
134
- }
135
- ]
136
- };
137
- }
138
- default:
139
- throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}`);
140
- }
77
+ const result = await generateStyleGuide({
78
+ corpus_name,
79
+ corpus_dir,
80
+ });
81
+ return {
82
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
83
+ };
141
84
  }
142
85
  catch (error) {
143
- if (error instanceof McpError) {
144
- throw error;
145
- }
146
- throw new McpError(ErrorCode.InternalError, `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`);
86
+ throw new McpError(ErrorCode.InternalError, `Guide generation failed: ${error instanceof Error ? error.message : String(error)}`);
147
87
  }
148
88
  });
149
89
  // Start server
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Style Guide Generator v3.0 - EXECUTABLE FORMAT
3
+ *
4
+ * PHILOSOPHY SHIFT: Prescriptive rules over immersive learning
5
+ * STRUCTURE: Match writing_style.md format (500 lines target)
6
+ * OUTPUT: Claude can execute this, not "learn by immersion"
7
+ *
8
+ * Structure (matching writing_style.md):
9
+ * 1. EXECUTIVE SUMMARY FOR CLAUDE (critical rules upfront)
10
+ * 2. THE FORBIDDEN LIST (zero tolerance AI clichés)
11
+ * 3. CORE VOICE CHARACTERISTICS (do/don't examples)
12
+ * 4. SENTENCE STRUCTURE & RHYTHM (target statistics)
13
+ * 5. CONVERSATIONAL MARKERS (extracted patterns)
14
+ * 6. ANTI-MECHANICAL WRITING PATTERNS (problems + solutions)
15
+ * 7. AUTHENTIC VOICE CHECKLIST (60s/5min/10min validation)
16
+ * 8. EXAMPLES: WHAT AUTHENTICITY LOOKS LIKE (good/bad side-by-side)
17
+ * 9. REFERENCE: CORPUS STATISTICS (z-scores, tables)
18
+ */
19
+ export interface StyleGuideParams {
20
+ corpus_name: string;
21
+ corpus_dir: string;
22
+ }
23
+ export interface StyleGuideResult {
24
+ success: boolean;
25
+ guide_path: string;
26
+ }
27
+ declare function generateStyleGuideInternal(params: StyleGuideParams): Promise<StyleGuideResult>;
28
+ export { generateStyleGuideInternal as generateStyleGuide };
29
+ //# sourceMappingURL=generate-narrative-guide-v3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-narrative-guide-v3.d.ts","sourceRoot":"","sources":["../../src/tools/generate-narrative-guide-v3.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAaH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iBAAe,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqD7F;AAwoBD,OAAO,EAAE,0BAA0B,IAAI,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,621 @@
1
+ /**
2
+ * Style Guide Generator v3.0 - EXECUTABLE FORMAT
3
+ *
4
+ * PHILOSOPHY SHIFT: Prescriptive rules over immersive learning
5
+ * STRUCTURE: Match writing_style.md format (500 lines target)
6
+ * OUTPUT: Claude can execute this, not "learn by immersion"
7
+ *
8
+ * Structure (matching writing_style.md):
9
+ * 1. EXECUTIVE SUMMARY FOR CLAUDE (critical rules upfront)
10
+ * 2. THE FORBIDDEN LIST (zero tolerance AI clichés)
11
+ * 3. CORE VOICE CHARACTERISTICS (do/don't examples)
12
+ * 4. SENTENCE STRUCTURE & RHYTHM (target statistics)
13
+ * 5. CONVERSATIONAL MARKERS (extracted patterns)
14
+ * 6. ANTI-MECHANICAL WRITING PATTERNS (problems + solutions)
15
+ * 7. AUTHENTIC VOICE CHECKLIST (60s/5min/10min validation)
16
+ * 8. EXAMPLES: WHAT AUTHENTICITY LOOKS LIKE (good/bad side-by-side)
17
+ * 9. REFERENCE: CORPUS STATISTICS (z-scores, tables)
18
+ */
19
+ import fs from 'fs/promises';
20
+ import path from 'path';
21
+ async function generateStyleGuideInternal(params) {
22
+ const { corpus_name, corpus_dir } = params;
23
+ const corpusPath = path.join(corpus_dir, corpus_name);
24
+ const analysisDir = path.join(corpusPath, 'analysis');
25
+ const articlesDir = path.join(corpusPath, 'articles');
26
+ await fs.mkdir(corpusPath, { recursive: true });
27
+ const vocab = await loadJSON(analysisDir, 'vocabulary.json');
28
+ const sentence = await loadJSON(analysisDir, 'sentence.json');
29
+ const voice = await loadJSON(analysisDir, 'voice.json');
30
+ const paragraph = await loadJSON(analysisDir, 'paragraph.json', true);
31
+ const punctuation = await loadJSON(analysisDir, 'punctuation.json', true);
32
+ const functionWords = await loadJSON(analysisDir, 'function-words.json', true);
33
+ const argumentFlow = await loadJSON(analysisDir, 'argument-flow.json', true);
34
+ const paragraphTransitions = await loadJSON(analysisDir, 'paragraph-transitions.json', true);
35
+ if (!vocab || !sentence || !voice) {
36
+ throw new Error('Missing required analysis files (vocabulary, sentence, voice)');
37
+ }
38
+ if (!argumentFlow || !paragraphTransitions) {
39
+ throw new Error('Missing argument-flow.json or paragraph-transitions.json - run analyze_corpus first');
40
+ }
41
+ const examples = await extractExampleParagraphs(articlesDir, 30);
42
+ const metadata = JSON.parse(await fs.readFile(path.join(corpusPath, 'corpus.json'), 'utf-8'));
43
+ const guide = generateExecutableGuide(corpus_name, metadata, vocab, sentence, voice, paragraph, punctuation, functionWords, argumentFlow, paragraphTransitions, examples);
44
+ const guidePath = path.join(corpusPath, `writing_style_${corpus_name}.md`);
45
+ await fs.writeFile(guidePath, guide, 'utf-8');
46
+ return {
47
+ success: true,
48
+ guide_path: guidePath
49
+ };
50
+ }
51
+ async function loadJSON(dir, filename, optional = false) {
52
+ try {
53
+ const content = await fs.readFile(path.join(dir, filename), 'utf-8');
54
+ return JSON.parse(content);
55
+ }
56
+ catch (e) {
57
+ if (optional)
58
+ return null;
59
+ throw e;
60
+ }
61
+ }
62
+ async function extractExampleParagraphs(articlesDir, count) {
63
+ const files = await fs.readdir(articlesDir);
64
+ const markdownFiles = files.filter(f => f.endsWith('.md'));
65
+ const personal = [];
66
+ const technical = [];
67
+ const counterpoints = [];
68
+ const cleanParagraph = (text) => {
69
+ return text
70
+ .replace(/\[([^\]]*)\]\([^\)]*\)/g, '$1')
71
+ .replace(/^#{1,6}\s+/gm, '')
72
+ .replace(/\*\*([^\*]+)\*\*/g, '$1')
73
+ .replace(/\*([^\*]+)\*/g, '$1')
74
+ .replace(/`([^`]+)`/g, '$1')
75
+ .replace(/\s+/g, ' ')
76
+ .trim();
77
+ };
78
+ for (const file of markdownFiles) {
79
+ const content = await fs.readFile(path.join(articlesDir, file), 'utf-8');
80
+ const withoutFrontmatter = content.replace(/^---[\s\S]*?---\n\n/, '');
81
+ const paras = withoutFrontmatter.split(/\n\n+/).filter(p => {
82
+ const words = p.split(/\s+/).length;
83
+ const hasNoHeaderMarker = !p.trim().startsWith('#');
84
+ const hasSubstantialText = p.trim().length > 100;
85
+ return words >= 30 && words <= 250 && hasNoHeaderMarker && hasSubstantialText;
86
+ });
87
+ if (paras.length === 0)
88
+ continue;
89
+ const perCategory = Math.ceil(count / 3);
90
+ for (const para of paras) {
91
+ const lower = para.toLowerCase();
92
+ const isTechnical = /\d+\s*(nm|kg|mm|watts|hz|fps|%|px|kb|mb|gb)/i.test(para);
93
+ const isPersonal = ["i've", "my ", "in my experience", "i found", "i tested"].some(w => lower.includes(w));
94
+ const isCounterpoint = ['but ', 'however', 'although', 'despite', 'yet ', 'still'].some(w => lower.startsWith(w) || lower.includes('. but ') || lower.includes('. however '));
95
+ if (isPersonal && personal.length < perCategory) {
96
+ personal.push(cleanParagraph(para));
97
+ }
98
+ else if (isTechnical && technical.length < perCategory) {
99
+ technical.push(cleanParagraph(para));
100
+ }
101
+ else if (isCounterpoint && counterpoints.length < perCategory) {
102
+ counterpoints.push(cleanParagraph(para));
103
+ }
104
+ }
105
+ }
106
+ return { personal, technical, counterpoints };
107
+ }
108
+ function formatWriterName(name) {
109
+ return name.split(/[-_]/).map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
110
+ }
111
+ function generateExecutableGuide(writerName, metadata, vocab, sentence, voice, paragraph, punctuation, functionWords, argumentFlow, paragraphTransitions, examples) {
112
+ const lines = [];
113
+ // HEADER
114
+ lines.push(`# ${formatWriterName(writerName)} Writing Style Guide`);
115
+ lines.push(`*Corpus: ${metadata.wordCount.toLocaleString()} words across ${metadata.articleCount} articles*`);
116
+ lines.push('');
117
+ lines.push('**Status:** Statistical truth derived from published corpus');
118
+ lines.push('');
119
+ lines.push('---');
120
+ lines.push('');
121
+ // ============================================================
122
+ // 1. EXECUTIVE SUMMARY FOR CLAUDE
123
+ // ============================================================
124
+ lines.push('## EXECUTIVE SUMMARY FOR CLAUDE');
125
+ lines.push('');
126
+ const hasPersonal = voice.firstPerson.frequency > 0.3;
127
+ const hasConfidence = voice.hedgingLanguage.frequency < 0.5;
128
+ const hasBritish = vocab.britishMarkers.length > 0;
129
+ // Domain detection from argument flow
130
+ const domains = [];
131
+ if (argumentFlow.openingMoves.some(m => m.type.toLowerCase().includes('technical'))) {
132
+ domains.push('technical');
133
+ }
134
+ if (voice.equipmentSpecificity && voice.equipmentSpecificity.specific.length > 5) {
135
+ domains.push('product reviews');
136
+ }
137
+ lines.push(`You're writing as ${formatWriterName(writerName)}${domains.length > 0 ? ', covering ' + domains.join(', ') : ''}.`);
138
+ lines.push('');
139
+ lines.push('**Your voice:**');
140
+ if (hasPersonal && hasConfidence) {
141
+ lines.push('- Confident practitioner, not a guru or marketer');
142
+ lines.push('- First-person authority from real testing/experience');
143
+ }
144
+ else if (hasPersonal) {
145
+ lines.push('- Thoughtful expert with personal experience');
146
+ lines.push('- Measured caution balanced with practical insight');
147
+ }
148
+ else {
149
+ lines.push('- Authoritative educator style');
150
+ lines.push('- Clear explanations with practical examples');
151
+ }
152
+ lines.push('- Technical depth with engineering rationale');
153
+ lines.push('- Honest caveats and limitations');
154
+ if (hasBritish) {
155
+ lines.push('- British English throughout');
156
+ }
157
+ lines.push('- Natural conversational flow');
158
+ lines.push('- **ZERO AI clichés** (non-negotiable)');
159
+ lines.push('');
160
+ lines.push('**Most critical rule:** If it sounds like marketing copy or a LinkedIn post, delete it.');
161
+ lines.push('');
162
+ lines.push('---');
163
+ lines.push('');
164
+ // ============================================================
165
+ // 2. THE FORBIDDEN LIST
166
+ // ============================================================
167
+ lines.push('## THE FORBIDDEN LIST');
168
+ lines.push('');
169
+ lines.push('**Zero tolerance for these AI clichés:**');
170
+ lines.push('');
171
+ const universalForbidden = [
172
+ { phrase: 'delve', fix: 'Use: explore, examine, look at' },
173
+ { phrase: 'leverage', fix: 'Use: use, apply, employ' },
174
+ { phrase: 'unlock', fix: 'Use: enable, access, discover' },
175
+ { phrase: 'seamless', fix: 'Be specific about what works well' },
176
+ { phrase: 'robust', fix: 'Describe actual capabilities' },
177
+ { phrase: 'game-changer', fix: 'Explain actual impact' },
178
+ { phrase: 'cutting-edge', fix: 'Name the actual technology' },
179
+ { phrase: 'revolutionary', fix: 'Show what changed, do not claim it' }
180
+ ];
181
+ for (const item of universalForbidden) {
182
+ lines.push(`- **"${item.phrase}"** → ${item.fix}`);
183
+ }
184
+ lines.push('');
185
+ // Corpus-detected AI clichés
186
+ if (voice.aiCliches && voice.aiCliches.length > 0) {
187
+ lines.push('**Detected in YOUR corpus (must eliminate):**');
188
+ lines.push('');
189
+ for (const cliche of voice.aiCliches.slice(0, 5)) {
190
+ lines.push(`- "${cliche.phrase}" (${cliche.count} uses) - Remove completely`);
191
+ }
192
+ lines.push('');
193
+ }
194
+ // Hollow intensifiers
195
+ if (voice.hollowIntensifiers && voice.hollowIntensifiers.length > 0) {
196
+ lines.push('**Hollow intensifiers (performative sincerity):**');
197
+ lines.push('');
198
+ for (const intensifier of voice.hollowIntensifiers.slice(0, 5)) {
199
+ lines.push(`- "${intensifier.phrase}" → ${intensifier.alternative}`);
200
+ }
201
+ lines.push('');
202
+ }
203
+ lines.push('---');
204
+ lines.push('');
205
+ // ============================================================
206
+ // 3. CORE VOICE CHARACTERISTICS
207
+ // ============================================================
208
+ lines.push('## CORE VOICE CHARACTERISTICS');
209
+ lines.push('');
210
+ // 3.1 Confidence Level
211
+ lines.push('### 1. Confident but Grounded');
212
+ lines.push('');
213
+ if (hasPersonal) {
214
+ lines.push('**✅ Right:**');
215
+ lines.push('- "I\'ve found that..." (establishes real experience)');
216
+ lines.push('- "What I\'ve tested shows..." (practitioner authority)');
217
+ lines.push('- "This is actually..." (emphasis on real insight)');
218
+ lines.push('');
219
+ lines.push('**❌ Wrong:**');
220
+ lines.push('- "I\'m passionate about..." (marketing speak)');
221
+ lines.push('- "This revolutionary approach..." (hyperbole)');
222
+ lines.push('- "In today\'s digital landscape..." (corporate jargon)');
223
+ }
224
+ else {
225
+ lines.push('**✅ Right:**');
226
+ lines.push('- "It\'s worth knowing..." (educator voice)');
227
+ lines.push('- "The key point is..." (direct guidance)');
228
+ lines.push('- "What matters here..." (practical focus)');
229
+ lines.push('');
230
+ lines.push('**❌ Wrong:**');
231
+ lines.push('- "You must understand..." (lecturing)');
232
+ lines.push('- "It\'s crucial to realise..." (pompous)');
233
+ lines.push('- "Let me explain..." (condescending)');
234
+ }
235
+ lines.push('');
236
+ // 3.2 Practitioner Authority (if applicable)
237
+ if (hasPersonal) {
238
+ lines.push('### 2. Practitioner Authority');
239
+ lines.push('');
240
+ lines.push('**Signature pattern:** Personal experience + measured opinion + technical specificity');
241
+ lines.push('');
242
+ if (examples.personal.length > 0) {
243
+ lines.push('**Example structure:**');
244
+ lines.push('```');
245
+ lines.push(examples.personal[0]);
246
+ lines.push('```');
247
+ lines.push('');
248
+ lines.push('**Breaks down as:**');
249
+ if (voice.equipmentSpecificity && voice.equipmentSpecificity.specific.length > 0) {
250
+ const specific = voice.equipmentSpecificity.specific[0].phrase;
251
+ lines.push(`- ✅ Specific equipment ("${specific}")`);
252
+ }
253
+ lines.push('- ✅ Personal testing (first-person statements)');
254
+ lines.push('- ✅ Measured observation (not hyperbole)');
255
+ lines.push('- ✅ Engineering rationale (why it matters)');
256
+ lines.push('');
257
+ }
258
+ }
259
+ // 3.3 Equipment Specificity (CRITICAL)
260
+ if (voice.equipmentSpecificity && voice.equipmentSpecificity.specific.length > 0) {
261
+ lines.push('### 3. Equipment Specificity (CRITICAL)');
262
+ lines.push('');
263
+ lines.push('**This is a major authenticity signal.**');
264
+ lines.push('');
265
+ lines.push('**✅ Right:**');
266
+ for (const eq of voice.equipmentSpecificity.specific.slice(0, 5)) {
267
+ lines.push(`- ${eq.phrase}`);
268
+ }
269
+ lines.push('');
270
+ if (voice.equipmentSpecificity.generic.length > 0) {
271
+ lines.push('**❌ Wrong:**');
272
+ for (const eq of voice.equipmentSpecificity.generic.slice(0, 5)) {
273
+ lines.push(`- ${eq.phrase}`);
274
+ }
275
+ lines.push('');
276
+ }
277
+ else {
278
+ lines.push('**❌ Wrong:**');
279
+ lines.push('- the wheelbase');
280
+ lines.push('- a pedal set');
281
+ lines.push('- the product');
282
+ lines.push('- this equipment');
283
+ lines.push('');
284
+ }
285
+ lines.push('**Why it matters:** Generic references signal AI-generated content. Specific names with possessives prove real testing.');
286
+ lines.push('');
287
+ }
288
+ // 3.4 Hedging & Confidence Balance
289
+ lines.push(`### ${voice.equipmentSpecificity && voice.equipmentSpecificity.specific.length > 0 ? '4' : '3'}. Hedging & Confidence Balance`);
290
+ lines.push('');
291
+ lines.push(`**Your confidence level:** ${hasConfidence ? 'HIGH' : 'MODERATE'}`);
292
+ lines.push('');
293
+ lines.push(`**Hedging frequency:** ${voice.hedgingLanguage.frequency.toFixed(2)} per 100 words (${hasConfidence ? 'LOW' : 'MODERATE'})`);
294
+ lines.push('');
295
+ if (hasConfidence) {
296
+ lines.push('Use hedging words sparingly. You should sound decisive.');
297
+ lines.push('');
298
+ lines.push('**When hedging IS appropriate:**');
299
+ lines.push('- Acknowledging alternatives: "possibly worth trying"');
300
+ lines.push('- Caveat to personal opinion: "could also depend on..."');
301
+ lines.push('- Technical uncertainty: "might perform differently"');
302
+ lines.push('');
303
+ lines.push('**When hedging HURTS your voice:**');
304
+ lines.push('- Every suggestion wrapped in "perhaps"');
305
+ lines.push('- Constant "I think, but..." (sounds unsure)');
306
+ lines.push('- Over-qualifying every statement');
307
+ }
308
+ else {
309
+ lines.push('Balanced hedging maintains credibility whilst showing appropriate caution.');
310
+ lines.push('');
311
+ lines.push('**Good hedging:**');
312
+ lines.push('- "In most cases..." (acknowledges exceptions)');
313
+ lines.push('- "Typically..." (allows for variation)');
314
+ lines.push('- "Generally..." (not absolute claim)');
315
+ lines.push('');
316
+ lines.push('**Avoid:**');
317
+ lines.push('- Absolute certainty where evidence is limited');
318
+ lines.push('- Hedging so much you say nothing');
319
+ }
320
+ lines.push('');
321
+ lines.push('---');
322
+ lines.push('');
323
+ // ============================================================
324
+ // 4. SENTENCE STRUCTURE & RHYTHM
325
+ // ============================================================
326
+ lines.push('## SENTENCE STRUCTURE & RHYTHM');
327
+ lines.push('');
328
+ lines.push('### Target Statistics');
329
+ lines.push('');
330
+ lines.push('| Metric | Value | Interpretation |');
331
+ lines.push('|--------|-------|-----------------|');
332
+ lines.push(`| Avg sentence length | ${sentence.length.mean.toFixed(1)} words | ${sentence.length.mean < 18 ? 'Concise style' : sentence.length.mean > 25 ? 'Complex style' : 'Medium complexity'} |`);
333
+ lines.push(`| Sentence variance | ±${sentence.length.stdDev.toFixed(1)} words | ${sentence.length.stdDev > 12 ? 'HIGH variance = natural' : 'Moderate variance'} |`);
334
+ if (paragraph) {
335
+ lines.push(`| Sentences per paragraph | ${paragraph.sentencesPerParagraph.mean.toFixed(1)} | ${paragraph.sentencesPerParagraph.mean < 2 ? 'VARIABLE (1-4 typical)' : 'Consistent structure'} |`);
336
+ }
337
+ lines.push(`| First-person frequency | ${voice.firstPerson.frequency.toFixed(2)} per 100 words | ${hasPersonal ? 'Distributed, not clustered' : 'Minimal personal voice'} |`);
338
+ if (punctuation) {
339
+ lines.push(`| Exclamation marks | ${punctuation.exclamationFrequency.toFixed(1)} per 1000 words | ${punctuation.exclamationFrequency > 5 ? 'Enthusiastic' : punctuation.exclamationFrequency > 2 ? 'Measured enthusiasm' : 'Restrained'} |`);
340
+ }
341
+ lines.push('');
342
+ // Sentence length variation
343
+ lines.push('### Sentence Length Variation (CRITICAL)');
344
+ lines.push('');
345
+ lines.push('**Bad (mechanical):** Every sentence 18-22 words');
346
+ lines.push('');
347
+ lines.push('**Good (natural):** Mix of these:');
348
+ lines.push('- Short punchy: 5-8 words ("This actually works." / "Look, it matters.")');
349
+ lines.push('- Standard: 10-18 words (most sentences land here)');
350
+ lines.push('- Complex: 20-30 words (explaining technical detail)');
351
+ lines.push('- Deep: 35+ words (rare, for complex concepts)');
352
+ lines.push('');
353
+ lines.push('**Test:** Read paragraph aloud. Does every sentence have the same rhythm? If yes, rewrite.');
354
+ lines.push('');
355
+ // Paragraph structure
356
+ lines.push('### Paragraph Structure');
357
+ lines.push('');
358
+ if (paragraph && paragraph.sentencesPerParagraph.mean < 2.5) {
359
+ lines.push('**Variable is key.** Your paragraphs should range from 1-4 sentences.');
360
+ lines.push('');
361
+ lines.push('**NOT this:**');
362
+ lines.push('```');
363
+ lines.push('First sentence explaining concept. Second sentence providing detail.');
364
+ lines.push('Third sentence adding emphasis. Fourth sentence concluding thought.');
365
+ lines.push('[repeat 5 times with same rhythm]');
366
+ lines.push('```');
367
+ lines.push('');
368
+ lines.push('**DO this:**');
369
+ lines.push('```');
370
+ lines.push('Key insight in one sentence.');
371
+ lines.push('');
372
+ lines.push('Supporting detail here. Technical context. This explains the why.');
373
+ lines.push('');
374
+ lines.push('Counter-point or caveat.');
375
+ lines.push('```');
376
+ }
377
+ else {
378
+ lines.push('Maintain consistent paragraph length for readability.');
379
+ }
380
+ lines.push('');
381
+ lines.push('---');
382
+ lines.push('');
383
+ // ============================================================
384
+ // 5. CONVERSATIONAL MARKERS
385
+ // ============================================================
386
+ if (voice.conversationalMarkers.length > 0 || argumentFlow.conversationalDevices.length > 0) {
387
+ lines.push('## CONVERSATIONAL MARKERS');
388
+ lines.push('');
389
+ if (voice.conversationalMarkers.length > 0) {
390
+ lines.push('**Words that make writing feel spoken:**');
391
+ lines.push('');
392
+ for (const marker of voice.conversationalMarkers.slice(0, 8)) {
393
+ const frequency = (marker.count / metadata.statistics.total_words) * 100;
394
+ lines.push(`- **"${marker.word}"** (${frequency.toFixed(2)}/100 words) - Natural connector`);
395
+ }
396
+ lines.push('');
397
+ }
398
+ if (argumentFlow.conversationalDevices.length > 0) {
399
+ lines.push('**Devices from your corpus:**');
400
+ lines.push('');
401
+ for (const device of argumentFlow.conversationalDevices.slice(0, 5)) {
402
+ lines.push(`- **"${device.trigger}"** - ${device.purpose}`);
403
+ }
404
+ lines.push('');
405
+ }
406
+ lines.push('**When to use:** Naturally, not forced. If every paragraph has one, you\'re overdoing it.');
407
+ lines.push('');
408
+ lines.push('---');
409
+ lines.push('');
410
+ }
411
+ // ============================================================
412
+ // 6. ANTI-MECHANICAL WRITING PATTERNS
413
+ // ============================================================
414
+ lines.push('## ANTI-MECHANICAL WRITING PATTERNS');
415
+ lines.push('');
416
+ lines.push('### Problem 1: Uniform Sentence Rhythm');
417
+ lines.push('');
418
+ lines.push('**Symptom:** Every sentence 15-20 words, same structure');
419
+ lines.push('');
420
+ lines.push('**Fix:** Deliberately vary. Write a 6-word sentence. Follow with a 28-word explanation that includes multiple clauses and technical detail.');
421
+ lines.push('');
422
+ if (voice.equipmentSpecificity && voice.equipmentSpecificity.specific.length > 0) {
423
+ lines.push('### Problem 2: Generic References');
424
+ lines.push('');
425
+ lines.push('**Symptom:** "the product", "the equipment", "this device"');
426
+ lines.push('');
427
+ lines.push('**Fix:** Name it specifically. Include model numbers, versions, your ownership.');
428
+ lines.push('');
429
+ }
430
+ lines.push('### Problem 3: Perfect Narratives');
431
+ lines.push('');
432
+ lines.push('**Symptom:** Everything works perfectly, no caveats, absolute confidence');
433
+ lines.push('');
434
+ lines.push('**Fix:** Admit limitations. Include "but" paragraphs. Acknowledge uncertainty.');
435
+ lines.push('');
436
+ if (examples.counterpoints.length > 0) {
437
+ lines.push('**Example from your corpus:**');
438
+ lines.push('```');
439
+ lines.push(examples.counterpoints[0]);
440
+ lines.push('```');
441
+ lines.push('');
442
+ }
443
+ // Punctuation anti-patterns
444
+ if (punctuation) {
445
+ lines.push('### Problem 4: Em-Dash Overuse');
446
+ lines.push('');
447
+ if (punctuation.dashTypes.emDash === 0) {
448
+ lines.push('**Your pattern:** You NEVER use em-dashes (—). Only hyphens (-).');
449
+ lines.push('');
450
+ lines.push('**CRITICAL:** If you see an em-dash in output, replace it immediately. Em-dashes are a major AI tell.');
451
+ }
452
+ else {
453
+ lines.push(`**Your pattern:** Em-dashes appear ${punctuation.dashTypes.emDash} times in corpus.`);
454
+ lines.push('');
455
+ lines.push('**Watch:** AI overuses em-dashes. Use sparingly and consistently.');
456
+ }
457
+ lines.push('');
458
+ }
459
+ lines.push('---');
460
+ lines.push('');
461
+ // ============================================================
462
+ // 7. AUTHENTIC VOICE CHECKLIST
463
+ // ============================================================
464
+ lines.push('## AUTHENTIC VOICE CHECKLIST');
465
+ lines.push('');
466
+ lines.push('### Pre-Publication Validation');
467
+ lines.push('');
468
+ lines.push('**Quick Filter (60 seconds):**');
469
+ if (voice.equipmentSpecificity && voice.equipmentSpecificity.specific.length > 0) {
470
+ lines.push('- [ ] Contains specific product name (not "the product")');
471
+ }
472
+ if (hasPersonal) {
473
+ lines.push('- [ ] Contains first-person statement');
474
+ }
475
+ lines.push('- [ ] No AI clichés detected (check forbidden list)');
476
+ lines.push('- [ ] Sounds like person, not marketing');
477
+ lines.push('');
478
+ lines.push('**Detailed Check (5 minutes):**');
479
+ lines.push('- [ ] Sentence lengths vary (5-8 words to 30+ words)');
480
+ lines.push('- [ ] No em-dash usage (or consistent with corpus)');
481
+ lines.push('- [ ] Specific examples, not generic');
482
+ if (hasBritish) {
483
+ lines.push('- [ ] British spelling throughout');
484
+ }
485
+ if (examples.counterpoints.length > 0) {
486
+ lines.push('- [ ] Contains caveats or limitations');
487
+ }
488
+ lines.push('');
489
+ lines.push('**Deep Validation (10 minutes):**');
490
+ lines.push(`- [ ] First-person frequency ~${voice.firstPerson.frequency.toFixed(2)}/100 words`);
491
+ lines.push(`- [ ] Hedging frequency ~${voice.hedgingLanguage.frequency.toFixed(2)}/100 words`);
492
+ lines.push(`- [ ] Sentence variance ${sentence.length.stdDev.toFixed(1)}+ stddev`);
493
+ if (voice.conversationalMarkers.length > 0) {
494
+ const markers = voice.conversationalMarkers.slice(0, 3).map(m => `"${m.word}"`).join(', ');
495
+ lines.push(`- [ ] Conversational markers present (${markers})`);
496
+ }
497
+ lines.push('');
498
+ lines.push('---');
499
+ lines.push('');
500
+ // ============================================================
501
+ // 8. EXAMPLES: WHAT AUTHENTICITY LOOKS LIKE
502
+ // ============================================================
503
+ lines.push('## EXAMPLES: WHAT AUTHENTICITY LOOKS LIKE');
504
+ lines.push('');
505
+ if (examples.personal.length > 0) {
506
+ lines.push('### Personal Authority');
507
+ lines.push('');
508
+ lines.push('**✅ Good:**');
509
+ lines.push('```');
510
+ lines.push(examples.personal[0]);
511
+ lines.push('```');
512
+ lines.push('');
513
+ lines.push('**Why this works:**');
514
+ lines.push('- Specific equipment named');
515
+ lines.push('- Personal testing authority');
516
+ lines.push('- Engineering rationale included');
517
+ lines.push('');
518
+ }
519
+ if (examples.technical.length > 0) {
520
+ lines.push('### Technical Detail');
521
+ lines.push('');
522
+ lines.push('**✅ Good:**');
523
+ lines.push('```');
524
+ lines.push(examples.technical[0]);
525
+ lines.push('```');
526
+ lines.push('');
527
+ lines.push('**Why this works:**');
528
+ lines.push('- Real numbers and specifications');
529
+ lines.push('- Practical implications explained');
530
+ lines.push('- Human voice persists in technical content');
531
+ lines.push('');
532
+ }
533
+ if (examples.counterpoints.length > 0) {
534
+ lines.push('### Authentic Nuance');
535
+ lines.push('');
536
+ lines.push('**✅ Good:**');
537
+ lines.push('```');
538
+ lines.push(examples.counterpoints[0]);
539
+ lines.push('```');
540
+ lines.push('');
541
+ lines.push('**Why this works:**');
542
+ lines.push('- Acknowledges limitations');
543
+ lines.push('- "But" creates authentic complexity');
544
+ lines.push('- Not perfect narrative');
545
+ lines.push('');
546
+ }
547
+ lines.push('---');
548
+ lines.push('');
549
+ // ============================================================
550
+ // 9. REFERENCE: CORPUS STATISTICS
551
+ // ============================================================
552
+ lines.push('## REFERENCE: CORPUS STATISTICS');
553
+ lines.push('');
554
+ lines.push('*These validate the voice. They don\'t create it.*');
555
+ lines.push('');
556
+ // Function words (if available)
557
+ if (functionWords && (functionWords.distinctive.length > 0 || functionWords.avoided.length > 0)) {
558
+ lines.push('### Function Word Signature');
559
+ lines.push('');
560
+ if (functionWords.distinctive.length > 0) {
561
+ lines.push('**Words used MORE than typical:**');
562
+ lines.push('');
563
+ for (const word of functionWords.distinctive.slice(0, 8)) {
564
+ const zScore = functionWords.zScores[word.word];
565
+ if (zScore) {
566
+ lines.push(`- **"${word.word}"** (z=${zScore.zScore.toFixed(2)}) - ${word.frequency.toFixed(2)}/100 words`);
567
+ }
568
+ }
569
+ lines.push('');
570
+ }
571
+ if (functionWords.avoided.length > 0) {
572
+ lines.push('**Words AVOIDED (use sparingly):**');
573
+ lines.push('');
574
+ for (const word of functionWords.avoided.slice(0, 8)) {
575
+ const zScore = functionWords.zScores[word.word];
576
+ if (zScore) {
577
+ lines.push(`- **"${word.word}"** (z=${zScore.zScore.toFixed(2)}) - ${word.frequency.toFixed(2)}/100 words`);
578
+ }
579
+ }
580
+ lines.push('');
581
+ }
582
+ }
583
+ // British English markers
584
+ if (hasBritish) {
585
+ lines.push('### British English Markers');
586
+ lines.push('');
587
+ lines.push('| American | British |');
588
+ lines.push('|----------|---------|');
589
+ for (const marker of vocab.britishMarkers.slice(0, 10)) {
590
+ const british = marker.word;
591
+ const american = british.replace('ise', 'ize').replace('our', 'or').replace('re', 'er');
592
+ lines.push(`| ${american} | ${british} |`);
593
+ }
594
+ lines.push('');
595
+ }
596
+ // Punctuation patterns
597
+ if (punctuation) {
598
+ lines.push('### Punctuation Patterns');
599
+ lines.push('');
600
+ lines.push('| Pattern | Value |');
601
+ lines.push('|---------|-------|');
602
+ lines.push(`| Comma density | ${punctuation.commaDensity.toFixed(2)}/sentence |`);
603
+ lines.push(`| Semicolons | ${punctuation.semicolonFrequency.toFixed(1)}/1000 words |`);
604
+ lines.push(`| Exclamations | ${punctuation.exclamationFrequency.toFixed(1)}/1000 words |`);
605
+ lines.push(`| Parentheticals | ${punctuation.parentheticalFrequency.toFixed(1)}/1000 words |`);
606
+ if (punctuation.dashTypes.emDash === 0) {
607
+ lines.push(`| Em-dashes | 0 (NEVER use) |`);
608
+ }
609
+ lines.push('');
610
+ }
611
+ // Corpus overview
612
+ lines.push('### Corpus Overview');
613
+ lines.push('');
614
+ lines.push(`- **Total words:** ${metadata.wordCount.toLocaleString()}`);
615
+ lines.push(`- **Articles analyzed:** ${metadata.articleCount}`);
616
+ lines.push(`- **Average article length:** ${Math.round(metadata.wordCount / metadata.articleCount).toLocaleString()} words`);
617
+ lines.push('');
618
+ return lines.join('\n');
619
+ }
620
+ export { generateStyleGuideInternal as generateStyleGuide };
621
+ //# sourceMappingURL=generate-narrative-guide-v3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-narrative-guide-v3.js","sourceRoot":"","sources":["../../src/tools/generate-narrative-guide-v3.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,67 +1,68 @@
1
- {
2
- "name": "@houtini/voice-analyser",
3
- "version": "1.2.1",
4
- "description": "MCP server for automatic tone-of-voice analysis from published writing corpus",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "bin": {
8
- "voice-analyser": "./dist/index.js"
9
- },
10
- "files": [
11
- "dist/**/*",
12
- "README.md",
13
- "LICENSE"
14
- ],
15
- "scripts": {
16
- "build": "tsc",
17
- "watch": "tsc --watch",
18
- "prepublishOnly": "npm run build"
19
- },
20
- "keywords": [
21
- "mcp",
22
- "voice-analysis",
23
- "tone-of-voice",
24
- "content",
25
- "llm",
26
- "writing-style",
27
- "corpus-analysis"
28
- ],
29
- "author": {
30
- "name": "Houtini",
31
- "email": "hello@houtini.ai",
32
- "url": "https://houtini.ai"
33
- },
34
- "license": "Apache-2.0",
35
- "repository": {
36
- "type": "git",
37
- "url": "https://github.com/houtini-ai/voice-analyser-mcp.git"
38
- },
39
- "bugs": {
40
- "url": "https://github.com/houtini-ai/voice-analyser-mcp/issues"
41
- },
42
- "homepage": "https://github.com/houtini-ai/voice-analyser-mcp#readme",
43
- "publishConfig": {
44
- "access": "public"
45
- },
46
- "engines": {
47
- "node": ">=20.0.0"
48
- },
49
- "dependencies": {
50
- "@modelcontextprotocol/sdk": "^1.0.4",
51
- "cheerio": "^1.0.0",
52
- "compromise": "^14.14.0",
53
- "fast-xml-parser": "^4.5.0",
54
- "natural": "^8.0.1",
55
- "node-fetch": "^3.3.2",
56
- "turndown": "^7.2.0",
57
- "wink-eng-lite-web-model": "^1.8.1",
58
- "wink-nlp": "^2.4.0",
59
- "wink-nlp-utils": "^2.1.0"
60
- },
61
- "devDependencies": {
62
- "@types/natural": "^5.1.5",
63
- "@types/node": "^22.10.1",
64
- "@types/turndown": "^5.0.5",
65
- "typescript": "^5.7.2"
66
- }
67
- }
1
+ {
2
+ "name": "@houtini/voice-analyser",
3
+ "version": "1.3.0",
4
+ "description": "MCP server for automatic tone-of-voice analysis from published writing corpus",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "voice-analyser": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/**/*",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "watch": "tsc --watch",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "keywords": [
21
+ "mcp",
22
+ "voice-analysis",
23
+ "tone-of-voice",
24
+ "content",
25
+ "llm",
26
+ "writing-style",
27
+ "corpus-analysis"
28
+ ],
29
+ "author": {
30
+ "name": "Houtini",
31
+ "email": "hello@houtini.ai",
32
+ "url": "https://houtini.ai"
33
+ },
34
+ "license": "Apache-2.0",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/houtini-ai/voice-analyser-mcp.git"
38
+ },
39
+ "bugs": {
40
+ "url": "https://github.com/houtini-ai/voice-analyser-mcp/issues"
41
+ },
42
+ "homepage": "https://github.com/houtini-ai/voice-analyser-mcp#readme",
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ },
49
+ "dependencies": {
50
+ "@modelcontextprotocol/sdk": "^1.25.3",
51
+ "cheerio": "^1.0.0",
52
+ "compromise": "^14.14.0",
53
+ "fast-xml-parser": "^4.5.0",
54
+ "natural": "^8.0.1",
55
+ "node-fetch": "^3.3.2",
56
+ "turndown": "^7.2.0",
57
+ "wink-eng-lite-web-model": "^1.8.1",
58
+ "wink-nlp": "^2.4.0",
59
+ "wink-nlp-utils": "^2.1.0",
60
+ "zod": "^3.25.0"
61
+ },
62
+ "devDependencies": {
63
+ "@types/natural": "^5.1.5",
64
+ "@types/node": "^22.19.7",
65
+ "@types/turndown": "^5.0.6",
66
+ "typescript": "^5.9.3"
67
+ }
68
+ }