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/dist/memory.js ADDED
@@ -0,0 +1,215 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { getConfigDir } from './config.js';
4
+ const MEMORY_FILE = 'memory.md';
5
+ const MEMORY_DIR = 'memory';
6
+ const LEARNINGS_DIR = '.learnings';
7
+ const MAX_MEMORY_SIZE = 5 * 1024; // 5KB
8
+ /**
9
+ * Get paths for memory storage
10
+ */
11
+ function getMemoryPaths() {
12
+ const configDir = getConfigDir();
13
+ return {
14
+ memoryFile: join(configDir, MEMORY_FILE),
15
+ memoryDir: join(configDir, MEMORY_DIR),
16
+ learningsDir: join(configDir, LEARNINGS_DIR),
17
+ correctionsFile: join(configDir, LEARNINGS_DIR, 'corrections.md'),
18
+ changelogFile: join(configDir, LEARNINGS_DIR, 'changelog.md'),
19
+ };
20
+ }
21
+ /**
22
+ * Ensure memory directories exist
23
+ */
24
+ function ensureMemoryDirs() {
25
+ const paths = getMemoryPaths();
26
+ for (const dir of [paths.memoryDir, paths.learningsDir]) {
27
+ if (!existsSync(dir)) {
28
+ mkdirSync(dir, { recursive: true });
29
+ }
30
+ }
31
+ }
32
+ /**
33
+ * Load memory.md content for system prompt injection
34
+ */
35
+ export function loadMemory() {
36
+ const { memoryFile } = getMemoryPaths();
37
+ if (!existsSync(memoryFile))
38
+ return null;
39
+ const content = readFileSync(memoryFile, 'utf-8').trim();
40
+ return content || null;
41
+ }
42
+ /**
43
+ * Save a memory entry
44
+ */
45
+ export function saveMemory(entry) {
46
+ ensureMemoryDirs();
47
+ const { memoryFile } = getMemoryPaths();
48
+ let content = '';
49
+ if (existsSync(memoryFile)) {
50
+ content = readFileSync(memoryFile, 'utf-8');
51
+ }
52
+ else {
53
+ content = getMemoryTemplate();
54
+ }
55
+ const sectionMap = {
56
+ user: '## 🔒 用户偏好',
57
+ feedback: '## 🔄 纠正记录',
58
+ project: '## 📋 活跃任务',
59
+ reference: '## 📝 业务经验',
60
+ experience: '## 📝 业务经验',
61
+ };
62
+ const section = sectionMap[entry.category] || '## 📝 业务经验';
63
+ const line = `- [${entry.timestamp}] ${entry.content}`;
64
+ // Find the section and append
65
+ const sectionIdx = content.indexOf(section);
66
+ if (sectionIdx !== -1) {
67
+ // Find next section or end
68
+ const nextSectionIdx = content.indexOf('\n## ', sectionIdx + section.length);
69
+ const insertAt = nextSectionIdx !== -1 ? nextSectionIdx : content.length;
70
+ content = content.slice(0, insertAt).trimEnd() + '\n' + line + '\n' + content.slice(insertAt);
71
+ }
72
+ else {
73
+ // Append section at end
74
+ content = content.trimEnd() + '\n\n' + section + '\n' + line + '\n';
75
+ }
76
+ // Check size and slim if needed
77
+ if (Buffer.byteLength(content, 'utf-8') > MAX_MEMORY_SIZE) {
78
+ content = slimMemory(content);
79
+ }
80
+ writeFileSync(memoryFile, content);
81
+ // Also log to daily file
82
+ logDaily(entry);
83
+ return `Memory saved: [${entry.category}] ${entry.content.slice(0, 50)}...`;
84
+ }
85
+ /**
86
+ * Search memory for relevant entries (multi-keyword scoring)
87
+ */
88
+ export function searchMemory(query) {
89
+ const { memoryFile, memoryDir } = getMemoryPaths();
90
+ const queryLower = query.toLowerCase();
91
+ const keywords = queryLower.split(/\s+/).filter(k => k.length > 1);
92
+ const results = [];
93
+ function scoreLines(content, source) {
94
+ const lines = content.split('\n');
95
+ for (let i = 0; i < lines.length; i++) {
96
+ const lineLower = lines[i].toLowerCase();
97
+ if (!lineLower.trim())
98
+ continue;
99
+ // Score: number of matching keywords + bonus for exact phrase match
100
+ let score = 0;
101
+ for (const kw of keywords) {
102
+ if (lineLower.includes(kw))
103
+ score++;
104
+ }
105
+ if (score === 0)
106
+ continue;
107
+ // Bonus for exact phrase match
108
+ if (lineLower.includes(queryLower))
109
+ score += keywords.length;
110
+ // Include context (1 line before, 1 after)
111
+ const start = Math.max(0, i - 1);
112
+ const end = Math.min(lines.length, i + 2);
113
+ const text = lines.slice(start, end).join('\n');
114
+ results.push({ source, line: i + 1, text, score });
115
+ }
116
+ }
117
+ // Search main memory
118
+ if (existsSync(memoryFile)) {
119
+ scoreLines(readFileSync(memoryFile, 'utf-8'), 'memory.md');
120
+ }
121
+ // Search daily logs (last 7 days)
122
+ if (existsSync(memoryDir)) {
123
+ const files = readdirSync(memoryDir)
124
+ .filter(f => f.endsWith('.md'))
125
+ .sort()
126
+ .slice(-7);
127
+ for (const file of files) {
128
+ scoreLines(readFileSync(join(memoryDir, file), 'utf-8'), file);
129
+ }
130
+ }
131
+ if (results.length === 0) {
132
+ return `No memory entries found for: "${query}"`;
133
+ }
134
+ // Sort by score (highest first), deduplicate overlapping results
135
+ results.sort((a, b) => b.score - a.score);
136
+ const seen = new Set();
137
+ const deduped = [];
138
+ for (const r of results) {
139
+ const key = `${r.source}:${r.line}`;
140
+ if (!seen.has(key)) {
141
+ seen.add(key);
142
+ deduped.push(r);
143
+ }
144
+ }
145
+ return deduped
146
+ .slice(0, 10)
147
+ .map(r => `[${r.source}:${r.line}] (score:${r.score}) ${r.text}`)
148
+ .join('\n\n');
149
+ }
150
+ /**
151
+ * Log to daily memory file
152
+ */
153
+ function logDaily(entry) {
154
+ const { memoryDir } = getMemoryPaths();
155
+ const date = entry.timestamp.split(' ')[0] || new Date().toISOString().split('T')[0];
156
+ const dailyFile = join(memoryDir, `${date}.md`);
157
+ let content = '';
158
+ if (existsSync(dailyFile)) {
159
+ content = readFileSync(dailyFile, 'utf-8');
160
+ }
161
+ else {
162
+ content = `# ${date} Daily Log\n`;
163
+ }
164
+ content += `\n- [${entry.timestamp}] [${entry.category}] ${entry.content}`;
165
+ writeFileSync(dailyFile, content);
166
+ }
167
+ /**
168
+ * Slim memory when it exceeds size limit
169
+ */
170
+ function slimMemory(content) {
171
+ const lines = content.split('\n');
172
+ const result = [];
173
+ let inPermanentSection = false;
174
+ for (const line of lines) {
175
+ // Permanent sections - keep everything
176
+ if (line.includes('🔒') || line.includes('💼')) {
177
+ inPermanentSection = true;
178
+ result.push(line);
179
+ continue;
180
+ }
181
+ // New section starts
182
+ if (line.startsWith('## ')) {
183
+ inPermanentSection = false;
184
+ result.push(line);
185
+ continue;
186
+ }
187
+ if (inPermanentSection) {
188
+ result.push(line);
189
+ continue;
190
+ }
191
+ // For non-permanent sections, keep recent entries (last 10 per section)
192
+ result.push(line);
193
+ }
194
+ return result.join('\n');
195
+ }
196
+ /**
197
+ * Get the default memory template
198
+ */
199
+ function getMemoryTemplate() {
200
+ return `# Memory - 大波比
201
+
202
+ ## 🔒 用户偏好(永久保留)
203
+
204
+ ## 💼 角色定位(永久保留)
205
+
206
+ ## 📝 业务经验(长期保留)
207
+
208
+ ## 📋 活跃任务(完成后删)
209
+
210
+ ## 🔄 纠正记录(≤10条)
211
+
212
+ ## 💬 对话摘要(7天后精简)
213
+ `;
214
+ }
215
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ChatCompletionTool } from 'openai/resources/index.js';
2
+ export interface PlanStep {
3
+ id: number;
4
+ description: string;
5
+ status: 'pending' | 'in-progress' | 'done' | 'skipped';
6
+ }
7
+ export interface Plan {
8
+ title: string;
9
+ steps: PlanStep[];
10
+ createdAt: string;
11
+ }
12
+ export declare const plannerToolDefinitions: ChatCompletionTool[];
13
+ export declare function executePlannerTool(name: string, args: Record<string, unknown>): string;
14
+ export declare function isPlannerTool(name: string): boolean;
15
+ /**
16
+ * Get current plan for display in /plan command
17
+ */
18
+ export declare function getCurrentPlan(): string;
19
+ /**
20
+ * Reset the plan (for /clear)
21
+ */
22
+ export declare function resetPlan(): void;
@@ -0,0 +1,130 @@
1
+ // Session-scoped plan (not persisted, lives within one REPL session)
2
+ let currentPlan = null;
3
+ // ─── Tool Definitions ────────────────────────────────────────
4
+ export const plannerToolDefinitions = [
5
+ {
6
+ type: 'function',
7
+ function: {
8
+ name: 'create_plan',
9
+ description: 'Create a task plan with steps. Use for tasks with 3+ steps. Shows the plan to the user before execution.',
10
+ parameters: {
11
+ type: 'object',
12
+ properties: {
13
+ title: { type: 'string', description: 'Plan title' },
14
+ steps: {
15
+ type: 'array',
16
+ items: { type: 'string' },
17
+ description: 'List of step descriptions',
18
+ },
19
+ },
20
+ required: ['title', 'steps'],
21
+ },
22
+ },
23
+ },
24
+ {
25
+ type: 'function',
26
+ function: {
27
+ name: 'update_plan',
28
+ description: 'Update the status of a plan step.',
29
+ parameters: {
30
+ type: 'object',
31
+ properties: {
32
+ stepId: { type: 'number', description: 'Step ID (1-indexed)' },
33
+ status: {
34
+ type: 'string',
35
+ enum: ['pending', 'in-progress', 'done', 'skipped'],
36
+ description: 'New status',
37
+ },
38
+ },
39
+ required: ['stepId', 'status'],
40
+ },
41
+ },
42
+ },
43
+ {
44
+ type: 'function',
45
+ function: {
46
+ name: 'show_plan',
47
+ description: 'Display the current task plan with progress.',
48
+ parameters: {
49
+ type: 'object',
50
+ properties: {},
51
+ required: [],
52
+ },
53
+ },
54
+ },
55
+ ];
56
+ // ─── Tool Execution ──────────────────────────────────────────
57
+ export function executePlannerTool(name, args) {
58
+ switch (name) {
59
+ case 'create_plan': return createPlan(args);
60
+ case 'update_plan': return updatePlan(args);
61
+ case 'show_plan': return showPlan();
62
+ default: return `Unknown planner tool: ${name}`;
63
+ }
64
+ }
65
+ export function isPlannerTool(name) {
66
+ return ['create_plan', 'update_plan', 'show_plan'].includes(name);
67
+ }
68
+ function createPlan(args) {
69
+ const title = args.title;
70
+ const stepDescs = args.steps;
71
+ currentPlan = {
72
+ title,
73
+ steps: stepDescs.map((desc, i) => ({
74
+ id: i + 1,
75
+ description: desc,
76
+ status: 'pending',
77
+ })),
78
+ createdAt: new Date().toISOString(),
79
+ };
80
+ return formatPlan(currentPlan);
81
+ }
82
+ function updatePlan(args) {
83
+ if (!currentPlan)
84
+ return 'No active plan. Create one first with create_plan.';
85
+ const stepId = args.stepId;
86
+ const status = args.status;
87
+ const step = currentPlan.steps.find(s => s.id === stepId);
88
+ if (!step)
89
+ return `Step ${stepId} not found. Plan has ${currentPlan.steps.length} steps.`;
90
+ step.status = status;
91
+ return formatPlan(currentPlan);
92
+ }
93
+ function showPlan() {
94
+ if (!currentPlan)
95
+ return 'No active plan.';
96
+ return formatPlan(currentPlan);
97
+ }
98
+ function formatPlan(plan) {
99
+ const statusIcons = {
100
+ 'pending': '⬜',
101
+ 'in-progress': '🔵',
102
+ 'done': '✅',
103
+ 'skipped': '⏭️',
104
+ };
105
+ const total = plan.steps.length;
106
+ const done = plan.steps.filter(s => s.status === 'done').length;
107
+ const progress = Math.round((done / total) * 100);
108
+ let output = `📋 ${plan.title} [${done}/${total} = ${progress}%]\n`;
109
+ output += '─'.repeat(40) + '\n';
110
+ for (const step of plan.steps) {
111
+ const icon = statusIcons[step.status] || '⬜';
112
+ output += `${icon} ${step.id}. ${step.description}\n`;
113
+ }
114
+ return output;
115
+ }
116
+ /**
117
+ * Get current plan for display in /plan command
118
+ */
119
+ export function getCurrentPlan() {
120
+ if (!currentPlan)
121
+ return 'No active plan.';
122
+ return formatPlan(currentPlan);
123
+ }
124
+ /**
125
+ * Reset the plan (for /clear)
126
+ */
127
+ export function resetPlan() {
128
+ currentPlan = null;
129
+ }
130
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAcA,qEAAqE;AACrE,IAAI,WAAW,GAAgB,IAAI,CAAC;AAEpC,gEAAgE;AAEhE,MAAM,CAAC,MAAM,sBAAsB,GAAyB;IAC1D;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,0GAA0G;YACvH,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;oBACpD,KAAK,EAAE;wBACL,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EAAE,2BAA2B;qBACzC;iBACF;gBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;aAC7B;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,mCAAmC;YAChD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;oBAC9D,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC;wBACnD,WAAW,EAAE,YAAY;qBAC1B;iBACF;gBACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;aAC/B;SACF;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,8CAA8C;YAC3D,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,EAAE;aACb;SACF;KACF;CACF,CAAC;AAEF,gEAAgE;AAEhE,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAA6B;IAC5E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa,CAAC,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5C,KAAK,aAAa,CAAC,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5C,KAAK,WAAW,CAAC,CAAC,OAAO,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,CAAC,OAAO,yBAAyB,IAAI,EAAE,CAAC;IAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,UAAU,CAAC,IAA6B;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAiB,CAAC;IAEzC,WAAW,GAAG;QACZ,KAAK;QACL,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,EAAE,EAAE,CAAC,GAAG,CAAC;YACT,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,UAAU,CAAC,IAA6B;IAC/C,IAAI,CAAC,WAAW;QAAE,OAAO,oDAAoD,CAAC;IAE9E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAgB,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4B,CAAC;IAEjD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,MAAM,wBAAwB,WAAW,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;IAE1F,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACrB,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,QAAQ;IACf,IAAI,CAAC,WAAW;QAAE,OAAO,iBAAiB,CAAC;IAC3C,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,MAAM,WAAW,GAA2B;QAC1C,SAAS,EAAE,GAAG;QACd,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,IAAI;KAChB,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAElD,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM,QAAQ,MAAM,CAAC;IACpE,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,IAAI,CAAC;IACxD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,WAAW;QAAE,OAAO,iBAAiB,CAAC;IAC3C,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,25 @@
1
+ export interface ProjectConfig {
2
+ name?: string;
3
+ description?: string;
4
+ knowledge?: string[];
5
+ rules?: string[];
6
+ }
7
+ /**
8
+ * Find project root by walking up from CWD looking for .bobo/
9
+ */
10
+ export declare function findProjectRoot(): string | null;
11
+ /**
12
+ * Load project config if in a project
13
+ */
14
+ export declare function loadProjectConfig(): {
15
+ root: string;
16
+ config: ProjectConfig;
17
+ } | null;
18
+ /**
19
+ * Load project-level knowledge for system prompt injection
20
+ */
21
+ export declare function loadProjectKnowledge(): string | null;
22
+ /**
23
+ * Initialize a project .bobo/ directory
24
+ */
25
+ export declare function initProject(): string;
@@ -0,0 +1,117 @@
1
+ import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ const PROJECT_DIR = '.bobo';
4
+ const PROJECT_CONFIG = 'project.json';
5
+ /**
6
+ * Find project root by walking up from CWD looking for .bobo/
7
+ */
8
+ export function findProjectRoot() {
9
+ let dir = process.cwd();
10
+ const root = resolve('/');
11
+ while (dir !== root) {
12
+ if (existsSync(join(dir, PROJECT_DIR))) {
13
+ return dir;
14
+ }
15
+ dir = resolve(dir, '..');
16
+ }
17
+ return null;
18
+ }
19
+ /**
20
+ * Load project config if in a project
21
+ */
22
+ export function loadProjectConfig() {
23
+ const root = findProjectRoot();
24
+ if (!root)
25
+ return null;
26
+ const configPath = join(root, PROJECT_DIR, PROJECT_CONFIG);
27
+ if (!existsSync(configPath)) {
28
+ return { root, config: {} };
29
+ }
30
+ try {
31
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
32
+ return { root, config };
33
+ }
34
+ catch {
35
+ return { root, config: {} };
36
+ }
37
+ }
38
+ /**
39
+ * Load project-level knowledge for system prompt injection
40
+ */
41
+ export function loadProjectKnowledge() {
42
+ const project = loadProjectConfig();
43
+ if (!project)
44
+ return null;
45
+ const parts = [];
46
+ const boboDir = join(project.root, PROJECT_DIR);
47
+ // Load project description
48
+ if (project.config.name) {
49
+ parts.push(`# Project: ${project.config.name}`);
50
+ if (project.config.description) {
51
+ parts.push(project.config.description);
52
+ }
53
+ }
54
+ // Load project knowledge files
55
+ const knowledgeFiles = project.config.knowledge || [];
56
+ for (const file of knowledgeFiles) {
57
+ const filePath = join(boboDir, file);
58
+ if (existsSync(filePath)) {
59
+ parts.push(readFileSync(filePath, 'utf-8').trim());
60
+ }
61
+ }
62
+ // Load project rules
63
+ const ruleFiles = project.config.rules || [];
64
+ for (const file of ruleFiles) {
65
+ const filePath = join(boboDir, file);
66
+ if (existsSync(filePath)) {
67
+ parts.push(readFileSync(filePath, 'utf-8').trim());
68
+ }
69
+ }
70
+ // Auto-detect common project files
71
+ const autoDetect = ['AGENTS.md', 'CLAUDE.md', 'CONVENTIONS.md', 'RULES.md'];
72
+ for (const file of autoDetect) {
73
+ const filePath = join(project.root, file);
74
+ if (existsSync(filePath)) {
75
+ const content = readFileSync(filePath, 'utf-8').trim();
76
+ if (content.length < 5000) { // Don't load huge files
77
+ parts.push(`# ${file}\n\n${content}`);
78
+ }
79
+ }
80
+ }
81
+ return parts.length > 0 ? parts.join('\n\n---\n\n') : null;
82
+ }
83
+ /**
84
+ * Initialize a project .bobo/ directory
85
+ */
86
+ export function initProject() {
87
+ const projectDir = join(process.cwd(), PROJECT_DIR);
88
+ if (existsSync(projectDir)) {
89
+ return `Project already initialized at ${projectDir}`;
90
+ }
91
+ mkdirSync(projectDir, { recursive: true });
92
+ const config = {
93
+ name: process.cwd().split('/').pop() || 'project',
94
+ description: '',
95
+ knowledge: [],
96
+ rules: [],
97
+ };
98
+ writeFileSync(join(projectDir, PROJECT_CONFIG), JSON.stringify(config, null, 2) + '\n');
99
+ writeFileSync(join(projectDir, 'README.md'), `# Project Configuration
100
+
101
+ This directory contains project-specific configuration for bobo-cli.
102
+
103
+ ## Files
104
+
105
+ - \`project.json\` — Project config (name, knowledge files, rules)
106
+ - Add \`.md\` files here and reference them in project.json
107
+
108
+ ## Usage
109
+
110
+ \`\`\`bash
111
+ # Run bobo in this project (auto-detects .bobo/)
112
+ bobo "explain this codebase"
113
+ \`\`\`
114
+ `);
115
+ return `Initialized project at ${projectDir}`;
116
+ }
117
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerRulesCommand(program: Command): Command;
@@ -0,0 +1,51 @@
1
+ import chalk from 'chalk';
2
+ import { KnowledgeLoader } from './structured/loader.js';
3
+ import { KnowledgeSearch } from './structured/search.js';
4
+ import { getStructuredKnowledgePath } from './structured/paths.js';
5
+ import { renderRule, renderSearchResult } from './structured/render-markdown.js';
6
+ import { renderTable } from './structured/render-table.js';
7
+ export function registerRulesCommand(program) {
8
+ const rules = program.command('rules').description('Browse structured rules');
9
+ rules
10
+ .command('list')
11
+ .description('List all rules')
12
+ .option('-c, --category <cat>', '按分类过滤')
13
+ .action(async (opts) => {
14
+ const loader = new KnowledgeLoader(getStructuredKnowledgePath());
15
+ const all = await loader.listRules();
16
+ const filtered = opts.category ? all.filter((rule) => rule.category === opts.category) : all;
17
+ if (filtered.length === 0) {
18
+ console.log(chalk.dim('No rules found.'));
19
+ return;
20
+ }
21
+ renderTable(['ID', 'Title', 'Category', 'Tags'], filtered.map((rule) => [rule.id, rule.title, rule.category, rule.tags.join(', ')]));
22
+ console.log(chalk.dim(`\n${filtered.length} rules`));
23
+ });
24
+ rules
25
+ .command('show <id>')
26
+ .description('显示规则全文')
27
+ .action(async (id) => {
28
+ const loader = new KnowledgeLoader(getStructuredKnowledgePath());
29
+ const rule = await loader.loadRule(id);
30
+ if (!rule) {
31
+ console.log(chalk.red(`Rule not found: ${id}`));
32
+ process.exit(1);
33
+ }
34
+ renderRule(rule);
35
+ });
36
+ rules
37
+ .command('search <query>')
38
+ .description('Search rules')
39
+ .action(async (query) => {
40
+ const loader = new KnowledgeLoader(getStructuredKnowledgePath());
41
+ const search = new KnowledgeSearch(loader);
42
+ const results = await search.searchByType(query, 'rule');
43
+ if (results.length === 0) {
44
+ console.log(chalk.dim('No matching rules.'));
45
+ return;
46
+ }
47
+ results.forEach(renderSearchResult);
48
+ });
49
+ return rules;
50
+ }
51
+ //# sourceMappingURL=rules-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-commands.js","sourceRoot":"","sources":["../src/rules-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface Skill {
2
+ name: string;
3
+ description: string;
4
+ enabled: boolean;
5
+ type: 'builtin' | 'custom';
6
+ promptFile?: string;
7
+ }
8
+ /**
9
+ * List all available skills
10
+ */
11
+ export declare function listSkills(): Skill[];
12
+ /**
13
+ * Enable or disable a skill
14
+ */
15
+ export declare function setSkillEnabled(name: string, enabled: boolean): string;
16
+ /**
17
+ * Load enabled skill prompts for system prompt injection
18
+ */
19
+ export declare function loadSkillPrompts(): string;
20
+ /**
21
+ * Import OpenClaw skills from a directory into ~/.bobo/skills/
22
+ * Returns a report of imported/skipped skills
23
+ */
24
+ export declare function importSkills(sourceDir: string): string;
25
+ /**
26
+ * Initialize skills directory with README
27
+ */
28
+ export declare function initSkills(): void;