bluera-knowledge 0.13.0 → 0.13.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.
@@ -0,0 +1,458 @@
1
+ # Claude Code & Claude Code Plugins — Best Practices (2026-01)
2
+
3
+ > This is a field guide for **Claude Code customization** (CLAUDE.md, rules, skills, subagents, hooks, MCP, output styles, settings) and **plugin / marketplace development** (plugin.json, commands, skills, hooks, MCP/LSP bundling, distribution, testing, troubleshooting).
4
+ > It synthesizes official docs plus recurring real-world gotchas from GitHub issues + community threads.
5
+
6
+ ---
7
+
8
+ ## 0) Quick decision guide (what to build)
9
+
10
+ ### Choose the lightest-weight lever that solves the problem
11
+
12
+ | You want to… | Use… | Why |
13
+ |---|---|---|
14
+ | Set project-wide standards, workflows, "how we do things here" | `CLAUDE.md` + `.claude/rules/*.md` | Always-on, versioned, easy to review; rules can be path-scoped. |
15
+ | Make **explicit, user-invoked** workflows (`/review`, `/ship`, `/debug`) | **Slash commands** (`.claude/commands/*.md`) | Deterministic, discoverable, supports args and pre-run context gathering. |
16
+ | Teach Claude a reusable "how to do X" playbook it can apply automatically | **Skills** (`.claude/skills/*/SKILL.md`) | Autonomously applied based on task intent; great for standards + recipes. |
17
+ | Isolate noisy operations (tests, grepping, docs spelunking), or run parallel research | **Subagents** (`.claude/agents/*.md`) | Separate context + tool restrictions; keeps main thread clean. |
18
+ | Guarantee something always happens (formatting, linting, compliance logging) | **Hooks** (`settings.json` or plugin `hooks.json`) | Deterministic "always-run" automation vs hoping the model remembers. |
19
+ | Connect Claude to external systems/tools (GitHub, Jira, DB, Sentry) | **MCP servers** (`.mcp.json` or plugin) | Adds tools/resources/prompts via MCP; policy controls + permissions. |
20
+ | Package and share the above across repos/teams | **Plugins** (+ marketplaces) | Portable bundles: commands, skills, agents, hooks, MCP/LSP configs. |
21
+ | Make Claude "be a different kind of agent" (teaching mode, super-terse mode, etc.) | **Output styles** | Alters system prompt behavior (and triggers reminders). Use sparingly. |
22
+
23
+ ### When to move from "repo config" to "plugin"
24
+ Use a plugin when:
25
+ - You need **cross-repo reuse** (org-wide workflows, platform tooling).
26
+ - You want **versioning + distribution** via marketplaces.
27
+ - You're bundling "a product": docs, scripts, validation, and predictable interfaces.
28
+
29
+ Stay with standalone `.claude/` when:
30
+ - It's **project-specific** and tightly coupled to repo architecture.
31
+ - You want the lowest friction for contributors (no extra installs).
32
+
33
+ ---
34
+
35
+ ## 1) Recommended baseline layout for a repo
36
+
37
+ ```
38
+ your-repo/
39
+ ├─ CLAUDE.md # high-level "how we work" + common commands
40
+ ├─ CLAUDE.local.md # per-user overrides (gitignored by default)
41
+ └─ .claude/
42
+ ├─ settings.json # shared team config (permissions/hooks/plugins)
43
+ ├─ settings.local.json # local overrides (not committed)
44
+ ├─ rules/ # modular, reviewable instructions
45
+ │ ├─ general.md
46
+ │ ├─ testing.md
47
+ │ ├─ security.md
48
+ │ └─ frontend/
49
+ │ └─ react.md
50
+ ├─ commands/ # repo slash commands
51
+ ├─ skills/ # repo skills
52
+ └─ agents/ # repo subagents
53
+ ```
54
+
55
+ Why this works:
56
+ - Memory loads hierarchically (enterprise → project → rules → user → local).
57
+ - Rules can be **path-scoped** via frontmatter `paths:` so you avoid "giant CLAUDE.md".
58
+ - `settings.local.json` is ideal for experimentation without polluting the team baseline.
59
+
60
+ ---
61
+
62
+ ## 2) CLAUDE.md & rules: treat it like an "agent manifest"
63
+
64
+ ### CLAUDE.md best practices
65
+ - **Prefer checklists + short bullets over prose.** Keep it scannable and review-friendly.
66
+ - Include **canonical commands** (build/test/lint, local env setup, common scripts). This avoids repeated tool search.
67
+ - Put "project invariants" here: architecture boundaries, naming conventions, PR policy, test expectations.
68
+ - Keep it stable. Put volatile data (tokens, local URLs, personal notes) in `CLAUDE.local.md`.
69
+
70
+ ### `.claude/rules/*.md` best practices
71
+ - **One topic per file** (testing, security, API conventions). Official guidance explicitly recommends this style.
72
+ - Use `paths:` frontmatter only when rules truly are file-type specific.
73
+ - Prefer shallow hierarchies; subdirectories for grouping are fine and recursively discovered.
74
+
75
+ **Path-scoped rule example**
76
+ ```md
77
+ ---
78
+ paths:
79
+ - "src/api/**/*.ts"
80
+ ---
81
+ # API rules
82
+ - Validate inputs (zod)
83
+ - Standard error format
84
+ - OpenAPI doc blocks required
85
+ ```
86
+
87
+ ### Imports: structure without bloat
88
+ If you have a large "standards pack," use `@path/to/file.md` imports inside `CLAUDE.md` (max depth is limited). Use imports to factor shared guidance into multiple files without giant prompts.
89
+
90
+ ---
91
+
92
+ ## 3) Settings & scopes: keep policy separate from preference
93
+
94
+ Claude Code settings are hierarchical (managed > CLI flags > local > project > user). Use that intentionally:
95
+ - **Managed scope:** enforce security/compliance org-wide (permissions, marketplace allowlists, hook restrictions).
96
+ - **Project scope:** team-shared permissions, hooks, MCP config, required plugins.
97
+ - **Local scope:** per-machine/per-user overrides for a repo.
98
+ - **User scope:** personal defaults everywhere.
99
+
100
+ ### Settings hygiene checklist
101
+ - Put **permissions** and **hooks** in project scope so teammates have consistent guardrails.
102
+ - Keep personal allowlists (e.g., favorite harmless `Bash(...)` commands) in user scope.
103
+ - **Secrets Management:** Never hardcode API keys or secrets in `settings.json` or `plugin.json`. Use environment variables on the host system, which Claude (and MCP servers) can inherit.
104
+ - For monorepos, consider a custom `fileSuggestion` command to speed `@` completion.
105
+
106
+ ---
107
+
108
+ ## 4) Output styles: powerful, but don't use them as a crutch
109
+
110
+ Output styles directly change the system prompt; they're great when you want Claude Code to behave like a different agent (teaching mode, ultra-terse mode). They also trigger reminders to adhere to the style.
111
+
112
+ Best practices:
113
+ - If you're mostly doing software engineering: keep `keep-coding-instructions: true` in custom styles so you don't lose "run tests / verify" guardrails.
114
+ - If the goal is consistent formatting, consider: **CLAUDE.md**, **rules**, or a **UserPromptSubmit hook** that reminds Claude. Use output styles only when you truly want to disable/replace core prompt sections.
115
+
116
+ **Minimal custom output style**
117
+ ```md
118
+ ---
119
+ name: Ultra-Terse
120
+ description: Minimal text, only actionable output
121
+ keep-coding-instructions: true
122
+ ---
123
+ # Instructions
124
+ - Be concise.
125
+ - Prefer code/commands over explanation.
126
+ - Ask only the minimum clarifying questions.
127
+ ```
128
+
129
+ ---
130
+
131
+ ## 5) Slash commands: deterministic "stored prompts"
132
+
133
+ Slash commands are ideal for workflows you *choose* to run. They also support:
134
+ - args (`$ARGUMENTS`, `$1`, `$2`, …)
135
+ - frontmatter (`allowed-tools`, `argument-hint`, `context: fork`)
136
+ - optional bash pre-exec using `!` + backticks
137
+
138
+ ### Slash command best practices
139
+ - Treat each command like an API:
140
+ - Define inputs (`argument-hint`)
141
+ - Define outputs ("what success looks like")
142
+ - Declare tool constraints (`allowed-tools`)
143
+ - Use `context: fork` for noisy/expensive commands so they don't pollute your main thread.
144
+ - Be extremely careful with `!` pre-exec:
145
+ - Keep it to read-only / low-risk commands (status, diff, logs).
146
+ - Avoid constructing shell from untrusted args without strict quoting.
147
+
148
+ **Example: safe-ish "commit" command**
149
+ ```md
150
+ ---
151
+ description: Create a single high-quality commit from current changes
152
+ allowed-tools: Bash(git status:*), Bash(git diff:*), Bash(git commit:*)
153
+ ---
154
+ ## Context
155
+ - Status: !`git status`
156
+ - Diff: !`git diff`
157
+
158
+ ## Task
159
+ Propose a commit message and run the commit.
160
+ ```
161
+
162
+ ---
163
+
164
+ ## 6) Skills: autonomous playbooks (make them small & surgical)
165
+
166
+ Skills are injected guidance that Claude may apply automatically when your request matches the skill's purpose.
167
+
168
+ ### Skill authoring best practices
169
+ - **Progressive disclosure**: keep `SKILL.md` lean; push depth into `references/*.md`.
170
+ *Community experience shows that huge SKILL.md files cause context bloat; a PR explicitly optimized this by moving detail into references and shrinking SKILL.md size.*
171
+ - Use frontmatter carefully:
172
+ - `description:` is your router—write it like a trigger spec.
173
+ - Use `disable-model-invocation: true` for skills you only want loaded manually (safety / cost control).
174
+ - Include *operational* guidance:
175
+ - exact commands to run
176
+ - where files live
177
+ - how to validate success
178
+ - Keep examples realistic and minimal; avoid giant code dumps.
179
+
180
+ ### "Gotcha": accidental bash execution from docs
181
+ A real plugin-dev PR removed patterns like `!` + backticks from skill documentation because Claude Code can treat them as executable pre-run snippets—even inside markdown blocks.
182
+ **Best practice:** in skills (and docs), avoid `!` + backticks unless you intentionally want a command executed by a slash command context.
183
+
184
+ ### Skills vs. commands vs. subagents vs. MCP (short version)
185
+ - **Skill:** "how to do X" guidance (autonomous).
186
+ - **Command:** "do X now" (explicit).
187
+ - **Subagent:** isolate X in separate context / tool restrictions.
188
+ - **MCP:** provides tools; a Skill teaches the tool usage patterns.
189
+
190
+ ---
191
+
192
+ ## 7) Subagents: isolate context, tools, and cost
193
+
194
+ Subagents shine for:
195
+ - high-output operations (tests, log scrapes, big greps)
196
+ - parallel research
197
+ - specialized expertise (security review, DB query validation)
198
+
199
+ ### Subagent best practices
200
+ - Keep `description` precise: it drives automatic delegation.
201
+ - Use tool restrictions (`tools`, `disallowedTools`) to enforce intent.
202
+ - **Context Cost Awareness:** Subagents spawn a *new* context window. While they keep the main thread clean, if a subagent needs to read 100 files, you pay for those tokens again. Use them for tasks that need *isolation*, not just to hide text.
203
+ - Be aware of background-mode constraints:
204
+ - background subagents inherit permissions and auto-deny missing ones
205
+ - **MCP tools are not available in background subagents** (plan around this)
206
+ - If you attach `skills:` in a subagent file, remember: the full skill content is injected at startup → keep those skills small.
207
+
208
+ **Example: test-runner subagent**
209
+ ```md
210
+ ---
211
+ name: test-runner
212
+ description: Run tests and summarize failures only
213
+ tools: Bash, Read, Grep, Glob
214
+ model: sonnet
215
+ ---
216
+ Run the test suite, capture only failing test output, and summarize the root causes.
217
+ ```
218
+
219
+ ---
220
+
221
+ ## 8) Hooks: deterministic automation (guardrails, not "magic")
222
+
223
+ Hooks are the most reliable way to ensure repeatable behavior:
224
+ - run formatters after file edits
225
+ - block unsafe commands
226
+ - log/annotate actions for compliance
227
+ - send notifications when Claude is waiting
228
+
229
+ ### Hook best practices (high-signal)
230
+ - Make hooks **fast** and **idempotent**. Hooks run often; latency adds up.
231
+ - Prefer **PostToolUse** for formatting/linting (runs after edits).
232
+ - Prefer **PreToolUse** for policy enforcement (block risky Bash/MCP calls).
233
+ - Keep hook logic in scripts with real tests; keep config thin.
234
+
235
+ ### Stop hooks: avoid infinite loops
236
+ Claude Code exposes `stop_hook_active` in Stop hook input to indicate a stop hook has already forced continuation. Use it to prevent "retry forever" loops.
237
+ Practical rule: **Stop hook should continue at most once**, then require user intervention.
238
+
239
+ ### Security stance
240
+ - Hooks can enforce policy even when the model is "confused."
241
+ - In managed environments, admins can set `allowManagedHooksOnly: true` to block user/project/plugin hooks.
242
+
243
+ ---
244
+
245
+ ## 9) Plugins: build "a small product"
246
+
247
+ ### Core structure
248
+ A plugin is a directory with a manifest at `.claude-plugin/plugin.json` and optional feature directories at the plugin root.
249
+
250
+ Key best practices:
251
+ - Keep `.claude-plugin/` **manifest-only**. Do **not** nest `commands/`, `skills/`, etc. inside it.
252
+ - Namespacing: plugin commands are generally invoked as `/plugin-name:command` (prefix optional unless collisions).
253
+ - Use semantic versioning in `plugin.json` and keep a `CHANGELOG.md`.
254
+
255
+ ### Plugin caching: design for relocatability
256
+ Installed plugins are copied into a cache for integrity/security. Implications:
257
+ - **Never reference files outside the plugin root** via `../..` — they won't exist in cache.
258
+ - Always reference internal scripts/resources using `${CLAUDE_PLUGIN_ROOT}`.
259
+ - If you need shared code across plugins:
260
+ - use symlinks inside the plugin directory (copied during install), or
261
+ - restructure marketplace `source` to include the shared parent directory and declare component paths in the marketplace entry.
262
+
263
+ ### Debugging & validation
264
+ - **Enable Verbose Logging:** Use `claude --debug` (CLI) or set `"verbose": true` in your user `settings.json` to see plugin loading, hook registration, and MCP init details.
265
+ - Validate manifests early: `claude plugin validate` (or `/plugin validate`).
266
+ - If skills don't show up: clear cache (`rm -rf ~/.claude/plugins/cache`), restart, reinstall.
267
+
268
+ ### Cross-platform scripts
269
+ If you ship hooks/scripts:
270
+ - Use `#!/usr/bin/env bash` when possible.
271
+ - Avoid bashisms if Windows users (Git Bash) are in scope.
272
+ - Prefer portable tools (python, node) when already required, and document prerequisites.
273
+
274
+ ---
275
+
276
+ ## 10) Plugin marketplaces: distribution, upgrades, and trust
277
+
278
+ A marketplace is a repo (or URL) containing `.claude-plugin/marketplace.json`.
279
+
280
+ ### Marketplace best practices
281
+ - Prefer Git-hosted marketplaces over URL-hosted:
282
+ - Relative `source: "./plugins/my-plugin"` works reliably only for git-based installs.
283
+ - Use `strict` intentionally:
284
+ - `strict: true` → plugin must have its own `plugin.json`
285
+ - `strict: false` → marketplace entry can fully define components (useful for "monorepo" layouts)
286
+ - Provide:
287
+ - ownership metadata (name/email)
288
+ - plugin categories/keywords
289
+ - license + repo homepage
290
+ - clear install instructions + compatibility notes
291
+
292
+ ### Updating marketplaces & the "stale cache" gotcha
293
+ A recent Claude Code issue reports self-hosted marketplace caches not being fetched before install/update, causing outdated installs unless you manually update the marketplace checkout. Until this is fixed everywhere:
294
+ - Run `/plugin marketplace update <marketplace>` before installing/updating plugins from self-hosted sources.
295
+ - If you suspect a stale cache, manually `git pull` inside `~/.claude/plugins/marketplaces/<marketplace-name>/`.
296
+
297
+ ### Team rollouts (recommended pattern)
298
+ In `.claude/settings.json`:
299
+ - add `extraKnownMarketplaces` so teammates are prompted to install on trust
300
+ - add `enabledPlugins` to suggest default installs
301
+
302
+ In managed settings:
303
+ - restrict marketplace sources with `strictKnownMarketplaces` (allowlist).
304
+
305
+ ---
306
+
307
+ ## 11) MCP: integrations with sharp edges (treat as untrusted)
308
+
309
+ ### Transport & configuration choices
310
+ - Remote HTTP is recommended; SSE is deprecated where possible.
311
+ - Stdio servers are ideal for local tooling or custom scripts.
312
+
313
+ ### MCP security best practices
314
+ - Assume third-party MCP servers are untrusted unless vetted. Official docs explicitly warn about correctness/security and prompt injection risks.
315
+ - Minimize tool surface:
316
+ - prefer "read-only" tools unless you need mutation
317
+ - restrict via permissions and/or managed allowlists/denylists
318
+ - **No Secrets in Config:** Pass API keys and secrets via ENV variables. Do not commit them to `.mcp.json`.
319
+ - Combine MCP + Skills:
320
+ - MCP provides tools
321
+ - Skills teach "how to use our tools safely" (queries, limits, retry policy, etc.)
322
+
323
+ ### MCP in plugins
324
+ - Bundle MCP via `.mcp.json` (or inline in plugin.json) and reference local scripts/config with `${CLAUDE_PLUGIN_ROOT}`.
325
+
326
+ ---
327
+
328
+ ## 12) LSP in plugins: cheap correctness wins
329
+
330
+ LSP servers give Claude immediate diagnostics and better navigation.
331
+ Best practices:
332
+ - Ensure binaries exist in PATH (install instructions in README).
333
+ - Set `startupTimeout` sensibly for slower servers.
334
+ - Use `extensionToLanguage` mappings carefully in polyglot repos.
335
+ - Keep LSP config in `.lsp.json` unless you truly need inline `plugin.json`.
336
+
337
+ ---
338
+
339
+ ## 13) Performance & context management
340
+
341
+ High-leverage habits:
342
+ - Keep always-loaded content small:
343
+ - CLAUDE.md concise
344
+ - rules modular
345
+ - SKILL.md lean
346
+ - Use subagents to isolate "output floods".
347
+ - Use hooks for formatting/linting instead of "please remember to run prettier."
348
+ - If a workflow grows complex, promote it:
349
+ - from ad-hoc prompt → command
350
+ - from command → plugin
351
+ - from plugin → marketplace with versioning and CI
352
+
353
+ ---
354
+
355
+ ## 14) Known pain points & pragmatic workarounds
356
+
357
+ ### Marketplace cache / updates
358
+ Symptom: plugin updates don't appear even after bumping version.
359
+ Workarounds:
360
+ - `/plugin marketplace update …`
361
+ - manual `git pull` in the cached marketplace directory
362
+
363
+ ### Windows plugin management UX
364
+ There are reports of plugin uninstall/removal problems in the UI on Windows.
365
+ Workaround:
366
+ - Use CLI commands (`claude plugin uninstall … --scope …`) where the UI gets stuck.
367
+
368
+ ### Claude Code on the web: plugin install hangs
369
+ A freshly opened issue reports that installing plugins in web-based Claude Code environments can hang the agent.
370
+ Workaround patterns:
371
+ - Skip plugin installs in cloud hooks (detect env) and pre-bake dependencies where possible.
372
+ - If you need plugins, prefer local Claude Code execution until the web install path is stable.
373
+
374
+ ---
375
+
376
+ ## 15) Templates (copy/paste)
377
+
378
+ ### Minimal plugin skeleton
379
+ ```
380
+ my-plugin/
381
+ ├─ .claude-plugin/
382
+ │ └─ plugin.json
383
+ ├─ commands/
384
+ │ └─ hello.md
385
+ ├─ skills/
386
+ │ └─ my-skill/
387
+ │ ├─ SKILL.md
388
+ │ └─ references/
389
+ │ └─ deep-dive.md
390
+ ├─ hooks/
391
+ │ └─ hooks.json
392
+ └─ scripts/
393
+ └─ format.sh
394
+ ```
395
+
396
+ ### Minimal marketplace skeleton
397
+ ```
398
+ my-marketplace/
399
+ ├─ .claude-plugin/
400
+ │ └─ marketplace.json
401
+ └─ plugins/
402
+ └─ my-plugin/
403
+ └─ ...plugin contents...
404
+ ```
405
+
406
+ ### "Progressive disclosure" skill skeleton
407
+ ```md
408
+ ---
409
+ name: my-skill
410
+ description: Use when the user asks to <X>; avoid when <Y>
411
+ disable-model-invocation: false
412
+ ---
413
+
414
+ # Purpose
415
+ Teach Claude how to <X> safely and consistently.
416
+
417
+ # Quick recipe
418
+ 1) Do A
419
+ 2) Validate B
420
+ 3) Only then do C
421
+
422
+ # References
423
+ - See references/deep-dive.md for edge cases and detailed workflows.
424
+ ```
425
+
426
+ ---
427
+
428
+ ## References (source material)
429
+
430
+ Official docs (Claude Code):
431
+ - https://code.claude.com/docs/
432
+ - Plugins: https://code.claude.com/docs/en/plugins
433
+ - Plugins reference: https://code.claude.com/docs/en/plugins-reference
434
+ - Discover plugins: https://code.claude.com/docs/en/discover-plugins
435
+ - Plugin marketplaces: https://code.claude.com/docs/en/plugin-marketplaces
436
+ - Skills: https://code.claude.com/docs/en/skills
437
+ - Subagents: https://code.claude.com/docs/en/sub-agents
438
+ - Hooks: https://code.claude.com/docs/en/hooks and https://code.claude.com/docs/en/hooks-guide
439
+ - Memory: https://code.claude.com/docs/en/memory
440
+ - Settings: https://code.claude.com/docs/en/settings
441
+ - MCP: https://code.claude.com/docs/en/mcp
442
+ - Output styles: https://code.claude.com/docs/en/output-styles
443
+ - Security: https://code.claude.com/docs/en/security
444
+
445
+ GitHub issues (examples of common failure modes / UX gaps):
446
+ - Plugin marketplace cache: https://github.com/anthropics/claude-code/issues/16866
447
+ - Web env plugin install hang: https://github.com/anthropics/claude-code/issues/18088
448
+ - Windows plugin mgmt UX: https://github.com/anthropics/claude-code/issues/9426
449
+
450
+ Community signals (toolkits + discussion):
451
+ - plugin-dev toolkit (community expansion): https://github.com/sjnims/plugin-dev
452
+ - PR note on slimming skill docs / removing accidental bash triggers: https://github.com/anthropics/claude-code/pull/13204
453
+ - Output styles discussion: https://github.com/anthropics/claude-code/issues/10721
454
+ - Reddit thread re output style changes: https://www.reddit.com/r/ClaudeCode/comments/1okvlib/important_2030_please_keep_the_outputstyle/
455
+
456
+ ---
457
+
458
+ *Last reviewed: 2026-01-15. Claude Code evolves quickly; validate against current release notes when making policy or platform commitments.*
package/eslint.config.js CHANGED
@@ -83,7 +83,7 @@ export default tseslint.config(
83
83
  },
