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/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,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,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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"}
|