bobo-ai-cli 2.0.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 (126) hide show
  1. package/README.md +52 -9
  2. package/dist/agent.js +70 -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/claude-bridge.d.ts +18 -0
  19. package/dist/claude-bridge.js +91 -0
  20. package/dist/claude-bridge.js.map +1 -0
  21. package/dist/cli.d.ts +8 -0
  22. package/dist/cli.js +667 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/compactor.d.ts +49 -4
  25. package/dist/compactor.js +164 -17
  26. package/dist/compactor.js.map +1 -1
  27. package/dist/completer.js +2 -0
  28. package/dist/completer.js.map +1 -1
  29. package/dist/cost-tracker.js +35 -2
  30. package/dist/cost-tracker.js.map +1 -1
  31. package/dist/dream.d.ts +42 -0
  32. package/dist/dream.js +321 -0
  33. package/dist/dream.js.map +1 -0
  34. package/dist/hooks.d.ts +1 -1
  35. package/dist/hooks.js +4 -0
  36. package/dist/hooks.js.map +1 -1
  37. package/dist/index.js +8 -1099
  38. package/dist/index.js.map +1 -1
  39. package/dist/insight.js +4 -11
  40. package/dist/insight.js.map +1 -1
  41. package/dist/knowledge.d.ts +13 -0
  42. package/dist/knowledge.js +13 -2
  43. package/dist/knowledge.js.map +1 -1
  44. package/dist/memory.d.ts +4 -0
  45. package/dist/memory.js +6 -0
  46. package/dist/memory.js.map +1 -1
  47. package/dist/repl.d.ts +16 -0
  48. package/dist/repl.js +702 -0
  49. package/dist/repl.js.map +1 -0
  50. package/dist/sessions.js +23 -0
  51. package/dist/sessions.js.map +1 -1
  52. package/dist/skills/composer.d.ts +18 -0
  53. package/dist/skills/composer.js +59 -0
  54. package/dist/skills/composer.js.map +1 -0
  55. package/dist/skills/index.d.ts +3 -0
  56. package/dist/skills/index.js +3 -0
  57. package/dist/skills/index.js.map +1 -0
  58. package/dist/skills/loader.d.ts +12 -0
  59. package/dist/skills/loader.js +150 -0
  60. package/dist/skills/loader.js.map +1 -0
  61. package/dist/skills/types.d.ts +28 -0
  62. package/dist/skills/types.js +9 -0
  63. package/dist/skills/types.js.map +1 -0
  64. package/dist/skills.d.ts +1 -0
  65. package/dist/skills.js +1 -0
  66. package/dist/skills.js.map +1 -1
  67. package/dist/state/artifacts.d.ts +71 -0
  68. package/dist/state/artifacts.js +131 -0
  69. package/dist/state/artifacts.js.map +1 -0
  70. package/dist/state/index.d.ts +9 -0
  71. package/dist/state/index.js +7 -0
  72. package/dist/state/index.js.map +1 -0
  73. package/dist/state/manager.d.ts +89 -0
  74. package/dist/state/manager.js +130 -0
  75. package/dist/state/manager.js.map +1 -0
  76. package/dist/state/project-memory.d.ts +24 -0
  77. package/dist/state/project-memory.js +81 -0
  78. package/dist/state/project-memory.js.map +1 -0
  79. package/dist/state/recovery.d.ts +24 -0
  80. package/dist/state/recovery.js +94 -0
  81. package/dist/state/recovery.js.map +1 -0
  82. package/dist/statusbar.d.ts +1 -0
  83. package/dist/statusbar.js +12 -1
  84. package/dist/statusbar.js.map +1 -1
  85. package/dist/sub-agent-runner.d.ts +1 -0
  86. package/dist/sub-agent-runner.js +29 -3
  87. package/dist/sub-agent-runner.js.map +1 -1
  88. package/dist/sub-agents.d.ts +19 -1
  89. package/dist/sub-agents.js +137 -2
  90. package/dist/sub-agents.js.map +1 -1
  91. package/dist/tool-governance.d.ts +77 -0
  92. package/dist/tool-governance.js +335 -0
  93. package/dist/tool-governance.js.map +1 -0
  94. package/dist/tools/claude-bridge-tool.d.ts +4 -0
  95. package/dist/tools/claude-bridge-tool.js +44 -0
  96. package/dist/tools/claude-bridge-tool.js.map +1 -0
  97. package/dist/tools/claude-code.d.ts +33 -0
  98. package/dist/tools/claude-code.js +279 -0
  99. package/dist/tools/claude-code.js.map +1 -0
  100. package/dist/tools/index.js +4 -0
  101. package/dist/tools/index.js.map +1 -1
  102. package/dist/ui/hud.d.ts +25 -0
  103. package/dist/ui/hud.js +67 -0
  104. package/dist/ui/hud.js.map +1 -0
  105. package/dist/verification-agent.d.ts +46 -0
  106. package/dist/verification-agent.js +528 -0
  107. package/dist/verification-agent.js.map +1 -0
  108. package/dist/workflows/ask.d.ts +13 -0
  109. package/dist/workflows/ask.js +66 -0
  110. package/dist/workflows/ask.js.map +1 -0
  111. package/dist/workflows/index.d.ts +5 -0
  112. package/dist/workflows/index.js +6 -0
  113. package/dist/workflows/index.js.map +1 -0
  114. package/dist/workflows/interview.d.ts +11 -0
  115. package/dist/workflows/interview.js +36 -0
  116. package/dist/workflows/interview.js.map +1 -0
  117. package/dist/workflows/plan.d.ts +13 -0
  118. package/dist/workflows/plan.js +34 -0
  119. package/dist/workflows/plan.js.map +1 -0
  120. package/dist/workflows/team.d.ts +17 -0
  121. package/dist/workflows/team.js +86 -0
  122. package/dist/workflows/team.js.map +1 -0
  123. package/dist/workflows/verify.d.ts +11 -0
  124. package/dist/workflows/verify.js +21 -0
  125. package/dist/workflows/verify.js.map +1 -0
  126. package/package.json +2 -4
