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.
- package/LICENSE +21 -0
- package/README.md +216 -0
- package/dist/agent.d.ts +9 -0
- package/dist/agent.js +144 -0
- package/dist/agent.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.js +76 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +366 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge-commands.d.ts +2 -0
- package/dist/knowledge-commands.js +40 -0
- package/dist/knowledge-commands.js.map +1 -0
- package/dist/knowledge.d.ts +17 -0
- package/dist/knowledge.js +112 -0
- package/dist/knowledge.js.map +1 -0
- package/dist/memory.d.ts +17 -0
- package/dist/memory.js +215 -0
- package/dist/memory.js.map +1 -0
- package/dist/planner.d.ts +22 -0
- package/dist/planner.js +130 -0
- package/dist/planner.js.map +1 -0
- package/dist/project.d.ts +25 -0
- package/dist/project.js +117 -0
- package/dist/project.js.map +1 -0
- package/dist/rules-commands.d.ts +2 -0
- package/dist/rules-commands.js +51 -0
- package/dist/rules-commands.js.map +1 -0
- package/dist/skills.d.ts +28 -0
- package/dist/skills.js +349 -0
- package/dist/skills.js.map +1 -0
- package/dist/structured/loader.d.ts +19 -0
- package/dist/structured/loader.js +147 -0
- package/dist/structured/loader.js.map +1 -0
- package/dist/structured/paths.d.ts +2 -0
- package/dist/structured/paths.js +14 -0
- package/dist/structured/paths.js.map +1 -0
- package/dist/structured/project-scaffold.d.ts +7 -0
- package/dist/structured/project-scaffold.js +60 -0
- package/dist/structured/project-scaffold.js.map +1 -0
- package/dist/structured/render-markdown.d.ts +37 -0
- package/dist/structured/render-markdown.js +47 -0
- package/dist/structured/render-markdown.js.map +1 -0
- package/dist/structured/render-table.d.ts +1 -0
- package/dist/structured/render-table.js +15 -0
- package/dist/structured/render-table.js.map +1 -0
- package/dist/structured/search.d.ts +10 -0
- package/dist/structured/search.js +104 -0
- package/dist/structured/search.js.map +1 -0
- package/dist/structured/skill-runner.d.ts +15 -0
- package/dist/structured/skill-runner.js +60 -0
- package/dist/structured/skill-runner.js.map +1 -0
- package/dist/structured/types.d.ts +212 -0
- package/dist/structured/types.js +97 -0
- package/dist/structured/types.js.map +1 -0
- package/dist/structured-skills-commands.d.ts +3 -0
- package/dist/structured-skills-commands.js +126 -0
- package/dist/structured-skills-commands.js.map +1 -0
- package/dist/structured-template-commands.d.ts +2 -0
- package/dist/structured-template-commands.js +34 -0
- package/dist/structured-template-commands.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +450 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/ui.d.ts +19 -0
- package/dist/ui.js +72 -0
- package/dist/ui.js.map +1 -0
- package/dist/web.d.ts +4 -0
- package/dist/web.js +124 -0
- package/dist/web.js.map +1 -0
- package/knowledge/advanced-patterns.md +70 -0
- package/knowledge/agent-directives.md +74 -0
- package/knowledge/dream.md +36 -0
- package/knowledge/engineering.md +46 -0
- package/knowledge/error-catalog.md +33 -0
- package/knowledge/index.json +170 -0
- package/knowledge/memory/cache-optimization-and-skill-integration.md +102 -0
- package/knowledge/memory/engineering-patterns.md +134 -0
- package/knowledge/memory/feedback_root_structure.md +16 -0
- package/knowledge/memory/project-contexts.md +69 -0
- package/knowledge/memory/tools-and-services.md +85 -0
- package/knowledge/rules/agents.md +62 -0
- package/knowledge/rules/blocking-rules.md +323 -0
- package/knowledge/rules/cache-management.md +379 -0
- package/knowledge/rules/capability-evolution.md +132 -0
- package/knowledge/rules/coding.md +126 -0
- package/knowledge/rules/engineering-workflows.md +225 -0
- package/knowledge/rules/evomap-content-guidelines.md +354 -0
- package/knowledge/rules/evomap-guide.md +224 -0
- package/knowledge/rules/git.md +31 -0
- package/knowledge/rules/hooks.md +106 -0
- package/knowledge/rules/performance.md +101 -0
- package/knowledge/rules/remotion-auto-production.md +1120 -0
- package/knowledge/rules/security.md +46 -0
- package/knowledge/rules/testing.md +32 -0
- package/knowledge/rules/work-mode.md +208 -0
- package/knowledge/rules.md +62 -0
- package/knowledge/skills/Skill_Seekers.md +1722 -0
- package/knowledge/skills/ab-test-setup.md +557 -0
- package/knowledge/skills/agent-sdk-dev.md +238 -0
- package/knowledge/skills/agent-tools.md +136 -0
- package/knowledge/skills/analytics-tracking.md +597 -0
- package/knowledge/skills/artifacts-builder.md +89 -0
- package/knowledge/skills/asana.md +13 -0
- package/knowledge/skills/backend-expert.md +97 -0
- package/knowledge/skills/brand-voice.md +481 -0
- package/knowledge/skills/browser-use.md +419 -0
- package/knowledge/skills/cache-optimization-skill.md +179 -0
- package/knowledge/skills/canvas-design.md +147 -0
- package/knowledge/skills/citation-validator.md +203 -0
- package/knowledge/skills/clangd-lsp.md +52 -0
- package/knowledge/skills/code-review-expert.md +85 -0
- package/knowledge/skills/code-review.md +280 -0
- package/knowledge/skills/code-simplifier.md +13 -0
- package/knowledge/skills/commit-commands.md +258 -0
- package/knowledge/skills/competitor-alternatives.md +795 -0
- package/knowledge/skills/content-atomizer.md +910 -0
- package/knowledge/skills/content-research-writer.md +605 -0
- package/knowledge/skills/context-optimization-suite.md +162 -0
- package/knowledge/skills/context7.md +13 -0
- package/knowledge/skills/copy-editing.md +494 -0
- package/knowledge/skills/copywriting.md +510 -0
- package/knowledge/skills/csharp-lsp.md +40 -0
- package/knowledge/skills/decision-making-framework.md +154 -0
- package/knowledge/skills/developer-growth-analysis.md +335 -0
- package/knowledge/skills/direct-response-copy.md +2336 -0
- package/knowledge/skills/docker-expert.md +229 -0
- package/knowledge/skills/document-skills.md +13 -0
- package/knowledge/skills/documentation-expert.md +126 -0
- package/knowledge/skills/email-sequence.md +1061 -0
- package/knowledge/skills/email-sequences.md +910 -0
- package/knowledge/skills/example-plugin.md +72 -0
- package/knowledge/skills/explanatory-output-style.md +82 -0
- package/knowledge/skills/feature-dev.md +458 -0
- package/knowledge/skills/file-organizer.md +466 -0
- package/knowledge/skills/firebase.disabled.md +13 -0
- package/knowledge/skills/form-cro.md +488 -0
- package/knowledge/skills/free-tool-strategy.md +636 -0
- package/knowledge/skills/frontend-design-offical.md +55 -0
- package/knowledge/skills/frontend-design.md +41 -0
- package/knowledge/skills/frontend-expert.md +93 -0
- package/knowledge/skills/github.md +13 -0
- package/knowledge/skills/gitlab.md +13 -0
- package/knowledge/skills/gopls-lsp.md +32 -0
- package/knowledge/skills/got-controller.md +218 -0
- package/knowledge/skills/greptile.md +72 -0
- package/knowledge/skills/hookify.md +376 -0
- package/knowledge/skills/image-editor.md +189 -0
- package/knowledge/skills/image-enhancer.md +109 -0
- package/knowledge/skills/jdtls-lsp.md +49 -0
- package/knowledge/skills/json-canvas.md +654 -0
- package/knowledge/skills/keyword-research.md +559 -0
- package/knowledge/skills/kotlin-lsp.md +28 -0
- package/knowledge/skills/laravel-boost.md +13 -0
- package/knowledge/skills/launch-strategy.md +394 -0
- package/knowledge/skills/lead-magnet.md +393 -0
- package/knowledge/skills/learning-output-style.md +106 -0
- package/knowledge/skills/linear.md +13 -0
- package/knowledge/skills/lua-lsp.md +47 -0
- package/knowledge/skills/marketing-ideas.md +720 -0
- package/knowledge/skills/marketing-psychology.md +534 -0
- package/knowledge/skills/mcp-builder.md +369 -0
- package/knowledge/skills/meeting-insights-analyzer.md +347 -0
- package/knowledge/skills/memory-evolution-system.md +172 -0
- package/knowledge/skills/multi-lens-thinking.md +407 -0
- package/knowledge/skills/nano-banana-pro.md +116 -0
- package/knowledge/skills/newsletter.md +736 -0
- package/knowledge/skills/notebooklm.md +296 -0
- package/knowledge/skills/obsidian-bases.md +634 -0
- package/knowledge/skills/obsidian-markdown.md +651 -0
- package/knowledge/skills/onboarding-cro.md +494 -0
- package/knowledge/skills/orchestrator.md +681 -0
- package/knowledge/skills/page-cro.md +379 -0
- package/knowledge/skills/paid-ads.md +624 -0
- package/knowledge/skills/paywall-upgrade-cro.md +651 -0
- package/knowledge/skills/php-lsp.md +36 -0
- package/knowledge/skills/planning-with-files.md +193 -0
- package/knowledge/skills/playwright.md +13 -0
- package/knowledge/skills/plugin-dev.md +434 -0
- package/knowledge/skills/popup-cro.md +520 -0
- package/knowledge/skills/positioning-angles.md +330 -0
- package/knowledge/skills/pr-review-toolkit.md +359 -0
- package/knowledge/skills/pricing-strategy.md +777 -0
- package/knowledge/skills/programmatic-seo.md +714 -0
- package/knowledge/skills/pyright-lsp.md +43 -0
- package/knowledge/skills/quality-assurance-framework.md +168 -0
- package/knowledge/skills/question-refiner.md +160 -0
- package/knowledge/skills/ralph-loop.md +205 -0
- package/knowledge/skills/refactoring-expert.md +103 -0
- package/knowledge/skills/referral-program.md +668 -0
- package/knowledge/skills/research-executor.md +164 -0
- package/knowledge/skills/review-with-security.md +12 -0
- package/knowledge/skills/rust-analyzer-lsp.md +50 -0
- package/knowledge/skills/schema-markup.md +647 -0
- package/knowledge/skills/security-audit-expert.md +124 -0
- package/knowledge/skills/security-expert.md +140 -0
- package/knowledge/skills/security-guidance.md +13 -0
- package/knowledge/skills/seedance-prompt.md +139 -0
- package/knowledge/skills/self-evolution.md +1160 -0
- package/knowledge/skills/seo-audit.md +432 -0
- package/knowledge/skills/seo-content.md +787 -0
- package/knowledge/skills/serena.md +13 -0
- package/knowledge/skills/signup-flow-cro.md +409 -0
- package/knowledge/skills/skill-creator.md +220 -0
- package/knowledge/skills/skill-manager.md +226 -0
- package/knowledge/skills/skill-share.md +98 -0
- package/knowledge/skills/slack.md +13 -0
- package/knowledge/skills/social-content.md +878 -0
- package/knowledge/skills/spec-flow-skill.md +124 -0
- package/knowledge/skills/stripe.md +13 -0
- package/knowledge/skills/supabase.md +13 -0
- package/knowledge/skills/swift-lsp.md +40 -0
- package/knowledge/skills/synthesizer.md +236 -0
- package/knowledge/skills/template-skill.md +16 -0
- package/knowledge/skills/testing-expert.md +99 -0
- package/knowledge/skills/theme-factory.md +72 -0
- package/knowledge/skills/tiktok-research.md +208 -0
- package/knowledge/skills/typescript-lsp.md +36 -0
- package/knowledge/skills/ui-ux-pro-max.md +247 -0
- package/knowledge/skills/verify.md +15 -0
- package/knowledge/skills/visual-prompt-engineer.md +102 -0
- package/knowledge/skills/webapp-testing.md +111 -0
- package/knowledge/skills/wide-research.md +191 -0
- package/knowledge/system.md +93 -0
- package/knowledge/task-router.md +37 -0
- package/knowledge/verification.md +38 -0
- package/knowledge/workflows/3d-viz.md +47 -0
- package/knowledge/workflows/data-pipeline.md +47 -0
- package/knowledge/workflows/db-migration.md +51 -0
- package/knowledge/workflows/feature-dev.md +41 -0
- package/knowledge/workflows/tdd-flow.md +52 -0
- package/knowledge/workflows/ui-verify.md +51 -0
- 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
|
+
[](https://www.npmjs.com/package/bobo-cli)
|
|
8
|
+
[](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.
|
package/dist/agent.d.ts
ADDED
|
@@ -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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED