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.
Files changed (238) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +259 -259
  3. package/bundled-skills/CORE_SKILLS.txt +18 -18
  4. package/bundled-skills/backend-expert/SKILL.md +97 -97
  5. package/bundled-skills/code-review/SKILL.md +280 -280
  6. package/bundled-skills/code-review-expert/SKILL.md +85 -85
  7. package/bundled-skills/context-budget-analyzer/SKILL.md +76 -76
  8. package/bundled-skills/context-compressor/SKILL.md +75 -75
  9. package/bundled-skills/context-optimization-suite/SKILL.md +162 -162
  10. package/bundled-skills/frontend-expert/SKILL.md +93 -93
  11. package/bundled-skills/github/SKILL.md +12 -12
  12. package/bundled-skills/high-agency/SKILL.md +473 -473
  13. package/bundled-skills/high-agency/references/builder-patterns.md +126 -126
  14. package/bundled-skills/high-agency/references/recovery-playbook.md +298 -298
  15. package/bundled-skills/memory-manager/SKILL.md +214 -214
  16. package/bundled-skills/memory-manager/references/advanced-config.md +65 -65
  17. package/bundled-skills/orchestrator/SKILL.md +681 -681
  18. package/bundled-skills/planning-with-files/SKILL.md +193 -193
  19. package/bundled-skills/skill-creator/SKILL.md +220 -220
  20. package/bundled-skills/testing-expert/SKILL.md +99 -99
  21. package/bundled-skills/verify/SKILL.md +15 -15
  22. package/dist/agent.d.ts +5 -0
  23. package/dist/agent.js +11 -1
  24. package/dist/agent.js.map +1 -1
  25. package/dist/agents/catalog.d.ts +47 -0
  26. package/dist/agents/catalog.js +63 -5
  27. package/dist/agents/catalog.js.map +1 -1
  28. package/dist/agents/router.d.ts +12 -1
  29. package/dist/agents/router.js +43 -3
  30. package/dist/agents/router.js.map +1 -1
  31. package/dist/agents/spawn.js +36 -18
  32. package/dist/agents/spawn.js.map +1 -1
  33. package/dist/autonomous.js +5 -5
  34. package/dist/cli.js +23 -21
  35. package/dist/cli.js.map +1 -1
  36. package/dist/compactor.js +39 -39
  37. package/dist/dream.js +29 -29
  38. package/dist/image-input.d.ts +44 -0
  39. package/dist/image-input.js +161 -0
  40. package/dist/image-input.js.map +1 -0
  41. package/dist/memory.js +13 -13
  42. package/dist/project.js +15 -15
  43. package/dist/repl.js +88 -0
  44. package/dist/repl.js.map +1 -1
  45. package/dist/skills.js +54 -54
  46. package/dist/sub-agents.js +65 -65
  47. package/dist/tools/browser.js +21 -21
  48. package/dist/tools/claude-code.js +10 -10
  49. package/dist/web.js +7 -7
  50. package/dist/wiki-commands.d.ts +2 -0
  51. package/dist/wiki-commands.js +249 -0
  52. package/dist/wiki-commands.js.map +1 -0
  53. package/dist/wiki.d.ts +90 -0
  54. package/dist/wiki.js +614 -0
  55. package/dist/wiki.js.map +1 -0
  56. package/knowledge/advanced-patterns.md +70 -70
  57. package/knowledge/agent-directives.md +74 -74
  58. package/knowledge/api-integration-patterns.md +102 -0
  59. package/knowledge/code-review-protocol.md +69 -0
  60. package/knowledge/dream.md +36 -36
  61. package/knowledge/engineering.md +52 -46
  62. package/knowledge/error-catalog.md +38 -33
  63. package/knowledge/event-driven-architecture.md +43 -0
  64. package/knowledge/external-alignment.md +47 -0
  65. package/knowledge/high-agency.md +73 -0
  66. package/knowledge/image-generation.md +48 -0
  67. package/knowledge/index.json +194 -169
  68. package/knowledge/llm-wiki-pattern.md +71 -0
  69. package/knowledge/long-task-management.md +79 -0
  70. package/knowledge/memory/cache-optimization-and-skill-integration.md +102 -102
  71. package/knowledge/memory/engineering-patterns.md +134 -134
  72. package/knowledge/memory/feedback_root_structure.md +15 -15
  73. package/knowledge/memory/project-contexts.md +69 -69
  74. package/knowledge/memory/tools-and-services.md +85 -85
  75. package/knowledge/memory-management.md +72 -0
  76. package/knowledge/rules/advisor-strategy.md +204 -0
  77. package/knowledge/rules/agents.md +62 -62
  78. package/knowledge/rules/blocking-rules.md +323 -323
  79. package/knowledge/rules/cache-management.md +379 -379
  80. package/knowledge/rules/capability-evolution.md +132 -132
  81. package/knowledge/rules/coding.md +126 -126
  82. package/knowledge/rules/engineering-workflows.md +225 -225
  83. package/knowledge/rules/evomap-content-guidelines.md +354 -354
  84. package/knowledge/rules/evomap-guide.md +224 -224
  85. package/knowledge/rules/external-alignment.md +22 -0
  86. package/knowledge/rules/git.md +31 -31
  87. package/knowledge/rules/hooks.md +106 -106
  88. package/knowledge/rules/performance.md +101 -101
  89. package/knowledge/rules/remotion-auto-production.md +1120 -1120
  90. package/knowledge/rules/security.md +46 -46
  91. package/knowledge/rules/testing.md +32 -32
  92. package/knowledge/rules/work-mode.md +208 -208
  93. package/knowledge/rules.md +62 -62
  94. package/knowledge/self-evolution.md +78 -0
  95. package/knowledge/self-rationalization-guard.md +52 -0
  96. package/knowledge/skills/Skill_Seekers.md +1722 -1722
  97. package/knowledge/skills/ab-test-setup.md +557 -557
  98. package/knowledge/skills/agent-sdk-dev.md +238 -238
  99. package/knowledge/skills/agent-tools.md +136 -136
  100. package/knowledge/skills/analytics-tracking.md +597 -597
  101. package/knowledge/skills/artifacts-builder.md +89 -89
  102. package/knowledge/skills/asana.md +12 -12
  103. package/knowledge/skills/backend-expert.md +97 -97
  104. package/knowledge/skills/brand-voice.md +481 -481
  105. package/knowledge/skills/browser-use.md +419 -419
  106. package/knowledge/skills/cache-optimization-skill.md +179 -179
  107. package/knowledge/skills/canvas-design.md +147 -147
  108. package/knowledge/skills/citation-validator.md +203 -203
  109. package/knowledge/skills/clangd-lsp.md +52 -52
  110. package/knowledge/skills/code-review-expert.md +85 -85
  111. package/knowledge/skills/code-review.md +280 -280
  112. package/knowledge/skills/code-simplifier.md +12 -12
  113. package/knowledge/skills/commit-commands.md +258 -258
  114. package/knowledge/skills/competitor-alternatives.md +795 -795
  115. package/knowledge/skills/content-atomizer.md +910 -910
  116. package/knowledge/skills/content-research-writer.md +605 -605
  117. package/knowledge/skills/context-optimization-suite.md +162 -162
  118. package/knowledge/skills/context7.md +12 -12
  119. package/knowledge/skills/copy-editing.md +494 -494
  120. package/knowledge/skills/copywriting.md +510 -510
  121. package/knowledge/skills/csharp-lsp.md +40 -40
  122. package/knowledge/skills/decision-making-framework.md +154 -154
  123. package/knowledge/skills/developer-growth-analysis.md +335 -335
  124. package/knowledge/skills/direct-response-copy.md +2336 -2336
  125. package/knowledge/skills/docker-expert.md +229 -229
  126. package/knowledge/skills/document-skills.md +12 -12
  127. package/knowledge/skills/documentation-expert.md +126 -126
  128. package/knowledge/skills/email-sequence.md +1061 -1061
  129. package/knowledge/skills/email-sequences.md +910 -910
  130. package/knowledge/skills/example-plugin.md +72 -72
  131. package/knowledge/skills/explanatory-output-style.md +82 -82
  132. package/knowledge/skills/feature-dev.md +458 -458
  133. package/knowledge/skills/file-organizer.md +466 -466
  134. package/knowledge/skills/firebase.disabled.md +12 -12
  135. package/knowledge/skills/form-cro.md +488 -488
  136. package/knowledge/skills/free-tool-strategy.md +636 -636
  137. package/knowledge/skills/frontend-design-offical.md +55 -55
  138. package/knowledge/skills/frontend-design.md +41 -41
  139. package/knowledge/skills/frontend-expert.md +93 -93
  140. package/knowledge/skills/github.md +12 -12
  141. package/knowledge/skills/gitlab.md +12 -12
  142. package/knowledge/skills/gopls-lsp.md +32 -32
  143. package/knowledge/skills/got-controller.md +218 -218
  144. package/knowledge/skills/greptile.md +72 -72
  145. package/knowledge/skills/hookify.md +376 -376
  146. package/knowledge/skills/image-editor.md +189 -189
  147. package/knowledge/skills/image-enhancer.md +109 -109
  148. package/knowledge/skills/jdtls-lsp.md +49 -49
  149. package/knowledge/skills/json-canvas.md +654 -654
  150. package/knowledge/skills/keyword-research.md +559 -559
  151. package/knowledge/skills/kotlin-lsp.md +28 -28
  152. package/knowledge/skills/laravel-boost.md +12 -12
  153. package/knowledge/skills/launch-strategy.md +394 -394
  154. package/knowledge/skills/lead-magnet.md +393 -393
  155. package/knowledge/skills/learning-output-style.md +106 -106
  156. package/knowledge/skills/linear.md +12 -12
  157. package/knowledge/skills/lua-lsp.md +47 -47
  158. package/knowledge/skills/marketing-ideas.md +720 -720
  159. package/knowledge/skills/marketing-psychology.md +534 -534
  160. package/knowledge/skills/mcp-builder.md +369 -369
  161. package/knowledge/skills/meeting-insights-analyzer.md +347 -347
  162. package/knowledge/skills/memory-evolution-system.md +172 -172
  163. package/knowledge/skills/multi-lens-thinking.md +407 -407
  164. package/knowledge/skills/nano-banana-pro.md +116 -116
  165. package/knowledge/skills/newsletter.md +736 -736
  166. package/knowledge/skills/notebooklm.md +296 -296
  167. package/knowledge/skills/obsidian-bases.md +634 -634
  168. package/knowledge/skills/obsidian-markdown.md +651 -651
  169. package/knowledge/skills/onboarding-cro.md +494 -494
  170. package/knowledge/skills/orchestrator.md +681 -681
  171. package/knowledge/skills/page-cro.md +379 -379
  172. package/knowledge/skills/paid-ads.md +624 -624
  173. package/knowledge/skills/paywall-upgrade-cro.md +651 -651
  174. package/knowledge/skills/php-lsp.md +36 -36
  175. package/knowledge/skills/planning-with-files.md +193 -193
  176. package/knowledge/skills/playwright.md +12 -12
  177. package/knowledge/skills/plugin-dev.md +434 -434
  178. package/knowledge/skills/popup-cro.md +520 -520
  179. package/knowledge/skills/positioning-angles.md +330 -330
  180. package/knowledge/skills/pr-review-toolkit.md +359 -359
  181. package/knowledge/skills/pricing-strategy.md +777 -777
  182. package/knowledge/skills/programmatic-seo.md +714 -714
  183. package/knowledge/skills/pyright-lsp.md +43 -43
  184. package/knowledge/skills/quality-assurance-framework.md +168 -168
  185. package/knowledge/skills/question-refiner.md +160 -160
  186. package/knowledge/skills/ralph-loop.md +205 -205
  187. package/knowledge/skills/refactoring-expert.md +103 -103
  188. package/knowledge/skills/referral-program.md +668 -668
  189. package/knowledge/skills/research-executor.md +164 -164
  190. package/knowledge/skills/review-with-security.md +12 -12
  191. package/knowledge/skills/rust-analyzer-lsp.md +50 -50
  192. package/knowledge/skills/schema-markup.md +647 -647
  193. package/knowledge/skills/security-audit-expert.md +124 -124
  194. package/knowledge/skills/security-expert.md +140 -140
  195. package/knowledge/skills/security-guidance.md +12 -12
  196. package/knowledge/skills/seedance-prompt.md +139 -139
  197. package/knowledge/skills/self-evolution.md +1160 -1160
  198. package/knowledge/skills/seo-audit.md +432 -432
  199. package/knowledge/skills/seo-content.md +787 -787
  200. package/knowledge/skills/serena.md +12 -12
  201. package/knowledge/skills/signup-flow-cro.md +409 -409
  202. package/knowledge/skills/skill-creator.md +220 -220
  203. package/knowledge/skills/skill-manager.md +226 -226
  204. package/knowledge/skills/skill-share.md +98 -98
  205. package/knowledge/skills/slack.md +12 -12
  206. package/knowledge/skills/social-content.md +878 -878
  207. package/knowledge/skills/spec-flow-skill.md +124 -124
  208. package/knowledge/skills/stripe.md +12 -12
  209. package/knowledge/skills/supabase.md +12 -12
  210. package/knowledge/skills/swift-lsp.md +40 -40
  211. package/knowledge/skills/synthesizer.md +236 -236
  212. package/knowledge/skills/template-skill.md +16 -16
  213. package/knowledge/skills/testing-expert.md +99 -99
  214. package/knowledge/skills/theme-factory.md +72 -72
  215. package/knowledge/skills/tiktok-research.md +208 -208
  216. package/knowledge/skills/typescript-lsp.md +36 -36
  217. package/knowledge/skills/ui-ux-pro-max.md +247 -247
  218. package/knowledge/skills/verify.md +15 -15
  219. package/knowledge/skills/visual-prompt-engineer.md +102 -102
  220. package/knowledge/skills/webapp-testing.md +111 -111
  221. package/knowledge/skills/wide-research.md +191 -191
  222. package/knowledge/system.md +93 -93
  223. package/knowledge/task-router.md +46 -37
  224. package/knowledge/verification.md +38 -38
  225. package/knowledge/worker-prompt-craft.md +66 -0
  226. package/knowledge/workflows/3d-viz.md +47 -47
  227. package/knowledge/workflows/data-pipeline.md +47 -47
  228. package/knowledge/workflows/db-migration.md +51 -51
  229. package/knowledge/workflows/feature-dev.md +41 -41
  230. package/knowledge/workflows/tdd-flow.md +52 -52
  231. package/knowledge/workflows/ui-verify.md +51 -51
  232. package/package.json +74 -74
  233. package/dist/claude-bridge.d.ts +0 -18
  234. package/dist/claude-bridge.js +0 -91
  235. package/dist/claude-bridge.js.map +0 -1
  236. package/dist/tools/claude-bridge-tool.d.ts +0 -4
  237. package/dist/tools/claude-bridge-tool.js +0 -44
  238. 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.js","sourceRoot":"","sources":["../src/wiki.ts"],"names":[],"mappings":"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"}