bluera-knowledge 0.27.2 → 0.27.4

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/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [0.27.4](https://github.com/blueraai/bluera-knowledge/compare/v0.27.3...v0.27.4) (2026-02-10)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * **gitignore:** add semantic equivalence, dedup, and managed section markers ([a07d6fe](https://github.com/blueraai/bluera-knowledge/commit/a07d6fe2bdf5214f8deee86b1c888eb318356809))
11
+ * **plugin:** remove redundant hooks manifest entry ([6fa1e6f](https://github.com/blueraai/bluera-knowledge/commit/6fa1e6f1401464db2d2bd8d2929524b73bdc6a4b))
12
+
13
+ ## [0.27.3](https://github.com/blueraai/bluera-knowledge/compare/v0.27.2...v0.27.3) (2026-02-07)
14
+
5
15
  ## [0.27.2](https://github.com/blueraai/bluera-knowledge/compare/v0.27.1...v0.27.2) (2026-02-05)
6
16
 
7
17
 
package/README.md CHANGED
@@ -452,200 +452,18 @@ Combine canonical library code with project-specific patterns:
452
452
 
453
453
  ## 🔧 Troubleshooting
454
454
 
455
- ### Quick Diagnostics
456
-
457
- Run `/bluera-knowledge:doctor` to diagnose common issues. This checks:
458
- - Build tools (make/gcc) - required for native modules
459
- - Node.js installation
460
- - Plugin dependencies (node_modules)
461
- - MCP wrapper installation
462
- - Python 3 (optional, for embeddings)
463
- - Playwright browser (optional, for web crawling)
464
-
465
- Works even when MCP is broken (uses Bash tool directly).
466
-
467
- <details>
468
- <summary><b>❌ Command not found or not recognized</b></summary>
469
-
470
- Ensure the plugin is installed and enabled:
471
-
472
- ```bash
473
- /plugin list
474
- /plugin enable bluera-knowledge
475
- ```
476
-
477
- If the plugin isn't listed, install it:
478
-
479
- ```bash
480
- /plugin marketplace add blueraai/bluera-marketplace
481
- /plugin install bluera-knowledge@bluera
482
- ```
483
- </details>
484
-
485
- <details>
486
- <summary><b>🔌 MCP server shows as "failed" in /plugin</b></summary>
487
-
488
- If the MCP server shows as failed after installation:
489
-
490
- 1. **Run `/bluera-knowledge:doctor`** - This diagnoses the most common issues
491
- 2. **Restart Claude Code** - MCP servers require a restart to initialize
492
- 3. **Check logs:** Run `/logs errors` to see recent errors or `/logs module bootstrap` for startup logs
493
- 4. **Check status:** Run `/mcp` to see connection status
494
- 5. **Reinstall:** Try `/plugin uninstall bluera-knowledge` then `/plugin install bluera-knowledge@bluera`
495
-
496
- **Common MCP failure causes:**
497
-
498
- | Symptom | Cause | Fix |
499
- |---------|-------|-----|
500
- | `npm ERR! ERESOLVE` in logs | Peer dependency conflict | Fixed in v0.22.6+ with npm flag |
501
- | Old plugin version running | Multiple cached versions | Fixed in v0.22.7+ (version sorting) |
502
- | `make not found` | Missing build tools | Install `build-essential` (Linux) |
503
- | Compilation errors on Node 24 | V8 API changes | Use Node.js v20.x or v22.x |
504
-
505
- If the issue persists, check that Claude Code is v2.0.65 or later (earlier versions had MCP loading bugs).
506
- </details>
507
-
508
- <details>
509
- <summary><b>🌐 Web crawling fails</b></summary>
510
-
511
- Check Playwright browser installation:
512
-
513
- ```bash
514
- npx playwright install chromium
515
- ```
516
-
517
- The plugin attempts to auto-install Playwright browsers on first use, but manual installation may be needed in some environments.
518
- </details>
519
-
520
- <details>
521
- <summary><b>🔍 Search returns no results</b></summary>
522
-
523
- 1. Verify store exists: `/bluera-knowledge:stores`
524
- 2. Check store is indexed: `/bluera-knowledge:index <store-name>`
525
- 3. Try broader search terms
526
- 4. Verify you're searching the correct store with `--stores=<name>`
527
- </details>
528
-
529
- <details>
530
- <summary><b>⚠️ "Model mismatch" error</b></summary>
531
-
532
- This error occurs when a store was indexed with a different embedding model than the current configuration. As of v0.20+, stores are indexed with `bge-small-en-v1.5` (previously `all-MiniLM-L6-v2`).
533
-
534
- **Solution:** Reindex the affected store:
535
-
536
- ```bash
537
- /bluera-knowledge:index <store-name>
538
- ```
539
-
540
- **Check model status for all stores:**
541
-
542
- ```bash
543
- # Via MCP execute command
544
- execute stores:check-models
545
- ```
546
-
547
- This lists all stores with their embedding model and flags any that need reindexing.
548
- </details>
549
-
550
- <details>
551
- <summary><b>❓ "Store not found" error</b></summary>
552
-
553
- List all stores to see available names and IDs:
554
-
555
- ```bash
556
- /bluera-knowledge:stores
557
- ```
558
-
559
- Use the exact store name or ID shown in the table.
560
- </details>
561
-
562
- <details>
563
- <summary><b>🔨 Native module compilation fails (Node.js v24)</b></summary>
564
-
565
- tree-sitter and lancedb require native module compilation. Node.js v24 introduced V8 API changes that break these modules.
566
-
567
- **Solution:** Use Node.js v20.x or v22.x (LTS versions):
568
-
569
- ```bash
570
- # Using nvm
571
- nvm install 22
572
- nvm use 22
573
- ```
574
-
575
- Run `/bluera-knowledge:doctor` to verify your environment.
576
- </details>
577
-
578
- <details>
579
- <summary><b>🐧 Linux: "make not found" or build errors</b></summary>
580
-
581
- Native modules require build tools:
582
-
583
- ```bash
584
- # Debian/Ubuntu
585
- sudo apt install build-essential
586
-
587
- # Fedora/RHEL
588
- sudo dnf groupinstall "Development Tools"
589
- ```
590
-
591
- Then restart Claude Code for auto-setup to complete.
592
- </details>
593
-
594
- <details>
595
- <summary><b>⏱️ Indexing is slow or fails</b></summary>
596
-
597
- Large repositories (10,000+ files) take longer to index. If indexing fails:
598
-
599
- 1. Check available disk space
600
- 2. Ensure the source repository/folder is accessible
601
- 3. For repo stores, verify git is installed: `git --version`
602
- 4. Check for network connectivity (for repo stores)
603
- 5. Check logs for errors: `/logs errors` or `/logs search "index"`
604
- </details>
605
-
606
- <details>
607
- <summary><b>🤖 "Claude CLI not found" during crawl</b></summary>
608
-
609
- This means intelligent crawling is unavailable. The crawler will automatically use simple BFS mode instead.
610
-
611
- To enable intelligent crawling with `--crawl` and `--extract`:
612
- 1. Install Claude Code: https://claude.com/code
613
- 2. Ensure `claude` command is in PATH: `which claude`
614
-
615
- Simple mode still crawls effectively—it just doesn't use AI to select which pages to crawl or extract specific content.
616
- </details>
617
-
618
- <details>
619
- <summary><b>📋 How to view logs for debugging</b></summary>
620
-
621
- The plugin logs all MCP server operations to `.bluera/bluera-knowledge/logs/app.log` (relative to project root).
622
-
623
- **View logs using the `/logs` command:**
624
-
625
- ```bash
626
- /logs # Watch logs in real-time (tail -f)
627
- /logs view 50 # View last 50 log entries
628
- /logs errors # Show only error-level logs
629
- /logs module mcp-store # Filter by module (mcp-server, mcp-store, mcp-execute, mcp-job, mcp-sync, bootstrap)
630
- /logs search "pattern" # Search for a pattern
631
- ```
632
-
633
- **Log modules:**
634
- - `bootstrap` - MCP server startup and dependency installation
635
- - `mcp-server` - Core MCP server operations
636
- - `mcp-store` - Store create/list/delete operations
637
- - `mcp-search` - Search queries and results
638
- - `mcp-execute` - Meta-tool command execution
639
- - `mcp-job` - Background job status
640
- - `mcp-sync` - Store sync operations
641
-
642
- **Manual access:**
643
- ```bash
644
- tail -f .bluera/bluera-knowledge/logs/app.log
645
- ```
646
-
647
- Logs are JSON formatted (NDJSON) and can be processed with `jq` for pretty-printing.
648
- </details>
455
+ Run `/bluera-knowledge:doctor` for quick diagnostics (works even when MCP is broken).
456
+
457
+ **Common issues:** See [docs/troubleshooting.md](docs/troubleshooting.md) for solutions to:
458
+ - Command not found or not recognized
459
+ - MCP server failures
460
+ - Web crawling issues
461
+ - Search returning no results
462
+ - Model mismatch errors
463
+ - Native module compilation (Node.js v24)
464
+ - Linux build tool requirements
465
+ - Slow indexing
466
+ - Log viewing and debugging
649
467
 
650
468
  ---
651
469
 
@@ -827,6 +645,7 @@ This ensures:
827
645
  | [Commands Reference](docs/commands.md) | All slash commands with parameters and examples |
828
646
  | [Crawler Architecture](docs/crawler-architecture.md) | How the intelligent web crawler works |
829
647
  | [Token Efficiency](docs/token-efficiency.md) | How BK reduces token consumption vs web search |
648
+ | [Troubleshooting](docs/troubleshooting.md) | Common issues and solutions |
830
649
  | [CONTRIBUTING](CONTRIBUTING.md) | Development setup, testing, and release process |
831
650
 
832
651
  ---
@@ -2,7 +2,7 @@ import {
2
2
  createLogger,
3
3
  summarizePayload,
4
4
  truncateForLog
5
- } from "./chunk-GB5WKUBX.js";
5
+ } from "./chunk-WP2GERAJ.js";
6
6
 
7
7
  // src/crawl/intelligent-crawler.ts
8
8
  import { EventEmitter } from "events";
@@ -916,4 +916,4 @@ export {
916
916
  getCrawlStrategy,
917
917
  IntelligentCrawler
918
918
  };
919
- //# sourceMappingURL=chunk-S3DJUNUG.js.map
919
+ //# sourceMappingURL=chunk-BYLIDCWD.js.map
@@ -9,7 +9,7 @@ import {
9
9
  isRepoStoreDefinition,
10
10
  isWebStoreDefinition,
11
11
  summarizePayload
12
- } from "./chunk-GB5WKUBX.js";
12
+ } from "./chunk-WP2GERAJ.js";
13
13
  import {
14
14
  checkStoreModelCompatibility
15
15
  } from "./chunk-H25AEF47.js";
@@ -2402,4 +2402,4 @@ export {
2402
2402
  createMCPServer,
2403
2403
  runMCPServer
2404
2404
  };
2405
- //# sourceMappingURL=chunk-LBE2PTSB.js.map
2405
+ //# sourceMappingURL=chunk-UXT3BCAH.js.map
@@ -2207,20 +2207,17 @@ var ConfigService = class {
2207
2207
  import { readFile as readFile3, writeFile as writeFile3, access as access2 } from "fs/promises";
2208
2208
  import { join as join6 } from "path";
2209
2209
  var REQUIRED_PATTERNS = [
2210
- ".bluera/",
2211
- "!.bluera/",
2210
+ ".bluera/*",
2212
2211
  "!.bluera/bluera-knowledge/",
2212
+ ".bluera/bluera-knowledge/*",
2213
2213
  "!.bluera/bluera-knowledge/stores.config.json",
2214
2214
  "!.bluera/bluera-knowledge/config.json",
2215
2215
  "!.bluera/bluera-knowledge/skill-activation.json",
2216
2216
  ".bluera/bluera-knowledge/data/",
2217
2217
  ".bluera/bluera-knowledge/logs/"
2218
2218
  ];
2219
- var SECTION_HEADER = `
2220
- # Bluera Knowledge
2221
- # Config files (stores.config.json, config.json, skill-activation.json) can be committed
2222
- # Data directory (vector DB, cloned repos) and logs are not committed
2223
- `;
2219
+ var SECTION_BEGIN = "# BEGIN Bluera Knowledge";
2220
+ var SECTION_END = "# END Bluera Knowledge";
2224
2221
  async function fileExists2(path4) {
2225
2222
  try {
2226
2223
  await access2(path4);
@@ -2229,13 +2226,73 @@ async function fileExists2(path4) {
2229
2226
  return false;
2230
2227
  }
2231
2228
  }
2229
+ function isPatternSatisfied(requiredPattern, existingLines) {
2230
+ if (existingLines.includes(requiredPattern)) {
2231
+ return true;
2232
+ }
2233
+ switch (requiredPattern) {
2234
+ case ".bluera/*":
2235
+ return existingLines.includes(".bluera/");
2236
+ case "!.bluera/bluera-knowledge/":
2237
+ return existingLines.includes("!.bluera/bluera-knowledge");
2238
+ case ".bluera/bluera-knowledge/data/":
2239
+ case ".bluera/bluera-knowledge/logs/":
2240
+ return existingLines.includes(".bluera/bluera-knowledge/*");
2241
+ default:
2242
+ return false;
2243
+ }
2244
+ }
2245
+ function removeBkSection(content) {
2246
+ const lines = content.split("\n");
2247
+ const outputLines = [];
2248
+ let removed = false;
2249
+ let i = 0;
2250
+ while (i < lines.length) {
2251
+ const line = lines[i] ?? "";
2252
+ const trimmed = line.trim();
2253
+ if (trimmed === SECTION_BEGIN) {
2254
+ removed = true;
2255
+ i++;
2256
+ while (i < lines.length && (lines[i] ?? "").trim() !== SECTION_END) {
2257
+ i++;
2258
+ }
2259
+ if (i < lines.length) {
2260
+ i++;
2261
+ }
2262
+ continue;
2263
+ }
2264
+ if (trimmed === "# Bluera Knowledge") {
2265
+ removed = true;
2266
+ i++;
2267
+ while (i < lines.length) {
2268
+ const lt = (lines[i] ?? "").trim();
2269
+ if (lt === "" || lt.startsWith("#") || lt.includes(".bluera")) {
2270
+ i++;
2271
+ } else {
2272
+ break;
2273
+ }
2274
+ }
2275
+ continue;
2276
+ }
2277
+ outputLines.push(line);
2278
+ i++;
2279
+ }
2280
+ let lastIdx = outputLines.length - 1;
2281
+ while (lastIdx >= 0 && outputLines[lastIdx]?.trim() === "") {
2282
+ outputLines.pop();
2283
+ lastIdx--;
2284
+ }
2285
+ const cleaned = outputLines.length > 0 ? `${outputLines.join("\n")}
2286
+ ` : "";
2287
+ return { cleaned, removed };
2288
+ }
2232
2289
  var GitignoreService = class {
2233
2290
  gitignorePath;
2234
2291
  constructor(projectRoot) {
2235
2292
  this.gitignorePath = join6(projectRoot, ".gitignore");
2236
2293
  }
2237
2294
  /**
2238
- * Check if all required patterns are present in .gitignore
2295
+ * Check if all required patterns are semantically present in .gitignore
2239
2296
  */
2240
2297
  async hasRequiredPatterns() {
2241
2298
  const exists = await fileExists2(this.gitignorePath);
@@ -2244,50 +2301,62 @@ var GitignoreService = class {
2244
2301
  }
2245
2302
  const content = await readFile3(this.gitignorePath, "utf-8");
2246
2303
  const lines = content.split("\n").map((l) => l.trim());
2247
- for (const pattern of REQUIRED_PATTERNS) {
2248
- if (!lines.includes(pattern)) {
2249
- return false;
2250
- }
2251
- }
2252
- return true;
2304
+ return REQUIRED_PATTERNS.every((pattern) => isPatternSatisfied(pattern, lines));
2253
2305
  }
2254
2306
  /**
2255
2307
  * Ensure required .gitignore patterns are present.
2256
2308
  *
2257
2309
  * - Creates .gitignore if it doesn't exist
2258
- * - Appends missing patterns if .gitignore exists
2259
- * - Does nothing if all patterns are already present
2310
+ * - Removes existing managed sections (old or new format)
2311
+ * - Appends only semantically missing patterns with BEGIN/END markers
2312
+ * - Persists cleanup even when no patterns are missing
2260
2313
  *
2261
2314
  * @returns Object with updated flag and descriptive message
2262
2315
  */
2263
2316
  async ensureGitignorePatterns() {
2264
2317
  const exists = await fileExists2(this.gitignorePath);
2265
2318
  if (!exists) {
2266
- const content = `${SECTION_HEADER.trim()}
2267
- ${REQUIRED_PATTERNS.join("\n")}
2268
- `;
2319
+ const content = [SECTION_BEGIN, ...REQUIRED_PATTERNS, SECTION_END, ""].join("\n");
2269
2320
  await writeFile3(this.gitignorePath, content);
2270
2321
  return {
2271
2322
  updated: true,
2272
2323
  message: "Created .gitignore with Bluera Knowledge patterns"
2273
2324
  };
2274
2325
  }
2275
- const existingContent = await readFile3(this.gitignorePath, "utf-8");
2276
- const lines = existingContent.split("\n").map((l) => l.trim());
2277
- const missingPatterns = REQUIRED_PATTERNS.filter((pattern) => !lines.includes(pattern));
2326
+ let rawContent = await readFile3(this.gitignorePath, "utf-8");
2327
+ rawContent = rawContent.replace(/\r\n/g, "\n");
2328
+ const { cleaned, removed } = removeBkSection(rawContent);
2329
+ const cleanedLines = cleaned.split("\n").map((l) => l.trim());
2330
+ const missingPatterns = REQUIRED_PATTERNS.filter(
2331
+ (pattern) => !isPatternSatisfied(pattern, cleanedLines)
2332
+ );
2278
2333
  if (missingPatterns.length === 0) {
2334
+ if (removed) {
2335
+ await writeFile3(this.gitignorePath, cleaned);
2336
+ return {
2337
+ updated: true,
2338
+ message: "Cleaned redundant Bluera Knowledge section from .gitignore"
2339
+ };
2340
+ }
2279
2341
  return {
2280
2342
  updated: false,
2281
2343
  message: "All Bluera Knowledge patterns already present in .gitignore"
2282
2344
  };
2283
2345
  }
2284
- let newContent = existingContent;
2285
- if (!newContent.endsWith("\n")) {
2346
+ let newContent = cleaned;
2347
+ if (newContent.length > 0) {
2348
+ if (!newContent.endsWith("\n")) {
2349
+ newContent += "\n";
2350
+ }
2286
2351
  newContent += "\n";
2287
2352
  }
2288
- newContent += SECTION_HEADER;
2289
- newContent += `${missingPatterns.join("\n")}
2290
- `;
2353
+ newContent += [SECTION_BEGIN, ...missingPatterns, SECTION_END, ""].join("\n");
2354
+ if (newContent === rawContent) {
2355
+ return {
2356
+ updated: false,
2357
+ message: "All Bluera Knowledge patterns already present in .gitignore"
2358
+ };
2359
+ }
2291
2360
  await writeFile3(this.gitignorePath, newContent);
2292
2361
  return {
2293
2362
  updated: true,
@@ -6625,4 +6694,4 @@ export {
6625
6694
  createServices,
6626
6695
  destroyServices
6627
6696
  };
6628
- //# sourceMappingURL=chunk-GB5WKUBX.js.map
6697
+ //# sourceMappingURL=chunk-WP2GERAJ.js.map