bobo-ai-cli 2.1.0 → 3.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 (115) hide show
  1. package/README.md +52 -9
  2. package/dist/agent.js +66 -45
  3. package/dist/agent.js.map +1 -1
  4. package/dist/agents/catalog.d.ts +40 -0
  5. package/dist/agents/catalog.js +172 -0
  6. package/dist/agents/catalog.js.map +1 -0
  7. package/dist/agents/index.d.ts +6 -0
  8. package/dist/agents/index.js +4 -0
  9. package/dist/agents/index.js.map +1 -0
  10. package/dist/agents/router.d.ts +43 -0
  11. package/dist/agents/router.js +87 -0
  12. package/dist/agents/router.js.map +1 -0
  13. package/dist/agents/spawn.d.ts +46 -0
  14. package/dist/agents/spawn.js +91 -0
  15. package/dist/agents/spawn.js.map +1 -0
  16. package/dist/autonomous.js +41 -1
  17. package/dist/autonomous.js.map +1 -1
  18. package/dist/cli.d.ts +8 -0
  19. package/dist/cli.js +667 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/compactor.d.ts +49 -4
  22. package/dist/compactor.js +164 -17
  23. package/dist/compactor.js.map +1 -1
  24. package/dist/completer.js +2 -0
  25. package/dist/completer.js.map +1 -1
  26. package/dist/cost-tracker.js +35 -2
  27. package/dist/cost-tracker.js.map +1 -1
  28. package/dist/dream.d.ts +42 -0
  29. package/dist/dream.js +321 -0
  30. package/dist/dream.js.map +1 -0
  31. package/dist/hooks.d.ts +1 -1
  32. package/dist/hooks.js +4 -0
  33. package/dist/hooks.js.map +1 -1
  34. package/dist/index.js +8 -1134
  35. package/dist/index.js.map +1 -1
  36. package/dist/insight.js +4 -11
  37. package/dist/insight.js.map +1 -1
  38. package/dist/knowledge.d.ts +13 -0
  39. package/dist/knowledge.js +13 -2
  40. package/dist/knowledge.js.map +1 -1
  41. package/dist/memory.d.ts +4 -0
  42. package/dist/memory.js +6 -0
  43. package/dist/memory.js.map +1 -1
  44. package/dist/repl.d.ts +16 -0
  45. package/dist/repl.js +702 -0
  46. package/dist/repl.js.map +1 -0
  47. package/dist/sessions.js +23 -0
  48. package/dist/sessions.js.map +1 -1
  49. package/dist/skills/composer.d.ts +18 -0
  50. package/dist/skills/composer.js +59 -0
  51. package/dist/skills/composer.js.map +1 -0
  52. package/dist/skills/index.d.ts +3 -0
  53. package/dist/skills/index.js +3 -0
  54. package/dist/skills/index.js.map +1 -0
  55. package/dist/skills/loader.d.ts +12 -0
  56. package/dist/skills/loader.js +150 -0
  57. package/dist/skills/loader.js.map +1 -0
  58. package/dist/skills/types.d.ts +28 -0
  59. package/dist/skills/types.js +9 -0
  60. package/dist/skills/types.js.map +1 -0
  61. package/dist/skills.d.ts +1 -0
  62. package/dist/skills.js +1 -0
  63. package/dist/skills.js.map +1 -1
  64. package/dist/state/artifacts.d.ts +71 -0
  65. package/dist/state/artifacts.js +131 -0
  66. package/dist/state/artifacts.js.map +1 -0
  67. package/dist/state/index.d.ts +9 -0
  68. package/dist/state/index.js +7 -0
  69. package/dist/state/index.js.map +1 -0
  70. package/dist/state/manager.d.ts +89 -0
  71. package/dist/state/manager.js +130 -0
  72. package/dist/state/manager.js.map +1 -0
  73. package/dist/state/project-memory.d.ts +24 -0
  74. package/dist/state/project-memory.js +81 -0
  75. package/dist/state/project-memory.js.map +1 -0
  76. package/dist/state/recovery.d.ts +24 -0
  77. package/dist/state/recovery.js +94 -0
  78. package/dist/state/recovery.js.map +1 -0
  79. package/dist/statusbar.d.ts +1 -0
  80. package/dist/statusbar.js +12 -1
  81. package/dist/statusbar.js.map +1 -1
  82. package/dist/sub-agent-runner.d.ts +1 -0
  83. package/dist/sub-agent-runner.js +29 -3
  84. package/dist/sub-agent-runner.js.map +1 -1
  85. package/dist/sub-agents.d.ts +19 -1
  86. package/dist/sub-agents.js +137 -2
  87. package/dist/sub-agents.js.map +1 -1
  88. package/dist/tool-governance.d.ts +77 -0
  89. package/dist/tool-governance.js +335 -0
  90. package/dist/tool-governance.js.map +1 -0
  91. package/dist/ui/hud.d.ts +25 -0
  92. package/dist/ui/hud.js +67 -0
  93. package/dist/ui/hud.js.map +1 -0
  94. package/dist/verification-agent.d.ts +46 -0
  95. package/dist/verification-agent.js +528 -0
  96. package/dist/verification-agent.js.map +1 -0
  97. package/dist/workflows/ask.d.ts +13 -0
  98. package/dist/workflows/ask.js +66 -0
  99. package/dist/workflows/ask.js.map +1 -0
  100. package/dist/workflows/index.d.ts +5 -0
  101. package/dist/workflows/index.js +6 -0
  102. package/dist/workflows/index.js.map +1 -0
  103. package/dist/workflows/interview.d.ts +11 -0
  104. package/dist/workflows/interview.js +36 -0
  105. package/dist/workflows/interview.js.map +1 -0
  106. package/dist/workflows/plan.d.ts +13 -0
  107. package/dist/workflows/plan.js +34 -0
  108. package/dist/workflows/plan.js.map +1 -0
  109. package/dist/workflows/team.d.ts +17 -0
  110. package/dist/workflows/team.js +86 -0
  111. package/dist/workflows/team.js.map +1 -0
  112. package/dist/workflows/verify.d.ts +11 -0
  113. package/dist/workflows/verify.js +21 -0
  114. package/dist/workflows/verify.js.map +1 -0
  115. package/package.json +2 -4
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Tool Governance Pipeline
3
+ *
4
+ * Enforces safety and consistency for all tool executions:
5
+ * Input validation → Risk classification → PreToolUse Hook →
6
+ * Permission check → Execution → PostToolUse Hook → Telemetry
7
+ *
8
+ * Key principles:
9
+ * - Fail-closed: All tools are unsafe by default
10
+ * - Explicit permissions: isConcurrencySafe and isReadOnly must be declared
11
+ * - Stateful constraints: edit_file requires prior read_file
12
+ */
13
+ import { runHooks } from './hooks.js';
14
+ /**
15
+ * Governance state tracker.
16
+ */
17
+ class GovernanceState {
18
+ filesRead = new Set();
19
+ toolCallHistory = [];
20
+ maxHistorySize = 100;
21
+ recordFileRead(path) {
22
+ this.filesRead.add(path);
23
+ }
24
+ hasReadFile(path) {
25
+ return this.filesRead.has(path);
26
+ }
27
+ recordToolCall(context) {
28
+ this.toolCallHistory.push(context);
29
+ if (this.toolCallHistory.length > this.maxHistorySize) {
30
+ this.toolCallHistory.shift();
31
+ }
32
+ }
33
+ getRecentToolCalls(limit = 10) {
34
+ return this.toolCallHistory.slice(-limit);
35
+ }
36
+ reset() {
37
+ this.filesRead.clear();
38
+ this.toolCallHistory = [];
39
+ }
40
+ }
41
+ // Global governance state (per process)
42
+ const governanceState = new GovernanceState();
43
+ /**
44
+ * Tool metadata registry.
45
+ * IMPORTANT: Default to fail-closed (unsafe) for unknown tools.
46
+ */
47
+ const toolMetadataRegistry = {
48
+ // Read-only tools (safe)
49
+ read_file: {
50
+ name: 'read_file',
51
+ isReadOnly: true,
52
+ isConcurrencySafe: true,
53
+ riskLevel: 'safe',
54
+ },
55
+ list_directory: {
56
+ name: 'list_directory',
57
+ isReadOnly: true,
58
+ isConcurrencySafe: true,
59
+ riskLevel: 'safe',
60
+ },
61
+ search_files: {
62
+ name: 'search_files',
63
+ isReadOnly: true,
64
+ isConcurrencySafe: true,
65
+ riskLevel: 'safe',
66
+ },
67
+ git_status: {
68
+ name: 'git_status',
69
+ isReadOnly: true,
70
+ isConcurrencySafe: true,
71
+ riskLevel: 'safe',
72
+ },
73
+ git_diff: {
74
+ name: 'git_diff',
75
+ isReadOnly: true,
76
+ isConcurrencySafe: true,
77
+ riskLevel: 'safe',
78
+ },
79
+ git_log: {
80
+ name: 'git_log',
81
+ isReadOnly: true,
82
+ isConcurrencySafe: true,
83
+ riskLevel: 'safe',
84
+ },
85
+ search_memory: {
86
+ name: 'search_memory',
87
+ isReadOnly: true,
88
+ isConcurrencySafe: true,
89
+ riskLevel: 'safe',
90
+ },
91
+ // Moderate-risk tools (state-modifying but recoverable)
92
+ write_file: {
93
+ name: 'write_file',
94
+ isReadOnly: false,
95
+ isConcurrencySafe: false, // File system races
96
+ riskLevel: 'moderate',
97
+ },
98
+ edit_file: {
99
+ name: 'edit_file',
100
+ isReadOnly: false,
101
+ isConcurrencySafe: false,
102
+ riskLevel: 'moderate',
103
+ requiresPriorRead: ['read_file'], // MUST read file before editing
104
+ },
105
+ save_memory: {
106
+ name: 'save_memory',
107
+ isReadOnly: false,
108
+ isConcurrencySafe: false,
109
+ riskLevel: 'moderate',
110
+ },
111
+ // Dangerous tools (hard to reverse)
112
+ shell: {
113
+ name: 'shell',
114
+ isReadOnly: false,
115
+ isConcurrencySafe: false,
116
+ riskLevel: 'dangerous',
117
+ },
118
+ git_commit: {
119
+ name: 'git_commit',
120
+ isReadOnly: false,
121
+ isConcurrencySafe: false,
122
+ riskLevel: 'dangerous',
123
+ },
124
+ git_push: {
125
+ name: 'git_push',
126
+ isReadOnly: false,
127
+ isConcurrencySafe: false,
128
+ riskLevel: 'dangerous',
129
+ },
130
+ };
131
+ /**
132
+ * Get tool metadata (fail-closed for unknown tools).
133
+ */
134
+ export function getToolMetadata(toolName) {
135
+ return toolMetadataRegistry[toolName] || {
136
+ name: toolName,
137
+ isReadOnly: false,
138
+ isConcurrencySafe: false,
139
+ riskLevel: 'dangerous', // Unknown tools are dangerous by default
140
+ };
141
+ }
142
+ /**
143
+ * Register tool metadata (for external tools).
144
+ */
145
+ export function registerToolMetadata(metadata) {
146
+ toolMetadataRegistry[metadata.name] = metadata;
147
+ }
148
+ /**
149
+ * Validate tool inputs against schema.
150
+ */
151
+ function validateToolInputs(toolName, args) {
152
+ // Basic validation - can be extended with JSON schema validation
153
+ switch (toolName) {
154
+ case 'read_file':
155
+ case 'write_file':
156
+ case 'edit_file':
157
+ if (!args.path || typeof args.path !== 'string') {
158
+ return { valid: false, error: 'Missing or invalid "path" parameter' };
159
+ }
160
+ // Check for path traversal attempts
161
+ if (args.path.includes('..')) {
162
+ return { valid: false, error: 'Path traversal not allowed' };
163
+ }
164
+ break;
165
+ case 'shell':
166
+ if (!args.command || typeof args.command !== 'string') {
167
+ return { valid: false, error: 'Missing or invalid "command" parameter' };
168
+ }
169
+ // Check for dangerous patterns
170
+ const cmd = args.command;
171
+ if (cmd.includes('rm -rf /') || cmd.includes('mkfs') || cmd.includes(':(){:|:&};:')) {
172
+ return { valid: false, error: 'Dangerous command blocked' };
173
+ }
174
+ break;
175
+ case 'edit_file':
176
+ if (!args.oldText || !args.newText) {
177
+ return { valid: false, error: 'Missing "oldText" or "newText" parameter' };
178
+ }
179
+ break;
180
+ }
181
+ return { valid: true };
182
+ }
183
+ /**
184
+ * Check if tool execution should be allowed based on governance rules.
185
+ */
186
+ function checkGovernanceRules(toolName, args) {
187
+ const metadata = getToolMetadata(toolName);
188
+ // Check for required prior tool calls
189
+ if (metadata.requiresPriorRead && metadata.requiresPriorRead.length > 0) {
190
+ if (toolName === 'edit_file' && args.path) {
191
+ const filePath = args.path;
192
+ if (!governanceState.hasReadFile(filePath)) {
193
+ return {
194
+ allowed: false,
195
+ reason: `Must read file "${filePath}" before editing. Use read_file first.`,
196
+ };
197
+ }
198
+ }
199
+ }
200
+ return { allowed: true };
201
+ }
202
+ /**
203
+ * Execute tool with full governance pipeline.
204
+ */
205
+ export async function executeToolWithGovernance(toolName, args, executor) {
206
+ const startTime = Date.now();
207
+ const context = {
208
+ toolName,
209
+ args,
210
+ timestamp: startTime,
211
+ };
212
+ try {
213
+ // Step 1: Input validation
214
+ const validation = validateToolInputs(toolName, args);
215
+ if (!validation.valid) {
216
+ return {
217
+ success: false,
218
+ error: `Input validation failed: ${validation.error}`,
219
+ duration: Date.now() - startTime,
220
+ blocked: true,
221
+ blockReason: validation.error,
222
+ };
223
+ }
224
+ // Step 2: Risk classification (already in metadata)
225
+ const metadata = getToolMetadata(toolName);
226
+ // Step 3: Governance rules check
227
+ const governanceCheck = checkGovernanceRules(toolName, args);
228
+ if (!governanceCheck.allowed) {
229
+ return {
230
+ success: false,
231
+ error: `Governance rule violation: ${governanceCheck.reason}`,
232
+ duration: Date.now() - startTime,
233
+ blocked: true,
234
+ blockReason: governanceCheck.reason,
235
+ };
236
+ }
237
+ // Step 4: PreToolUse Hook
238
+ try {
239
+ runHooks('pre-tool-use', {
240
+ BOBO_TOOL_NAME: toolName,
241
+ BOBO_TOOL_RISK: metadata.riskLevel,
242
+ BOBO_TOOL_ARGS: JSON.stringify(args),
243
+ });
244
+ }
245
+ catch (hookError) {
246
+ return {
247
+ success: false,
248
+ error: `Pre-tool-use hook failed: ${hookError.message}`,
249
+ duration: Date.now() - startTime,
250
+ blocked: true,
251
+ blockReason: 'Hook rejection',
252
+ };
253
+ }
254
+ // Step 5: Execute tool
255
+ let output;
256
+ try {
257
+ const result = executor(toolName, args);
258
+ output = result instanceof Promise ? await result : result;
259
+ }
260
+ catch (execError) {
261
+ const duration = Date.now() - startTime;
262
+ governanceState.recordToolCall(context);
263
+ return {
264
+ success: false,
265
+ error: execError.message,
266
+ duration,
267
+ };
268
+ }
269
+ // Step 6: PostToolUse Hook
270
+ try {
271
+ runHooks('post-tool-use', {
272
+ BOBO_TOOL_NAME: toolName,
273
+ BOBO_TOOL_RISK: metadata.riskLevel,
274
+ BOBO_TOOL_SUCCESS: 'true',
275
+ });
276
+ }
277
+ catch {
278
+ // Post-execution hooks shouldn't block
279
+ }
280
+ // Step 7: Update governance state
281
+ governanceState.recordToolCall(context);
282
+ // Track file reads for edit_file enforcement
283
+ if (toolName === 'read_file' && args.path) {
284
+ governanceState.recordFileRead(args.path);
285
+ }
286
+ // Step 8: Telemetry (recorded in context history)
287
+ const duration = Date.now() - startTime;
288
+ return {
289
+ success: true,
290
+ output,
291
+ duration,
292
+ };
293
+ }
294
+ catch (error) {
295
+ return {
296
+ success: false,
297
+ error: `Governance pipeline error: ${error.message}`,
298
+ duration: Date.now() - startTime,
299
+ };
300
+ }
301
+ }
302
+ /**
303
+ * Check if tools can be run concurrently.
304
+ */
305
+ export function canRunConcurrently(toolNames) {
306
+ return toolNames.every(name => {
307
+ const metadata = getToolMetadata(name);
308
+ return metadata.isConcurrencySafe;
309
+ });
310
+ }
311
+ /**
312
+ * Get governance statistics.
313
+ */
314
+ export function getGovernanceStats() {
315
+ return {
316
+ filesRead: governanceState['filesRead'].size,
317
+ recentToolCalls: governanceState.getRecentToolCalls(20),
318
+ };
319
+ }
320
+ /**
321
+ * Reset governance state (useful for testing or session boundaries).
322
+ */
323
+ export function resetGovernanceState() {
324
+ governanceState.reset();
325
+ }
326
+ /**
327
+ * Format governance result for user display.
328
+ */
329
+ export function formatGovernanceError(result) {
330
+ if (result.blocked) {
331
+ return `🚫 Tool execution blocked: ${result.blockReason || result.error}`;
332
+ }
333
+ return `❌ Tool execution failed: ${result.error}`;
334
+ }
335
+ //# sourceMappingURL=tool-governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-governance.js","sourceRoot":"","sources":["../src/tool-governance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * HUD — 轻量状态显示
3
+ *
4
+ * 在 CLI 交互模式下,显示当前 agent 状态、活跃 workflow、token 用量
5
+ */
6
+ export interface HUDState {
7
+ sessionId: string;
8
+ model: string;
9
+ effort: string;
10
+ activeAgents: string[];
11
+ completedTasks: number;
12
+ totalTasks: number;
13
+ tokenUsage: {
14
+ input: number;
15
+ output: number;
16
+ };
17
+ }
18
+ /**
19
+ * 渲染单行 HUD
20
+ */
21
+ export declare function renderHUD(state: HUDState): string;
22
+ /**
23
+ * 渲染详细状态面板
24
+ */
25
+ export declare function renderStatusPanel(state: HUDState): string;
package/dist/ui/hud.js ADDED
@@ -0,0 +1,67 @@
1
+ /**
2
+ * HUD — 轻量状态显示
3
+ *
4
+ * 在 CLI 交互模式下,显示当前 agent 状态、活跃 workflow、token 用量
5
+ */
6
+ import chalk from 'chalk';
7
+ import { readActiveWorkflows } from '../state/manager.js';
8
+ /**
9
+ * 渲染单行 HUD
10
+ */
11
+ export function renderHUD(state) {
12
+ const agents = state.activeAgents.length > 0
13
+ ? state.activeAgents.map(a => chalk.cyan(a)).join(', ')
14
+ : chalk.dim('idle');
15
+ const progress = state.totalTasks > 0
16
+ ? `${state.completedTasks}/${state.totalTasks}`
17
+ : '-';
18
+ const tokens = state.tokenUsage.input + state.tokenUsage.output > 0
19
+ ? `${formatTokens(state.tokenUsage.input)}↓ ${formatTokens(state.tokenUsage.output)}↑`
20
+ : '';
21
+ const workflows = readActiveWorkflows();
22
+ const workflowStr = workflows.length > 0
23
+ ? chalk.yellow(` wf:${workflows.length}`)
24
+ : '';
25
+ return chalk.dim('[') +
26
+ chalk.bold(state.model) +
27
+ chalk.dim('/') +
28
+ state.effort +
29
+ chalk.dim('] ') +
30
+ agents +
31
+ chalk.dim(` ${progress}`) +
32
+ workflowStr +
33
+ (tokens ? chalk.dim(` ${tokens}`) : '');
34
+ }
35
+ /**
36
+ * 渲染详细状态面板
37
+ */
38
+ export function renderStatusPanel(state) {
39
+ const lines = [
40
+ chalk.cyan.bold('─'.repeat(50)),
41
+ ` ${chalk.bold('Session:')} ${state.sessionId}`,
42
+ ` ${chalk.bold('Model:')} ${state.model} (${state.effort})`,
43
+ ` ${chalk.bold('Agents:')} ${state.activeAgents.length > 0 ? state.activeAgents.join(', ') : 'none'}`,
44
+ ` ${chalk.bold('Tasks:')} ${state.completedTasks}/${state.totalTasks}`,
45
+ ];
46
+ if (state.tokenUsage.input + state.tokenUsage.output > 0) {
47
+ lines.push(` ${chalk.bold('Tokens:')} ${formatTokens(state.tokenUsage.input)} in / ${formatTokens(state.tokenUsage.output)} out`);
48
+ }
49
+ const workflows = readActiveWorkflows();
50
+ if (workflows.length > 0) {
51
+ lines.push(` ${chalk.bold('Workflows:')}`);
52
+ for (const w of workflows) {
53
+ const icon = w.status === 'completed' ? '✅' : w.status === 'failed' ? '❌' : '⏳';
54
+ lines.push(` ${icon} ${w.type} (${w.status})`);
55
+ }
56
+ }
57
+ lines.push(chalk.cyan.bold('─'.repeat(50)));
58
+ return lines.join('\n');
59
+ }
60
+ function formatTokens(n) {
61
+ if (n >= 1_000_000)
62
+ return `${(n / 1_000_000).toFixed(1)}M`;
63
+ if (n >= 1_000)
64
+ return `${(n / 1_000).toFixed(1)}K`;
65
+ return String(n);
66
+ }
67
+ //# sourceMappingURL=hud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hud.js","sourceRoot":"","sources":["../../src/ui/hud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Verification Agent — 'try to break it' philosophy
3
+ *
4
+ * Instead of confirming success, this agent actively tries to find flaws.
5
+ * - Enforces build/test/lint execution
6
+ * - Adversarial probing: boundary testing, actual API calls
7
+ * - Separation of concerns: independent from the code-writing agent
8
+ * - Returns VERDICT: PASS / FAIL / PARTIAL
9
+ */
10
+ export type VerificationVerdict = 'PASS' | 'FAIL' | 'PARTIAL';
11
+ export interface VerificationResult {
12
+ verdict: VerificationVerdict;
13
+ summary: string;
14
+ checks: VerificationCheck[];
15
+ reasoning: string;
16
+ suggestedFixes?: string[];
17
+ }
18
+ export interface VerificationCheck {
19
+ name: string;
20
+ passed: boolean;
21
+ output?: string;
22
+ error?: string;
23
+ skipped?: boolean;
24
+ skipReason?: string;
25
+ }
26
+ interface VerificationOptions {
27
+ cwd?: string;
28
+ skipTests?: boolean;
29
+ skipBuild?: boolean;
30
+ skipLint?: boolean;
31
+ adversarialTests?: AdversarialTest[];
32
+ }
33
+ interface AdversarialTest {
34
+ name: string;
35
+ command: string;
36
+ expectFail?: boolean;
37
+ }
38
+ /**
39
+ * Main verification function — runs all checks and returns verdict.
40
+ */
41
+ export declare function runVerification(task: string, result: string, options?: VerificationOptions): Promise<VerificationResult>;
42
+ /**
43
+ * Format verification result for display.
44
+ */
45
+ export declare function formatVerificationResult(result: VerificationResult): string;
46
+ export {};