84
84
  },
85
85
  {
86
- ignores: ['dist/**', 'node_modules/**', '*.config.js', '*.config.ts', '**/*.test.ts', 'tests/**/*.ts'],
86
+ ignores: ['dist/**', 'node_modules/**', 'scripts/**', '*.config.js', '*.config.ts', '**/*.test.ts', 'tests/**/*.ts'],
87
87
  },
88
88
  // Test files: Apply custom skip-comment rule only
89
89
  {
@@ -1,6 +1,15 @@
1
1
  #!/bin/bash
2
2
  # Bluera Knowledge Plugin - Dependency Checker
3
3
  # Automatically checks and installs dependencies for the plugin
4
+ #
5
+ # Environment variables:
6
+ # BK_SKIP_AUTO_INSTALL=1 - Skip automatic pip installation of crawl4ai
7
+ # Set this if you prefer to manage Python packages manually
8
+ #
9
+ # What this script auto-installs (if missing):
10
+ # - Node.js dependencies (via bun or npm, from package.json)
11
+ # - crawl4ai Python package (via pip, for web crawling)
12
+ # - Playwright Chromium browser (via playwright CLI, for headless crawling)
4
13
 
5
14
  set -e
6
15
 
@@ -95,9 +104,17 @@ echo -e "${YELLOW}To enable web crawling, install crawl4ai:${NC}"
95
104
  echo -e " ${GREEN}pip install crawl4ai${NC}"
96
105
  echo ""
97
106
 
107
+ # Check if auto-install is disabled
108
+ if [ "${BK_SKIP_AUTO_INSTALL:-}" = "1" ]; then
109
+ echo -e "${YELLOW}[bluera-knowledge] Auto-install disabled (BK_SKIP_AUTO_INSTALL=1)${NC}"
110
+ echo -e "${YELLOW}Install manually: pip install crawl4ai && python3 -m playwright install chromium${NC}"
111
+ exit 0
112
+ fi
113
+
98
114
  # Check if we should auto-install
99
115
  if command -v pip3 &> /dev/null || command -v pip &> /dev/null; then
100
- echo -e "${YELLOW}Attempting automatic installation via pip...${NC}"
116
+ echo -e "${YELLOW}[bluera-knowledge] Auto-installing crawl4ai via pip...${NC}"
117
+ echo -e "${YELLOW}(Set BK_SKIP_AUTO_INSTALL=1 to disable auto-install)${NC}"
101
118
 
102
119
  # Try to install using pip3 or pip
103
120
  if command -v pip3 &> /dev/null; then
package/hooks/hooks.json CHANGED
@@ -40,12 +40,12 @@
40
40
  {
41
41
  "type": "command",
42
42
  "command": "${CLAUDE_PLUGIN_ROOT}/hooks/job-status-hook.sh",
43
- "timeout": 5
43
+ "timeout": 2
44
44
  },
45
45
  {
46
46
  "type": "command",
47
47
  "command": "python3 ${CLAUDE_PLUGIN_ROOT}/hooks/skill-activation.py",
48
- "timeout": 5
48
+ "timeout": 2
49
49
  }
50
50
  ]
