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/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;
|
package/dist/planner.js
ADDED
|
@@ -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":"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"}
|
|
@@ -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;
|
package/dist/project.js
ADDED
|
@@ -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,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":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE9E,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gBAAgB,CAAC;SAC7B,MAAM,CAAC,sBAAsB,EAAE,OAAO,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,IAA2B,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,0BAA0B,EAAE,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC7F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,WAAW,CACT,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,EACnC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACnF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,QAAQ,CAAC;SACrB,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,0BAA0B,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,cAAc,CAAC;SAC3B,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,0BAA0B,EAAE,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEL,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/skills.d.ts
ADDED
|
@@ -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;
|