bobo-ai-cli 1.4.1 → 1.5.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/agent.js +11 -3
- package/dist/agent.js.map +1 -1
- package/dist/completer.js +1 -0
- package/dist/completer.js.map +1 -1
- package/dist/hooks.d.ts +35 -0
- package/dist/hooks.js +97 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.js +138 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp-client.d.ts +43 -0
- package/dist/mcp-client.js +300 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/tools/index.js +25 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/watcher.d.ts +24 -0
- package/dist/watcher.js +131 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +1 -1
package/dist/agent.js
CHANGED
|
@@ -8,6 +8,7 @@ import { loadMemory } from './memory.js';
|
|
|
8
8
|
import { loadSkillPrompts } from './skills.js';
|
|
9
9
|
import { loadProjectKnowledge } from './project.js';
|
|
10
10
|
import { toolDefinitions, executeTool } from './tools/index.js';
|
|
11
|
+
import { getMcpToolDefinitions, executeMcpTool, isMcpTool } from './mcp-client.js';
|
|
11
12
|
import { printStreaming, printToolCall, printToolResult, printError, printLine } from './ui.js';
|
|
12
13
|
import { Spinner } from './spinner.js';
|
|
13
14
|
/**
|
|
@@ -133,7 +134,7 @@ export async function runAgent(userMessage, history, options = {}) {
|
|
|
133
134
|
const stream = await client.chat.completions.create({
|
|
134
135
|
model,
|
|
135
136
|
messages,
|
|
136
|
-
tools: toolDefinitions,
|
|
137
|
+
tools: [...toolDefinitions, ...getMcpToolDefinitions()],
|
|
137
138
|
max_tokens: config.maxTokens,
|
|
138
139
|
stream: true,
|
|
139
140
|
});
|
|
@@ -181,7 +182,7 @@ export async function runAgent(userMessage, history, options = {}) {
|
|
|
181
182
|
const completion = await client.chat.completions.create({
|
|
182
183
|
model,
|
|
183
184
|
messages,
|
|
184
|
-
tools: toolDefinitions,
|
|
185
|
+
tools: [...toolDefinitions, ...getMcpToolDefinitions()],
|
|
185
186
|
max_tokens: config.maxTokens,
|
|
186
187
|
stream: false,
|
|
187
188
|
});
|
|
@@ -246,7 +247,14 @@ export async function runAgent(userMessage, history, options = {}) {
|
|
|
246
247
|
spinner.start(`Running ${tc.name}...`);
|
|
247
248
|
printToolCall(tc.name, tc.arguments);
|
|
248
249
|
}
|
|
249
|
-
|
|
250
|
+
// Route to MCP or built-in tool
|
|
251
|
+
let result;
|
|
252
|
+
if (isMcpTool(tc.name)) {
|
|
253
|
+
result = await executeMcpTool(tc.name, args);
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
result = executeTool(tc.name, args);
|
|
257
|
+
}
|
|
250
258
|
spinner.stop();
|
|
251
259
|
if (!options.quiet)
|
|
252
260
|
printToolResult(result);
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/completer.js
CHANGED
|
@@ -19,6 +19,7 @@ const COMMANDS = [
|
|
|
19
19
|
{ name: '/knowledge', description: 'List knowledge files' },
|
|
20
20
|
{ name: '/skills', description: 'List skills' },
|
|
21
21
|
{ name: '/dream', description: 'Memory consolidation' },
|
|
22
|
+
{ name: '/mcp', description: 'MCP server status' },
|
|
22
23
|
{ name: '/rename', description: 'Rename current session' },
|
|
23
24
|
{ name: '/quit', description: 'Exit' },
|
|
24
25
|
{ name: '/exit', description: 'Exit' },
|
package/dist/completer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completer.js","sourceRoot":"","sources":["../src/completer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"completer.js","sourceRoot":"","sources":["../src/completer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,QAAQ,GAAiB;IAC7B,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE;IACzD,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAC7D,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,iCAAiC,EAAE;IACpE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAC9D,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACtD,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC3D,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAClD,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;IAC/C,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uCAAuC,EAAE;IACzE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACxD,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;IACnE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE;IACnD,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,iCAAiC,EAAE;IACjE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC3D,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE;IAC/C,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;IACvD,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE;IAClD,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC1D,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE;IACtC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE;CACvC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,QAAQ;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAEzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,mCAAmC;QACnC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,kCAAkC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1E,wDAAwD;QACxD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook system — run shell commands before/after agent actions.
|
|
3
|
+
* Config in BOBO.md frontmatter or ~/.bobo/hooks.json
|
|
4
|
+
*
|
|
5
|
+
* Hooks:
|
|
6
|
+
* pre-edit — before file edit (write_file, edit_file)
|
|
7
|
+
* post-edit — after file edit
|
|
8
|
+
* pre-shell — before shell command
|
|
9
|
+
* post-shell — after shell command
|
|
10
|
+
* pre-commit — before git commit (triggered by git_commit tool)
|
|
11
|
+
* post-commit — after git commit
|
|
12
|
+
* session-end — when REPL exits
|
|
13
|
+
*/
|
|
14
|
+
export type HookEvent = 'pre-edit' | 'post-edit' | 'pre-shell' | 'post-shell' | 'pre-commit' | 'post-commit' | 'session-end';
|
|
15
|
+
interface HookConfig {
|
|
16
|
+
[event: string]: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load hooks from ~/.bobo/hooks.json or project .bobo/hooks.json
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadHooks(): HookConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Run hooks for a given event. Returns true if all hooks succeeded.
|
|
24
|
+
* Context vars are passed as environment variables.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runHooks(event: HookEvent, context?: Record<string, string>): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Clear cached hooks (e.g. when changing directory).
|
|
29
|
+
*/
|
|
30
|
+
export declare function clearHookCache(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Initialize default hooks.json template.
|
|
33
|
+
*/
|
|
34
|
+
export declare function initHooksTemplate(): string;
|
|
35
|
+
export {};
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook system — run shell commands before/after agent actions.
|
|
3
|
+
* Config in BOBO.md frontmatter or ~/.bobo/hooks.json
|
|
4
|
+
*
|
|
5
|
+
* Hooks:
|
|
6
|
+
* pre-edit — before file edit (write_file, edit_file)
|
|
7
|
+
* post-edit — after file edit
|
|
8
|
+
* pre-shell — before shell command
|
|
9
|
+
* post-shell — after shell command
|
|
10
|
+
* pre-commit — before git commit (triggered by git_commit tool)
|
|
11
|
+
* post-commit — after git commit
|
|
12
|
+
* session-end — when REPL exits
|
|
13
|
+
*/
|
|
14
|
+
import { execSync } from 'node:child_process';
|
|
15
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { getConfigDir } from './config.js';
|
|
18
|
+
let cachedHooks = null;
|
|
19
|
+
/**
|
|
20
|
+
* Load hooks from ~/.bobo/hooks.json or project .bobo/hooks.json
|
|
21
|
+
*/
|
|
22
|
+
export function loadHooks() {
|
|
23
|
+
if (cachedHooks)
|
|
24
|
+
return cachedHooks;
|
|
25
|
+
const sources = [
|
|
26
|
+
join(getConfigDir(), 'hooks.json'),
|
|
27
|
+
join(process.cwd(), '.bobo', 'hooks.json'),
|
|
28
|
+
];
|
|
29
|
+
const merged = {};
|
|
30
|
+
for (const source of sources) {
|
|
31
|
+
if (existsSync(source)) {
|
|
32
|
+
try {
|
|
33
|
+
const raw = JSON.parse(readFileSync(source, 'utf-8'));
|
|
34
|
+
for (const [event, cmds] of Object.entries(raw)) {
|
|
35
|
+
if (Array.isArray(cmds)) {
|
|
36
|
+
merged[event] = [...(merged[event] || []), ...cmds];
|
|
37
|
+
}
|
|
38
|
+
else if (typeof cmds === 'string') {
|
|
39
|
+
merged[event] = [...(merged[event] || []), cmds];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch { /* skip malformed */ }
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
cachedHooks = merged;
|
|
47
|
+
return merged;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Run hooks for a given event. Returns true if all hooks succeeded.
|
|
51
|
+
* Context vars are passed as environment variables.
|
|
52
|
+
*/
|
|
53
|
+
export function runHooks(event, context) {
|
|
54
|
+
const hooks = loadHooks();
|
|
55
|
+
const cmds = hooks[event];
|
|
56
|
+
if (!cmds || cmds.length === 0)
|
|
57
|
+
return true;
|
|
58
|
+
const env = { ...process.env, ...context, BOBO_HOOK_EVENT: event };
|
|
59
|
+
let allOk = true;
|
|
60
|
+
for (const cmd of cmds) {
|
|
61
|
+
try {
|
|
62
|
+
execSync(cmd, {
|
|
63
|
+
env,
|
|
64
|
+
timeout: 30000,
|
|
65
|
+
stdio: 'pipe',
|
|
66
|
+
cwd: process.cwd(),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
allOk = false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return allOk;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Clear cached hooks (e.g. when changing directory).
|
|
77
|
+
*/
|
|
78
|
+
export function clearHookCache() {
|
|
79
|
+
cachedHooks = null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Initialize default hooks.json template.
|
|
83
|
+
*/
|
|
84
|
+
export function initHooksTemplate() {
|
|
85
|
+
return JSON.stringify({
|
|
86
|
+
'post-edit': [],
|
|
87
|
+
'pre-commit': [],
|
|
88
|
+
'post-commit': [],
|
|
89
|
+
'session-end': [],
|
|
90
|
+
'_examples': {
|
|
91
|
+
'post-edit': ['prettier --write $BOBO_FILE'],
|
|
92
|
+
'pre-commit': ['npm run lint'],
|
|
93
|
+
'post-commit': ['echo "Committed: $BOBO_COMMIT_MSG"'],
|
|
94
|
+
},
|
|
95
|
+
}, null, 2);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -22,6 +22,9 @@ import { generateInsight } from './insight.js';
|
|
|
22
22
|
import { spawnSubAgent, listSubAgents, getSubAgent } from './sub-agents.js';
|
|
23
23
|
import { enableStatusBar, disableStatusBar, updateStatusBar, setupResizeHandler, renderStatusBar } from './statusbar.js';
|
|
24
24
|
import { slashCompleter } from './completer.js';
|
|
25
|
+
import { runHooks, initHooksTemplate } from './hooks.js';
|
|
26
|
+
import { initMcpServers, shutdownMcpServers, getMcpStatus } from './mcp-client.js';
|
|
27
|
+
import { startWatch } from './watcher.js';
|
|
25
28
|
import chalk from 'chalk';
|
|
26
29
|
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
27
30
|
let version = '0.1.0';
|
|
@@ -382,6 +385,105 @@ skillCmd.command('import <path>').description('Batch import skills').action((pat
|
|
|
382
385
|
const resolved = path.startsWith('~') ? join(process.env.HOME || '', path.slice(1)) : path;
|
|
383
386
|
console.log(importSkills(resolved));
|
|
384
387
|
});
|
|
388
|
+
// ─── Watch command (file watcher / daemon mode) ─────────────
|
|
389
|
+
program
|
|
390
|
+
.command('watch')
|
|
391
|
+
.description('Watch files for changes and auto-run hooks (daemon-like mode)')
|
|
392
|
+
.option('--ignore <patterns>', 'Additional ignore patterns (comma-separated)', '')
|
|
393
|
+
.action((opts) => {
|
|
394
|
+
const ignore = opts.ignore ? opts.ignore.split(',').map(s => s.trim()) : [];
|
|
395
|
+
startWatch({
|
|
396
|
+
dir: process.cwd(),
|
|
397
|
+
recursive: true,
|
|
398
|
+
ignore,
|
|
399
|
+
});
|
|
400
|
+
});
|
|
401
|
+
// ─── MCP command ─────────────────────────────────────────────
|
|
402
|
+
const mcpCmd = program.command('mcp').description('Manage MCP (Model Context Protocol) servers');
|
|
403
|
+
mcpCmd
|
|
404
|
+
.command('status')
|
|
405
|
+
.description('Show MCP server status')
|
|
406
|
+
.action(async () => {
|
|
407
|
+
await initMcpServers();
|
|
408
|
+
const status = getMcpStatus();
|
|
409
|
+
if (status.length === 0) {
|
|
410
|
+
printLine(chalk.dim('No MCP servers configured.'));
|
|
411
|
+
printLine(chalk.dim('Create ~/.bobo/mcp.json to add servers.'));
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
printLine(chalk.cyan.bold('\n🔌 MCP Servers:\n'));
|
|
415
|
+
for (const s of status) {
|
|
416
|
+
const icon = s.ready ? chalk.green('●') : chalk.red('●');
|
|
417
|
+
printLine(` ${icon} ${chalk.bold(s.name)} [${s.transport}] — ${s.toolCount} tools`);
|
|
418
|
+
}
|
|
419
|
+
printLine();
|
|
420
|
+
shutdownMcpServers();
|
|
421
|
+
});
|
|
422
|
+
mcpCmd
|
|
423
|
+
.command('init')
|
|
424
|
+
.description('Create MCP configuration template')
|
|
425
|
+
.action(() => {
|
|
426
|
+
const configPath = join(getConfigDir(), 'mcp.json');
|
|
427
|
+
if (existsSync(configPath)) {
|
|
428
|
+
printWarning('mcp.json already exists');
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
writeFileSync(configPath, JSON.stringify({
|
|
432
|
+
servers: [
|
|
433
|
+
{
|
|
434
|
+
name: 'example',
|
|
435
|
+
transport: 'stdio',
|
|
436
|
+
command: 'npx',
|
|
437
|
+
args: ['-y', '@modelcontextprotocol/server-filesystem', process.cwd()],
|
|
438
|
+
_comment: 'Replace with your MCP server',
|
|
439
|
+
},
|
|
440
|
+
],
|
|
441
|
+
}, null, 2) + '\n');
|
|
442
|
+
printSuccess(`Created ${configPath}`);
|
|
443
|
+
});
|
|
444
|
+
// ─── Hooks command ───────────────────────────────────────────
|
|
445
|
+
program
|
|
446
|
+
.command('hooks')
|
|
447
|
+
.description('Manage lifecycle hooks')
|
|
448
|
+
.option('--init', 'Create hooks.json template')
|
|
449
|
+
.action((opts) => {
|
|
450
|
+
if (opts.init) {
|
|
451
|
+
const hooksPath = join(getConfigDir(), 'hooks.json');
|
|
452
|
+
if (existsSync(hooksPath)) {
|
|
453
|
+
printWarning('hooks.json already exists');
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
writeFileSync(hooksPath, initHooksTemplate() + '\n');
|
|
457
|
+
printSuccess(`Created ${hooksPath}`);
|
|
458
|
+
printLine(chalk.dim(' Available hooks: pre-edit, post-edit, pre-shell, post-shell, pre-commit, post-commit, session-end'));
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
// Show current hooks
|
|
462
|
+
const hooksPath = join(getConfigDir(), 'hooks.json');
|
|
463
|
+
if (!existsSync(hooksPath)) {
|
|
464
|
+
printLine(chalk.dim('No hooks configured. Run: bobo hooks --init'));
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
try {
|
|
468
|
+
const hooks = JSON.parse(readFileSync(hooksPath, 'utf-8'));
|
|
469
|
+
printLine(chalk.cyan.bold('\n🪝 Hooks:\n'));
|
|
470
|
+
for (const [event, cmds] of Object.entries(hooks)) {
|
|
471
|
+
if (event.startsWith('_'))
|
|
472
|
+
continue;
|
|
473
|
+
const arr = Array.isArray(cmds) ? cmds : [cmds];
|
|
474
|
+
if (arr.length === 0)
|
|
475
|
+
continue;
|
|
476
|
+
printLine(` ${chalk.bold(event)}`);
|
|
477
|
+
for (const cmd of arr) {
|
|
478
|
+
printLine(` → ${chalk.dim(String(cmd))}`);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
printLine();
|
|
482
|
+
}
|
|
483
|
+
catch {
|
|
484
|
+
printError('Failed to parse hooks.json');
|
|
485
|
+
}
|
|
486
|
+
});
|
|
385
487
|
// ─── Structured knowledge commands ──────────────────────────
|
|
386
488
|
registerKnowledgeCommand(program);
|
|
387
489
|
registerRulesCommand(program);
|
|
@@ -444,6 +546,8 @@ async function runRepl(opts) {
|
|
|
444
546
|
const knowledgeFiles = listKnowledgeFiles();
|
|
445
547
|
const sessionStartTime = Date.now();
|
|
446
548
|
const matchedSkills = [];
|
|
549
|
+
// Initialize MCP servers in background
|
|
550
|
+
initMcpServers().catch(() => { });
|
|
447
551
|
// Runtime overrides
|
|
448
552
|
let currentModel = opts.model || config.model;
|
|
449
553
|
let currentEffort = opts.effort || config.effort;
|
|
@@ -534,7 +638,7 @@ async function runRepl(opts) {
|
|
|
534
638
|
const bar = renderStatusBar();
|
|
535
639
|
if (bar)
|
|
536
640
|
printLine(bar);
|
|
537
|
-
|
|
641
|
+
rl.prompt();
|
|
538
642
|
};
|
|
539
643
|
const autoSave = () => {
|
|
540
644
|
if (history.length > 0) {
|
|
@@ -556,6 +660,8 @@ async function runRepl(opts) {
|
|
|
556
660
|
});
|
|
557
661
|
rl.on('close', () => {
|
|
558
662
|
autoSave();
|
|
663
|
+
runHooks('session-end');
|
|
664
|
+
shutdownMcpServers();
|
|
559
665
|
disableStatusBar();
|
|
560
666
|
printLine(chalk.dim('\nGoodbye! 🐕'));
|
|
561
667
|
process.exit(0);
|
|
@@ -570,6 +676,8 @@ async function runRepl(opts) {
|
|
|
570
676
|
// ─── Exit ───
|
|
571
677
|
if (input === '/quit' || input === '/exit') {
|
|
572
678
|
autoSave();
|
|
679
|
+
runHooks('session-end');
|
|
680
|
+
shutdownMcpServers();
|
|
573
681
|
disableStatusBar();
|
|
574
682
|
printLine(chalk.dim('Goodbye! 🐕'));
|
|
575
683
|
process.exit(0);
|
|
@@ -858,6 +966,7 @@ async function runRepl(opts) {
|
|
|
858
966
|
// ─── /status ───
|
|
859
967
|
if (input === '/status') {
|
|
860
968
|
const turns = history.filter(m => m.role === 'user').length;
|
|
969
|
+
const mcpServers = getMcpStatus();
|
|
861
970
|
printLine(chalk.cyan('📊 Session Status:'));
|
|
862
971
|
printLine(` Model: ${currentModel}`);
|
|
863
972
|
printLine(` Effort: ${currentEffort}`);
|
|
@@ -867,6 +976,9 @@ async function runRepl(opts) {
|
|
|
867
976
|
printLine(` CWD: ${process.cwd()}`);
|
|
868
977
|
if (sessionName)
|
|
869
978
|
printLine(` Name: ${sessionName}`);
|
|
979
|
+
if (mcpServers.length > 0) {
|
|
980
|
+
printLine(` MCP: ${mcpServers.filter(s => s.ready).length}/${mcpServers.length} servers (${mcpServers.reduce((a, s) => a + s.toolCount, 0)} tools)`);
|
|
981
|
+
}
|
|
870
982
|
showPrompt();
|
|
871
983
|
continue;
|
|
872
984
|
}
|
|
@@ -893,6 +1005,24 @@ async function runRepl(opts) {
|
|
|
893
1005
|
showPrompt();
|
|
894
1006
|
continue;
|
|
895
1007
|
}
|
|
1008
|
+
// ─── /mcp ───
|
|
1009
|
+
if (input === '/mcp') {
|
|
1010
|
+
const mcpServers = getMcpStatus();
|
|
1011
|
+
if (mcpServers.length === 0) {
|
|
1012
|
+
printLine(chalk.dim('No MCP servers. Configure in ~/.bobo/mcp.json'));
|
|
1013
|
+
printLine(chalk.dim('Run: bobo mcp init'));
|
|
1014
|
+
}
|
|
1015
|
+
else {
|
|
1016
|
+
printLine(chalk.cyan.bold('\n🔌 MCP Servers:\n'));
|
|
1017
|
+
for (const s of mcpServers) {
|
|
1018
|
+
const icon = s.ready ? chalk.green('●') : chalk.red('●');
|
|
1019
|
+
printLine(` ${icon} ${chalk.bold(s.name)} [${s.transport}] — ${s.toolCount} tools`);
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
printLine();
|
|
1023
|
+
showPrompt();
|
|
1024
|
+
continue;
|
|
1025
|
+
}
|
|
896
1026
|
// ─── /help ───
|
|
897
1027
|
if (input === '/help') {
|
|
898
1028
|
printLine(chalk.cyan.bold('Commands:'));
|
|
@@ -921,17 +1051,22 @@ async function runRepl(opts) {
|
|
|
921
1051
|
printLine(' /agents List sub-agents');
|
|
922
1052
|
printLine(' /agents show <id> Show sub-agent result');
|
|
923
1053
|
printLine('');
|
|
924
|
-
printLine(chalk.dim(' Knowledge'));
|
|
1054
|
+
printLine(chalk.dim(' Knowledge & Integrations'));
|
|
925
1055
|
printLine(' /knowledge List knowledge files');
|
|
926
1056
|
printLine(' /skills List skills');
|
|
1057
|
+
printLine(' /mcp MCP server status');
|
|
927
1058
|
printLine(' /dream Memory consolidation');
|
|
928
1059
|
printLine('');
|
|
929
|
-
printLine(chalk.dim(' CLI
|
|
1060
|
+
printLine(chalk.dim(' CLI Commands'));
|
|
930
1061
|
printLine(' bobo -p "q" Non-interactive (supports piping)');
|
|
931
1062
|
printLine(' bobo -c Continue last conversation');
|
|
932
1063
|
printLine(' bobo -r <id> Resume specific session');
|
|
933
1064
|
printLine(' bobo --full-auto Auto-approve tool calls');
|
|
934
1065
|
printLine(' bobo --yolo No sandbox, no approvals');
|
|
1066
|
+
printLine(' bobo watch File watcher (daemon mode)');
|
|
1067
|
+
printLine(' bobo mcp MCP server management');
|
|
1068
|
+
printLine(' bobo hooks Lifecycle hook management');
|
|
1069
|
+
printLine(' bobo doctor Environment check');
|
|
935
1070
|
showPrompt();
|
|
936
1071
|
continue;
|
|
937
1072
|
}
|