create-merlin-brain 3.21.0 → 3.23.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.
Files changed (88) hide show
  1. package/README.md +22 -4
  2. package/bin/install.cjs +23 -0
  3. package/bin/merlin-ask.cjs +111 -0
  4. package/bin/merlin-cli.cjs +22 -0
  5. package/bin/runtime-adapters.cjs +678 -28
  6. package/dist/server/api/client.d.ts +2 -0
  7. package/dist/server/api/client.d.ts.map +1 -1
  8. package/dist/server/api/client.js +4 -0
  9. package/dist/server/api/client.js.map +1 -1
  10. package/dist/server/server.d.ts.map +1 -1
  11. package/dist/server/server.js +45 -4
  12. package/dist/server/server.js.map +1 -1
  13. package/dist/server/tools/auto-mode.d.ts +9 -0
  14. package/dist/server/tools/auto-mode.d.ts.map +1 -0
  15. package/dist/server/tools/auto-mode.js +231 -0
  16. package/dist/server/tools/auto-mode.js.map +1 -0
  17. package/dist/server/tools/computer-use.d.ts +8 -0
  18. package/dist/server/tools/computer-use.d.ts.map +1 -0
  19. package/dist/server/tools/computer-use.js +355 -0
  20. package/dist/server/tools/computer-use.js.map +1 -0
  21. package/dist/server/tools/dream.d.ts +9 -0
  22. package/dist/server/tools/dream.d.ts.map +1 -0
  23. package/dist/server/tools/dream.js +246 -0
  24. package/dist/server/tools/dream.js.map +1 -0
  25. package/dist/server/tools/hud.d.ts +13 -0
  26. package/dist/server/tools/hud.d.ts.map +1 -0
  27. package/dist/server/tools/hud.js +295 -0
  28. package/dist/server/tools/hud.js.map +1 -0
  29. package/dist/server/tools/index.d.ts +4 -0
  30. package/dist/server/tools/index.d.ts.map +1 -1
  31. package/dist/server/tools/index.js +4 -0
  32. package/dist/server/tools/index.js.map +1 -1
  33. package/dist/server/tools/provider-ask.d.ts +10 -0
  34. package/dist/server/tools/provider-ask.d.ts.map +1 -0
  35. package/dist/server/tools/provider-ask.js +234 -0
  36. package/dist/server/tools/provider-ask.js.map +1 -0
  37. package/dist/server/tools/rate-limit.d.ts +8 -0
  38. package/dist/server/tools/rate-limit.d.ts.map +1 -0
  39. package/dist/server/tools/rate-limit.js +184 -0
  40. package/dist/server/tools/rate-limit.js.map +1 -0
  41. package/dist/server/tools/route.d.ts.map +1 -1
  42. package/dist/server/tools/route.js +14 -3
  43. package/dist/server/tools/route.js.map +1 -1
  44. package/dist/server/tools/skills.d.ts +16 -0
  45. package/dist/server/tools/skills.d.ts.map +1 -0
  46. package/dist/server/tools/skills.js +326 -0
  47. package/dist/server/tools/skills.js.map +1 -0
  48. package/dist/server/tools/smart-route.d.ts +19 -0
  49. package/dist/server/tools/smart-route.d.ts.map +1 -1
  50. package/dist/server/tools/smart-route.js +23 -1
  51. package/dist/server/tools/smart-route.js.map +1 -1
  52. package/dist/server/tools/team-workers.d.ts +7 -0
  53. package/dist/server/tools/team-workers.d.ts.map +1 -0
  54. package/dist/server/tools/team-workers.js +271 -0
  55. package/dist/server/tools/team-workers.js.map +1 -0
  56. package/dist/server/utils/merlin-manifest.d.ts +6 -1
  57. package/dist/server/utils/merlin-manifest.d.ts.map +1 -1
  58. package/dist/server/utils/merlin-manifest.js +34 -1
  59. package/dist/server/utils/merlin-manifest.js.map +1 -1
  60. package/files/CLAUDE.md +22 -0
  61. package/files/hooks/post-edit-logger.sh +48 -2
  62. package/files/hooks/pre-compact.sh +14 -2
  63. package/files/hooks/rate-limit-watch.sh +120 -0
  64. package/files/hooks/statusline.sh +148 -0
  65. package/files/hooks/user-prompt-router.sh +96 -0
  66. package/files/merlin/VERSION +1 -1
  67. package/files/merlin/skills/SKILLS-INDEX.md +82 -0
  68. package/files/merlin/skills/automation/payments.md +14 -0
  69. package/files/merlin/skills/automation/webhooks.md +14 -0
  70. package/files/merlin/skills/coding/accessibility.md +14 -0
  71. package/files/merlin/skills/coding/api-design.md +14 -0
  72. package/files/merlin/skills/coding/debug-mode.md +14 -0
  73. package/files/merlin/skills/coding/focus-mode.md +14 -0
  74. package/files/merlin/skills/coding/loop.md +14 -0
  75. package/files/merlin/skills/coding/performance.md +14 -0
  76. package/files/merlin/skills/coding/react-patterns.md +51 -0
  77. package/files/merlin/skills/coding/security-hardening.md +56 -0
  78. package/files/merlin/skills/coding/verify.md +14 -0
  79. package/files/merlin/skills/communication/dispatcher.md +40 -0
  80. package/files/merlin/skills/communication/email-gmail.md +31 -0
  81. package/files/merlin/skills/communication/telegram.md +50 -0
  82. package/files/merlin/skills/communication/whatsapp.md +47 -0
  83. package/files/merlin/skills/data/google-sheets.md +14 -0
  84. package/files/merlin/skills/design/animation.md +14 -0
  85. package/files/merlin/skills/devops/docker-containers.md +14 -0
  86. package/files/merlin/skills/research/brainstorm.md +14 -0
  87. package/files/merlin/skills/testing/tdd-workflow.md +58 -0
  88. package/package.json +4 -2
