create-merlin-brain 3.22.0 → 4.0.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 (80) hide show
  1. package/README.md +38 -4
  2. package/bin/merlin-ask.cjs +111 -0
  3. package/bin/merlin-cli.cjs +22 -0
  4. package/bin/runtime-adapters.cjs +709 -28
  5. package/dist/server/api/client.d.ts +2 -0
  6. package/dist/server/api/client.d.ts.map +1 -1
  7. package/dist/server/api/client.js +4 -0
  8. package/dist/server/api/client.js.map +1 -1
  9. package/dist/server/server.d.ts.map +1 -1
  10. package/dist/server/server.js +56 -4
  11. package/dist/server/server.js.map +1 -1
  12. package/dist/server/tools/auto-mode.d.ts +9 -0
  13. package/dist/server/tools/auto-mode.d.ts.map +1 -0
  14. package/dist/server/tools/auto-mode.js +231 -0
  15. package/dist/server/tools/auto-mode.js.map +1 -0
  16. package/dist/server/tools/computer-use.d.ts +8 -0
  17. package/dist/server/tools/computer-use.d.ts.map +1 -0
  18. package/dist/server/tools/computer-use.js +355 -0
  19. package/dist/server/tools/computer-use.js.map +1 -0
  20. package/dist/server/tools/dream.d.ts +9 -0
  21. package/dist/server/tools/dream.d.ts.map +1 -0
  22. package/dist/server/tools/dream.js +246 -0
  23. package/dist/server/tools/dream.js.map +1 -0
  24. package/dist/server/tools/help.d.ts +3 -0
  25. package/dist/server/tools/help.d.ts.map +1 -0
  26. package/dist/server/tools/help.js +110 -0
  27. package/dist/server/tools/help.js.map +1 -0
  28. package/dist/server/tools/hud.d.ts +13 -0
  29. package/dist/server/tools/hud.d.ts.map +1 -0
  30. package/dist/server/tools/hud.js +295 -0
  31. package/dist/server/tools/hud.js.map +1 -0
  32. package/dist/server/tools/index.d.ts +5 -0
  33. package/dist/server/tools/index.d.ts.map +1 -1
  34. package/dist/server/tools/index.js +5 -0
  35. package/dist/server/tools/index.js.map +1 -1
  36. package/dist/server/tools/provider-ask.d.ts +10 -0
  37. package/dist/server/tools/provider-ask.d.ts.map +1 -0
  38. package/dist/server/tools/provider-ask.js +234 -0
  39. package/dist/server/tools/provider-ask.js.map +1 -0
  40. package/dist/server/tools/rate-limit.d.ts +8 -0
  41. package/dist/server/tools/rate-limit.d.ts.map +1 -0
  42. package/dist/server/tools/rate-limit.js +184 -0
  43. package/dist/server/tools/rate-limit.js.map +1 -0
  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/team-workers.d.ts +7 -0
  49. package/dist/server/tools/team-workers.d.ts.map +1 -0
  50. package/dist/server/tools/team-workers.js +271 -0
  51. package/dist/server/tools/team-workers.js.map +1 -0
  52. package/dist/server/utils/merlin-manifest.d.ts +6 -1
  53. package/dist/server/utils/merlin-manifest.d.ts.map +1 -1
  54. package/dist/server/utils/merlin-manifest.js +34 -1
  55. package/dist/server/utils/merlin-manifest.js.map +1 -1
  56. package/files/CLAUDE.md +22 -0
  57. package/files/hooks/rate-limit-watch.sh +120 -0
  58. package/files/hooks/statusline.sh +148 -0
  59. package/files/merlin/skills/SKILLS-INDEX.md +82 -0
  60. package/files/merlin/skills/automation/payments.md +14 -0
  61. package/files/merlin/skills/automation/webhooks.md +14 -0
  62. package/files/merlin/skills/coding/accessibility.md +14 -0
  63. package/files/merlin/skills/coding/api-design.md +14 -0
  64. package/files/merlin/skills/coding/debug-mode.md +14 -0
  65. package/files/merlin/skills/coding/focus-mode.md +14 -0
  66. package/files/merlin/skills/coding/loop.md +14 -0
  67. package/files/merlin/skills/coding/performance.md +14 -0
  68. package/files/merlin/skills/coding/react-patterns.md +51 -0
  69. package/files/merlin/skills/coding/security-hardening.md +56 -0
  70. package/files/merlin/skills/coding/verify.md +14 -0
  71. package/files/merlin/skills/communication/dispatcher.md +40 -0
  72. package/files/merlin/skills/communication/email-gmail.md +31 -0
  73. package/files/merlin/skills/communication/telegram.md +50 -0
  74. package/files/merlin/skills/communication/whatsapp.md +47 -0
  75. package/files/merlin/skills/data/google-sheets.md +14 -0
  76. package/files/merlin/skills/design/animation.md +14 -0
  77. package/files/merlin/skills/devops/docker-containers.md +14 -0
  78. package/files/merlin/skills/research/brainstorm.md +14 -0
  79. package/files/merlin/skills/testing/tdd-workflow.md +58 -0
  80. package/package.json +4 -2
