bobo-ai-cli 1.4.2 → 1.6.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 +15 -3
- package/dist/agent.js.map +1 -1
- package/dist/autonomous.d.ts +20 -0
- package/dist/autonomous.js +121 -0
- package/dist/autonomous.js.map +1 -0
- 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 +156 -2
- 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/advanced.d.ts +12 -0
- package/dist/tools/advanced.js +280 -0
- package/dist/tools/advanced.js.map +1 -0
- package/dist/tools/index.js +28 -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,8 @@ 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 { isAdvancedTool, executeAdvancedTool } from './tools/advanced.js';
|
|
12
|
+
import { getMcpToolDefinitions, executeMcpTool, isMcpTool } from './mcp-client.js';
|
|
11
13
|
import { printStreaming, printToolCall, printToolResult, printError, printLine } from './ui.js';
|
|
12
14
|
import { Spinner } from './spinner.js';
|
|
13
15
|
/**
|
|
@@ -133,7 +135,7 @@ export async function runAgent(userMessage, history, options = {}) {
|
|
|
133
135
|
const stream = await client.chat.completions.create({
|
|
134
136
|
model,
|
|
135
137
|
messages,
|
|
136
|
-
tools: toolDefinitions,
|
|
138
|
+
tools: [...toolDefinitions, ...getMcpToolDefinitions()],
|
|
137
139
|
max_tokens: config.maxTokens,
|
|
138
140
|
stream: true,
|
|
139
141
|
});
|
|
@@ -181,7 +183,7 @@ export async function runAgent(userMessage, history, options = {}) {
|
|
|
181
183
|
const completion = await client.chat.completions.create({
|
|
182
184
|
model,
|
|
183
185
|
messages,
|
|
184
|
-
tools: toolDefinitions,
|
|
186
|
+
tools: [...toolDefinitions, ...getMcpToolDefinitions()],
|
|
185
187
|
max_tokens: config.maxTokens,
|
|
186
188
|
stream: false,
|
|
187
189
|
});
|
|
@@ -246,7 +248,17 @@ export async function runAgent(userMessage, history, options = {}) {
|
|
|
246
248
|
spinner.start(`Running ${tc.name}...`);
|
|
247
249
|
printToolCall(tc.name, tc.arguments);
|
|
248
250
|
}
|
|
249
|
-
|
|
251
|
+
// Route to MCP, advanced, or built-in tool
|
|
252
|
+
let result;
|
|
253
|
+
if (isMcpTool(tc.name)) {
|
|
254
|
+
result = await executeMcpTool(tc.name, args);
|
|
255
|
+
}
|
|
256
|
+
else if (isAdvancedTool(tc.name)) {
|
|
257
|
+
result = await executeAdvancedTool(tc.name, args);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
result = executeTool(tc.name, args);
|
|
261
|
+
}
|
|
250
262
|
spinner.stop();
|
|
251
263
|
if (!options.quiet)
|
|
252
264
|
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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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autonomous run mode — give a task, let Bobo run until done.
|
|
3
|
+
* Like Claude Code's long-running agent loop.
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Higher iteration limit (50 vs REPL's 20)
|
|
7
|
+
* - Auto-recovery on errors (retry up to 3 times)
|
|
8
|
+
* - Progress logging to file
|
|
9
|
+
* - Graceful Ctrl+C handling (saves progress)
|
|
10
|
+
*/
|
|
11
|
+
import { type EffortLevel, type PermissionMode } from './config.js';
|
|
12
|
+
export interface RunOptions {
|
|
13
|
+
task: string;
|
|
14
|
+
model?: string;
|
|
15
|
+
effort?: EffortLevel;
|
|
16
|
+
permissionMode?: PermissionMode;
|
|
17
|
+
maxIterations?: number;
|
|
18
|
+
logFile?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function runAutonomous(options: RunOptions): Promise<void>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autonomous run mode — give a task, let Bobo run until done.
|
|
3
|
+
* Like Claude Code's long-running agent loop.
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Higher iteration limit (50 vs REPL's 20)
|
|
7
|
+
* - Auto-recovery on errors (retry up to 3 times)
|
|
8
|
+
* - Progress logging to file
|
|
9
|
+
* - Graceful Ctrl+C handling (saves progress)
|
|
10
|
+
*/
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import { writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { runAgent } from './agent.js';
|
|
15
|
+
import { getConfigDir } from './config.js';
|
|
16
|
+
import { printLine, printError, printWarning } from './ui.js';
|
|
17
|
+
import { Spinner } from './spinner.js';
|
|
18
|
+
export async function runAutonomous(options) {
|
|
19
|
+
const { task, model, effort, permissionMode = 'auto', // Auto-approve by default in run mode
|
|
20
|
+
maxIterations = 5, logFile, } = options;
|
|
21
|
+
const startTime = Date.now();
|
|
22
|
+
const logDir = join(getConfigDir(), 'runs');
|
|
23
|
+
if (!existsSync(logDir))
|
|
24
|
+
mkdirSync(logDir, { recursive: true });
|
|
25
|
+
const runId = new Date().toISOString().replace(/[:.]/g, '-');
|
|
26
|
+
const logPath = logFile || join(logDir, `${runId}.md`);
|
|
27
|
+
printLine(chalk.cyan.bold('\n🚀 Bobo Run Mode — Autonomous Execution\n'));
|
|
28
|
+
printLine(chalk.dim(` Task: ${task.slice(0, 100)}${task.length > 100 ? '...' : ''}`));
|
|
29
|
+
printLine(chalk.dim(` Model: ${model || 'default'}`));
|
|
30
|
+
printLine(chalk.dim(` Effort: ${effort || 'medium'}`));
|
|
31
|
+
printLine(chalk.dim(` Max iterations: ${maxIterations}`));
|
|
32
|
+
printLine(chalk.dim(` Log: ${logPath}`));
|
|
33
|
+
printLine(chalk.dim(` Permission: ${permissionMode} (auto-approve)`));
|
|
34
|
+
printLine(chalk.dim(' Press Ctrl+C to abort (saves progress)\n'));
|
|
35
|
+
printLine(chalk.dim('─'.repeat(60)));
|
|
36
|
+
printLine();
|
|
37
|
+
const log = [];
|
|
38
|
+
log.push(`# Bobo Run: ${runId}`);
|
|
39
|
+
log.push(`Task: ${task}`);
|
|
40
|
+
log.push(`Started: ${new Date().toISOString()}`);
|
|
41
|
+
log.push(`Model: ${model || 'default'}`);
|
|
42
|
+
log.push('');
|
|
43
|
+
let history = [];
|
|
44
|
+
let aborted = false;
|
|
45
|
+
let iteration = 0;
|
|
46
|
+
let retries = 0;
|
|
47
|
+
const maxRetries = 3;
|
|
48
|
+
// Handle Ctrl+C gracefully
|
|
49
|
+
const abortHandler = () => {
|
|
50
|
+
if (aborted) {
|
|
51
|
+
printLine(chalk.red('\nForce quit.'));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
aborted = true;
|
|
55
|
+
printLine(chalk.yellow('\n⚠ Aborting... saving progress.'));
|
|
56
|
+
};
|
|
57
|
+
process.on('SIGINT', abortHandler);
|
|
58
|
+
// Build the autonomous prompt
|
|
59
|
+
const autonomousTask = `You are in AUTONOMOUS mode. Complete the following task end-to-end without asking questions.
|
|
60
|
+
Make decisions yourself. If something fails, try a different approach.
|
|
61
|
+
Use tools to read files, write code, run tests, and verify your work.
|
|
62
|
+
When the task is fully complete, say "TASK COMPLETE" and summarize what you did.
|
|
63
|
+
|
|
64
|
+
TASK: ${task}`;
|
|
65
|
+
const spinner = new Spinner();
|
|
66
|
+
for (iteration = 0; iteration < maxIterations && !aborted; iteration++) {
|
|
67
|
+
const iterMsg = iteration === 0 ? autonomousTask : 'Continue working on the task. If done, say "TASK COMPLETE".';
|
|
68
|
+
printLine(chalk.cyan(`\n── Iteration ${iteration + 1}/${maxIterations} ──\n`));
|
|
69
|
+
log.push(`\n## Iteration ${iteration + 1}`);
|
|
70
|
+
try {
|
|
71
|
+
const result = await runAgent(iterMsg, history, {
|
|
72
|
+
model,
|
|
73
|
+
effort: effort || 'high', // Default to high effort in autonomous mode
|
|
74
|
+
permissionMode,
|
|
75
|
+
});
|
|
76
|
+
history = result.history;
|
|
77
|
+
log.push(result.response.slice(0, 2000));
|
|
78
|
+
// Check if task is complete
|
|
79
|
+
if (result.response.includes('TASK COMPLETE')) {
|
|
80
|
+
printLine(chalk.green('\n✅ Task completed!'));
|
|
81
|
+
log.push('\n## Result: COMPLETE');
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
retries = 0; // Reset retry counter on success
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
const errorMsg = e.message;
|
|
88
|
+
log.push(`ERROR: ${errorMsg}`);
|
|
89
|
+
if (errorMsg === 'Aborted') {
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
retries++;
|
|
93
|
+
if (retries >= maxRetries) {
|
|
94
|
+
printError(`Failed after ${maxRetries} retries. Last error: ${errorMsg}`);
|
|
95
|
+
log.push(`\n## Result: FAILED (${maxRetries} retries exhausted)`);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
printWarning(`Error (retry ${retries}/${maxRetries}): ${errorMsg}`);
|
|
99
|
+
// Wait a bit before retrying
|
|
100
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
101
|
+
iteration--; // Don't count failed iterations
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Save progress
|
|
105
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(0);
|
|
106
|
+
log.push(`\nCompleted: ${new Date().toISOString()}`);
|
|
107
|
+
log.push(`Duration: ${elapsed}s`);
|
|
108
|
+
log.push(`Iterations: ${iteration + 1}`);
|
|
109
|
+
writeFileSync(logPath, log.join('\n'));
|
|
110
|
+
// Cleanup
|
|
111
|
+
process.removeListener('SIGINT', abortHandler);
|
|
112
|
+
printLine();
|
|
113
|
+
printLine(chalk.dim('─'.repeat(60)));
|
|
114
|
+
printLine();
|
|
115
|
+
printLine(chalk.cyan('📊 Run Summary:'));
|
|
116
|
+
printLine(` Duration: ${elapsed}s`);
|
|
117
|
+
printLine(` Iterations: ${iteration + 1}/${maxIterations}`);
|
|
118
|
+
printLine(` Log: ${logPath}`);
|
|
119
|
+
printLine();
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=autonomous.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autonomous.js","sourceRoot":"","sources":["../src/autonomous.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":"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"}
|
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,10 @@ 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';
|
|
28
|
+
import { runAutonomous } from './autonomous.js';
|
|
25
29
|
import chalk from 'chalk';
|
|
26
30
|
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
27
31
|
let version = '0.1.0';
|
|
@@ -382,6 +386,123 @@ skillCmd.command('import <path>').description('Batch import skills').action((pat
|
|
|
382
386
|
const resolved = path.startsWith('~') ? join(process.env.HOME || '', path.slice(1)) : path;
|
|
383
387
|
console.log(importSkills(resolved));
|
|
384
388
|
});
|
|
389
|
+
// ─── Watch command (file watcher / daemon mode) ─────────────
|
|
390
|
+
program
|
|
391
|
+
.command('watch')
|
|
392
|
+
.description('Watch files for changes and auto-run hooks (daemon-like mode)')
|
|
393
|
+
.option('--ignore <patterns>', 'Additional ignore patterns (comma-separated)', '')
|
|
394
|
+
.action((opts) => {
|
|
395
|
+
const ignore = opts.ignore ? opts.ignore.split(',').map(s => s.trim()) : [];
|
|
396
|
+
startWatch({
|
|
397
|
+
dir: process.cwd(),
|
|
398
|
+
recursive: true,
|
|
399
|
+
ignore,
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
// ─── Run command (autonomous agent loop) ─────────────────────
|
|
403
|
+
program
|
|
404
|
+
.command('run <task>')
|
|
405
|
+
.description('Autonomous mode: give a task, Bobo runs until done (like Claude Code agent loop)')
|
|
406
|
+
.option('--model <model>', 'Override model')
|
|
407
|
+
.option('--effort <level>', 'Effort level (low/medium/high)', 'high')
|
|
408
|
+
.option('--max-iterations <n>', 'Maximum iterations', '5')
|
|
409
|
+
.option('--log <path>', 'Log file path')
|
|
410
|
+
.action(async (task, opts) => {
|
|
411
|
+
await runAutonomous({
|
|
412
|
+
task,
|
|
413
|
+
model: opts.model,
|
|
414
|
+
effort: (opts.effort || 'high'),
|
|
415
|
+
permissionMode: 'auto',
|
|
416
|
+
maxIterations: parseInt(opts.maxIterations || '5', 10),
|
|
417
|
+
logFile: opts.log,
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
// ─── MCP command ─────────────────────────────────────────────
|
|
421
|
+
const mcpCmd = program.command('mcp').description('Manage MCP (Model Context Protocol) servers');
|
|
422
|
+
mcpCmd
|
|
423
|
+
.command('status')
|
|
424
|
+
.description('Show MCP server status')
|
|
425
|
+
.action(async () => {
|
|
426
|
+
await initMcpServers();
|
|
427
|
+
const status = getMcpStatus();
|
|
428
|
+
if (status.length === 0) {
|
|
429
|
+
printLine(chalk.dim('No MCP servers configured.'));
|
|
430
|
+
printLine(chalk.dim('Create ~/.bobo/mcp.json to add servers.'));
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
printLine(chalk.cyan.bold('\n🔌 MCP Servers:\n'));
|
|
434
|
+
for (const s of status) {
|
|
435
|
+
const icon = s.ready ? chalk.green('●') : chalk.red('●');
|
|
436
|
+
printLine(` ${icon} ${chalk.bold(s.name)} [${s.transport}] — ${s.toolCount} tools`);
|
|
437
|
+
}
|
|
438
|
+
printLine();
|
|
439
|
+
shutdownMcpServers();
|
|
440
|
+
});
|
|
441
|
+
mcpCmd
|
|
442
|
+
.command('init')
|
|
443
|
+
.description('Create MCP configuration template')
|
|
444
|
+
.action(() => {
|
|
445
|
+
const configPath = join(getConfigDir(), 'mcp.json');
|
|
446
|
+
if (existsSync(configPath)) {
|
|
447
|
+
printWarning('mcp.json already exists');
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
writeFileSync(configPath, JSON.stringify({
|
|
451
|
+
servers: [
|
|
452
|
+
{
|
|
453
|
+
name: 'example',
|
|
454
|
+
transport: 'stdio',
|
|
455
|
+
command: 'npx',
|
|
456
|
+
args: ['-y', '@modelcontextprotocol/server-filesystem', process.cwd()],
|
|
457
|
+
_comment: 'Replace with your MCP server',
|
|
458
|
+
},
|
|
459
|
+
],
|
|
460
|
+
}, null, 2) + '\n');
|
|
461
|
+
printSuccess(`Created ${configPath}`);
|
|
462
|
+
});
|
|
463
|
+
// ─── Hooks command ───────────────────────────────────────────
|
|
464
|
+
program
|
|
465
|
+
.command('hooks')
|
|
466
|
+
.description('Manage lifecycle hooks')
|
|
467
|
+
.option('--init', 'Create hooks.json template')
|
|
468
|
+
.action((opts) => {
|
|
469
|
+
if (opts.init) {
|
|
470
|
+
const hooksPath = join(getConfigDir(), 'hooks.json');
|
|
471
|
+
if (existsSync(hooksPath)) {
|
|
472
|
+
printWarning('hooks.json already exists');
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
writeFileSync(hooksPath, initHooksTemplate() + '\n');
|
|
476
|
+
printSuccess(`Created ${hooksPath}`);
|
|
477
|
+
printLine(chalk.dim(' Available hooks: pre-edit, post-edit, pre-shell, post-shell, pre-commit, post-commit, session-end'));
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
// Show current hooks
|
|
481
|
+
const hooksPath = join(getConfigDir(), 'hooks.json');
|
|
482
|
+
if (!existsSync(hooksPath)) {
|
|
483
|
+
printLine(chalk.dim('No hooks configured. Run: bobo hooks --init'));
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
try {
|
|
487
|
+
const hooks = JSON.parse(readFileSync(hooksPath, 'utf-8'));
|
|
488
|
+
printLine(chalk.cyan.bold('\n🪝 Hooks:\n'));
|
|
489
|
+
for (const [event, cmds] of Object.entries(hooks)) {
|
|
490
|
+
if (event.startsWith('_'))
|
|
491
|
+
continue;
|
|
492
|
+
const arr = Array.isArray(cmds) ? cmds : [cmds];
|
|
493
|
+
if (arr.length === 0)
|
|
494
|
+
continue;
|
|
495
|
+
printLine(` ${chalk.bold(event)}`);
|
|
496
|
+
for (const cmd of arr) {
|
|
497
|
+
printLine(` → ${chalk.dim(String(cmd))}`);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
printLine();
|
|
501
|
+
}
|
|
502
|
+
catch {
|
|
503
|
+
printError('Failed to parse hooks.json');
|
|
504
|
+
}
|
|
505
|
+
});
|
|
385
506
|
// ─── Structured knowledge commands ──────────────────────────
|
|
386
507
|
registerKnowledgeCommand(program);
|
|
387
508
|
registerRulesCommand(program);
|
|
@@ -444,6 +565,8 @@ async function runRepl(opts) {
|
|
|
444
565
|
const knowledgeFiles = listKnowledgeFiles();
|
|
445
566
|
const sessionStartTime = Date.now();
|
|
446
567
|
const matchedSkills = [];
|
|
568
|
+
// Initialize MCP servers in background
|
|
569
|
+
initMcpServers().catch(() => { });
|
|
447
570
|
// Runtime overrides
|
|
448
571
|
let currentModel = opts.model || config.model;
|
|
449
572
|
let currentEffort = opts.effort || config.effort;
|
|
@@ -556,6 +679,8 @@ async function runRepl(opts) {
|
|
|
556
679
|
});
|
|
557
680
|
rl.on('close', () => {
|
|
558
681
|
autoSave();
|
|
682
|
+
runHooks('session-end');
|
|
683
|
+
shutdownMcpServers();
|
|
559
684
|
disableStatusBar();
|
|
560
685
|
printLine(chalk.dim('\nGoodbye! 🐕'));
|
|
561
686
|
process.exit(0);
|
|
@@ -570,6 +695,8 @@ async function runRepl(opts) {
|
|
|
570
695
|
// ─── Exit ───
|
|
571
696
|
if (input === '/quit' || input === '/exit') {
|
|
572
697
|
autoSave();
|
|
698
|
+
runHooks('session-end');
|
|
699
|
+
shutdownMcpServers();
|
|
573
700
|
disableStatusBar();
|
|
574
701
|
printLine(chalk.dim('Goodbye! 🐕'));
|
|
575
702
|
process.exit(0);
|
|
@@ -858,6 +985,7 @@ async function runRepl(opts) {
|
|
|
858
985
|
// ─── /status ───
|
|
859
986
|
if (input === '/status') {
|
|
860
987
|
const turns = history.filter(m => m.role === 'user').length;
|
|
988
|
+
const mcpServers = getMcpStatus();
|
|
861
989
|
printLine(chalk.cyan('📊 Session Status:'));
|
|
862
990
|
printLine(` Model: ${currentModel}`);
|
|
863
991
|
printLine(` Effort: ${currentEffort}`);
|
|
@@ -867,6 +995,9 @@ async function runRepl(opts) {
|
|
|
867
995
|
printLine(` CWD: ${process.cwd()}`);
|
|
868
996
|
if (sessionName)
|
|
869
997
|
printLine(` Name: ${sessionName}`);
|
|
998
|
+
if (mcpServers.length > 0) {
|
|
999
|
+
printLine(` MCP: ${mcpServers.filter(s => s.ready).length}/${mcpServers.length} servers (${mcpServers.reduce((a, s) => a + s.toolCount, 0)} tools)`);
|
|
1000
|
+
}
|
|
870
1001
|
showPrompt();
|
|
871
1002
|
continue;
|
|
872
1003
|
}
|
|
@@ -893,6 +1024,24 @@ async function runRepl(opts) {
|
|
|
893
1024
|
showPrompt();
|
|
894
1025
|
continue;
|
|
895
1026
|
}
|
|
1027
|
+
// ─── /mcp ───
|
|
1028
|
+
if (input === '/mcp') {
|
|
1029
|
+
const mcpServers = getMcpStatus();
|
|
1030
|
+
if (mcpServers.length === 0) {
|
|
1031
|
+
printLine(chalk.dim('No MCP servers. Configure in ~/.bobo/mcp.json'));
|
|
1032
|
+
printLine(chalk.dim('Run: bobo mcp init'));
|
|
1033
|
+
}
|
|
1034
|
+
else {
|
|
1035
|
+
printLine(chalk.cyan.bold('\n🔌 MCP Servers:\n'));
|
|
1036
|
+
for (const s of mcpServers) {
|
|
1037
|
+
const icon = s.ready ? chalk.green('●') : chalk.red('●');
|
|
1038
|
+
printLine(` ${icon} ${chalk.bold(s.name)} [${s.transport}] — ${s.toolCount} tools`);
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
printLine();
|
|
1042
|
+
showPrompt();
|
|
1043
|
+
continue;
|
|
1044
|
+
}
|
|
896
1045
|
// ─── /help ───
|
|
897
1046
|
if (input === '/help') {
|
|
898
1047
|
printLine(chalk.cyan.bold('Commands:'));
|
|
@@ -921,17 +1070,22 @@ async function runRepl(opts) {
|
|
|
921
1070
|
printLine(' /agents List sub-agents');
|
|
922
1071
|
printLine(' /agents show <id> Show sub-agent result');
|
|
923
1072
|
printLine('');
|
|
924
|
-
printLine(chalk.dim(' Knowledge'));
|
|
1073
|
+
printLine(chalk.dim(' Knowledge & Integrations'));
|
|
925
1074
|
printLine(' /knowledge List knowledge files');
|
|
926
1075
|
printLine(' /skills List skills');
|
|
1076
|
+
printLine(' /mcp MCP server status');
|
|
927
1077
|
printLine(' /dream Memory consolidation');
|
|
928
1078
|
printLine('');
|
|
929
|
-
printLine(chalk.dim(' CLI
|
|
1079
|
+
printLine(chalk.dim(' CLI Commands'));
|
|
930
1080
|
printLine(' bobo -p "q" Non-interactive (supports piping)');
|
|
931
1081
|
printLine(' bobo -c Continue last conversation');
|
|
932
1082
|
printLine(' bobo -r <id> Resume specific session');
|
|
933
1083
|
printLine(' bobo --full-auto Auto-approve tool calls');
|
|
934
1084
|
printLine(' bobo --yolo No sandbox, no approvals');
|
|
1085
|
+
printLine(' bobo watch File watcher (daemon mode)');
|
|
1086
|
+
printLine(' bobo mcp MCP server management');
|
|
1087
|
+
printLine(' bobo hooks Lifecycle hook management');
|
|
1088
|
+
printLine(' bobo doctor Environment check');
|
|
935
1089
|
showPrompt();
|
|
936
1090
|
continue;
|
|
937
1091
|
}
|