@@ -0,0 +1,326 @@
1
+ /**
2
+ * Skills Tools — Discover, load, evolve, and track skills
3
+ *
4
+ * Skills are prompt injections stored as .md files in ~/.claude/merlin/skills/.
5
+ * Claude reads SKILLS-INDEX.md to find relevant skills, then loads the full .md.
6
+ *
7
+ * Inspired by OpenSpace's self-evolving skill system:
8
+ * - Skills track usage and success rates
9
+ * - Skills can be improved after use (auto-evolution)
10
+ * - Improvements push to the server for collective intelligence
11
+ *
12
+ * Works identically in CLI (via MCP) and Studio (same file paths).
13
+ */
14
+ import { z } from 'zod';
15
+ import { existsSync, readFileSync, writeFileSync, readdirSync, statSync, mkdirSync } from 'fs';
16
+ import { join, relative, basename } from 'path';
17
+ import { homedir } from 'os';
18
+ import { coachWrap } from '../session-coach.js';
19
+ // ─── Paths ────────────────────────────────────────────────────────────────────
20
+ const SKILLS_DIR = join(homedir(), '.claude', 'merlin', 'skills');
21
+ const SKILLS_INDEX = join(SKILLS_DIR, 'SKILLS-INDEX.md');
22
+ const SKILL_STATS_FILE = join(homedir(), '.claude', 'merlin', 'skill-stats.json');
23
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
24
+ function loadStats() {
25
+ try {
26
+ if (existsSync(SKILL_STATS_FILE)) {
27
+ return JSON.parse(readFileSync(SKILL_STATS_FILE, 'utf-8'));
28
+ }
29
+ }
30
+ catch { /* ignore */ }
31
+ return {};
32
+ }
33
+ function saveStats(stats) {
34
+ try {
35
+ mkdirSync(join(homedir(), '.claude', 'merlin'), { recursive: true });
36
+ writeFileSync(SKILL_STATS_FILE, JSON.stringify(stats, null, 2), 'utf-8');
37
+ }
38
+ catch { /* non-critical */ }
39
+ }
40
+ /** Find all .md files recursively in a directory */
41
+ function findSkillFiles(dir) {
42
+ const results = [];
43
+ if (!existsSync(dir))
44
+ return results;
45
+ for (const entry of readdirSync(dir)) {
46
+ const fullPath = join(dir, entry);
47
+ try {
48
+ const stat = statSync(fullPath);
49
+ if (stat.isDirectory()) {
50
+ results.push(...findSkillFiles(fullPath));
51
+ }
52
+ else if (entry.endsWith('.md') && entry !== 'SKILLS-INDEX.md') {
53
+ results.push(fullPath);
54
+ }
55
+ }
56
+ catch { /* skip unreadable */ }
57
+ }
58
+ return results;
59
+ }
60
+ /** Parse frontmatter from a skill .md file */
61
+ function parseFrontmatter(content) {
62
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
63
+ if (!match)
64
+ return {};
65
+ const result = {};
66
+ for (const line of match[1].split('\n')) {
67
+ const colonIdx = line.indexOf(':');
68
+ if (colonIdx > 0) {
69
+ const key = line.slice(0, colonIdx).trim();
70
+ let value = line.slice(colonIdx + 1).trim();
71
+ // Parse arrays
72
+ if (typeof value === 'string' && value.startsWith('[')) {
73
+ try {
74
+ value = JSON.parse(value.replace(/'/g, '"'));
75
+ }
76
+ catch { /* keep as string */ }
77
+ }
78
+ // Parse numbers
79
+ if (typeof value === 'string' && /^\d+$/.test(value)) {
80
+ value = parseInt(value, 10);
81
+ }
82
+ result[key] = value;
83
+ }
84
+ }
85
+ return result;
86
+ }
87
+ /** Search skills by keyword matching against tags and name */
88
+ function searchSkills(query) {
89
+ const files = findSkillFiles(SKILLS_DIR);
90
+ const queryWords = query.toLowerCase().split(/\s+/);
91
+ const results = [];
92
+ for (const filePath of files) {
93
+ try {
94
+ const content = readFileSync(filePath, 'utf-8');
95
+ const fm = parseFrontmatter(content);
96
+ const id = fm.id || basename(filePath, '.md');
97
+ const name = fm.name || id;
98
+ const tags = fm.tags || [];
99
+ const domain = fm.domain || '';
100
+ const category = fm.category || '';
101
+ // Score: exact tag match = 3, partial tag match = 2, name match = 2, domain/category = 1
102
+ let score = 0;
103
+ const allSearchable = [...tags, name.toLowerCase(), domain, category];
104
+ for (const word of queryWords) {
105
+ for (const term of allSearchable) {
106
+ if (term === word)
107
+ score += 3;
108
+ else if (term.includes(word) || word.includes(term))
109
+ score += 1;
110
+ }
111
+ }
112
+ if (score > 0) {
113
+ const relPath = relative(SKILLS_DIR, filePath).replace(/\.md$/, '');
114
+ results.push({ id, name, path: relPath, score, tags });
115
+ }
116
+ }
117
+ catch { /* skip unreadable */ }
118
+ }
119
+ return results.sort((a, b) => b.score - a.score);
120
+ }
121
+ // ─── Register Tools ───────────────────────────────────────────────────────────
122
+ export function registerSkillsTools(ctx) {
123
+ const { server } = ctx;
124
+ // ── merlin_find_skill — search the skills index ──────────────────────────
125
+ server.tool('merlin_find_skill', 'Search the Merlin Skills Index for relevant skills to load. ' +
126
+ 'Describe what you need (e.g., "react performance", "stripe payments", "telegram bot") ' +
127
+ 'and get back the best matching skills with their file paths. ' +
128
+ 'Load the top 1-3 skills by reading their .md files.', {
129
+ query: z.string().describe('What kind of skill you need (e.g., "react hooks", "security audit", "whatsapp messaging")'),
130
+ limit: z.number().optional().describe('Max results to return (default 5)'),
131
+ }, async ({ query, limit }) => {
132
+ const maxResults = Math.min(limit || 5, 20);
133
+ // First try local file search
134
+ const localResults = searchSkills(query);
135
+ // Also try server index if available
136
+ let serverResults = [];
137
+ try {
138
+ const skills = await ctx.client.request(`/api/skills/search?q=${encodeURIComponent(query)}&limit=${maxResults}`);
139
+ serverResults = skills.skills || [];
140
+ }
141
+ catch { /* server unavailable — local-only is fine */ }
142
+ // Merge results (local first, deduplicated)
143
+ const seen = new Set();
144
+ const merged = [];
145
+ for (const r of localResults.slice(0, maxResults)) {
146
+ seen.add(r.id);
147
+ const stats = loadStats()[r.id];
148
+ const successRate = stats && stats.usageCount > 0
149
+ ? `${Math.round((stats.successCount / stats.usageCount) * 100)}%`
150
+ : 'new';
151
+ merged.push(`**${r.name}** (${r.path})\n` +
152
+ ` Tags: ${r.tags.join(', ')}\n` +
153
+ ` Score: ${r.score} | Success: ${successRate} | Uses: ${stats?.usageCount || 0}\n` +
154
+ ` Load: Read ~/.claude/merlin/skills/${r.path}.md`);
155
+ }
156
+ for (const r of serverResults) {
157
+ if (!seen.has(r.id) && merged.length < maxResults) {
158
+ seen.add(r.id);
159
+ merged.push(`**${r.name}** (server)\n` +
160
+ ` ${r.description}\n` +
161
+ ` Install: merlin_install_skill("${r.id}")`);
162
+ }
163
+ }
164
+ const response = merged.length > 0
165
+ ? `Found ${merged.length} skill(s) for "${query}":\n\n${merged.join('\n\n')}`
166
+ : `No skills found for "${query}". You can create one with merlin_evolve_skill after completing the task.`;
167
+ return {
168
+ content: [{ type: 'text', text: coachWrap('merlin_find_skill', response) }],
169
+ };
170
+ });
171
+ // ── merlin_track_skill — record skill usage outcome ──────────────────────
172
+ server.tool('merlin_track_skill', 'Record that a skill was used and whether it helped. ' +
173
+ 'Call this after using a skill to track quality. ' +
174
+ 'Skills with high success rates get recommended more often.', {
175
+ skillId: z.string().describe('The skill ID (from frontmatter)'),
176
+ success: z.boolean().describe('Did the skill help accomplish the task?'),
177
+ feedback: z.string().optional().describe('What worked or didn\'t work'),
178
+ }, async ({ skillId, success, feedback }) => {
179
+ const stats = loadStats();
180
+ if (!stats[skillId]) {
181
+ stats[skillId] = { usageCount: 0, successCount: 0, failCount: 0, lastUsed: '', version: 1 };
182
+ }
183
+ stats[skillId].usageCount++;
184
+ if (success)
185
+ stats[skillId].successCount++;
186
+ else
187
+ stats[skillId].failCount++;
188
+ stats[skillId].lastUsed = new Date().toISOString();
189
+ saveStats(stats);
190
+ // Push stats to server (background, non-blocking)
191
+ try {
192
+ void ctx.client.request('/api/skills/usage', {
193
+ method: 'POST',
194
+ headers: { 'Content-Type': 'application/json' },
195
+ body: JSON.stringify({ skillId, success, feedback }),
196
+ });
197
+ }
198
+ catch { /* non-critical */ }
199
+ const rate = Math.round((stats[skillId].successCount / stats[skillId].usageCount) * 100);
200
+ const response = success
201
+ ? `Tracked: ${skillId} succeeded (${rate}% success rate, ${stats[skillId].usageCount} uses)`
202
+ : `Tracked: ${skillId} failed (${rate}% success rate). ${feedback ? `Feedback: ${feedback}` : 'Consider evolving this skill.'}`;
203
+ return {
204
+ content: [{ type: 'text', text: coachWrap('merlin_track_skill', response) }],
205
+ };
206
+ });
207
+ // ── merlin_evolve_skill — improve or create a skill ──────────────────────
208
+ server.tool('merlin_evolve_skill', 'Improve an existing skill or create a new one based on what you learned during a task. ' +
209
+ 'This is how skills self-evolve: after using a skill, if you found it lacking or wrong, ' +
210
+ 'update it with better instructions. New skills are created from successful task patterns.', {
211
+ skillId: z.string().describe('Skill ID to evolve (or new ID for a new skill)'),
212
+ name: z.string().describe('Human-readable skill name'),
213
+ domain: z.enum(['coding', 'non-coding']).describe('Top-level domain'),
214
+ category: z.string().describe('Sub-category (e.g., frontend, security, communication, automation)'),
215
+ tags: z.array(z.string()).describe('Search tags for discovery'),
216
+ content: z.string().describe('The full skill instructions (markdown)'),
217
+ reason: z.string().describe('Why this skill was created or what changed'),
218
+ }, async ({ skillId, name, domain, category, tags, content, reason }) => {
219
+ // Determine file path
220
+ const categoryDir = join(SKILLS_DIR, domain === 'non-coding' ? category : `coding`);
221
+ // For non-coding, use the category directly; for coding, check if the category subdir makes more sense
222
+ const targetDir = existsSync(join(SKILLS_DIR, category)) ? join(SKILLS_DIR, category) : categoryDir;
223
+ mkdirSync(targetDir, { recursive: true });
224
+ const filePath = join(targetDir, `${skillId}.md`);
225
+ // Check if evolving an existing skill
226
+ let version = 1;
227
+ const evolutionLog = [];
228
+ if (existsSync(filePath)) {
229
+ const existing = readFileSync(filePath, 'utf-8');
230
+ const fm = parseFrontmatter(existing);
231
+ version = (fm.version || 0) + 1;
232
+ const existingEvolution = fm.evolution || [];
233
+ evolutionLog.push(...existingEvolution);
234
+ }
235
+ evolutionLog.push(`v${version}: ${reason}`);
236
+ // Write the skill file
237
+ const frontmatter = [
238
+ '---',
239
+ `id: ${skillId}`,
240
+ `name: ${name}`,
241
+ `domain: ${domain}`,
242
+ `category: ${category}`,
243
+ `tags: [${tags.join(', ')}]`,
244
+ `version: ${version}`,
245
+ `source: ${version === 1 ? 'evolved' : 'evolved'}`,
246
+ `successRate: 0`,
247
+ `usageCount: 0`,
248
+ `evolution:`,
249
+ ...evolutionLog.map(e => ` - "${e}"`),
250
+ '---',
251
+ '',
252
+ ].join('\n');
253
+ writeFileSync(filePath, frontmatter + content, 'utf-8');
254
+ // Update stats
255
+ const stats = loadStats();
256
+ if (stats[skillId]) {
257
+ stats[skillId].lastEvolved = new Date().toISOString();
258
+ stats[skillId].version = version;
259
+ }
260
+ saveStats(stats);
261
+ // Push to server (background)
262
+ try {
263
+ void ctx.client.request('/api/skills', {
264
+ method: 'POST',
265
+ headers: { 'Content-Type': 'application/json' },
266
+ body: JSON.stringify({
267
+ id: skillId, name, domain, category, tags,
268
+ content, version, reason,
269
+ }),
270
+ });
271
+ }
272
+ catch { /* non-critical */ }
273
+ // Update the index file
274
+ updateSkillsIndex();
275
+ const action = version === 1 ? 'Created' : `Evolved to v${version}`;
276
+ const response = `${action}: **${name}** (${skillId})\n` +
277
+ `Path: ${relative(join(homedir(), '.claude', 'merlin'), filePath)}\n` +
278
+ `Reason: ${reason}\n` +
279
+ `Tags: ${tags.join(', ')}`;
280
+ return {
281
+ content: [{ type: 'text', text: coachWrap('merlin_evolve_skill', response) }],
282
+ };
283
+ });
284
+ }
285
+ // ─── Index Regeneration ───────────────────────────────────────────────────────
286
+ /** Rebuild SKILLS-INDEX.md from all skill files on disk */
287
+ function updateSkillsIndex() {
288
+ const files = findSkillFiles(SKILLS_DIR);
289
+ const byCategory = new Map();
290
+ for (const filePath of files) {
291
+ try {
292
+ const content = readFileSync(filePath, 'utf-8');
293
+ const fm = parseFrontmatter(content);
294
+ const id = fm.id || basename(filePath, '.md');
295
+ const name = fm.name || id;
296
+ const tags = fm.tags || [];
297
+ const domain = fm.domain || 'coding';
298
+ const category = fm.category || 'other';
299
+ const key = `${domain} > ${category}`;
300
+ const relPath = relative(SKILLS_DIR, filePath).replace(/\.md$/, '');
301
+ if (!byCategory.has(key))
302
+ byCategory.set(key, []);
303
+ byCategory.get(key).push({ id, name, tags, relPath });
304
+ }
305
+ catch { /* skip */ }
306
+ }
307
+ const lines = [
308
+ '# Merlin Skills Index',
309
+ '',
310
+ 'Search this index to find skills. Load by reading the .md file.',
311
+ 'Only load 1-3 per task. After use, track with merlin_track_skill.',
312
+ '',
313
+ ];
314
+ for (const [category, skills] of [...byCategory.entries()].sort()) {
315
+ lines.push(`## ${category}`);
316
+ for (const s of skills) {
317
+ lines.push(`- \`${s.relPath}\` — ${s.name} — [${s.tags.join(', ')}]`);
318
+ }
319
+ lines.push('');
320
+ }
321
+ try {
322
+ writeFileSync(SKILLS_INDEX, lines.join('\n'), 'utf-8');
323
+ }
324
+ catch { /* non-critical */ }
325
+ }
326
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/server/tools/skills.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,24 @@
8
8
  * 3. Ranking all candidates and recommending the best fit
9
9
  */
10
10
  import type { ToolContext } from './types.js';
11
+ /** Domain specialists with keyword matchers */
12
+ export declare const DOMAIN_AGENTS: Record<string, {
13
+ keywords: RegExp;
14
+ role: string;
15
+ }>;
16
+ /** Result from a local specialist check */
17
+ export interface LocalSpecialistHint {
18
+ name: string;
19
+ role: string;
20
+ }
21
+ /**
22
+ * Check whether a locally installed domain specialist is a better fit
23
+ * for the given task than the chosen agent. Returns the first match, or
24
+ * null if the chosen agent already IS the best local specialist.
25
+ *
26
+ * This is intentionally lightweight — no API calls, pure keyword scoring —
27
+ * so it can run inside merlin_route without adding latency.
28
+ */
29
+ export declare function checkLocalSpecialists(task: string, chosenAgent: string): LocalSpecialistHint | null;
11
30
  export declare function registerSmartRouteTools(ctx: ToolContext): void;
12
31
  //# sourceMappingURL=smart-route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"smart-route.d.ts","sourceRoot":"","sources":["../../../src/server/tools/smart-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2D9C,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,QA8GvD"}
1
+ {"version":3,"file":"smart-route.d.ts","sourceRoot":"","sources":["../../../src/server/tools/smart-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAe9C,+CAA+C;AAC/C,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAO5E,CAAC;AAEF,2CAA2C;AAC3C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAWnG;AAoCD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,QA8GvD"}
@@ -24,7 +24,7 @@ const AGENT_ROLES = {
24
24
  'docs-keeper': 'Documentation updates',
25
25
  };
26
26
  /** Domain specialists with keyword matchers */
27
- const DOMAIN_AGENTS = {
27
+ export const DOMAIN_AGENTS = {
28
28
  'remotion': { keywords: /\b(video|animation|remotion|render)\b/, role: 'Programmatic video creation' },
29
29
  'merlin-frontend': { keywords: /\b(react|vue|frontend|ui|component|css|tailwind)\b/, role: 'Frontend development' },
30
30
  'merlin-security': { keywords: /\b(security|audit|pentest|owasp|vulnerabilit)\b/, role: 'Deep security audits' },
@@ -32,6 +32,28 @@ const DOMAIN_AGENTS = {
32
32
  'merlin-api-designer': { keywords: /\b(api|rest|graphql|endpoint|swagger|openapi)\b/, role: 'API design' },
33
33
  'merlin-migrator': { keywords: /\b(migrat|schema|database|alter|column)\b/, role: 'Database migrations' },
34
34
  };
35
+ /**
36
+ * Check whether a locally installed domain specialist is a better fit
37
+ * for the given task than the chosen agent. Returns the first match, or
38
+ * null if the chosen agent already IS the best local specialist.
39
+ *
40
+ * This is intentionally lightweight — no API calls, pure keyword scoring —
41
+ * so it can run inside merlin_route without adding latency.
42
+ */
43
+ export function checkLocalSpecialists(task, chosenAgent) {
44
+ const taskLower = task.toLowerCase();
45
+ const available = getAvailableAgents();
46
+ for (const [agentName, { keywords, role }] of Object.entries(DOMAIN_AGENTS)) {
47
+ if (agentName === chosenAgent)
48
+ continue;
49
+ if (!available.includes(agentName))
50
+ continue;
51
+ if (keywords.test(taskLower)) {
52
+ return { name: agentName, role };
53
+ }
54
+ }
55
+ return null;
56
+ }
35
57
  /** Keyword boost patterns for core agents */
36
58
  const CORE_BOOSTS = {
37
59
  'implementation-dev': /\b(build|add|create|implement|write|code)\b/,
@@ -1 +1 @@
1
- {"version":3,"file":"smart-route.js","sourceRoot":"","sources":["../../../src/server/tools/smart-route.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"smart-route.js","sourceRoot":"","sources":["../../../src/server/tools/smart-route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Team Workers Tools — Spawn parallel AI CLI workers in tmux panes.
3
+ * Job state persisted to ~/.merlin/state/team/ for status/cleanup queries.
4
+ */
5
+ import type { ToolContext } from './types.js';
6
+ export declare function registerTeamWorkerTools(ctx: ToolContext): void;
7
+ //# sourceMappingURL=team-workers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-workers.d.ts","sourceRoot":"","sources":["../../../src/server/tools/team-workers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA0H9C,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CA4J9D"}