@@ -0,0 +1,246 @@
1
+ /**
2
+ * AutoDream Memory Consolidation Tools
3
+ * Enables/configures Claude Code's AutoDream for Merlin's memory system.
4
+ * Project memory: ~/.claude/projects/<derived-path>/memory/
5
+ * Global memory: ~/.claude/memory/
6
+ */
7
+ import { z } from 'zod';
8
+ import { existsSync, readFileSync, writeFileSync, readdirSync, statSync, mkdirSync } from 'fs';
9
+ import { join } from 'path';
10
+ import { homedir } from 'os';
11
+ import { coachWrap } from '../session-coach.js';
12
+ const STALE_DAYS = 30;
13
+ const SETTINGS_PATH = join(homedir(), '.claude', 'settings.json');
14
+ const GLOBAL_MEMORY_DIR = join(homedir(), '.claude', 'memory');
15
+ const PROJECTS_BASE_DIR = join(homedir(), '.claude', 'projects');
16
+ // ── Settings ──────────────────────────────────────────────────────────────────
17
+ function readSettings() {
18
+ if (!existsSync(SETTINGS_PATH))
19
+ return {};
20
+ try {
21
+ return JSON.parse(readFileSync(SETTINGS_PATH, 'utf-8'));
22
+ }
23
+ catch {
24
+ return {};
25
+ }
26
+ }
27
+ function writeSettings(settings) {
28
+ const dir = join(homedir(), '.claude');
29
+ if (!existsSync(dir))
30
+ mkdirSync(dir, { recursive: true });
31
+ writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
32
+ }
33
+ // ── Path resolution ───────────────────────────────────────────────────────────
34
+ /** Derive project memory path: replace / with -, strip leading - */
35
+ function deriveProjectMemoryDir(repoRootPath) {
36
+ const derived = repoRootPath.replace(/\//g, '-').replace(/^-/, '');
37
+ return join(PROJECTS_BASE_DIR, derived, 'memory');
38
+ }
39
+ async function resolveMemoryDir(scope, getRepoRootPath) {
40
+ if (scope === 'global')
41
+ return { dir: GLOBAL_MEMORY_DIR, label: 'global' };
42
+ if (getRepoRootPath) {
43
+ const root = await getRepoRootPath();
44
+ if (root)
45
+ return { dir: deriveProjectMemoryDir(root), label: `project (${root})` };
46
+ }
47
+ // Fallback: find most recently modified project memory dir
48
+ if (existsSync(PROJECTS_BASE_DIR)) {
49
+ let newest = null;
50
+ for (const entry of readdirSync(PROJECTS_BASE_DIR)) {
51
+ const memDir = join(PROJECTS_BASE_DIR, entry, 'memory');
52
+ if (existsSync(memDir)) {
53
+ const st = statSync(memDir);
54
+ if (!newest || st.mtimeMs > newest.mtime)
55
+ newest = { dir: memDir, mtime: st.mtimeMs };
56
+ }
57
+ }
58
+ if (newest)
59
+ return { dir: newest.dir, label: 'project (auto-detected)' };
60
+ }
61
+ return { dir: GLOBAL_MEMORY_DIR, label: 'global (fallback)' };
62
+ }
63
+ // ── Frontmatter parser ────────────────────────────────────────────────────────
64
+ function parseFrontmatter(content) {
65
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
66
+ if (!match)
67
+ return { name: '', description: '', type: 'unknown' };
68
+ const block = match[1];
69
+ const get = (key) => { const m = block.match(new RegExp(`^${key}:\\s*(.+)$`, 'm')); return m ? m[1].trim() : ''; };
70
+ return { name: get('name'), description: get('description'), type: get('type') || 'unknown' };
71
+ }
72
+ // ── Memory scanner ────────────────────────────────────────────────────────────
73
+ function scanMemoryFiles(dir) {
74
+ if (!existsSync(dir))
75
+ return [];
76
+ const staleCutoff = STALE_DAYS * 24 * 60 * 60 * 1000;
77
+ const now = Date.now();
78
+ const results = [];
79
+ for (const fname of readdirSync(dir)) {
80
+ if (!fname.endsWith('.md') || fname === 'MEMORY.md')
81
+ continue;
82
+ try {
83
+ const content = readFileSync(join(dir, fname), 'utf-8');
84
+ const st = statSync(join(dir, fname));
85
+ const fm = parseFrontmatter(content);
86
+ results.push({ name: fname, type: fm.type, description: fm.description || fm.name, modifiedAt: st.mtime, isStale: now - st.mtimeMs > staleCutoff });
87
+ }
88
+ catch { /* skip unreadable */ }
89
+ }
90
+ return results;
91
+ }
92
+ // ── Index checker ─────────────────────────────────────────────────────────────
93
+ function checkMemoryIndex(dir, files) {
94
+ const indexPath = join(dir, 'MEMORY.md');
95
+ const existingNames = new Set(files.map(f => f.name));
96
+ if (!existsSync(indexPath))
97
+ return { orphanedEntries: [], unindexedFiles: files.map(f => f.name) };
98
+ const content = readFileSync(indexPath, 'utf-8');
99
+ const linked = new Set();
100
+ for (const m of content.matchAll(/\[.*?\]\(([^)]+\.md)\)/g))
101
+ linked.add(m[1]);
102
+ return {
103
+ orphanedEntries: [...linked].filter(f => !existingNames.has(f)),
104
+ unindexedFiles: [...existingNames].filter(f => !linked.has(f)),
105
+ };
106
+ }
107
+ // ── Duplicate detector ────────────────────────────────────────────────────────
108
+ function findPotentialDuplicates(files) {
109
+ const dupes = [];
110
+ const baseName = (n) => n.replace(/\.md$/, '').replace(/[-_]\d+$/, '').toLowerCase();
111
+ for (let i = 0; i < files.length; i++) {
112
+ for (let j = i + 1; j < files.length; j++) {
113
+ const a = files[i];
114
+ const b = files[j];
115
+ if (a.type === b.type && baseName(a.name) === baseName(b.name)) {
116
+ dupes.push([a.name, b.name]);
117
+ continue;
118
+ }
119
+ if (a.description && b.description && a.description.length > 10 && b.description.length > 10) {
120
+ const [shorter, longer] = a.description.length < b.description.length ? [a.description, b.description] : [b.description, a.description];
121
+ if (longer.toLowerCase().includes(shorter.toLowerCase()))
122
+ dupes.push([a.name, b.name]);
123
+ }
124
+ }
125
+ }
126
+ return dupes;
127
+ }
128
+ // ── Report formatter ──────────────────────────────────────────────────────────
129
+ function formatConsolidationReport(files, indexIssues, label) {
130
+ const byType = {};
131
+ for (const f of files) {
132
+ if (!byType[f.type])
133
+ byType[f.type] = [];
134
+ byType[f.type].push(f.name);
135
+ }
136
+ const stale = files.filter(f => f.isStale).map(f => f.name);
137
+ const dupes = findPotentialDuplicates(files);
138
+ const suggestions = [];
139
+ if (dupes.length > 0)
140
+ suggestions.push(`Merge ${dupes.length} potential duplicate(s): ${dupes.map(([a, b]) => `${a} + ${b}`).join('; ')}`);
141
+ if (stale.length > 0)
142
+ suggestions.push(`Review ${stale.length} stale file(s) (${STALE_DAYS}+ days): ${stale.join(', ')}`);
143
+ if (indexIssues.orphanedEntries.length > 0)
144
+ suggestions.push(`Remove ${indexIssues.orphanedEntries.length} orphaned MEMORY.md link(s): ${indexIssues.orphanedEntries.join(', ')}`);
145
+ if (indexIssues.unindexedFiles.length > 0)
146
+ suggestions.push(`Add ${indexIssues.unindexedFiles.length} missing MEMORY.md entry(s): ${indexIssues.unindexedFiles.join(', ')}`);
147
+ if (suggestions.length === 0)
148
+ suggestions.push('Memory looks clean — no consolidation needed.');
149
+ const lines = [`## Memory Consolidation Report — ${label}`, '', `**Total memory files:** ${files.length}`, ''];
150
+ if (files.length === 0) {
151
+ lines.push('No memory files found in this directory.');
152
+ }
153
+ else {
154
+ lines.push('### Files by Type');
155
+ for (const [type, names] of Object.entries(byType))
156
+ lines.push(`- **${type}** (${names.length}): ${names.join(', ')}`);
157
+ if (stale.length > 0) {
158
+ lines.push('', `### Stale Files (${STALE_DAYS}+ days unchanged)`);
159
+ stale.forEach(f => lines.push(`- ${f}`));
160
+ }
161
+ if (dupes.length > 0) {
162
+ lines.push('', '### Potential Duplicates');
163
+ dupes.forEach(([a, b]) => lines.push(`- \`${a}\` and \`${b}\``));
164
+ }
165
+ if (indexIssues.orphanedEntries.length > 0) {
166
+ lines.push('', '### Orphaned MEMORY.md Entries');
167
+ indexIssues.orphanedEntries.forEach(f => lines.push(`- ${f}`));
168
+ }
169
+ if (indexIssues.unindexedFiles.length > 0) {
170
+ lines.push('', '### Unindexed Files (not in MEMORY.md)');
171
+ indexIssues.unindexedFiles.forEach(f => lines.push(`- ${f}`));
172
+ }
173
+ }
174
+ lines.push('', '### Suggested Actions');
175
+ suggestions.forEach((s, i) => lines.push(`${i + 1}. ${s}`));
176
+ return lines.join('\n');
177
+ }
178
+ // ── Tool registration ─────────────────────────────────────────────────────────
179
+ export function registerDreamTools(ctx) {
180
+ const { server, getRepoRootPath } = ctx;
181
+ server.tool('merlin_dream', 'Enable, disable, check status, or manually trigger consolidation of Merlin\'s AutoDream memory system. AutoDream keeps Claude Code\'s memory files organized by periodically consolidating them. Use "enable" to turn on automatic consolidation, "status" to inspect memory health, and "consolidate" to get a report with actionable suggestions for merging duplicates, pruning stale entries, and fixing the MEMORY.md index.', {
182
+ action: z.enum(['enable', 'disable', 'status', 'consolidate']).describe('enable — turn on AutoDream; disable — turn it off; status — check current state and memory stats; consolidate — scan memory and return actionable suggestions'),
183
+ scope: z.enum(['project', 'global']).optional().describe('"project" (default) uses .claude/projects/<repo>/memory/, "global" uses ~/.claude/memory/'),
184
+ }, async ({ action, scope = 'project' }) => {
185
+ try {
186
+ const { dir: memDir, label } = await resolveMemoryDir(scope, getRepoRootPath);
187
+ if (action === 'enable') {
188
+ const settings = readSettings();
189
+ settings.autoMemoryEnabled = true;
190
+ writeSettings(settings);
191
+ const text = [
192
+ '## AutoDream Enabled',
193
+ '',
194
+ 'Claude Code will now automatically consolidate memory files over time.',
195
+ `**Memory path (${scope}):** \`${memDir}\``,
196
+ '',
197
+ 'Run `merlin_dream` with action "status" to check memory health.',
198
+ 'Run `merlin_dream` with action "consolidate" to get manual suggestions.',
199
+ ].join('\n');
200
+ return { content: [{ type: 'text', text: coachWrap('merlin_dream', text) }] };
201
+ }
202
+ if (action === 'disable') {
203
+ const settings = readSettings();
204
+ settings.autoMemoryEnabled = false;
205
+ writeSettings(settings);
206
+ return { content: [{ type: 'text', text: coachWrap('merlin_dream', '## AutoDream Disabled\n\nAutomatic memory consolidation has been turned off.\nRun `merlin_dream` with action "enable" to re-activate.') }] };
207
+ }
208
+ if (action === 'status') {
209
+ const settings = readSettings();
210
+ const files = scanMemoryFiles(memDir);
211
+ const sorted = [...files].sort((a, b) => a.modifiedAt.getTime() - b.modifiedAt.getTime());
212
+ const lines = [
213
+ '## AutoDream Status',
214
+ '',
215
+ `**Enabled:** ${settings.autoMemoryEnabled === true ? 'Yes' : 'No'}`,
216
+ `**Scope:** ${label}`,
217
+ `**Memory directory:** \`${memDir}\``,
218
+ `**Directory exists:** ${existsSync(memDir) ? 'Yes' : 'No (created on first memory save)'}`,
219
+ '',
220
+ '### Memory Stats',
221
+ `- **Total files:** ${files.length}`,
222
+ `- **Stale (${STALE_DAYS}+ days):** ${files.filter(f => f.isStale).length}`,
223
+ sorted[0] ? `- **Oldest:** ${sorted[0].name} (${sorted[0].modifiedAt.toLocaleDateString()})` : '',
224
+ sorted.at(-1) ? `- **Newest:** ${sorted.at(-1).name} (${sorted.at(-1).modifiedAt.toLocaleDateString()})` : '',
225
+ ].filter(Boolean);
226
+ if (settings.autoMemoryEnabled !== true)
227
+ lines.push('', 'Run `merlin_dream` with action "enable" to activate AutoDream.');
228
+ if (files.length > 0)
229
+ lines.push('', 'Run `merlin_dream` with action "consolidate" for a full health report.');
230
+ return { content: [{ type: 'text', text: coachWrap('merlin_dream', lines.join('\n')) }] };
231
+ }
232
+ // consolidate
233
+ const files = scanMemoryFiles(memDir);
234
+ const indexIssues = checkMemoryIndex(memDir, files);
235
+ const report = formatConsolidationReport(files, indexIssues, label);
236
+ return { content: [{ type: 'text', text: coachWrap('merlin_dream', report) }] };
237
+ }
238
+ catch (error) {
239
+ return {
240
+ content: [{ type: 'text', text: `Error in merlin_dream: ${error instanceof Error ? error.message : 'Unknown error'}` }],
241
+ isError: true,
242
+ };
243
+ }
244
+ });
245
+ }
246
+ //# sourceMappingURL=dream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dream.js","sourceRoot":"","sources":["../../../src/server/tools/dream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolContext } from './types.js';
2
+ export declare function registerHelpTools(ctx: ToolContext): void;
3
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/server/tools/help.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAmF9C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAmDxD"}
@@ -0,0 +1,110 @@
1
+ import { z } from 'zod';
2
+ import { coachWrap } from '../session-coach.js';
3
+ function recommendRoute(task) {
4
+ const lower = task.toLowerCase();
5
+ if (/\b(resume|continue|pick up|where were we|status|progress|next step)\b/.test(lower)) {
6
+ return {
7
+ label: 'Resume and status',
8
+ why: 'The task is about regaining state, progress, or momentum.',
9
+ tools: ['merlin_get_project_status', 'merlin_get_brief'],
10
+ skills: ['merlin-resume', 'merlin-progress'],
11
+ agents: ['merlin_codebase_mapper'],
12
+ };
13
+ }
14
+ if (/\b(map codebase|understand|explore|onboard|architecture|how does|where is)\b/.test(lower)) {
15
+ return {
16
+ label: 'Codebase mapping',
17
+ why: 'The task needs architectural understanding before edits.',
18
+ tools: ['merlin_search', 'merlin_get_context', 'merlin_find_files'],
19
+ skills: ['merlin-map-codebase'],
20
+ agents: ['merlin_codebase_mapper', 'system_architect'],
21
+ };
22
+ }
23
+ if (/\b(bug|crash|error|failing|fix|debug|broken|exception)\b/.test(lower)) {
24
+ return {
25
+ label: 'Debug and repair',
26
+ why: 'The task is framed as a bug, regression, or failing behavior.',
27
+ tools: ['merlin_get_context', 'merlin_search', 'merlin_smart_route'],
28
+ skills: ['merlin-workflow', 'merlin-verify'],
29
+ agents: ['implementation_dev', 'tests_qa', 'hardening_guard'],
30
+ };
31
+ }
32
+ if (/\b(test|coverage|qa|verify|validation|release confidence)\b/.test(lower)) {
33
+ return {
34
+ label: 'Verification',
35
+ why: 'The task is primarily about validation and confidence.',
36
+ tools: ['merlin_get_context', 'merlin_find_skill'],
37
+ skills: ['merlin-verify'],
38
+ agents: ['tests_qa', 'merlin_verifier'],
39
+ };
40
+ }
41
+ if (/\b(refactor|cleanup|restructure|dedup|dry)\b/.test(lower)) {
42
+ return {
43
+ label: 'Refactor safely',
44
+ why: 'The task should preserve behavior while improving structure.',
45
+ tools: ['merlin_get_context', 'merlin_smart_route'],
46
+ skills: ['merlin-workflow', 'merlin-verify'],
47
+ agents: ['implementation_dev', 'tests_qa', 'system_architect'],
48
+ };
49
+ }
50
+ if (/\b(auth|oauth|stripe|prisma|railway|deploy|integration|sdk|api|graphql)\b/.test(lower)) {
51
+ return {
52
+ label: 'Build with recommendations',
53
+ why: 'The task likely benefits from specialist agents or reference implementations.',
54
+ tools: ['merlin_recommend_for_task', 'merlin_find_skill', 'merlin_smart_route'],
55
+ skills: ['merlin-workflow'],
56
+ agents: ['implementation_dev', 'system_architect', 'merlin_researcher'],
57
+ };
58
+ }
59
+ return {
60
+ label: 'General implementation',
61
+ why: 'The task looks like regular product or code work.',
62
+ tools: ['merlin_get_context', 'merlin_smart_route', 'merlin_find_skill'],
63
+ skills: ['merlin-workflow', 'merlin-verify'],
64
+ agents: ['implementation_dev', 'tests_qa'],
65
+ };
66
+ }
67
+ export function registerHelpTools(ctx) {
68
+ const { server } = ctx;
69
+ server.tool('merlin_help', 'Explain what Merlin can do in this repository and recommend the best Merlin workflow for a task. ' +
70
+ 'Use when you want discoverability in Codex, do not know which Merlin tool/skill/agent to use, ' +
71
+ 'or want an explicit route before starting work.', {
72
+ task: z.string().optional().describe('Optional task description for a tailored route recommendation'),
73
+ }, async ({ task }) => {
74
+ let response = '# Merlin Capabilities\n\n';
75
+ response += '## Boot\n';
76
+ response += '- `merlin_get_selected_repo` -> identify the active repository\n';
77
+ response += '- `merlin_get_project_status` -> load project state and active tasks\n';
78
+ response += '- `merlin_get_rules` and `merlin_get_brief` -> load local operating context\n\n';
79
+ response += '## Core Merlin Workflows\n';
80
+ response += '- Understand a repo: `merlin_search`, `merlin_find_files`, `merlin_get_context`, skill `merlin-map-codebase`\n';
81
+ response += '- Start or plan work: `merlin_smart_route`, `merlin_recommend_for_task`, skill `merlin-workflow`\n';
82
+ response += '- Find reusable prompts: `merlin_find_skill`\n';
83
+ response += '- Delegate bounded work: `merlin_route` or Codex custom agents in `.codex/agents`\n';
84
+ response += '- Verify results: skill `merlin-verify`, agents `tests_qa` or `merlin_verifier`\n';
85
+ response += '- Resume a repo: skill `merlin-resume`, `merlin_get_project_status`\n\n';
86
+ response += '## Codex Invocation Examples\n';
87
+ response += '- "Use Merlin to map this codebase before changing anything."\n';
88
+ response += '- "Use Merlin to find the best agent, skill, and flow for this task: add OAuth login."\n';
89
+ response += '- "Use Merlin verify mode on the work you just did."\n';
90
+ response += '- "Call merlin_help for this task: debug the failing Stripe webhook tests."\n';
91
+ if (task) {
92
+ const route = recommendRoute(task);
93
+ response += `\n## Recommended Route For: ${task}\n`;
94
+ response += `- Route: ${route.label}\n`;
95
+ response += `- Why: ${route.why}\n`;
96
+ response += `- Start with tools: ${route.tools.map((tool) => `\`${tool}\``).join(', ')}\n`;
97
+ response += `- Relevant skills: ${route.skills.map((skill) => `\`${skill}\``).join(', ')}\n`;
98
+ response += `- Relevant agents: ${route.agents.map((agent) => `\`${agent}\``).join(', ')}\n`;
99
+ response += '- Recommended sequence: boot, gather Merlin context, pick the route, execute narrowly, then verify.\n';
100
+ }
101
+ else {
102
+ response += '\n## Tip\n';
103
+ response += '- Call `merlin_help(task="your task")` to get a task-specific route before you start.\n';
104
+ }
105
+ return {
106
+ content: [{ type: 'text', text: coachWrap('merlin_help', response) }],
107
+ };
108
+ });
109
+ }
110
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/server/tools/help.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * HUD Tools
3
+ * MCP tools for reading and writing live session HUD metrics.
4
+ *
5
+ * merlin_hud_status — read all metrics (agents, tasks, cost, context, rate limit, git)
6
+ * merlin_hud_update — write a single metric (called by hooks and agents)
7
+ *
8
+ * All state lives in ~/.merlin/state/ as small JSON files.
9
+ * Missing files are handled gracefully — metrics fall back to null.
10
+ */
11
+ import type { ToolContext } from './types.js';
12
+ export declare function registerHudTools(ctx: ToolContext): void;
13
+ //# sourceMappingURL=hud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hud.d.ts","sourceRoot":"","sources":["../../../src/server/tools/hud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA0K9C,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAgKvD"}