bobo-ai-cli 3.0.3 → 3.0.5
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 -21
- package/README.md +259 -259
- package/bundled-skills/CORE_SKILLS.txt +18 -18
- package/bundled-skills/backend-expert/SKILL.md +97 -97
- package/bundled-skills/code-review/SKILL.md +280 -280
- package/bundled-skills/code-review-expert/SKILL.md +85 -85
- package/bundled-skills/context-budget-analyzer/SKILL.md +76 -76
- package/bundled-skills/context-compressor/SKILL.md +75 -75
- package/bundled-skills/context-optimization-suite/SKILL.md +162 -162
- package/bundled-skills/frontend-expert/SKILL.md +93 -93
- package/bundled-skills/github/SKILL.md +12 -12
- package/bundled-skills/high-agency/SKILL.md +473 -473
- package/bundled-skills/high-agency/references/builder-patterns.md +126 -126
- package/bundled-skills/high-agency/references/recovery-playbook.md +298 -298
- package/bundled-skills/memory-manager/SKILL.md +214 -214
- package/bundled-skills/memory-manager/references/advanced-config.md +65 -65
- package/bundled-skills/orchestrator/SKILL.md +681 -681
- package/bundled-skills/planning-with-files/SKILL.md +193 -193
- package/bundled-skills/skill-creator/SKILL.md +220 -220
- package/bundled-skills/testing-expert/SKILL.md +99 -99
- package/bundled-skills/verify/SKILL.md +15 -15
- package/dist/agent.d.ts +5 -0
- package/dist/agent.js +11 -1
- package/dist/agent.js.map +1 -1
- package/dist/agents/catalog.d.ts +47 -0
- package/dist/agents/catalog.js +63 -5
- package/dist/agents/catalog.js.map +1 -1
- package/dist/agents/router.d.ts +12 -1
- package/dist/agents/router.js +43 -3
- package/dist/agents/router.js.map +1 -1
- package/dist/agents/spawn.js +36 -18
- package/dist/agents/spawn.js.map +1 -1
- package/dist/autonomous.js +5 -5
- package/dist/cli.js +23 -21
- package/dist/cli.js.map +1 -1
- package/dist/compactor.js +39 -39
- package/dist/dream.js +29 -29
- package/dist/image-input.d.ts +44 -0
- package/dist/image-input.js +161 -0
- package/dist/image-input.js.map +1 -0
- package/dist/memory.js +13 -13
- package/dist/project.js +15 -15
- package/dist/repl.js +88 -0
- package/dist/repl.js.map +1 -1
- package/dist/skills.js +54 -54
- package/dist/sub-agents.js +65 -65
- package/dist/tools/browser.js +21 -21
- package/dist/tools/claude-code.js +10 -10
- package/dist/web.js +7 -7
- package/dist/wiki-commands.d.ts +2 -0
- package/dist/wiki-commands.js +249 -0
- package/dist/wiki-commands.js.map +1 -0
- package/dist/wiki.d.ts +90 -0
- package/dist/wiki.js +614 -0
- package/dist/wiki.js.map +1 -0
- package/knowledge/advanced-patterns.md +70 -70
- package/knowledge/agent-directives.md +74 -74
- package/knowledge/api-integration-patterns.md +102 -0
- package/knowledge/code-review-protocol.md +69 -0
- package/knowledge/dream.md +36 -36
- package/knowledge/engineering.md +52 -46
- package/knowledge/error-catalog.md +38 -33
- package/knowledge/event-driven-architecture.md +43 -0
- package/knowledge/external-alignment.md +47 -0
- package/knowledge/high-agency.md +73 -0
- package/knowledge/image-generation.md +48 -0
- package/knowledge/index.json +194 -169
- package/knowledge/llm-wiki-pattern.md +71 -0
- package/knowledge/long-task-management.md +79 -0
- package/knowledge/memory/cache-optimization-and-skill-integration.md +102 -102
- package/knowledge/memory/engineering-patterns.md +134 -134
- package/knowledge/memory/feedback_root_structure.md +15 -15
- package/knowledge/memory/project-contexts.md +69 -69
- package/knowledge/memory/tools-and-services.md +85 -85
- package/knowledge/memory-management.md +72 -0
- package/knowledge/rules/advisor-strategy.md +204 -0
- package/knowledge/rules/agents.md +62 -62
- package/knowledge/rules/blocking-rules.md +323 -323
- package/knowledge/rules/cache-management.md +379 -379
- package/knowledge/rules/capability-evolution.md +132 -132
- package/knowledge/rules/coding.md +126 -126
- package/knowledge/rules/engineering-workflows.md +225 -225
- package/knowledge/rules/evomap-content-guidelines.md +354 -354
- package/knowledge/rules/evomap-guide.md +224 -224
- package/knowledge/rules/external-alignment.md +22 -0
- package/knowledge/rules/git.md +31 -31
- package/knowledge/rules/hooks.md +106 -106
- package/knowledge/rules/performance.md +101 -101
- package/knowledge/rules/remotion-auto-production.md +1120 -1120
- package/knowledge/rules/security.md +46 -46
- package/knowledge/rules/testing.md +32 -32
- package/knowledge/rules/work-mode.md +208 -208
- package/knowledge/rules.md +62 -62
- package/knowledge/self-evolution.md +78 -0
- package/knowledge/self-rationalization-guard.md +52 -0
- package/knowledge/skills/Skill_Seekers.md +1722 -1722
- package/knowledge/skills/ab-test-setup.md +557 -557
- package/knowledge/skills/agent-sdk-dev.md +238 -238
- package/knowledge/skills/agent-tools.md +136 -136
- package/knowledge/skills/analytics-tracking.md +597 -597
- package/knowledge/skills/artifacts-builder.md +89 -89
- package/knowledge/skills/asana.md +12 -12
- package/knowledge/skills/backend-expert.md +97 -97
- package/knowledge/skills/brand-voice.md +481 -481
- package/knowledge/skills/browser-use.md +419 -419
- package/knowledge/skills/cache-optimization-skill.md +179 -179
- package/knowledge/skills/canvas-design.md +147 -147
- package/knowledge/skills/citation-validator.md +203 -203
- package/knowledge/skills/clangd-lsp.md +52 -52
- package/knowledge/skills/code-review-expert.md +85 -85
- package/knowledge/skills/code-review.md +280 -280
- package/knowledge/skills/code-simplifier.md +12 -12
- package/knowledge/skills/commit-commands.md +258 -258
- package/knowledge/skills/competitor-alternatives.md +795 -795
- package/knowledge/skills/content-atomizer.md +910 -910
- package/knowledge/skills/content-research-writer.md +605 -605
- package/knowledge/skills/context-optimization-suite.md +162 -162
- package/knowledge/skills/context7.md +12 -12
- package/knowledge/skills/copy-editing.md +494 -494
- package/knowledge/skills/copywriting.md +510 -510
- package/knowledge/skills/csharp-lsp.md +40 -40
- package/knowledge/skills/decision-making-framework.md +154 -154
- package/knowledge/skills/developer-growth-analysis.md +335 -335
- package/knowledge/skills/direct-response-copy.md +2336 -2336
- package/knowledge/skills/docker-expert.md +229 -229
- package/knowledge/skills/document-skills.md +12 -12
- package/knowledge/skills/documentation-expert.md +126 -126
- package/knowledge/skills/email-sequence.md +1061 -1061
- package/knowledge/skills/email-sequences.md +910 -910
- package/knowledge/skills/example-plugin.md +72 -72
- package/knowledge/skills/explanatory-output-style.md +82 -82
- package/knowledge/skills/feature-dev.md +458 -458
- package/knowledge/skills/file-organizer.md +466 -466
- package/knowledge/skills/firebase.disabled.md +12 -12
- package/knowledge/skills/form-cro.md +488 -488
- package/knowledge/skills/free-tool-strategy.md +636 -636
- package/knowledge/skills/frontend-design-offical.md +55 -55
- package/knowledge/skills/frontend-design.md +41 -41
- package/knowledge/skills/frontend-expert.md +93 -93
- package/knowledge/skills/github.md +12 -12
- package/knowledge/skills/gitlab.md +12 -12
- package/knowledge/skills/gopls-lsp.md +32 -32
- package/knowledge/skills/got-controller.md +218 -218
- package/knowledge/skills/greptile.md +72 -72
- package/knowledge/skills/hookify.md +376 -376
- package/knowledge/skills/image-editor.md +189 -189
- package/knowledge/skills/image-enhancer.md +109 -109
- package/knowledge/skills/jdtls-lsp.md +49 -49
- package/knowledge/skills/json-canvas.md +654 -654
- package/knowledge/skills/keyword-research.md +559 -559
- package/knowledge/skills/kotlin-lsp.md +28 -28
- package/knowledge/skills/laravel-boost.md +12 -12
- package/knowledge/skills/launch-strategy.md +394 -394
- package/knowledge/skills/lead-magnet.md +393 -393
- package/knowledge/skills/learning-output-style.md +106 -106
- package/knowledge/skills/linear.md +12 -12
- package/knowledge/skills/lua-lsp.md +47 -47
- package/knowledge/skills/marketing-ideas.md +720 -720
- package/knowledge/skills/marketing-psychology.md +534 -534
- package/knowledge/skills/mcp-builder.md +369 -369
- package/knowledge/skills/meeting-insights-analyzer.md +347 -347
- package/knowledge/skills/memory-evolution-system.md +172 -172
- package/knowledge/skills/multi-lens-thinking.md +407 -407
- package/knowledge/skills/nano-banana-pro.md +116 -116
- package/knowledge/skills/newsletter.md +736 -736
- package/knowledge/skills/notebooklm.md +296 -296
- package/knowledge/skills/obsidian-bases.md +634 -634
- package/knowledge/skills/obsidian-markdown.md +651 -651
- package/knowledge/skills/onboarding-cro.md +494 -494
- package/knowledge/skills/orchestrator.md +681 -681
- package/knowledge/skills/page-cro.md +379 -379
- package/knowledge/skills/paid-ads.md +624 -624
- package/knowledge/skills/paywall-upgrade-cro.md +651 -651
- package/knowledge/skills/php-lsp.md +36 -36
- package/knowledge/skills/planning-with-files.md +193 -193
- package/knowledge/skills/playwright.md +12 -12
- package/knowledge/skills/plugin-dev.md +434 -434
- package/knowledge/skills/popup-cro.md +520 -520
- package/knowledge/skills/positioning-angles.md +330 -330
- package/knowledge/skills/pr-review-toolkit.md +359 -359
- package/knowledge/skills/pricing-strategy.md +777 -777
- package/knowledge/skills/programmatic-seo.md +714 -714
- package/knowledge/skills/pyright-lsp.md +43 -43
- package/knowledge/skills/quality-assurance-framework.md +168 -168
- package/knowledge/skills/question-refiner.md +160 -160
- package/knowledge/skills/ralph-loop.md +205 -205
- package/knowledge/skills/refactoring-expert.md +103 -103
- package/knowledge/skills/referral-program.md +668 -668
- package/knowledge/skills/research-executor.md +164 -164
- package/knowledge/skills/review-with-security.md +12 -12
- package/knowledge/skills/rust-analyzer-lsp.md +50 -50
- package/knowledge/skills/schema-markup.md +647 -647
- package/knowledge/skills/security-audit-expert.md +124 -124
- package/knowledge/skills/security-expert.md +140 -140
- package/knowledge/skills/security-guidance.md +12 -12
- package/knowledge/skills/seedance-prompt.md +139 -139
- package/knowledge/skills/self-evolution.md +1160 -1160
- package/knowledge/skills/seo-audit.md +432 -432
- package/knowledge/skills/seo-content.md +787 -787
- package/knowledge/skills/serena.md +12 -12
- package/knowledge/skills/signup-flow-cro.md +409 -409
- package/knowledge/skills/skill-creator.md +220 -220
- package/knowledge/skills/skill-manager.md +226 -226
- package/knowledge/skills/skill-share.md +98 -98
- package/knowledge/skills/slack.md +12 -12
- package/knowledge/skills/social-content.md +878 -878
- package/knowledge/skills/spec-flow-skill.md +124 -124
- package/knowledge/skills/stripe.md +12 -12
- package/knowledge/skills/supabase.md +12 -12
- package/knowledge/skills/swift-lsp.md +40 -40
- package/knowledge/skills/synthesizer.md +236 -236
- package/knowledge/skills/template-skill.md +16 -16
- package/knowledge/skills/testing-expert.md +99 -99
- package/knowledge/skills/theme-factory.md +72 -72
- package/knowledge/skills/tiktok-research.md +208 -208
- package/knowledge/skills/typescript-lsp.md +36 -36
- package/knowledge/skills/ui-ux-pro-max.md +247 -247
- package/knowledge/skills/verify.md +15 -15
- package/knowledge/skills/visual-prompt-engineer.md +102 -102
- package/knowledge/skills/webapp-testing.md +111 -111
- package/knowledge/skills/wide-research.md +191 -191
- package/knowledge/system.md +93 -93
- package/knowledge/task-router.md +46 -37
- package/knowledge/verification.md +38 -38
- package/knowledge/worker-prompt-craft.md +66 -0
- package/knowledge/workflows/3d-viz.md +47 -47
- package/knowledge/workflows/data-pipeline.md +47 -47
- package/knowledge/workflows/db-migration.md +51 -51
- package/knowledge/workflows/feature-dev.md +41 -41
- package/knowledge/workflows/tdd-flow.md +52 -52
- package/knowledge/workflows/ui-verify.md +51 -51
- package/package.json +74 -74
- package/dist/claude-bridge.d.ts +0 -18
- package/dist/claude-bridge.js +0 -91
- package/dist/claude-bridge.js.map +0 -1
- package/dist/tools/claude-bridge-tool.d.ts +0 -4
- package/dist/tools/claude-bridge-tool.js +0 -44
- package/dist/tools/claude-bridge-tool.js.map +0 -1
package/dist/wiki.js
ADDED
|
@@ -0,0 +1,614 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM-Wiki Mode — Karpathy pattern implementation
|
|
3
|
+
*
|
|
4
|
+
* A self-maintaining knowledge wiki powered by LLM that:
|
|
5
|
+
* - Ingests documents (files/URLs) and distills them into structured wiki pages
|
|
6
|
+
* - Creates entity/concept/source pages with cross-references
|
|
7
|
+
* - Answers questions by synthesizing information from wiki pages
|
|
8
|
+
* - Maintains health through linting and contradiction detection
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync } from 'node:fs';
|
|
11
|
+
import { join, basename, extname } from 'node:path';
|
|
12
|
+
import OpenAI from 'openai';
|
|
13
|
+
import { loadConfig } from './config.js';
|
|
14
|
+
import { executeWebTool } from './web.js';
|
|
15
|
+
/**
|
|
16
|
+
* Initialize .bobo/wiki/ directory structure.
|
|
17
|
+
*/
|
|
18
|
+
export function initWiki(projectRoot) {
|
|
19
|
+
const wikiDir = join(projectRoot, '.bobo', 'wiki');
|
|
20
|
+
// Create directory structure
|
|
21
|
+
const dirs = [
|
|
22
|
+
wikiDir,
|
|
23
|
+
join(wikiDir, 'sources'),
|
|
24
|
+
join(wikiDir, 'pages'),
|
|
25
|
+
];
|
|
26
|
+
for (const dir of dirs) {
|
|
27
|
+
if (!existsSync(dir)) {
|
|
28
|
+
mkdirSync(dir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Create initial files
|
|
32
|
+
const indexPath = join(wikiDir, 'index.md');
|
|
33
|
+
if (!existsSync(indexPath)) {
|
|
34
|
+
writeFileSync(indexPath, `# Wiki Index
|
|
35
|
+
|
|
36
|
+
## Entities
|
|
37
|
+
|
|
38
|
+
## Concepts
|
|
39
|
+
|
|
40
|
+
## Sources
|
|
41
|
+
|
|
42
|
+
## Analysis
|
|
43
|
+
`);
|
|
44
|
+
}
|
|
45
|
+
const logPath = join(wikiDir, 'log.md');
|
|
46
|
+
if (!existsSync(logPath)) {
|
|
47
|
+
writeFileSync(logPath, `# Wiki Log\n`);
|
|
48
|
+
}
|
|
49
|
+
const schemaPath = join(wikiDir, 'schema.md');
|
|
50
|
+
if (!existsSync(schemaPath)) {
|
|
51
|
+
writeFileSync(schemaPath, `# Wiki Schema
|
|
52
|
+
|
|
53
|
+
This wiki follows these conventions:
|
|
54
|
+
|
|
55
|
+
## Page Types
|
|
56
|
+
- **entity**: People, companies, products, projects
|
|
57
|
+
- **concept**: Ideas, technologies, methodologies
|
|
58
|
+
- **source**: Original documents, articles, papers
|
|
59
|
+
- **comparison**: Side-by-side analysis of multiple entities/concepts
|
|
60
|
+
- **analysis**: Deep-dive synthesis and insights
|
|
61
|
+
|
|
62
|
+
## Page Format
|
|
63
|
+
Each page has YAML frontmatter with:
|
|
64
|
+
- type: page type
|
|
65
|
+
- tags: categorization tags
|
|
66
|
+
- sources: source pages referenced
|
|
67
|
+
- created: creation date (YYYY-MM-DD)
|
|
68
|
+
- updated: last update date (YYYY-MM-DD)
|
|
69
|
+
|
|
70
|
+
## Linking
|
|
71
|
+
Use [[page-name]] for internal wiki links.
|
|
72
|
+
Use See Also section for related pages.
|
|
73
|
+
`);
|
|
74
|
+
}
|
|
75
|
+
return wikiDir;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Ingest a source (file or URL) into the wiki.
|
|
79
|
+
*/
|
|
80
|
+
export async function ingestSource(source, options) {
|
|
81
|
+
const { wikiDir, verbose } = options;
|
|
82
|
+
// Step 1: Fetch/read content
|
|
83
|
+
let content;
|
|
84
|
+
let sourceName;
|
|
85
|
+
if (source.startsWith('http://') || source.startsWith('https://')) {
|
|
86
|
+
// Fetch URL
|
|
87
|
+
if (verbose)
|
|
88
|
+
console.log(`Fetching ${source}...`);
|
|
89
|
+
content = executeWebTool('web_fetch', { url: source, maxChars: 10000 });
|
|
90
|
+
sourceName = sanitizeFilename(new URL(source).hostname + '-' + Date.now());
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Read local file
|
|
94
|
+
if (!existsSync(source)) {
|
|
95
|
+
throw new Error(`File not found: ${source}`);
|
|
96
|
+
}
|
|
97
|
+
content = readFileSync(source, 'utf-8');
|
|
98
|
+
sourceName = sanitizeFilename(basename(source, extname(source)));
|
|
99
|
+
}
|
|
100
|
+
// Step 2: Save to sources/
|
|
101
|
+
const sourceFileName = `${sourceName}.md`;
|
|
102
|
+
const sourcePath = join(wikiDir, 'sources', sourceFileName);
|
|
103
|
+
const sourceMetadata = `---
|
|
104
|
+
type: source
|
|
105
|
+
source: ${source}
|
|
106
|
+
ingested: ${new Date().toISOString().split('T')[0]}
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
# ${sourceName}
|
|
110
|
+
|
|
111
|
+
${content}
|
|
112
|
+
`;
|
|
113
|
+
writeFileSync(sourcePath, sourceMetadata);
|
|
114
|
+
// Step 3: Extract information with LLM
|
|
115
|
+
const config = loadConfig();
|
|
116
|
+
if (!config.apiKey) {
|
|
117
|
+
throw new Error('API key not configured. Run: bobo config set apiKey <key>');
|
|
118
|
+
}
|
|
119
|
+
const client = new OpenAI({
|
|
120
|
+
apiKey: config.apiKey,
|
|
121
|
+
baseURL: config.baseUrl,
|
|
122
|
+
});
|
|
123
|
+
const extractionPrompt = `You are analyzing a document to extract structured information for a wiki.
|
|
124
|
+
|
|
125
|
+
Document content:
|
|
126
|
+
${content.slice(0, 8000)}${content.length > 8000 ? '\n\n... (truncated)' : ''}
|
|
127
|
+
|
|
128
|
+
Task: Extract key entities, concepts, and insights.
|
|
129
|
+
|
|
130
|
+
Output format (JSON):
|
|
131
|
+
{
|
|
132
|
+
"entities": [
|
|
133
|
+
{"name": "Entity Name", "type": "person|company|product", "description": "Brief description"}
|
|
134
|
+
],
|
|
135
|
+
"concepts": [
|
|
136
|
+
{"name": "Concept Name", "description": "Brief explanation"}
|
|
137
|
+
],
|
|
138
|
+
"summary": "2-3 sentence summary of the document",
|
|
139
|
+
"keyInsights": ["Insight 1", "Insight 2"]
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
Output ONLY valid JSON:`;
|
|
143
|
+
const extraction = await client.chat.completions.create({
|
|
144
|
+
model: config.model,
|
|
145
|
+
messages: [{ role: 'user', content: extractionPrompt }],
|
|
146
|
+
temperature: 0.3,
|
|
147
|
+
max_tokens: 2000,
|
|
148
|
+
});
|
|
149
|
+
const extractionText = extraction.choices[0]?.message?.content || '{}';
|
|
150
|
+
const jsonMatch = extractionText.match(/\{[\s\S]*\}/);
|
|
151
|
+
const extractionData = JSON.parse(jsonMatch ? jsonMatch[0] : '{}');
|
|
152
|
+
// Step 4: Create/update pages
|
|
153
|
+
const pagesCreated = [];
|
|
154
|
+
const pagesUpdated = [];
|
|
155
|
+
const today = new Date().toISOString().split('T')[0];
|
|
156
|
+
// Create source summary page
|
|
157
|
+
const sourcePageName = `source-${sourceName}.md`;
|
|
158
|
+
const sourcePagePath = join(wikiDir, 'pages', sourcePageName);
|
|
159
|
+
const sourcePageContent = `---
|
|
160
|
+
type: source
|
|
161
|
+
tags: [source]
|
|
162
|
+
sources: []
|
|
163
|
+
created: ${today}
|
|
164
|
+
updated: ${today}
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
# ${sourceName}
|
|
168
|
+
|
|
169
|
+
**Source:** ${source}
|
|
170
|
+
|
|
171
|
+
## Summary
|
|
172
|
+
|
|
173
|
+
${extractionData.summary || 'No summary available.'}
|
|
174
|
+
|
|
175
|
+
## Key Insights
|
|
176
|
+
|
|
177
|
+
${(extractionData.keyInsights || []).map(i => `- ${i}`).join('\n')}
|
|
178
|
+
|
|
179
|
+
## See Also
|
|
180
|
+
|
|
181
|
+
${(extractionData.entities || []).map(e => `- [[${slugify(e.name)}]]`).join('\n')}
|
|
182
|
+
${(extractionData.concepts || []).map(c => `- [[${slugify(c.name)}]]`).join('\n')}
|
|
183
|
+
`;
|
|
184
|
+
writeFileSync(sourcePagePath, sourcePageContent);
|
|
185
|
+
pagesCreated.push(sourcePageName);
|
|
186
|
+
// Create/update entity pages
|
|
187
|
+
for (const entity of extractionData.entities || []) {
|
|
188
|
+
const slug = slugify(entity.name);
|
|
189
|
+
const pageName = `${slug}.md`;
|
|
190
|
+
const pagePath = join(wikiDir, 'pages', pageName);
|
|
191
|
+
if (existsSync(pagePath)) {
|
|
192
|
+
// Update existing page
|
|
193
|
+
const existing = readFileSync(pagePath, 'utf-8');
|
|
194
|
+
const updatedContent = updatePageWithNewInfo(existing, entity.description, sourcePageName, today);
|
|
195
|
+
writeFileSync(pagePath, updatedContent);
|
|
196
|
+
pagesUpdated.push(pageName);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
// Create new page
|
|
200
|
+
const pageContent = `---
|
|
201
|
+
type: entity
|
|
202
|
+
tags: [${entity.type}]
|
|
203
|
+
sources: [${sourcePageName}]
|
|
204
|
+
created: ${today}
|
|
205
|
+
updated: ${today}
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
# ${entity.name}
|
|
209
|
+
|
|
210
|
+
${entity.description}
|
|
211
|
+
|
|
212
|
+
## References
|
|
213
|
+
|
|
214
|
+
- [[${sourcePageName.replace('.md', '')}]]
|
|
215
|
+
|
|
216
|
+
## See Also
|
|
217
|
+
`;
|
|
218
|
+
writeFileSync(pagePath, pageContent);
|
|
219
|
+
pagesCreated.push(pageName);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Create/update concept pages
|
|
223
|
+
for (const concept of extractionData.concepts || []) {
|
|
224
|
+
const slug = slugify(concept.name);
|
|
225
|
+
const pageName = `${slug}.md`;
|
|
226
|
+
const pagePath = join(wikiDir, 'pages', pageName);
|
|
227
|
+
if (existsSync(pagePath)) {
|
|
228
|
+
const existing = readFileSync(pagePath, 'utf-8');
|
|
229
|
+
const updatedContent = updatePageWithNewInfo(existing, concept.description, sourcePageName, today);
|
|
230
|
+
writeFileSync(pagePath, updatedContent);
|
|
231
|
+
pagesUpdated.push(pageName);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
const pageContent = `---
|
|
235
|
+
type: concept
|
|
236
|
+
tags: [concept]
|
|
237
|
+
sources: [${sourcePageName}]
|
|
238
|
+
created: ${today}
|
|
239
|
+
updated: ${today}
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
# ${concept.name}
|
|
243
|
+
|
|
244
|
+
${concept.description}
|
|
245
|
+
|
|
246
|
+
## References
|
|
247
|
+
|
|
248
|
+
- [[${sourcePageName.replace('.md', '')}]]
|
|
249
|
+
|
|
250
|
+
## See Also
|
|
251
|
+
`;
|
|
252
|
+
writeFileSync(pagePath, pageContent);
|
|
253
|
+
pagesCreated.push(pageName);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Step 5: Update index.md
|
|
257
|
+
await rebuildIndex(wikiDir);
|
|
258
|
+
// Step 6: Append to log.md
|
|
259
|
+
const logPath = join(wikiDir, 'log.md');
|
|
260
|
+
const logEntry = `
|
|
261
|
+
## [${today}] ingest | ${sourceName}
|
|
262
|
+
Source: ${source}
|
|
263
|
+
Pages created: ${pagesCreated.join(', ')}
|
|
264
|
+
Pages updated: ${pagesUpdated.join(', ')}
|
|
265
|
+
`;
|
|
266
|
+
const existingLog = existsSync(logPath) ? readFileSync(logPath, 'utf-8') : '# Wiki Log\n';
|
|
267
|
+
writeFileSync(logPath, existingLog + logEntry);
|
|
268
|
+
return {
|
|
269
|
+
sourcePage: sourcePageName,
|
|
270
|
+
pagesCreated,
|
|
271
|
+
pagesUpdated,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Query the wiki with LLM synthesis.
|
|
276
|
+
*/
|
|
277
|
+
export async function queryWiki(question, options) {
|
|
278
|
+
const { wikiDir, verbose } = options;
|
|
279
|
+
// Step 1: Find relevant pages by searching index
|
|
280
|
+
const indexPath = join(wikiDir, 'index.md');
|
|
281
|
+
if (!existsSync(indexPath)) {
|
|
282
|
+
throw new Error('Wiki not initialized. Run: bobo wiki init');
|
|
283
|
+
}
|
|
284
|
+
const indexContent = readFileSync(indexPath, 'utf-8');
|
|
285
|
+
// Simple keyword matching (could be enhanced with embeddings)
|
|
286
|
+
const keywords = question.toLowerCase().split(/\s+/);
|
|
287
|
+
const relevantPages = findRelevantPages(wikiDir, keywords);
|
|
288
|
+
if (relevantPages.length === 0) {
|
|
289
|
+
return {
|
|
290
|
+
answer: 'No relevant information found in the wiki. Consider ingesting more sources.',
|
|
291
|
+
sources: [],
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
// Step 2: Read relevant pages
|
|
295
|
+
if (verbose)
|
|
296
|
+
console.log(`Found ${relevantPages.length} relevant pages...`);
|
|
297
|
+
const pageContents = relevantPages.slice(0, 5).map(page => {
|
|
298
|
+
const content = readFileSync(join(wikiDir, 'pages', page), 'utf-8');
|
|
299
|
+
return `## [[${page.replace('.md', '')}]]\n\n${content}`;
|
|
300
|
+
}).join('\n\n---\n\n');
|
|
301
|
+
// Step 3: LLM synthesis
|
|
302
|
+
const config = loadConfig();
|
|
303
|
+
if (!config.apiKey) {
|
|
304
|
+
throw new Error('API key not configured');
|
|
305
|
+
}
|
|
306
|
+
const client = new OpenAI({
|
|
307
|
+
apiKey: config.apiKey,
|
|
308
|
+
baseURL: config.baseUrl,
|
|
309
|
+
});
|
|
310
|
+
const synthesisPrompt = `You are answering a question using information from a knowledge wiki.
|
|
311
|
+
|
|
312
|
+
Question: ${question}
|
|
313
|
+
|
|
314
|
+
Wiki pages:
|
|
315
|
+
${pageContents.slice(0, 6000)}${pageContents.length > 6000 ? '\n\n... (truncated)' : ''}
|
|
316
|
+
|
|
317
|
+
Task: Provide a clear, accurate answer based on the wiki content. Cite page names using [[page-name]] notation.
|
|
318
|
+
|
|
319
|
+
If the answer would be valuable for future reference, suggest a wiki page title to save it as.
|
|
320
|
+
|
|
321
|
+
Format:
|
|
322
|
+
ANSWER: [your answer]
|
|
323
|
+
SOURCES: [[page1]], [[page2]], ...
|
|
324
|
+
SUGGESTED_PAGE: [page title or "none"]`;
|
|
325
|
+
const synthesis = await client.chat.completions.create({
|
|
326
|
+
model: config.model,
|
|
327
|
+
messages: [{ role: 'user', content: synthesisPrompt }],
|
|
328
|
+
temperature: 0.4,
|
|
329
|
+
max_tokens: 1500,
|
|
330
|
+
});
|
|
331
|
+
const response = synthesis.choices[0]?.message?.content || '';
|
|
332
|
+
// Parse response
|
|
333
|
+
const answerMatch = response.match(/ANSWER:\s*([\s\S]*?)(?=SOURCES:|$)/i);
|
|
334
|
+
const sourcesMatch = response.match(/SOURCES:\s*(.*?)(?=SUGGESTED_PAGE:|$)/i);
|
|
335
|
+
const suggestedMatch = response.match(/SUGGESTED_PAGE:\s*(.*?)$/i);
|
|
336
|
+
const answer = answerMatch ? answerMatch[1].trim() : response;
|
|
337
|
+
const sources = sourcesMatch
|
|
338
|
+
? sourcesMatch[1].match(/\[\[([^\]]+)\]\]/g)?.map(s => s.replace(/[\[\]]/g, '')) || []
|
|
339
|
+
: [];
|
|
340
|
+
const suggestedPageTitle = suggestedMatch && suggestedMatch[1].trim().toLowerCase() !== 'none'
|
|
341
|
+
? suggestedMatch[1].trim()
|
|
342
|
+
: undefined;
|
|
343
|
+
return {
|
|
344
|
+
answer,
|
|
345
|
+
sources,
|
|
346
|
+
suggestedPageTitle,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Run health checks on the wiki.
|
|
351
|
+
*/
|
|
352
|
+
export async function lintWiki(wikiDir) {
|
|
353
|
+
const pagesDir = join(wikiDir, 'pages');
|
|
354
|
+
if (!existsSync(pagesDir)) {
|
|
355
|
+
return { issues: [], orphanPages: [], missingLinks: [], contradictions: [] };
|
|
356
|
+
}
|
|
357
|
+
const pages = readdirSync(pagesDir).filter(f => f.endsWith('.md'));
|
|
358
|
+
// Find orphan pages (not referenced by index or other pages)
|
|
359
|
+
const orphanPages = [];
|
|
360
|
+
const allPageContents = pages.map(p => readFileSync(join(pagesDir, p), 'utf-8')).join('\n');
|
|
361
|
+
for (const page of pages) {
|
|
362
|
+
const pageName = page.replace('.md', '');
|
|
363
|
+
if (!allPageContents.includes(`[[${pageName}]]`) && !allPageContents.includes(page)) {
|
|
364
|
+
orphanPages.push(page);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// Find broken links
|
|
368
|
+
const missingLinks = [];
|
|
369
|
+
const linkPattern = /\[\[([^\]]+)\]\]/g;
|
|
370
|
+
for (const page of pages) {
|
|
371
|
+
const content = readFileSync(join(pagesDir, page), 'utf-8');
|
|
372
|
+
let match;
|
|
373
|
+
while ((match = linkPattern.exec(content)) !== null) {
|
|
374
|
+
const linkedPage = match[1];
|
|
375
|
+
if (!pages.includes(`${linkedPage}.md`) && !linkedPage.startsWith('source-')) {
|
|
376
|
+
missingLinks.push(`${page} → ${linkedPage}`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
const issues = [];
|
|
381
|
+
for (const orphan of orphanPages) {
|
|
382
|
+
issues.push({
|
|
383
|
+
page: orphan,
|
|
384
|
+
type: 'orphan',
|
|
385
|
+
description: 'Page is not referenced by any other page',
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
for (const missing of missingLinks) {
|
|
389
|
+
const [page, target] = missing.split(' → ');
|
|
390
|
+
issues.push({
|
|
391
|
+
page: page,
|
|
392
|
+
type: 'missing-link',
|
|
393
|
+
description: `Links to non-existent page: ${target}`,
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
return {
|
|
397
|
+
issues,
|
|
398
|
+
orphanPages,
|
|
399
|
+
missingLinks,
|
|
400
|
+
contradictions: [], // TODO: LLM-based contradiction detection
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Rebuild index.md from all pages.
|
|
405
|
+
*/
|
|
406
|
+
export async function rebuildIndex(wikiDir) {
|
|
407
|
+
const pagesDir = join(wikiDir, 'pages');
|
|
408
|
+
if (!existsSync(pagesDir))
|
|
409
|
+
return;
|
|
410
|
+
const pages = readdirSync(pagesDir).filter(f => f.endsWith('.md'));
|
|
411
|
+
const byType = {
|
|
412
|
+
entity: [],
|
|
413
|
+
concept: [],
|
|
414
|
+
source: [],
|
|
415
|
+
comparison: [],
|
|
416
|
+
analysis: [],
|
|
417
|
+
};
|
|
418
|
+
for (const page of pages) {
|
|
419
|
+
const content = readFileSync(join(pagesDir, page), 'utf-8');
|
|
420
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
421
|
+
if (!frontmatterMatch)
|
|
422
|
+
continue;
|
|
423
|
+
const frontmatter = parseFrontmatter(frontmatterMatch[1]);
|
|
424
|
+
const typeValue = frontmatter.type;
|
|
425
|
+
const type = (Array.isArray(typeValue) ? typeValue[0] : typeValue) || 'concept';
|
|
426
|
+
const titleMatch = content.match(/^#\s+(.+)$/m);
|
|
427
|
+
const title = titleMatch ? titleMatch[1] : page.replace('.md', '');
|
|
428
|
+
const firstParagraph = content
|
|
429
|
+
.replace(/^---[\s\S]*?---/, '')
|
|
430
|
+
.replace(/^#.*$/gm, '')
|
|
431
|
+
.trim()
|
|
432
|
+
.split('\n\n')[0] || '';
|
|
433
|
+
const summary = firstParagraph.slice(0, 100).replace(/\n/g, ' ');
|
|
434
|
+
if (byType[type]) {
|
|
435
|
+
byType[type].push({ name: page.replace('.md', ''), title, summary });
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
const indexLines = ['# Wiki Index\n'];
|
|
439
|
+
const sections = [
|
|
440
|
+
['Entities', 'entity'],
|
|
441
|
+
['Concepts', 'concept'],
|
|
442
|
+
['Sources', 'source'],
|
|
443
|
+
['Comparisons', 'comparison'],
|
|
444
|
+
['Analysis', 'analysis'],
|
|
445
|
+
];
|
|
446
|
+
for (const [sectionTitle, type] of sections) {
|
|
447
|
+
if (byType[type].length > 0) {
|
|
448
|
+
indexLines.push(`## ${sectionTitle}\n`);
|
|
449
|
+
for (const item of byType[type]) {
|
|
450
|
+
indexLines.push(`- [${item.title}](pages/${item.name}.md) — ${item.summary}`);
|
|
451
|
+
}
|
|
452
|
+
indexLines.push('');
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
writeFileSync(join(wikiDir, 'index.md'), indexLines.join('\n'));
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Search wiki pages by keyword.
|
|
459
|
+
*/
|
|
460
|
+
export function searchWiki(keyword, wikiDir) {
|
|
461
|
+
const pagesDir = join(wikiDir, 'pages');
|
|
462
|
+
if (!existsSync(pagesDir))
|
|
463
|
+
return [];
|
|
464
|
+
const pages = readdirSync(pagesDir).filter(f => f.endsWith('.md'));
|
|
465
|
+
const results = [];
|
|
466
|
+
const searchTerm = keyword.toLowerCase();
|
|
467
|
+
for (const page of pages) {
|
|
468
|
+
const content = readFileSync(join(pagesDir, page), 'utf-8');
|
|
469
|
+
if (content.toLowerCase().includes(searchTerm)) {
|
|
470
|
+
const lines = content.split('\n');
|
|
471
|
+
const matches = lines
|
|
472
|
+
.filter(line => line.toLowerCase().includes(searchTerm))
|
|
473
|
+
.slice(0, 3);
|
|
474
|
+
results.push({ page, matches });
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
return results;
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Get wiki statistics.
|
|
481
|
+
*/
|
|
482
|
+
export function getWikiStats(wikiDir) {
|
|
483
|
+
const pagesDir = join(wikiDir, 'pages');
|
|
484
|
+
const sourcesDir = join(wikiDir, 'sources');
|
|
485
|
+
if (!existsSync(pagesDir)) {
|
|
486
|
+
return {
|
|
487
|
+
totalPages: 0,
|
|
488
|
+
byType: {},
|
|
489
|
+
totalSources: 0,
|
|
490
|
+
lastUpdated: 'never',
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
const pages = readdirSync(pagesDir).filter(f => f.endsWith('.md'));
|
|
494
|
+
const sources = existsSync(sourcesDir) ? readdirSync(sourcesDir).filter(f => f.endsWith('.md')) : [];
|
|
495
|
+
const byType = {};
|
|
496
|
+
let latestUpdate = 0;
|
|
497
|
+
for (const page of pages) {
|
|
498
|
+
const content = readFileSync(join(pagesDir, page), 'utf-8');
|
|
499
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
500
|
+
if (frontmatterMatch) {
|
|
501
|
+
const frontmatter = parseFrontmatter(frontmatterMatch[1]);
|
|
502
|
+
const typeValue = frontmatter.type;
|
|
503
|
+
const type = (Array.isArray(typeValue) ? typeValue[0] : typeValue) || 'unknown';
|
|
504
|
+
byType[type] = (byType[type] || 0) + 1;
|
|
505
|
+
if (frontmatter.updated) {
|
|
506
|
+
const updatedValue = frontmatter.updated;
|
|
507
|
+
const updatedStr = Array.isArray(updatedValue) ? updatedValue[0] : updatedValue;
|
|
508
|
+
const updateTime = new Date(updatedStr).getTime();
|
|
509
|
+
if (updateTime > latestUpdate)
|
|
510
|
+
latestUpdate = updateTime;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
const stat = statSync(join(pagesDir, page));
|
|
514
|
+
if (stat.mtimeMs > latestUpdate)
|
|
515
|
+
latestUpdate = stat.mtimeMs;
|
|
516
|
+
}
|
|
517
|
+
return {
|
|
518
|
+
totalPages: pages.length,
|
|
519
|
+
byType,
|
|
520
|
+
totalSources: sources.length,
|
|
521
|
+
lastUpdated: latestUpdate > 0 ? new Date(latestUpdate).toISOString().split('T')[0] : 'never',
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Get recent log entries.
|
|
526
|
+
*/
|
|
527
|
+
export function getRecentLogs(wikiDir, count = 10) {
|
|
528
|
+
const logPath = join(wikiDir, 'log.md');
|
|
529
|
+
if (!existsSync(logPath))
|
|
530
|
+
return [];
|
|
531
|
+
const content = readFileSync(logPath, 'utf-8');
|
|
532
|
+
const entries = content.split(/^## /m).filter(e => e.trim()).slice(-count);
|
|
533
|
+
return entries.map(e => '## ' + e.trim());
|
|
534
|
+
}
|
|
535
|
+
// ─── Helper Functions ────────────────────────────────────────────
|
|
536
|
+
function sanitizeFilename(name) {
|
|
537
|
+
return name
|
|
538
|
+
.replace(/[^a-zA-Z0-9-_]/g, '-')
|
|
539
|
+
.replace(/-+/g, '-')
|
|
540
|
+
.replace(/^-|-$/g, '')
|
|
541
|
+
.toLowerCase();
|
|
542
|
+
}
|
|
543
|
+
function slugify(text) {
|
|
544
|
+
return text
|
|
545
|
+
.toLowerCase()
|
|
546
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
547
|
+
.replace(/^-|-$/g, '');
|
|
548
|
+
}
|
|
549
|
+
function parseFrontmatter(yaml) {
|
|
550
|
+
const result = {};
|
|
551
|
+
for (const line of yaml.split('\n')) {
|
|
552
|
+
const match = line.match(/^(\w+):\s*(.+)$/);
|
|
553
|
+
if (match) {
|
|
554
|
+
const key = match[1];
|
|
555
|
+
const value = match[2];
|
|
556
|
+
// Parse arrays
|
|
557
|
+
if (value.startsWith('[') && value.endsWith(']')) {
|
|
558
|
+
result[key] = value
|
|
559
|
+
.slice(1, -1)
|
|
560
|
+
.split(',')
|
|
561
|
+
.map(s => s.trim().replace(/^['"]|['"]$/g, ''));
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
result[key] = value.trim().replace(/^['"]|['"]$/g, '');
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
return result;
|
|
569
|
+
}
|
|
570
|
+
function findRelevantPages(wikiDir, keywords) {
|
|
571
|
+
const pagesDir = join(wikiDir, 'pages');
|
|
572
|
+
if (!existsSync(pagesDir))
|
|
573
|
+
return [];
|
|
574
|
+
const pages = readdirSync(pagesDir).filter(f => f.endsWith('.md'));
|
|
575
|
+
const scored = [];
|
|
576
|
+
for (const page of pages) {
|
|
577
|
+
const content = readFileSync(join(pagesDir, page), 'utf-8').toLowerCase();
|
|
578
|
+
let score = 0;
|
|
579
|
+
for (const keyword of keywords) {
|
|
580
|
+
const occurrences = (content.match(new RegExp(keyword, 'g')) || []).length;
|
|
581
|
+
score += occurrences;
|
|
582
|
+
}
|
|
583
|
+
if (score > 0) {
|
|
584
|
+
scored.push({ page, score });
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
return scored
|
|
588
|
+
.sort((a, b) => b.score - a.score)
|
|
589
|
+
.map(s => s.page);
|
|
590
|
+
}
|
|
591
|
+
function updatePageWithNewInfo(existingContent, newInfo, sourcePage, today) {
|
|
592
|
+
// Update frontmatter updated field
|
|
593
|
+
const updatedContent = existingContent.replace(/updated: \d{4}-\d{2}-\d{2}/, `updated: ${today}`);
|
|
594
|
+
// Add to sources array if not already present
|
|
595
|
+
let finalContent = updatedContent;
|
|
596
|
+
if (!finalContent.includes(sourcePage)) {
|
|
597
|
+
finalContent = finalContent.replace(/sources: \[(.*?)\]/, (match, sources) => {
|
|
598
|
+
const sourceList = sources.split(',').map((s) => s.trim()).filter((s) => s);
|
|
599
|
+
sourceList.push(sourcePage);
|
|
600
|
+
return `sources: [${sourceList.join(', ')}]`;
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
// Add new info before "## References" section if it doesn't already exist
|
|
604
|
+
if (!finalContent.includes(newInfo.slice(0, 50))) {
|
|
605
|
+
const referencesIndex = finalContent.indexOf('## References');
|
|
606
|
+
if (referencesIndex > 0) {
|
|
607
|
+
finalContent = finalContent.slice(0, referencesIndex) +
|
|
608
|
+
`\n### Additional Information\n\n${newInfo}\n\n` +
|
|
609
|
+
finalContent.slice(referencesIndex);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
return finalContent;
|
|
613
|
+
}
|
|
614
|
+
//# sourceMappingURL=wiki.js.map
|
package/dist/wiki.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki.js","sourceRoot":"","sources":["../src/wiki.ts"],"names":[],"mappings":"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"}
|