bobo-ai-cli 1.0.1

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 (234) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +216 -0
  3. package/dist/agent.d.ts +9 -0
  4. package/dist/agent.js +144 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/config.d.ts +15 -0
  7. package/dist/config.js +76 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.js +366 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/knowledge-commands.d.ts +2 -0
  13. package/dist/knowledge-commands.js +40 -0
  14. package/dist/knowledge-commands.js.map +1 -0
  15. package/dist/knowledge.d.ts +17 -0
  16. package/dist/knowledge.js +112 -0
  17. package/dist/knowledge.js.map +1 -0
  18. package/dist/memory.d.ts +17 -0
  19. package/dist/memory.js +215 -0
  20. package/dist/memory.js.map +1 -0
  21. package/dist/planner.d.ts +22 -0
  22. package/dist/planner.js +130 -0
  23. package/dist/planner.js.map +1 -0
  24. package/dist/project.d.ts +25 -0
  25. package/dist/project.js +117 -0
  26. package/dist/project.js.map +1 -0
  27. package/dist/rules-commands.d.ts +2 -0
  28. package/dist/rules-commands.js +51 -0
  29. package/dist/rules-commands.js.map +1 -0
  30. package/dist/skills.d.ts +28 -0
  31. package/dist/skills.js +349 -0
  32. package/dist/skills.js.map +1 -0
  33. package/dist/structured/loader.d.ts +19 -0
  34. package/dist/structured/loader.js +147 -0
  35. package/dist/structured/loader.js.map +1 -0
  36. package/dist/structured/paths.d.ts +2 -0
  37. package/dist/structured/paths.js +14 -0
  38. package/dist/structured/paths.js.map +1 -0
  39. package/dist/structured/project-scaffold.d.ts +7 -0
  40. package/dist/structured/project-scaffold.js +60 -0
  41. package/dist/structured/project-scaffold.js.map +1 -0
  42. package/dist/structured/render-markdown.d.ts +37 -0
  43. package/dist/structured/render-markdown.js +47 -0
  44. package/dist/structured/render-markdown.js.map +1 -0
  45. package/dist/structured/render-table.d.ts +1 -0
  46. package/dist/structured/render-table.js +15 -0
  47. package/dist/structured/render-table.js.map +1 -0
  48. package/dist/structured/search.d.ts +10 -0
  49. package/dist/structured/search.js +104 -0
  50. package/dist/structured/search.js.map +1 -0
  51. package/dist/structured/skill-runner.d.ts +15 -0
  52. package/dist/structured/skill-runner.js +60 -0
  53. package/dist/structured/skill-runner.js.map +1 -0
  54. package/dist/structured/types.d.ts +212 -0
  55. package/dist/structured/types.js +97 -0
  56. package/dist/structured/types.js.map +1 -0
  57. package/dist/structured-skills-commands.d.ts +3 -0
  58. package/dist/structured-skills-commands.js +126 -0
  59. package/dist/structured-skills-commands.js.map +1 -0
  60. package/dist/structured-template-commands.d.ts +2 -0
  61. package/dist/structured-template-commands.js +34 -0
  62. package/dist/structured-template-commands.js.map +1 -0
  63. package/dist/tools/index.d.ts +3 -0
  64. package/dist/tools/index.js +450 -0
  65. package/dist/tools/index.js.map +1 -0
  66. package/dist/ui.d.ts +19 -0
  67. package/dist/ui.js +72 -0
  68. package/dist/ui.js.map +1 -0
  69. package/dist/web.d.ts +4 -0
  70. package/dist/web.js +124 -0
  71. package/dist/web.js.map +1 -0
  72. package/knowledge/advanced-patterns.md +70 -0
  73. package/knowledge/agent-directives.md +74 -0
  74. package/knowledge/dream.md +36 -0
  75. package/knowledge/engineering.md +46 -0
  76. package/knowledge/error-catalog.md +33 -0
  77. package/knowledge/index.json +170 -0
  78. package/knowledge/memory/cache-optimization-and-skill-integration.md +102 -0
  79. package/knowledge/memory/engineering-patterns.md +134 -0
  80. package/knowledge/memory/feedback_root_structure.md +16 -0
  81. package/knowledge/memory/project-contexts.md +69 -0
  82. package/knowledge/memory/tools-and-services.md +85 -0
  83. package/knowledge/rules/agents.md +62 -0
  84. package/knowledge/rules/blocking-rules.md +323 -0
  85. package/knowledge/rules/cache-management.md +379 -0
  86. package/knowledge/rules/capability-evolution.md +132 -0
  87. package/knowledge/rules/coding.md +126 -0
  88. package/knowledge/rules/engineering-workflows.md +225 -0
  89. package/knowledge/rules/evomap-content-guidelines.md +354 -0
  90. package/knowledge/rules/evomap-guide.md +224 -0
  91. package/knowledge/rules/git.md +31 -0
  92. package/knowledge/rules/hooks.md +106 -0
  93. package/knowledge/rules/performance.md +101 -0
  94. package/knowledge/rules/remotion-auto-production.md +1120 -0
  95. package/knowledge/rules/security.md +46 -0
  96. package/knowledge/rules/testing.md +32 -0
  97. package/knowledge/rules/work-mode.md +208 -0
  98. package/knowledge/rules.md +62 -0
  99. package/knowledge/skills/Skill_Seekers.md +1722 -0
  100. package/knowledge/skills/ab-test-setup.md +557 -0
  101. package/knowledge/skills/agent-sdk-dev.md +238 -0
  102. package/knowledge/skills/agent-tools.md +136 -0
  103. package/knowledge/skills/analytics-tracking.md +597 -0
  104. package/knowledge/skills/artifacts-builder.md +89 -0
  105. package/knowledge/skills/asana.md +13 -0
  106. package/knowledge/skills/backend-expert.md +97 -0
  107. package/knowledge/skills/brand-voice.md +481 -0
  108. package/knowledge/skills/browser-use.md +419 -0
  109. package/knowledge/skills/cache-optimization-skill.md +179 -0
  110. package/knowledge/skills/canvas-design.md +147 -0
  111. package/knowledge/skills/citation-validator.md +203 -0
  112. package/knowledge/skills/clangd-lsp.md +52 -0
  113. package/knowledge/skills/code-review-expert.md +85 -0
  114. package/knowledge/skills/code-review.md +280 -0
  115. package/knowledge/skills/code-simplifier.md +13 -0
  116. package/knowledge/skills/commit-commands.md +258 -0
  117. package/knowledge/skills/competitor-alternatives.md +795 -0
  118. package/knowledge/skills/content-atomizer.md +910 -0
  119. package/knowledge/skills/content-research-writer.md +605 -0
  120. package/knowledge/skills/context-optimization-suite.md +162 -0
  121. package/knowledge/skills/context7.md +13 -0
  122. package/knowledge/skills/copy-editing.md +494 -0
  123. package/knowledge/skills/copywriting.md +510 -0
  124. package/knowledge/skills/csharp-lsp.md +40 -0
  125. package/knowledge/skills/decision-making-framework.md +154 -0
  126. package/knowledge/skills/developer-growth-analysis.md +335 -0
  127. package/knowledge/skills/direct-response-copy.md +2336 -0
  128. package/knowledge/skills/docker-expert.md +229 -0
  129. package/knowledge/skills/document-skills.md +13 -0
  130. package/knowledge/skills/documentation-expert.md +126 -0
  131. package/knowledge/skills/email-sequence.md +1061 -0
  132. package/knowledge/skills/email-sequences.md +910 -0
  133. package/knowledge/skills/example-plugin.md +72 -0
  134. package/knowledge/skills/explanatory-output-style.md +82 -0
  135. package/knowledge/skills/feature-dev.md +458 -0
  136. package/knowledge/skills/file-organizer.md +466 -0
  137. package/knowledge/skills/firebase.disabled.md +13 -0
  138. package/knowledge/skills/form-cro.md +488 -0
  139. package/knowledge/skills/free-tool-strategy.md +636 -0
  140. package/knowledge/skills/frontend-design-offical.md +55 -0
  141. package/knowledge/skills/frontend-design.md +41 -0
  142. package/knowledge/skills/frontend-expert.md +93 -0
  143. package/knowledge/skills/github.md +13 -0
  144. package/knowledge/skills/gitlab.md +13 -0
  145. package/knowledge/skills/gopls-lsp.md +32 -0
  146. package/knowledge/skills/got-controller.md +218 -0
  147. package/knowledge/skills/greptile.md +72 -0
  148. package/knowledge/skills/hookify.md +376 -0
  149. package/knowledge/skills/image-editor.md +189 -0
  150. package/knowledge/skills/image-enhancer.md +109 -0
  151. package/knowledge/skills/jdtls-lsp.md +49 -0
  152. package/knowledge/skills/json-canvas.md +654 -0
  153. package/knowledge/skills/keyword-research.md +559 -0
  154. package/knowledge/skills/kotlin-lsp.md +28 -0
  155. package/knowledge/skills/laravel-boost.md +13 -0
  156. package/knowledge/skills/launch-strategy.md +394 -0
  157. package/knowledge/skills/lead-magnet.md +393 -0
  158. package/knowledge/skills/learning-output-style.md +106 -0
  159. package/knowledge/skills/linear.md +13 -0
  160. package/knowledge/skills/lua-lsp.md +47 -0
  161. package/knowledge/skills/marketing-ideas.md +720 -0
  162. package/knowledge/skills/marketing-psychology.md +534 -0
  163. package/knowledge/skills/mcp-builder.md +369 -0
  164. package/knowledge/skills/meeting-insights-analyzer.md +347 -0
  165. package/knowledge/skills/memory-evolution-system.md +172 -0
  166. package/knowledge/skills/multi-lens-thinking.md +407 -0
  167. package/knowledge/skills/nano-banana-pro.md +116 -0
  168. package/knowledge/skills/newsletter.md +736 -0
  169. package/knowledge/skills/notebooklm.md +296 -0
  170. package/knowledge/skills/obsidian-bases.md +634 -0
  171. package/knowledge/skills/obsidian-markdown.md +651 -0
  172. package/knowledge/skills/onboarding-cro.md +494 -0
  173. package/knowledge/skills/orchestrator.md +681 -0
  174. package/knowledge/skills/page-cro.md +379 -0
  175. package/knowledge/skills/paid-ads.md +624 -0
  176. package/knowledge/skills/paywall-upgrade-cro.md +651 -0
  177. package/knowledge/skills/php-lsp.md +36 -0
  178. package/knowledge/skills/planning-with-files.md +193 -0
  179. package/knowledge/skills/playwright.md +13 -0
  180. package/knowledge/skills/plugin-dev.md +434 -0
  181. package/knowledge/skills/popup-cro.md +520 -0
  182. package/knowledge/skills/positioning-angles.md +330 -0
  183. package/knowledge/skills/pr-review-toolkit.md +359 -0
  184. package/knowledge/skills/pricing-strategy.md +777 -0
  185. package/knowledge/skills/programmatic-seo.md +714 -0
  186. package/knowledge/skills/pyright-lsp.md +43 -0
  187. package/knowledge/skills/quality-assurance-framework.md +168 -0
  188. package/knowledge/skills/question-refiner.md +160 -0
  189. package/knowledge/skills/ralph-loop.md +205 -0
  190. package/knowledge/skills/refactoring-expert.md +103 -0
  191. package/knowledge/skills/referral-program.md +668 -0
  192. package/knowledge/skills/research-executor.md +164 -0
  193. package/knowledge/skills/review-with-security.md +12 -0
  194. package/knowledge/skills/rust-analyzer-lsp.md +50 -0
  195. package/knowledge/skills/schema-markup.md +647 -0
  196. package/knowledge/skills/security-audit-expert.md +124 -0
  197. package/knowledge/skills/security-expert.md +140 -0
  198. package/knowledge/skills/security-guidance.md +13 -0
  199. package/knowledge/skills/seedance-prompt.md +139 -0
  200. package/knowledge/skills/self-evolution.md +1160 -0
  201. package/knowledge/skills/seo-audit.md +432 -0
  202. package/knowledge/skills/seo-content.md +787 -0
  203. package/knowledge/skills/serena.md +13 -0
  204. package/knowledge/skills/signup-flow-cro.md +409 -0
  205. package/knowledge/skills/skill-creator.md +220 -0
  206. package/knowledge/skills/skill-manager.md +226 -0
  207. package/knowledge/skills/skill-share.md +98 -0
  208. package/knowledge/skills/slack.md +13 -0
  209. package/knowledge/skills/social-content.md +878 -0
  210. package/knowledge/skills/spec-flow-skill.md +124 -0
  211. package/knowledge/skills/stripe.md +13 -0
  212. package/knowledge/skills/supabase.md +13 -0
  213. package/knowledge/skills/swift-lsp.md +40 -0
  214. package/knowledge/skills/synthesizer.md +236 -0
  215. package/knowledge/skills/template-skill.md +16 -0
  216. package/knowledge/skills/testing-expert.md +99 -0
  217. package/knowledge/skills/theme-factory.md +72 -0
  218. package/knowledge/skills/tiktok-research.md +208 -0
  219. package/knowledge/skills/typescript-lsp.md +36 -0
  220. package/knowledge/skills/ui-ux-pro-max.md +247 -0
  221. package/knowledge/skills/verify.md +15 -0
  222. package/knowledge/skills/visual-prompt-engineer.md +102 -0
  223. package/knowledge/skills/webapp-testing.md +111 -0
  224. package/knowledge/skills/wide-research.md +191 -0
  225. package/knowledge/system.md +93 -0
  226. package/knowledge/task-router.md +37 -0
  227. package/knowledge/verification.md +38 -0
  228. package/knowledge/workflows/3d-viz.md +47 -0
  229. package/knowledge/workflows/data-pipeline.md +47 -0
  230. package/knowledge/workflows/db-migration.md +51 -0
  231. package/knowledge/workflows/feature-dev.md +41 -0
  232. package/knowledge/workflows/tdd-flow.md +52 -0
  233. package/knowledge/workflows/ui-verify.md +51 -0
  234. package/package.json +60 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Bobo Zhou
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,216 @@
1
+ <div align="center">
2
+
3
+ # 🐕 Bobo CLI
4
+
5
+ **Portable AI Engineering Assistant**
6
+
7
+ [![npm version](https://img.shields.io/npm/v/bobo-cli.svg)](https://www.npmjs.com/package/bobo-cli)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
9
+
10
+ An AI-powered CLI assistant with embedded engineering knowledge, a pluggable skill system, persistent memory, and project-aware context — designed to be your pair-programming partner in the terminal.
11
+
12
+ </div>
13
+
14
+ ---
15
+
16
+ ## Quick Start
17
+
18
+ ```bash
19
+ # Install
20
+ npm install -g bobo-ai-cli
21
+
22
+ # Initialize
23
+ bobo init
24
+ bobo config set apiKey sk-your-anthropic-key
25
+
26
+ # Start interactive REPL
27
+ bobo
28
+
29
+ # Or run a one-shot prompt
30
+ bobo "explain this codebase"
31
+ ```
32
+
33
+ ## Features
34
+
35
+ ### 🧠 Knowledge System
36
+ 9 built-in knowledge files that shape the assistant's behavior and engineering methodology:
37
+
38
+ | File | Type | Description |
39
+ |------|------|-------------|
40
+ | `system.md` | always | Core identity, work mode, and personality |
41
+ | `rules.md` | always | Coding standards, honest reporting, git workflow |
42
+ | `agent-directives.md` | always | 10 mechanical override rules (edit safety, context decay, phased execution) |
43
+ | `engineering.md` | on-demand | Task routing, search strategies, three-file pattern |
44
+ | `error-catalog.md` | on-demand | Top 10 high-frequency error patterns with quick fixes |
45
+ | `verification.md` | on-demand | Adversarial verification protocol |
46
+ | `task-router.md` | on-demand | Task classification and strategy selection |
47
+ | `dream.md` | on-demand | Memory consolidation protocol |
48
+ | `advanced-patterns.md` | on-demand | Memory taxonomy, compact protocol, sub-agent architecture |
49
+
50
+ On-demand files are loaded automatically when the user's message matches trigger keywords.
51
+
52
+ ### 🧩 Skill System
53
+ 47 skills (2 built-in + 45 importable) covering coding, research, verification, context management, self-improvement, and domain-specific tools:
54
+
55
+ ```bash
56
+ bobo skill list # List all skills
57
+ bobo skill enable semrush # Enable a skill
58
+ bobo skill disable coding # Disable a skill
59
+ bobo skill import ~/skills/ # Batch import from directory
60
+ ```
61
+
62
+ **Core skills (enabled by default):**
63
+ - `coding` — Code standards, zero-comment principle, review checklist
64
+ - `research` — Search strategies, information synthesis
65
+ - `adversarial-verification` — Break-it-don't-confirm-it validation
66
+ - `context-compressor` — Nine-section context compression
67
+ - `context-budget-analyzer` — Token usage analysis
68
+ - `proactive-self-improving` — Automatic experience capture and evolution
69
+ - `high-agency` — Sustained motivation and ownership mindset
70
+ - `memory-manager` — Structured long-term memory management
71
+ - `deep-research` — Multi-model deep research with citations
72
+
73
+ ### 🔧 Tool System
74
+ 18 tools available to the AI assistant:
75
+
76
+ | Category | Tools |
77
+ |----------|-------|
78
+ | **File** | `read_file`, `write_file`, `edit_file`, `search_files`, `list_directory` |
79
+ | **Shell** | `shell` |
80
+ | **Memory** | `save_memory`, `search_memory` |
81
+ | **Git** | `git_status`, `git_diff`, `git_log`, `git_commit`, `git_push` |
82
+ | **Planner** | `create_plan`, `update_plan`, `show_plan` |
83
+ | **Web** | `web_search`, `web_fetch` |
84
+
85
+ ### 💾 Memory System
86
+ Persistent memory across sessions with structured categories:
87
+
88
+ - **user** — Preferences and habits
89
+ - **feedback** — Corrections and confirmations
90
+ - **project** — Active tasks and goals
91
+ - **reference** — External knowledge not in code
92
+ - **experience** — Lessons learned
93
+
94
+ Memory is stored in `~/.bobo/memory.md` with a 5KB auto-slim cap and daily logs in `~/.bobo/memory/`.
95
+
96
+ ### 📁 Project Awareness
97
+ Drop a `.bobo/` directory in any project to provide project-specific context:
98
+
99
+ ```bash
100
+ cd my-project
101
+ bobo project init # Creates .bobo/project.json
102
+ ```
103
+
104
+ Bobo automatically detects and loads `AGENTS.md`, `CLAUDE.md`, and `CONVENTIONS.md` from the project root.
105
+
106
+ ## Architecture
107
+
108
+ ```
109
+ bobo CLI v1.0.0
110
+
111
+ ├── System Prompt Assembly (priority order)
112
+ │ ① Knowledge (3 always-load + 6 on-demand)
113
+ │ ② Skills (active skill prompts)
114
+ │ ③ Memory (persistent user/project/feedback data)
115
+ │ ④ Project (.bobo/ config + auto-detected files)
116
+ │ ⑤ Environment (CWD + context decay warnings)
117
+
118
+ ├── Agent Loop
119
+ │ ├── Streaming responses with tool calls
120
+ │ ├── Max 20 iterations per turn
121
+ │ └── Context decay detection (10+ turns)
122
+
123
+ ├── Structured Knowledge (advanced)
124
+ │ ├── knowledge/rules/ — 15+ domain rule files
125
+ │ ├── knowledge/skills/ — 140+ structured skill files
126
+ │ ├── knowledge/workflows/ — 6 workflow templates
127
+ │ └── knowledge/memory/ — Extracted patterns
128
+
129
+ └── CLI Commands
130
+ ├── bobo [prompt] — One-shot or REPL mode
131
+ ├── bobo config — Configuration management
132
+ ├── bobo init — Initialize ~/.bobo/
133
+ ├── bobo knowledge — View knowledge base
134
+ ├── bobo skill — Skill management
135
+ ├── bobo kb — Structured knowledge search
136
+ ├── bobo rules — Browse engineering rules
137
+ ├── bobo skills — Structured skill browser
138
+ ├── bobo template — Project scaffolding
139
+ └── bobo project — Project configuration
140
+ ```
141
+
142
+ ## REPL Commands
143
+
144
+ | Command | Description |
145
+ |---------|-------------|
146
+ | `/help` | Show available commands |
147
+ | `/status` | Session status (model, turns, CWD) |
148
+ | `/knowledge` | List loaded knowledge files |
149
+ | `/skills` | List active skills |
150
+ | `/plan` | Show current task plan |
151
+ | `/compact` | Compress context (nine-section summary) |
152
+ | `/dream` | Memory consolidation |
153
+ | `/clear` | Clear conversation history |
154
+ | `/history` | Show turn count |
155
+ | `/quit` | Exit |
156
+
157
+ ## Configuration
158
+
159
+ ```bash
160
+ bobo config set apiKey sk-your-key # API key (required)
161
+ bobo config set model gpt-4o # Model name
162
+ bobo config set baseUrl https://... # API base URL
163
+ bobo config set maxTokens 8192 # Max response tokens
164
+ bobo config list # Show all config
165
+ ```
166
+
167
+ Configuration is stored in `~/.bobo/config.json`. The API key is masked in `config list` output.
168
+
169
+ ### Supported Providers
170
+
171
+ Bobo CLI uses the OpenAI-compatible API format. It works with:
172
+ - **Anthropic** (default) — `baseUrl: https://api.anthropic.com/v1`
173
+ - **OpenAI** — `baseUrl: https://api.openai.com/v1`
174
+ - **Azure OpenAI** — Set your Azure endpoint as `baseUrl`
175
+ - **Any OpenAI-compatible API** — Ollama, Together, Groq, etc.
176
+
177
+ ## Knowledge Customization
178
+
179
+ ### Adding custom knowledge
180
+ Place `.md` files in `~/.bobo/knowledge/` — they'll be loaded as custom context:
181
+
182
+ ```bash
183
+ echo "# My Team Standards\n\nAlways use TypeScript strict mode." > ~/.bobo/knowledge/team.md
184
+ ```
185
+
186
+ ### Importing skills from OpenClaw
187
+ If you use [OpenClaw](https://github.com/openclaw/openclaw), you can import its skills directly:
188
+
189
+ ```bash
190
+ bobo skill import ~/.openclaw/workspace/skills/
191
+ ```
192
+
193
+ ## Contributing
194
+
195
+ Contributions are welcome! Please:
196
+
197
+ 1. Fork the repo
198
+ 2. Create a feature branch (`git checkout -b feat/my-feature`)
199
+ 3. Run tests (`npm test`)
200
+ 4. Ensure the build passes (`npm run build`)
201
+ 5. Submit a PR
202
+
203
+ ### Development
204
+
205
+ ```bash
206
+ git clone https://github.com/Arxchibobo/bobo-cli.git
207
+ cd bobo-cli
208
+ npm install
209
+ npm run dev # Run with tsx (hot reload)
210
+ npm run build # Compile TypeScript
211
+ npm test # Run tests
212
+ ```
213
+
214
+ ## License
215
+
216
+ MIT — see [LICENSE](LICENSE) for details.
@@ -0,0 +1,9 @@
1
+ import type { ChatCompletionMessageParam } from 'openai/resources/index.js';
2
+ export interface AgentOptions {
3
+ onText?: (text: string) => void;
4
+ signal?: AbortSignal;
5
+ }
6
+ export declare function runAgent(userMessage: string, history: ChatCompletionMessageParam[], options?: AgentOptions): Promise<{
7
+ response: string;
8
+ history: ChatCompletionMessageParam[];
9
+ }>;
package/dist/agent.js ADDED
@@ -0,0 +1,144 @@
1
+ import OpenAI from 'openai';
2
+ import { loadConfig } from './config.js';
3
+ import { loadKnowledge } from './knowledge.js';
4
+ import { loadMemory } from './memory.js';
5
+ import { loadSkillPrompts } from './skills.js';
6
+ import { loadProjectKnowledge } from './project.js';
7
+ import { toolDefinitions, executeTool } from './tools/index.js';
8
+ import { printStreaming, printToolCall, printToolResult, printError, printLine } from './ui.js';
9
+ export async function runAgent(userMessage, history, options = {}) {
10
+ const config = loadConfig();
11
+ if (!config.apiKey) {
12
+ throw new Error('API key not configured. Run: bobo config set apiKey <your-key>');
13
+ }
14
+ const client = new OpenAI({
15
+ apiKey: config.apiKey,
16
+ baseURL: config.baseUrl,
17
+ });
18
+ // Build system prompt with all context layers (order matters)
19
+ const extraParts = [];
20
+ // Layer 1: Active skills (behavior rules — highest priority after knowledge)
21
+ const skillPrompts = loadSkillPrompts();
22
+ if (skillPrompts)
23
+ extraParts.push(skillPrompts);
24
+ // Layer 2: Persistent memory (data — lower priority than rules)
25
+ const memory = loadMemory();
26
+ if (memory)
27
+ extraParts.push(`# 你的记忆\n\n${memory}`);
28
+ // Layer 3: Project context (local project config + auto-detected files)
29
+ const projectKnowledge = loadProjectKnowledge();
30
+ if (projectKnowledge)
31
+ extraParts.push(`# 项目上下文\n\n${projectKnowledge}`);
32
+ // Layer 4: Environment + context decay warning
33
+ const turnCount = history.filter(m => m.role === 'user').length;
34
+ let envInfo = `# Environment\n\nWorking directory: ${process.cwd()}\nConversation turns: ${turnCount}`;
35
+ if (turnCount >= 10) {
36
+ envInfo += '\n\n⚠️ Context Decay Warning: 对话已超过 10 轮,编辑文件前必须重新读取确认内容。不要信任你对文件的记忆。';
37
+ }
38
+ extraParts.push(envInfo);
39
+ const systemPrompt = loadKnowledge({
40
+ userMessage,
41
+ loadAll: history.length === 0,
42
+ extraContext: extraParts.join('\n\n---\n\n'),
43
+ });
44
+ const messages = [
45
+ { role: 'system', content: systemPrompt },
46
+ ...history,
47
+ { role: 'user', content: userMessage },
48
+ ];
49
+ let fullResponse = '';
50
+ const maxIterations = 20;
51
+ for (let i = 0; i < maxIterations; i++) {
52
+ if (options.signal?.aborted) {
53
+ throw new Error('Aborted');
54
+ }
55
+ try {
56
+ const stream = await client.chat.completions.create({
57
+ model: config.model,
58
+ messages,
59
+ tools: toolDefinitions,
60
+ max_tokens: config.maxTokens,
61
+ stream: true,
62
+ });
63
+ let assistantContent = '';
64
+ const toolCalls = new Map();
65
+ for await (const chunk of stream) {
66
+ if (options.signal?.aborted) {
67
+ throw new Error('Aborted');
68
+ }
69
+ const delta = chunk.choices[0]?.delta;
70
+ if (!delta)
71
+ continue;
72
+ if (delta.content) {
73
+ assistantContent += delta.content;
74
+ fullResponse += delta.content;
75
+ printStreaming(delta.content);
76
+ }
77
+ if (delta.tool_calls) {
78
+ for (const tc of delta.tool_calls) {
79
+ const idx = tc.index;
80
+ if (!toolCalls.has(idx)) {
81
+ toolCalls.set(idx, { id: tc.id || '', name: tc.function?.name || '', arguments: '' });
82
+ }
83
+ const existing = toolCalls.get(idx);
84
+ if (tc.id)
85
+ existing.id = tc.id;
86
+ if (tc.function?.name)
87
+ existing.name = tc.function.name;
88
+ if (tc.function?.arguments)
89
+ existing.arguments += tc.function.arguments;
90
+ }
91
+ }
92
+ }
93
+ const assistantMsg = {
94
+ role: 'assistant',
95
+ content: assistantContent || null,
96
+ };
97
+ if (toolCalls.size > 0) {
98
+ assistantMsg.tool_calls = Array.from(toolCalls.values()).map(tc => ({
99
+ id: tc.id,
100
+ type: 'function',
101
+ function: { name: tc.name, arguments: tc.arguments },
102
+ }));
103
+ }
104
+ messages.push(assistantMsg);
105
+ if (toolCalls.size === 0) {
106
+ if (assistantContent)
107
+ printLine();
108
+ break;
109
+ }
110
+ if (assistantContent)
111
+ printLine();
112
+ for (const tc of toolCalls.values()) {
113
+ let args = {};
114
+ try {
115
+ args = JSON.parse(tc.arguments);
116
+ }
117
+ catch {
118
+ args = {};
119
+ }
120
+ printToolCall(tc.name, tc.arguments);
121
+ const result = executeTool(tc.name, args);
122
+ printToolResult(result);
123
+ messages.push({
124
+ role: 'tool',
125
+ tool_call_id: tc.id,
126
+ content: result,
127
+ });
128
+ }
129
+ }
130
+ catch (e) {
131
+ if (e.message === 'Aborted')
132
+ throw e;
133
+ printError(`API Error: ${e.message}`);
134
+ throw e;
135
+ }
136
+ }
137
+ const newHistory = [
138
+ ...history,
139
+ { role: 'user', content: userMessage },
140
+ ...messages.slice(history.length + 2),
141
+ ];
142
+ return { response: fullResponse, history: newHistory };
143
+ }
144
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface Config {
2
+ apiKey: string;
3
+ model: string;
4
+ baseUrl: string;
5
+ knowledgeDir: string;
6
+ maxTokens: number;
7
+ }
8
+ export declare function ensureConfigDir(): void;
9
+ export declare function loadConfig(): Config;
10
+ export declare function saveConfig(config: Config): void;
11
+ export declare function getConfigValue(key: string): string | number | undefined;
12
+ export declare function setConfigValue(key: string, value: string): void;
13
+ export declare function listConfig(): Record<string, string | number>;
14
+ export declare function getConfigDir(): string;
15
+ export declare function resolveKnowledgeDir(config: Config): string;
package/dist/config.js ADDED
@@ -0,0 +1,76 @@
1
+ import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ const CONFIG_DIR = join(homedir(), '.bobo');
5
+ const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
6
+ const DEFAULT_CONFIG = {
7
+ apiKey: '',
8
+ model: 'claude-sonnet-4-20250514',
9
+ baseUrl: 'https://api.anthropic.com/v1',
10
+ knowledgeDir: join(CONFIG_DIR, 'knowledge'),
11
+ maxTokens: 4096,
12
+ };
13
+ export function ensureConfigDir() {
14
+ if (!existsSync(CONFIG_DIR)) {
15
+ mkdirSync(CONFIG_DIR, { recursive: true });
16
+ }
17
+ }
18
+ export function loadConfig() {
19
+ ensureConfigDir();
20
+ if (!existsSync(CONFIG_PATH)) {
21
+ return { ...DEFAULT_CONFIG };
22
+ }
23
+ try {
24
+ const raw = readFileSync(CONFIG_PATH, 'utf-8');
25
+ return { ...DEFAULT_CONFIG, ...JSON.parse(raw) };
26
+ }
27
+ catch {
28
+ return { ...DEFAULT_CONFIG };
29
+ }
30
+ }
31
+ export function saveConfig(config) {
32
+ ensureConfigDir();
33
+ writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + '\n');
34
+ }
35
+ export function getConfigValue(key) {
36
+ const config = loadConfig();
37
+ return config[key];
38
+ }
39
+ export function setConfigValue(key, value) {
40
+ const config = loadConfig();
41
+ if (!(key in DEFAULT_CONFIG)) {
42
+ throw new Error(`Unknown config key: ${key}. Valid keys: ${Object.keys(DEFAULT_CONFIG).join(', ')}`);
43
+ }
44
+ const rec = config;
45
+ if (key === 'maxTokens') {
46
+ rec[key] = parseInt(value, 10);
47
+ }
48
+ else {
49
+ rec[key] = value;
50
+ }
51
+ saveConfig(config);
52
+ }
53
+ export function listConfig() {
54
+ const config = loadConfig();
55
+ const result = {};
56
+ for (const [k, v] of Object.entries(config)) {
57
+ if (k === 'apiKey' && typeof v === 'string' && v.length > 8) {
58
+ result[k] = v.slice(0, 4) + '...' + v.slice(-4);
59
+ }
60
+ else {
61
+ result[k] = v;
62
+ }
63
+ }
64
+ return result;
65
+ }
66
+ export function getConfigDir() {
67
+ return CONFIG_DIR;
68
+ }
69
+ export function resolveKnowledgeDir(config) {
70
+ const dir = config.knowledgeDir;
71
+ if (dir.startsWith('~')) {
72
+ return join(homedir(), dir.slice(1));
73
+ }
74
+ return resolve(dir);
75
+ }
76
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};