51
51
  }
@@ -10,6 +10,20 @@ import re
10
10
  import sys
11
11
  from typing import Any
12
12
 
13
+ # Fast string checks - if none of these are in the path, skip regex entirely
14
+ # This avoids regex overhead for the vast majority of file accesses
15
+ LIBRARY_QUICK_CHECKS = frozenset([
16
+ "node_modules",
17
+ "vendor",
18
+ "site-packages",
19
+ "venv",
20
+ "bower_components",
21
+ "packages",
22
+ ".npm",
23
+ ".cargo",
24
+ "go/pkg",
25
+ ])
26
+
13
27
  # Patterns indicating library/dependency code
14
28
  LIBRARY_PATH_PATTERNS = [
15
29
  r"node_modules/",
@@ -28,6 +42,12 @@ LIBRARY_PATH_PATTERNS = [
28
42
  LIBRARY_PATTERNS_RE = re.compile("|".join(LIBRARY_PATH_PATTERNS), re.IGNORECASE)
29
43
 
30
44
 
45
+ def quick_path_check(path: str) -> bool:
46
+ """Fast check if path might contain library code. Avoids regex for most paths."""
47
+ path_lower = path.lower()
48
+ return any(keyword in path_lower for keyword in LIBRARY_QUICK_CHECKS)
49
+
50
+
31
51
  def extract_library_name(path: str) -> str | None:
32
52
  """Extract library name from dependency path."""
33
53
  # node_modules/package-name/...
@@ -62,7 +82,11 @@ def check_grep_tool(tool_input: dict[str, Any]) -> tuple[str | None, str | None]
62
82
  """Check if Grep targeted library code. Returns (action, library_name)."""
63
83
  path = tool_input.get("path", "")
64
84
 
65
- if path and LIBRARY_PATTERNS_RE.search(path):
85
+ # Fast path: skip regex if no library keywords present
86
+ if not path or not quick_path_check(path):
87
+ return None, None
88
+
89
+ if LIBRARY_PATTERNS_RE.search(path):
66
90
  lib_name = extract_library_name(path)
67
91
  return f"grepped in `{path}`", lib_name
68
92
 
@@ -73,7 +97,11 @@ def check_read_tool(tool_input: dict[str, Any]) -> tuple[str | None, str | None]
73
97
  """Check if Read targeted library code. Returns (action, library_name)."""
74
98
  file_path = tool_input.get("file_path", "")
75
99
 
76
- if file_path and LIBRARY_PATTERNS_RE.search(file_path):
100
+ # Fast path: skip regex if no library keywords present
101
+ if not file_path or not quick_path_check(file_path):
102
+ return None, None
103
+
104
+ if LIBRARY_PATTERNS_RE.search(file_path):
77
105
  lib_name = extract_library_name(file_path)
78
106
  return f"read `{file_path}`", lib_name
79
107
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bluera-knowledge",
3
- "version": "0.13.0",
3
+ "version": "0.13.1",
4
4
  "description": "CLI tool for managing knowledge stores with semantic search",
5
5
  "type": "module",
6
6
  "bin": {