@@ -2,5 +2,6 @@
2
2
  * Sub-agent runner — standalone script that runs as a child process.
3
3
  * Usage: node dist/sub-agent-runner.js <taskFile>
4
4
  * Reads task from JSON file, runs agent loop, writes result back.
5
+ * Enhanced with role-based tool filtering and prompt injection.
5
6
  */
6
7
  export {};
@@ -2,9 +2,12 @@
2
2
  * Sub-agent runner — standalone script that runs as a child process.
3
3
  * Usage: node dist/sub-agent-runner.js <taskFile>
4
4
  * Reads task from JSON file, runs agent loop, writes result back.
5
+ * Enhanced with role-based tool filtering and prompt injection.
5
6
  */
6
7
  import { readFileSync, writeFileSync } from 'node:fs';
7
8
  import { runAgent } from './agent.js';
9
+ import { runVerification, formatVerificationResult } from './verification-agent.js';
10
+ import { getRolePromptInjection } from './sub-agents.js';
8
11
  async function main() {
9
12
  const taskFile = process.argv[2];
10
13
  if (!taskFile) {
@@ -17,20 +20,43 @@ async function main() {
17
20
  catch {
18
21
  process.exit(1);
19
22
  }
23
+ // Set 30-minute timeout
24
+ const timeoutMs = 30 * 60 * 1000;
25
+ const timeoutHandle = setTimeout(() => {
26
+ taskData.status = 'failed';
27
+ taskData.error = 'Timeout: exceeded 30 minute limit';
28
+ writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
29
+ process.exit(1);
30
+ }, timeoutMs);
20
31
  // Change to task's cwd
21
32
  try {
22
33
  process.chdir(taskData.cwd);
23
34
  }
24
35
  catch { /* stay in current dir */ }
25
36
  try {
26
- const result = await runAgent(taskData.task, []);
27
- taskData.status = 'completed';
28
- taskData.result = result.response;
37
+ const role = taskData.role || 'worker';
38
+ if (role === 'verify') {
39
+ // Special handling for verification agents
40
+ const verificationResult = await runVerification(taskData.task, '', { cwd: taskData.cwd });
41
+ taskData.status = verificationResult.verdict === 'FAIL' ? 'failed' : 'completed';
42
+ taskData.result = formatVerificationResult(verificationResult);
43
+ }
44
+ else {
45
+ // Inject role-specific prompt
46
+ const rolePrompt = getRolePromptInjection(role);
47
+ const enhancedTask = rolePrompt ? `${rolePrompt}\n\n---\n\n${taskData.task}` : taskData.task;
48
+ const result = await runAgent(enhancedTask, [], { quiet: true });
49
+ taskData.status = 'completed';
50
+ taskData.result = result.response;
51
+ }
29
52
  }
30
53
  catch (e) {
31
54
  taskData.status = 'failed';
32
55
  taskData.error = e.message;
33
56
  }
57
+ finally {
58
+ clearTimeout(timeoutHandle);
59
+ }
34
60
  writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
35
61
  }
36
62
  main().catch(() => process.exit(1));
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agent-runner.js","sourceRoot":"","sources":["../src/sub-agent-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAYtC,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,QAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjD,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;QAC9B,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;IACpC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC3B,QAAQ,CAAC,KAAK,GAAI,CAAW,CAAC,OAAO,CAAC;IACxC,CAAC;IAED,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"sub-agent-runner.js","sourceRoot":"","sources":["../src/sub-agent-runner.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,15 @@
1
1
  /**
2
2
  * Sub-agent management — spawn, list, show background agents.
3
+ * Enhanced with role-based isolation (explore/plan/worker/verify).
3
4
  */
5
+ /**
6
+ * Agent role types with different permission levels.
7
+ * - explore: Read-only exploration (read_file, list_directory, search_files, shell with restrictions)
8
+ * - plan: Read-only planning mode (outputs task plans but cannot modify files)
9
+ * - worker: Full tool permissions (but injected with anti-recursion prompt)
10
+ * - verify: Uses verification-agent logic to validate work
11
+ */
12
+ export type AgentRole = 'explore' | 'plan' | 'worker' | 'verify';
4
13
  interface SubAgentTask {
5
14
  id: string;
6
15
  task: string;
@@ -11,11 +20,20 @@ interface SubAgentTask {
11
20
  result?: string;
12
21
  error?: string;
13
22
  pid?: number;
23
+ role?: AgentRole;
14
24
  }
25
+ /**
26
+ * Get allowed tools for a specific role.
27
+ */
28
+ export declare function getAllowedToolsForRole(role: AgentRole): string[];
29
+ /**
30
+ * Get role-specific system prompt injection.
31
+ */
32
+ export declare function getRolePromptInjection(role: AgentRole): string;
15
33
  /**
16
34
  * Spawn a new sub-agent to run a task in the background.
17
35
  */
18
- export declare function spawnSubAgent(task: string): {
36
+ export declare function spawnSubAgent(task: string, role?: AgentRole): {
19
37
  id: string;
20
38
  error?: string;
21
39
  };
@@ -1,11 +1,13 @@
1
1
  /**
2
2
  * Sub-agent management — spawn, list, show background agents.
3
+ * Enhanced with role-based isolation (explore/plan/worker/verify).
3
4
  */
4
5
  import { fork } from 'node:child_process';
5
6
  import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'node:fs';
6
7
  import { join } from 'node:path';
7
8
  import { fileURLToPath } from 'node:url';
8
9
  import { getConfigDir } from './config.js';
10
+ import { AGENT_CATALOG } from './agents/catalog.js';
9
11
  const __dirname = fileURLToPath(new URL('.', import.meta.url));
10
12
  const MAX_CONCURRENT = 3;
11
13
  // Track running processes in memory
@@ -19,17 +21,149 @@ function ensureAgentsDir() {
19
21
  mkdirSync(dir, { recursive: true });
20
22
  }
21
23
  }
24
+ /**
25
+ * Get allowed tools for a specific role.
26
+ */
27
+ export function getAllowedToolsForRole(role) {
28
+ switch (role) {
29
+ case 'explore':
30
+ // Read-only tools for exploration
31
+ return [
32
+ 'read_file',
33
+ 'list_directory',
34
+ 'search_files',
35
+ 'git_status',
36
+ 'git_diff',
37
+ 'git_log',
38
+ 'search_memory',
39
+ ];
40
+ case 'plan':
41
+ // Read-only + planning tools
42
+ return [
43
+ 'read_file',
44
+ 'list_directory',
45
+ 'search_files',
46
+ 'git_status',
47
+ 'git_diff',
48
+ 'git_log',
49
+ 'search_memory',
50
+ ];
51
+ case 'worker':
52
+ // Full access (but will be injected with anti-recursion prompt)
53
+ return ['*']; // All tools allowed
54
+ case 'verify':
55
+ // Verification tools
56
+ return [
57
+ 'read_file',
58
+ 'list_directory',
59
+ 'search_files',
60
+ 'shell', // For running build/test/lint
61
+ 'git_status',
62
+ 'git_diff',
63
+ ];
64
+ default:
65
+ return [];
66
+ }
67
+ }
68
+ /**
69
+ * Get role-specific system prompt injection.
70
+ */
71
+ export function getRolePromptInjection(role) {
72
+ // Try to use catalog-based prompts first for richer role definitions
73
+ const catalogRole = role === 'worker' ? 'executor' : role === 'plan' ? 'planner' : role === 'verify' ? 'verifier' : role;
74
+ const catalogAgent = AGENT_CATALOG[catalogRole];
75
+ const catalogContext = catalogAgent
76
+ ? `\n\n## Catalog Context\n- Role: ${catalogAgent.role}\n- Description: ${catalogAgent.description}\n- Use cases: ${catalogAgent.useCases.join(', ')}\n- Boundaries: ${catalogAgent.boundaries.join(', ')}`
77
+ : '';
78
+ switch (role) {
79
+ case 'explore':
80
+ return `
81
+ # Role: Explorer Agent
82
+
83
+ You are an exploration agent with READ-ONLY access. Your job is to:
84
+ - Read and analyze files
85
+ - Search for patterns and information
86
+ - Report findings clearly
87
+
88
+ You CANNOT:
89
+ - Modify any files (write_file, edit_file)
90
+ - Execute arbitrary shell commands
91
+ - Create or delete files
92
+ - Make git commits
93
+
94
+ Focus on gathering information and presenting it clearly.${catalogContext}`;
95
+ case 'plan':
96
+ return `
97
+ # Role: Planning Agent
98
+
99
+ You are a planning agent with READ-ONLY access. Your job is to:
100
+ - Analyze the codebase and requirements
101
+ - Create detailed task breakdowns
102
+ - Identify dependencies and risks
103
+ - Propose implementation approaches
104
+
105
+ You CANNOT:
106
+ - Modify any files
107
+ - Execute code changes
108
+ - Make commits
109
+
110
+ Output a structured plan with:
111
+ 1. Tasks broken down into steps
112
+ 2. File paths that need changes
113
+ 3. Potential risks or blockers
114
+ 4. Estimated complexity${catalogContext}`;
115
+ case 'worker':
116
+ return `
117
+ # Role: Worker Agent
118
+
119
+ You are a worker agent with FULL tool access. Your job is to:
120
+ - Execute tasks efficiently
121
+ - Make file changes as needed
122
+ - Run tests and verify your work
123
+ - Report completion status
124
+
125
+ CRITICAL CONSTRAINTS:
126
+ - You are a WORKER, not a manager
127
+ - NEVER spawn sub-agents or delegate work
128
+ - Execute tasks directly yourself
129
+ - If you encounter blockers, report them immediately
130
+
131
+ Focus on DOING the work, not planning or delegating.${catalogContext}`;
132
+ case 'verify':
133
+ return `
134
+ # Role: Verification Agent
135
+
136
+ You are a verification agent using 'try to break it' philosophy. Your job is to:
137
+ - Run build/test/lint checks
138
+ - Probe for edge cases and boundary conditions
139
+ - Test actual functionality (API calls, CLI commands)
140
+ - Report honest assessment
141
+
142
+ You SHOULD:
143
+ - Be adversarial - try to find what's broken
144
+ - Run all available verification steps
145
+ - Test with unusual inputs
146
+ - Check for security issues
147
+
148
+ You MUST:
149
+ - Return VERDICT: PASS / FAIL / PARTIAL
150
+ - Provide specific evidence for failures
151
+ - Suggest concrete fixes${catalogContext}`;
152
+ default:
153
+ return '';
154
+ }
155
+ }
22
156
  /**
23
157
  * Spawn a new sub-agent to run a task in the background.
24
158
  */
25
- export function spawnSubAgent(task) {
159
+ export function spawnSubAgent(task, role = 'worker') {
26
160
  ensureAgentsDir();
27
161
  // Check concurrent limit
28
162
  const running = listSubAgents().filter(a => a.status === 'running');
29
163
  if (running.length >= MAX_CONCURRENT) {
30
164
  return { id: '', error: `Max ${MAX_CONCURRENT} concurrent sub-agents. Wait for one to finish or check /agents.` };
31
165
  }
32
- const id = `agent-${Date.now().toString(36)}`;
166
+ const id = `agent-${Date.now().toString(36)}-${role}`;
33
167
  const taskFile = join(getAgentsDir(), `${id}.json`);
34
168
  const taskData = {
35
169
  id,
@@ -37,6 +171,7 @@ export function spawnSubAgent(task) {
37
171
  cwd: process.cwd(),
38
172
  status: 'running',
39
173
  startedAt: new Date().toISOString(),
174
+ role,
40
175
  };
41
176
  writeFileSync(taskFile, JSON.stringify(taskData, null, 2));
42
177
  // Fork the sub-agent runner
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agents.js","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sub-agents.js","sourceRoot":"","sources":["../src/sub-agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
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
+ /**
14
+ * Risk levels for tool operations.
15
+ */
16
+ export type ToolRiskLevel = 'safe' | 'moderate' | 'dangerous';
17
+ /**
18
+ * Tool metadata for governance.
19
+ */
20
+ export interface ToolMetadata {
21
+ name: string;
22
+ isReadOnly: boolean;
23
+ isConcurrencySafe: boolean;
24
+ riskLevel: ToolRiskLevel;
25
+ requiresPriorRead?: string[];
26
+ }
27
+ /**
28
+ * Tool execution context.
29
+ */
30
+ export interface ToolExecutionContext {
31
+ toolName: string;
32
+ args: Record<string, unknown>;
33
+ timestamp: number;
34
+ sessionId?: string;
35
+ }
36
+ /**
37
+ * Tool execution result.
38
+ */
39
+ export interface ToolExecutionResult {
40
+ success: boolean;
41
+ output?: string;
42
+ error?: string;
43
+ duration: number;
44
+ blocked?: boolean;
45
+ blockReason?: string;
46
+ }
47
+ /**
48
+ * Get tool metadata (fail-closed for unknown tools).
49
+ */
50
+ export declare function getToolMetadata(toolName: string): ToolMetadata;
51
+ /**
52
+ * Register tool metadata (for external tools).
53
+ */
54
+ export declare function registerToolMetadata(metadata: ToolMetadata): void;
55
+ /**
56
+ * Execute tool with full governance pipeline.
57
+ */
58
+ export declare function executeToolWithGovernance(toolName: string, args: Record<string, unknown>, executor: (name: string, args: Record<string, unknown>) => Promise<string> | string): Promise<ToolExecutionResult>;
59
+ /**
60
+ * Check if tools can be run concurrently.
61
+ */
62
+ export declare function canRunConcurrently(toolNames: string[]): boolean;
63
+ /**
64
+ * Get governance statistics.
65
+ */
66
+ export declare function getGovernanceStats(): {
67
+ filesRead: number;
68
+ recentToolCalls: ToolExecutionContext[];
69
+ };
70
+ /**
71
+ * Reset governance state (useful for testing or session boundaries).
72
+ */
73
+ export declare function resetGovernanceState(): void;
74
+ /**
75
+ * Format governance result for user display.
76
+ */
77
+ export declare function formatGovernanceError(result: ToolExecutionResult): string;