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/skills.js ADDED
@@ -0,0 +1,349 @@
1
+ import { readFileSync, existsSync, mkdirSync, readdirSync, writeFileSync, copyFileSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { getConfigDir } from './config.js';
4
+ const SKILLS_DIR = 'skills';
5
+ const MANIFEST_FILE = 'skills-manifest.json';
6
+ // ─── Built-in Skills ─────────────────────────────────────────
7
+ const BUILTIN_SKILLS = {
8
+ coding: {
9
+ description: '代码规范、零注释原则、验证协议',
10
+ prompt: `# Coding Skill
11
+
12
+ ## 零注释原则
13
+ - 默认不写注释,只在 WHY 非显而易见时写
14
+ - 好的命名已说明 WHAT
15
+ - 禁止 "added for issue #123"
16
+
17
+ ## 代码质量
18
+ - 不投机抽象:三行重复好过一个过早抽象
19
+ - 不加没用的:不加 impossible error handling
20
+ - 函数职责单一,命名明确
21
+
22
+ ## PR 规范
23
+ - commit message 用英文,动词开头
24
+ - 一个 PR 一个功能,不混杂
25
+ - 变更说明写在 PR 描述,不写在代码注释
26
+
27
+ ## Review Checklist
28
+ 1. 编译通过
29
+ 2. 测试通过(或明确说没测试)
30
+ 3. 无 console.log/debugger 遗留
31
+ 4. 无硬编码路径/密钥
32
+ 5. 错误处理完整`,
33
+ },
34
+ research: {
35
+ description: '搜索策略、信息综合、调研方法',
36
+ prompt: `# Research Skill
37
+
38
+ ## 搜索策略
39
+ 1. **先窄后宽**:精确搜索 → 模糊搜索 → 全局搜索
40
+ 2. **先本地后远程**:文件系统 → git log → web
41
+ 3. **先结构后内容**:目录结构 → 文件名 → 文件内容
42
+
43
+ ## 信息综合
44
+ - 收集多个来源,交叉验证
45
+ - 区分事实和观点
46
+ - 标注信息来源和时效性
47
+
48
+ ## 调研模板
49
+ 1. 明确问题(要回答什么?)
50
+ 2. 搜索关键信息
51
+ 3. 整理发现
52
+ 4. 得出结论
53
+ 5. 标注不确定的地方`,
54
+ },
55
+ };
56
+ // ─── Skill Management ────────────────────────────────────────
57
+ function getSkillsDir() {
58
+ return join(getConfigDir(), SKILLS_DIR);
59
+ }
60
+ function getManifestPath() {
61
+ return join(getConfigDir(), MANIFEST_FILE);
62
+ }
63
+ function loadManifest() {
64
+ const path = getManifestPath();
65
+ if (existsSync(path)) {
66
+ try {
67
+ return JSON.parse(readFileSync(path, 'utf-8'));
68
+ }
69
+ catch {
70
+ return { skills: {} };
71
+ }
72
+ }
73
+ // Default: all builtin skills enabled
74
+ const skills = {};
75
+ for (const name of Object.keys(BUILTIN_SKILLS)) {
76
+ skills[name] = { enabled: true };
77
+ }
78
+ return { skills };
79
+ }
80
+ function saveManifest(manifest) {
81
+ writeFileSync(getManifestPath(), JSON.stringify(manifest, null, 2) + '\n');
82
+ }
83
+ /**
84
+ * List all available skills
85
+ */
86
+ export function listSkills() {
87
+ const manifest = loadManifest();
88
+ const skills = [];
89
+ // Built-in skills
90
+ for (const [name, info] of Object.entries(BUILTIN_SKILLS)) {
91
+ skills.push({
92
+ name,
93
+ description: info.description,
94
+ enabled: manifest.skills[name]?.enabled ?? true,
95
+ type: 'builtin',
96
+ });
97
+ }
98
+ // Custom skills from ~/.bobo/skills/
99
+ const skillsDir = getSkillsDir();
100
+ if (existsSync(skillsDir)) {
101
+ const entries = readdirSync(skillsDir);
102
+ for (const entry of entries) {
103
+ const fullPath = join(skillsDir, entry);
104
+ try {
105
+ // Use statSync to follow symlinks
106
+ const stat = statSync(fullPath);
107
+ if (!stat.isDirectory())
108
+ continue;
109
+ }
110
+ catch {
111
+ continue;
112
+ }
113
+ const skillFile = join(fullPath, 'SKILL.md');
114
+ if (existsSync(skillFile)) {
115
+ const content = readFileSync(skillFile, 'utf-8');
116
+ let desc = 'Custom skill';
117
+ const h1Match = content.match(/^#\s+.+\n+([^#\n][^\n]{10,})/m);
118
+ const fmMatch = content.match(/^description:\s*(.+)/m);
119
+ const firstLine = content.split('\n').find(l => l.trim() && !l.startsWith('#') && !l.startsWith('---') && !l.startsWith('```') && l.trim().length > 15);
120
+ if (fmMatch)
121
+ desc = fmMatch[1].trim().replace(/^["']|["']$/g, '').slice(0, 120);
122
+ else if (h1Match)
123
+ desc = h1Match[1].trim().slice(0, 120);
124
+ else if (firstLine)
125
+ desc = firstLine.trim().slice(0, 120);
126
+ skills.push({
127
+ name: entry,
128
+ description: desc,
129
+ enabled: manifest.skills[entry]?.enabled ?? true,
130
+ type: 'custom',
131
+ promptFile: skillFile,
132
+ });
133
+ }
134
+ }
135
+ }
136
+ return skills;
137
+ }
138
+ /**
139
+ * Enable or disable a skill
140
+ */
141
+ export function setSkillEnabled(name, enabled) {
142
+ const manifest = loadManifest();
143
+ const allSkills = listSkills();
144
+ const skill = allSkills.find(s => s.name === name);
145
+ if (!skill) {
146
+ return `Skill not found: ${name}. Available: ${allSkills.map(s => s.name).join(', ')}`;
147
+ }
148
+ manifest.skills[name] = { enabled };
149
+ saveManifest(manifest);
150
+ return `Skill "${name}" ${enabled ? 'enabled ✅' : 'disabled ❌'}`;
151
+ }
152
+ /**
153
+ * Load enabled skill prompts for system prompt injection
154
+ */
155
+ export function loadSkillPrompts() {
156
+ const manifest = loadManifest();
157
+ const parts = [];
158
+ // Built-in skills
159
+ for (const [name, info] of Object.entries(BUILTIN_SKILLS)) {
160
+ if (manifest.skills[name]?.enabled !== false) {
161
+ parts.push(info.prompt);
162
+ }
163
+ }
164
+ // Custom skills (follow symlinks)
165
+ const skillsDir = getSkillsDir();
166
+ if (existsSync(skillsDir)) {
167
+ const entries = readdirSync(skillsDir);
168
+ for (const entry of entries) {
169
+ const fullPath = join(skillsDir, entry);
170
+ try {
171
+ if (!statSync(fullPath).isDirectory())
172
+ continue;
173
+ }
174
+ catch {
175
+ continue;
176
+ }
177
+ if (manifest.skills[entry]?.enabled === false)
178
+ continue;
179
+ const skillFile = join(fullPath, 'SKILL.md');
180
+ if (existsSync(skillFile)) {
181
+ parts.push(readFileSync(skillFile, 'utf-8').trim());
182
+ }
183
+ }
184
+ }
185
+ return parts.length > 0 ? '\n\n---\n\n# Active Skills\n\n' + parts.join('\n\n---\n\n') : '';
186
+ }
187
+ /**
188
+ * Import OpenClaw skills from a directory into ~/.bobo/skills/
189
+ * Returns a report of imported/skipped skills
190
+ */
191
+ export function importSkills(sourceDir) {
192
+ const skillsDir = getSkillsDir();
193
+ if (!existsSync(skillsDir)) {
194
+ mkdirSync(skillsDir, { recursive: true });
195
+ }
196
+ if (!existsSync(sourceDir)) {
197
+ return `Source directory not found: ${sourceDir}`;
198
+ }
199
+ const dirs = [];
200
+ for (const entry of readdirSync(sourceDir)) {
201
+ const fullPath = join(sourceDir, entry);
202
+ try {
203
+ if (statSync(fullPath).isDirectory())
204
+ dirs.push(entry);
205
+ }
206
+ catch { /* skip broken symlinks */ }
207
+ }
208
+ let imported = 0;
209
+ let skipped = 0;
210
+ let alreadyExists = 0;
211
+ const report = [];
212
+ // Tools that the CLI has
213
+ const cliTools = new Set([
214
+ 'read_file', 'write_file', 'edit_file', 'search_files', 'list_directory',
215
+ 'shell', 'save_memory', 'search_memory', 'git_status', 'git_diff',
216
+ 'git_log', 'git_commit', 'create_plan', 'update_plan', 'show_plan',
217
+ 'web_search', 'web_fetch',
218
+ ]);
219
+ // Tools/features that need OpenClaw-specific infrastructure
220
+ const incompatiblePatterns = [
221
+ /\bmessage\s*\(\s*{?\s*action/i, // message tool (Slack/Telegram/etc)
222
+ /\bnodes\s*\(\s*{?\s*action/i, // nodes tool (camera/screen)
223
+ /\bcron\s*\(\s*{?\s*action/i, // cron tool
224
+ /\bcanvas\s*\(\s*{?\s*action/i, // canvas tool
225
+ /\bsessions_spawn\b/i, // sub-agent spawning
226
+ /\bsessions_send\b/i, // inter-session messaging
227
+ /\bgateway\s*\(\s*{?\s*action/i, // gateway management
228
+ ];
229
+ for (const dir of dirs) {
230
+ const skillFile = join(sourceDir, dir, 'SKILL.md');
231
+ if (!existsSync(skillFile)) {
232
+ continue;
233
+ }
234
+ const targetDir = join(skillsDir, dir);
235
+ // Skip if already exists
236
+ if (existsSync(targetDir)) {
237
+ alreadyExists++;
238
+ continue;
239
+ }
240
+ // Read SKILL.md to classify
241
+ const content = readFileSync(skillFile, 'utf-8');
242
+ // Check for incompatible patterns
243
+ const hasIncompatible = incompatiblePatterns.some(p => p.test(content));
244
+ // Create skill directory and copy SKILL.md
245
+ mkdirSync(targetDir, { recursive: true });
246
+ if (hasIncompatible) {
247
+ // Add compatibility note
248
+ const wrappedContent = `<!-- Imported from OpenClaw. Some features may require tools not available in CLI mode. -->\n\n${content}`;
249
+ writeFileSync(join(targetDir, 'SKILL.md'), wrappedContent);
250
+ report.push(` ⚠️ ${dir} (imported with compatibility warning)`);
251
+ }
252
+ else {
253
+ writeFileSync(join(targetDir, 'SKILL.md'), content);
254
+ report.push(` ✅ ${dir}`);
255
+ }
256
+ // Copy any additional .md files in the skill directory
257
+ try {
258
+ const extraFiles = readdirSync(join(sourceDir, dir))
259
+ .filter(f => f.endsWith('.md') && f !== 'SKILL.md');
260
+ for (const f of extraFiles) {
261
+ const src = join(sourceDir, dir, f);
262
+ const dst = join(targetDir, f);
263
+ try {
264
+ if (existsSync(src) && !existsSync(dst)) {
265
+ const st = statSync(src);
266
+ if (st.size < 50000)
267
+ copyFileSync(src, dst);
268
+ }
269
+ }
270
+ catch { /* skip files with permission issues */ }
271
+ }
272
+ // Also copy references/ directory if it exists
273
+ const refsDir = join(sourceDir, dir, 'references');
274
+ if (existsSync(refsDir)) {
275
+ const targetRefs = join(targetDir, 'references');
276
+ mkdirSync(targetRefs, { recursive: true });
277
+ try {
278
+ const refFiles = readdirSync(refsDir).filter(f => f.endsWith('.md'));
279
+ for (const f of refFiles) {
280
+ try {
281
+ const st = statSync(join(refsDir, f));
282
+ if (st.size < 50000)
283
+ copyFileSync(join(refsDir, f), join(targetRefs, f));
284
+ }
285
+ catch { /* skip */ }
286
+ }
287
+ }
288
+ catch { /* skip unreadable refs */ }
289
+ }
290
+ }
291
+ catch { /* skip extra file copy errors */ }
292
+ imported++;
293
+ }
294
+ // Update manifest - all imported skills start disabled to avoid prompt bloat
295
+ const manifest = loadManifest();
296
+ for (const dir of dirs) {
297
+ const skillFile = join(sourceDir, dir, 'SKILL.md');
298
+ if (existsSync(skillFile) && !manifest.skills[dir]) {
299
+ manifest.skills[dir] = { enabled: false }; // Start disabled
300
+ }
301
+ }
302
+ saveManifest(manifest);
303
+ return [
304
+ `📦 Skill Import Report:`,
305
+ ` Imported: ${imported}`,
306
+ ` Already exists: ${alreadyExists}`,
307
+ ` Total available: ${imported + alreadyExists}`,
308
+ ``,
309
+ `Imported skills start DISABLED to avoid prompt bloat.`,
310
+ `Enable with: bobo skill enable <name>`,
311
+ ``,
312
+ ...(report.length > 0 ? ['Details:', ...report] : []),
313
+ ].join('\n');
314
+ }
315
+ /**
316
+ * Initialize skills directory with README
317
+ */
318
+ export function initSkills() {
319
+ const skillsDir = getSkillsDir();
320
+ if (!existsSync(skillsDir)) {
321
+ mkdirSync(skillsDir, { recursive: true });
322
+ }
323
+ const readmePath = join(skillsDir, 'README.md');
324
+ if (!existsSync(readmePath)) {
325
+ writeFileSync(readmePath, `# Custom Skills
326
+
327
+ Create a subdirectory with a \`SKILL.md\` file to add a custom skill.
328
+
329
+ Example:
330
+ \`\`\`
331
+ skills/
332
+ └── my-skill/
333
+ └── SKILL.md
334
+ \`\`\`
335
+
336
+ Manage with:
337
+ - \`bobo skill list\` — List all skills
338
+ - \`bobo skill enable <name>\` — Enable a skill
339
+ - \`bobo skill disable <name>\` — Disable a skill
340
+ `);
341
+ }
342
+ // Save default manifest
343
+ const manifestPath = getManifestPath();
344
+ if (!existsSync(manifestPath)) {
345
+ const manifest = loadManifest();
346
+ saveManifest(manifest);
347
+ }
348
+ }
349
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Rule, Skill, Workflow, Memory, KnowledgeIndex } from "./types.js";
2
+ export declare class KnowledgeLoader {
3
+ private cache;
4
+ private basePath;
5
+ constructor(knowledgePath: string);
6
+ loadIndex(): Promise<KnowledgeIndex>;
7
+ loadRule(id: string): Promise<Rule | undefined>;
8
+ loadSkill(id: string): Promise<Skill | undefined>;
9
+ loadWorkflow(id: string): Promise<Workflow | undefined>;
10
+ loadMemory(id: string): Promise<Memory | undefined>;
11
+ listRules(): Promise<Pick<Rule, "id" | "title" | "category" | "tags">[]>;
12
+ listSkills(): Promise<Pick<Skill, "id" | "title" | "category" | "tags">[]>;
13
+ listWorkflows(): Promise<Pick<Workflow, "id" | "title" | "type" | "triggers">[]>;
14
+ listMemory(): Promise<Pick<Memory, "id" | "title" | "type" | "tags">[]>;
15
+ private loadItem;
16
+ private normalizeStringArray;
17
+ private parseWorkflowSteps;
18
+ clearCache(): void;
19
+ }
@@ -0,0 +1,147 @@
1
+ import { readFile } from "fs/promises";
2
+ import { join } from "path";
3
+ import matter from "gray-matter";
4
+ import { RuleSchema, SkillSchema, WorkflowSchema, MemorySchema, KnowledgeIndexSchema } from "./types.js";
5
+ export class KnowledgeLoader {
6
+ cache = new Map();
7
+ basePath;
8
+ constructor(knowledgePath) {
9
+ this.basePath = knowledgePath;
10
+ }
11
+ async loadIndex() {
12
+ if (this.cache.has("index"))
13
+ return this.cache.get("index");
14
+ const raw = await readFile(join(this.basePath, "index.json"), "utf-8");
15
+ const index = KnowledgeIndexSchema.parse(JSON.parse(raw));
16
+ this.cache.set("index", index);
17
+ return index;
18
+ }
19
+ async loadRule(id) {
20
+ return this.loadItem("rules", id, RuleSchema);
21
+ }
22
+ async loadSkill(id) {
23
+ return this.loadItem("skills", id, SkillSchema);
24
+ }
25
+ async loadWorkflow(id) {
26
+ const cacheKey = `workflows:${id}`;
27
+ if (this.cache.has(cacheKey))
28
+ return this.cache.get(cacheKey);
29
+ try {
30
+ const raw = await readFile(join(this.basePath, "workflows", `${id}.md`), "utf-8");
31
+ const { data, content } = matter(raw);
32
+ const steps = this.parseWorkflowSteps(content);
33
+ const workflow = WorkflowSchema.parse({
34
+ ...data,
35
+ triggers: this.normalizeStringArray(data.triggers),
36
+ checklist: this.normalizeStringArray(data.checklist),
37
+ steps,
38
+ });
39
+ this.cache.set(cacheKey, workflow);
40
+ return workflow;
41
+ }
42
+ catch {
43
+ return undefined;
44
+ }
45
+ }
46
+ async loadMemory(id) {
47
+ return this.loadItem("memory", id, MemorySchema);
48
+ }
49
+ async listRules() {
50
+ const index = await this.loadIndex();
51
+ const results = [];
52
+ for (const id of index.rules) {
53
+ const rule = await this.loadRule(id);
54
+ if (rule)
55
+ results.push({ id: rule.id, title: rule.title, category: rule.category, tags: rule.tags });
56
+ }
57
+ return results;
58
+ }
59
+ async listSkills() {
60
+ const index = await this.loadIndex();
61
+ const results = [];
62
+ for (const id of index.skills) {
63
+ const skill = await this.loadSkill(id);
64
+ if (skill)
65
+ results.push({ id: skill.id, title: skill.title, category: skill.category, tags: skill.tags });
66
+ }
67
+ return results;
68
+ }
69
+ async listWorkflows() {
70
+ const index = await this.loadIndex();
71
+ const results = [];
72
+ for (const id of index.workflows) {
73
+ const wf = await this.loadWorkflow(id);
74
+ if (wf)
75
+ results.push({ id: wf.id, title: wf.title, type: wf.type, triggers: wf.triggers });
76
+ }
77
+ return results;
78
+ }
79
+ async listMemory() {
80
+ const index = await this.loadIndex();
81
+ const results = [];
82
+ for (const id of index.memory) {
83
+ const mem = await this.loadMemory(id);
84
+ if (mem)
85
+ results.push({ id: mem.id, title: mem.title, type: mem.type, tags: mem.tags });
86
+ }
87
+ return results;
88
+ }
89
+ async loadItem(subdir, id, schema) {
90
+ const cacheKey = `${subdir}:${id}`;
91
+ if (this.cache.has(cacheKey))
92
+ return this.cache.get(cacheKey);
93
+ try {
94
+ const raw = await readFile(join(this.basePath, subdir, `${id}.md`), "utf-8");
95
+ const { data, content } = matter(raw);
96
+ const item = schema.parse({
97
+ ...data,
98
+ tags: this.normalizeStringArray(data.tags),
99
+ triggers: this.normalizeStringArray(data.triggers),
100
+ dependencies: this.normalizeStringArray(data.dependencies),
101
+ content,
102
+ });
103
+ this.cache.set(cacheKey, item);
104
+ return item;
105
+ }
106
+ catch {
107
+ return undefined;
108
+ }
109
+ }
110
+ normalizeStringArray(value) {
111
+ if (!Array.isArray(value)) {
112
+ return [];
113
+ }
114
+ return value
115
+ .filter((entry) => typeof entry === "string")
116
+ .map((entry) => entry.trim())
117
+ .filter(Boolean);
118
+ }
119
+ parseWorkflowSteps(content) {
120
+ const steps = [];
121
+ const stepPattern = /### Step \d+: (.+)\n([\s\S]*?)(?=\n### Step \d+:|\n## Checklist|$)/g;
122
+ for (const match of content.matchAll(stepPattern)) {
123
+ const name = match[1]?.trim();
124
+ const body = match[2] ?? "";
125
+ const description = body.split("\n")[0]?.trim() ?? "";
126
+ const actionMatch = body.match(/- Action: `([^`]+)`/);
127
+ const dependsOnMatch = body.match(/- Depends on: (.+)/);
128
+ if (!name || !description || !actionMatch)
129
+ continue;
130
+ const dependsOnRaw = dependsOnMatch?.[1]?.trim() ?? "none";
131
+ const dependsOn = dependsOnRaw === "none"
132
+ ? []
133
+ : dependsOnRaw.split(",").map((value) => value.trim()).filter(Boolean);
134
+ steps.push({
135
+ name,
136
+ description,
137
+ action: actionMatch[1].trim(),
138
+ dependsOn,
139
+ });
140
+ }
141
+ return steps;
142
+ }
143
+ clearCache() {
144
+ this.cache.clear();
145
+ }
146
+ }
147
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/structured/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getStructuredKnowledgePath(): string;
2
+ export declare function getStructuredConfigDir(): string;
@@ -0,0 +1,14 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ export function getStructuredKnowledgePath() {
5
+ const bundled = join(import.meta.dirname, '..', 'knowledge');
6
+ if (existsSync(join(bundled, 'index.json'))) {
7
+ return bundled;
8
+ }
9
+ return join(process.cwd(), 'knowledge');
10
+ }
11
+ export function getStructuredConfigDir() {
12
+ return join(homedir(), '.bobo');
13
+ }
14
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/structured/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,0BAA0B;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7D,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface ProjectScaffoldOptions {
2
+ targetDir: string;
3
+ projectName: string;
4
+ includedSkillIds?: string[];
5
+ includedRuleIds?: string[];
6
+ }
7
+ export declare function createProjectScaffold(options: ProjectScaffoldOptions): Promise<string[]>;
@@ -0,0 +1,60 @@
1
+ import { mkdir, writeFile } from "fs/promises";
2
+ import { join } from "path";
3
+ const DEFAULT_RULES = [
4
+ "blocking-rules",
5
+ "work-mode",
6
+ "capability-evolution",
7
+ "coding",
8
+ "engineering-workflows",
9
+ "testing",
10
+ "git",
11
+ "security",
12
+ ];
13
+ const DEFAULT_SKILLS = [
14
+ "code-review-expert",
15
+ "testing-expert",
16
+ "documentation-expert",
17
+ "refactoring-expert",
18
+ "frontend-expert",
19
+ "backend-expert",
20
+ ];
21
+ export async function createProjectScaffold(options) {
22
+ const rules = options.includedRuleIds ?? DEFAULT_RULES;
23
+ const skills = options.includedSkillIds ?? DEFAULT_SKILLS;
24
+ const created = [];
25
+ const claudeDir = join(options.targetDir, ".claude");
26
+ const rulesCoreDir = join(claudeDir, "rules", "core");
27
+ const rulesDomainDir = join(claudeDir, "rules", "domain");
28
+ const skillsDir = join(claudeDir, "skills");
29
+ await mkdir(rulesCoreDir, { recursive: true });
30
+ await mkdir(rulesDomainDir, { recursive: true });
31
+ await mkdir(skillsDir, { recursive: true });
32
+ const claudeMdPath = join(claudeDir, "CLAUDE.md");
33
+ const claudeMd = `# ${options.projectName} Rules\n\n## Core Workflow\n- Plan → Confirm → Execute → Verify\n- Use TDD for new behavior changes\n- Verify UI changes visually before completion\n\n## Included Rules\n${rules.map((rule) => `- ${rule}`).join("\n")}\n\n## Included Skills\n${skills.map((skill) => `- ${skill}`).join("\n")}\n`;
34
+ await writeFile(claudeMdPath, claudeMd, "utf-8");
35
+ created.push(claudeMdPath);
36
+ const settingsPath = join(claudeDir, "settings.json");
37
+ const settings = {
38
+ model: "opus",
39
+ effort: "high",
40
+ enabledSkills: skills,
41
+ notes: "Generated by bobo template project",
42
+ };
43
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
44
+ created.push(settingsPath);
45
+ for (const rule of rules) {
46
+ const isCore = ["blocking-rules", "work-mode", "capability-evolution"].includes(rule);
47
+ const outPath = join(isCore ? rulesCoreDir : rulesDomainDir, `${rule}.md`);
48
+ await writeFile(outPath, `# ${rule}\n\nImported via bobo template project.\n`, "utf-8");
49
+ created.push(outPath);
50
+ }
51
+ for (const skill of skills) {
52
+ const skillDir = join(skillsDir, skill);
53
+ await mkdir(skillDir, { recursive: true });
54
+ const outPath = join(skillDir, "SKILL.md");
55
+ await writeFile(outPath, `---\nid: ${skill}\ntitle: \"${skill}\"\ncategory: other\ntags: []\ntriggers: []\ndependencies: []\n---\n\n# ${skill}\n\nImported via bobo template project.\n`, "utf-8");
56
+ created.push(outPath);
57
+ }
58
+ return created;
59
+ }
60
+ //# sourceMappingURL=project-scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-scaffold.js","sourceRoot":"","sources":["../../src/structured/project-scaffold.ts"],"names":[],"mappings":"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"}