bluera-knowledge 0.9.21

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 (652) hide show
  1. package/.claude/commands/commit.md +37 -0
  2. package/.claude/hooks/post-edit-check.sh +41 -0
  3. package/.claude/settings.local.json.example +40 -0
  4. package/.claude/skills/atomic-commits/SKILL.md +53 -0
  5. package/.claude-plugin/plugin.json +13 -0
  6. package/.editorconfig +15 -0
  7. package/.github/workflows/auto-release.yml +59 -0
  8. package/.github/workflows/ci.yml +142 -0
  9. package/.github/workflows/release.yml +66 -0
  10. package/.github/workflows/update-marketplace.yml +96 -0
  11. package/.husky/pre-commit +47 -0
  12. package/.husky/pre-push +29 -0
  13. package/.versionrc.json +28 -0
  14. package/CHANGELOG.md +410 -0
  15. package/CLAUDE.md +109 -0
  16. package/LICENSE +21 -0
  17. package/NOTICE +47 -0
  18. package/README.md +1546 -0
  19. package/SECURITY.md +65 -0
  20. package/bun.lock +1758 -0
  21. package/commands/add-folder.md +48 -0
  22. package/commands/add-repo.md +50 -0
  23. package/commands/cancel.md +63 -0
  24. package/commands/check-status.md +78 -0
  25. package/commands/crawl.md +51 -0
  26. package/commands/index.md +48 -0
  27. package/commands/remove-store.md +52 -0
  28. package/commands/search.md +79 -0
  29. package/commands/search.sh +63 -0
  30. package/commands/stores.md +54 -0
  31. package/commands/suggest.md +82 -0
  32. package/dist/chunk-5QMHZUC4.js +3617 -0
  33. package/dist/chunk-5QMHZUC4.js.map +1 -0
  34. package/dist/chunk-BICFAWMN.js +656 -0
  35. package/dist/chunk-BICFAWMN.js.map +1 -0
  36. package/dist/chunk-J7J6LXOJ.js +958 -0
  37. package/dist/chunk-J7J6LXOJ.js.map +1 -0
  38. package/dist/chunk-L2YVNC63.js +59 -0
  39. package/dist/chunk-L2YVNC63.js.map +1 -0
  40. package/dist/index.d.ts +1 -0
  41. package/dist/index.js +1429 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/mcp/server.d.ts +15 -0
  44. package/dist/mcp/server.js +11 -0
  45. package/dist/mcp/server.js.map +1 -0
  46. package/dist/watch.service-YAIKKDCF.js +7 -0
  47. package/dist/watch.service-YAIKKDCF.js.map +1 -0
  48. package/dist/workers/background-worker-cli.d.ts +1 -0
  49. package/dist/workers/background-worker-cli.js +310 -0
  50. package/dist/workers/background-worker-cli.js.map +1 -0
  51. package/docs/plans/2024-12-17-ai-search-quality-implementation.md +752 -0
  52. package/docs/plans/2024-12-17-ai-search-quality-testing-design.md +201 -0
  53. package/docs/plans/2025-12-16-bluera-knowledge-cli.md +2951 -0
  54. package/docs/plans/2025-12-16-phase2-features.md +1518 -0
  55. package/docs/plans/2025-12-17-hil-implementation.md +926 -0
  56. package/docs/plans/2025-12-17-hil-quality-testing.md +224 -0
  57. package/docs/plans/2025-12-17-search-quality-phase1-implementation.md +1416 -0
  58. package/docs/plans/2025-12-17-search-quality-testing-v2-design.md +212 -0
  59. package/docs/plans/2025-12-28-ai-agent-optimization.md +1630 -0
  60. package/eslint-rules/require-skip-comment.js +81 -0
  61. package/eslint.config.js +61 -0
  62. package/hooks/check-dependencies.sh +110 -0
  63. package/hooks/format-search-results.py +132 -0
  64. package/hooks/hooks.json +27 -0
  65. package/hooks/job-status-hook.sh +51 -0
  66. package/knip.json +43 -0
  67. package/mcp.plugin.json +12 -0
  68. package/package.json +103 -0
  69. package/python/crawl_worker.py +275 -0
  70. package/python/requirements.txt +2 -0
  71. package/scripts/readme-version-updater.cjs +18 -0
  72. package/skills/advanced-workflows/SKILL.md +273 -0
  73. package/skills/atomic-commits/SKILL.md +77 -0
  74. package/skills/knowledge-search/SKILL.md +54 -0
  75. package/skills/search-optimization/SKILL.md +396 -0
  76. package/skills/store-lifecycle/SKILL.md +470 -0
  77. package/skills/when-to-query/SKILL.md +66 -0
  78. package/src/analysis/ast-parser.test.ts +423 -0
  79. package/src/analysis/ast-parser.ts +192 -0
  80. package/src/analysis/code-graph.test.ts +698 -0
  81. package/src/analysis/code-graph.ts +245 -0
  82. package/src/analysis/dependency-usage-analyzer.test.ts +799 -0
  83. package/src/analysis/dependency-usage-analyzer.ts +405 -0
  84. package/src/analysis/go-ast-parser.test.ts +531 -0
  85. package/src/analysis/go-ast-parser.ts +478 -0
  86. package/src/analysis/parser-factory.test.ts +132 -0
  87. package/src/analysis/parser-factory.ts +44 -0
  88. package/src/analysis/python-ast-parser.test.ts +210 -0
  89. package/src/analysis/python-ast-parser.ts +34 -0
  90. package/src/analysis/repo-url-resolver.test.ts +533 -0
  91. package/src/analysis/repo-url-resolver.ts +233 -0
  92. package/src/analysis/rust-ast-parser.test.ts +568 -0
  93. package/src/analysis/rust-ast-parser.ts +477 -0
  94. package/src/analysis/tree-sitter-parser.test.ts +297 -0
  95. package/src/analysis/tree-sitter-parser.ts +223 -0
  96. package/src/cli/commands/crawl.test.ts +942 -0
  97. package/src/cli/commands/crawl.ts +141 -0
  98. package/src/cli/commands/index-cmd.test.ts +722 -0
  99. package/src/cli/commands/index-cmd.ts +105 -0
  100. package/src/cli/commands/mcp.test.ts +218 -0
  101. package/src/cli/commands/mcp.ts +18 -0
  102. package/src/cli/commands/plugin-api.test.ts +313 -0
  103. package/src/cli/commands/plugin-api.ts +45 -0
  104. package/src/cli/commands/search.test.ts +911 -0
  105. package/src/cli/commands/search.ts +113 -0
  106. package/src/cli/commands/serve.test.ts +329 -0
  107. package/src/cli/commands/serve.ts +28 -0
  108. package/src/cli/commands/setup.test.ts +820 -0
  109. package/src/cli/commands/setup.ts +153 -0
  110. package/src/cli/commands/store.test.ts +1003 -0
  111. package/src/cli/commands/store.ts +167 -0
  112. package/src/cli/index.ts +7 -0
  113. package/src/cli/program.ts +59 -0
  114. package/src/crawl/article-converter.test.ts +604 -0
  115. package/src/crawl/article-converter.ts +98 -0
  116. package/src/crawl/bridge.test.ts +674 -0
  117. package/src/crawl/bridge.ts +236 -0
  118. package/src/crawl/claude-client.test.ts +663 -0
  119. package/src/crawl/claude-client.ts +234 -0
  120. package/src/crawl/intelligent-crawler.test.ts +931 -0
  121. package/src/crawl/intelligent-crawler.ts +428 -0
  122. package/src/crawl/markdown-utils.test.ts +703 -0
  123. package/src/crawl/markdown-utils.ts +228 -0
  124. package/src/crawl/schemas.ts +114 -0
  125. package/src/db/embeddings.test.ts +63 -0
  126. package/src/db/embeddings.ts +69 -0
  127. package/src/db/index.ts +2 -0
  128. package/src/db/lance.test.ts +390 -0
  129. package/src/db/lance.ts +164 -0
  130. package/src/defaults/repos.ts +67 -0
  131. package/src/index.ts +107 -0
  132. package/src/mcp/cache.test.ts +202 -0
  133. package/src/mcp/cache.ts +103 -0
  134. package/src/mcp/commands/index.ts +20 -0
  135. package/src/mcp/commands/job.commands.ts +54 -0
  136. package/src/mcp/commands/meta.commands.ts +54 -0
  137. package/src/mcp/commands/registry.ts +183 -0
  138. package/src/mcp/commands/store.commands.ts +75 -0
  139. package/src/mcp/handlers/execute.handler.test.ts +179 -0
  140. package/src/mcp/handlers/execute.handler.ts +24 -0
  141. package/src/mcp/handlers/index.ts +43 -0
  142. package/src/mcp/handlers/job.handler.test.ts +189 -0
  143. package/src/mcp/handlers/job.handler.ts +116 -0
  144. package/src/mcp/handlers/search.handler.test.ts +334 -0
  145. package/src/mcp/handlers/search.handler.ts +209 -0
  146. package/src/mcp/handlers/store.handler.test.ts +415 -0
  147. package/src/mcp/handlers/store.handler.ts +295 -0
  148. package/src/mcp/schemas/index.test.ts +315 -0
  149. package/src/mcp/schemas/index.ts +138 -0
  150. package/src/mcp/server.test.ts +36 -0
  151. package/src/mcp/server.ts +162 -0
  152. package/src/mcp/types.ts +41 -0
  153. package/src/plugin/commands.test.ts +789 -0
  154. package/src/plugin/commands.ts +257 -0
  155. package/src/plugin/dependency-analyzer.test.ts +380 -0
  156. package/src/plugin/dependency-analyzer.ts +147 -0
  157. package/src/plugin/git-clone.test.ts +332 -0
  158. package/src/plugin/git-clone.ts +57 -0
  159. package/src/server/app.test.ts +752 -0
  160. package/src/server/app.ts +119 -0
  161. package/src/server/index.test.ts +477 -0
  162. package/src/server/index.ts +1 -0
  163. package/src/services/chunking.service.test.ts +363 -0
  164. package/src/services/chunking.service.ts +350 -0
  165. package/src/services/code-graph.service.test.ts +304 -0
  166. package/src/services/code-graph.service.ts +302 -0
  167. package/src/services/code-unit.service.test.ts +596 -0
  168. package/src/services/code-unit.service.ts +115 -0
  169. package/src/services/config.service.test.ts +127 -0
  170. package/src/services/config.service.ts +69 -0
  171. package/src/services/index.service.test.ts +1002 -0
  172. package/src/services/index.service.ts +266 -0
  173. package/src/services/index.ts +75 -0
  174. package/src/services/job.service.test.ts +418 -0
  175. package/src/services/job.service.ts +246 -0
  176. package/src/services/project-root.service.test.ts +506 -0
  177. package/src/services/project-root.service.ts +112 -0
  178. package/src/services/search.service.test.ts +1105 -0
  179. package/src/services/search.service.ts +892 -0
  180. package/src/services/services.test.ts +38 -0
  181. package/src/services/snippet.service.test.ts +205 -0
  182. package/src/services/snippet.service.ts +166 -0
  183. package/src/services/store.service.test.ts +474 -0
  184. package/src/services/store.service.ts +225 -0
  185. package/src/services/watch.service.test.ts +553 -0
  186. package/src/services/watch.service.ts +71 -0
  187. package/src/types/brands.test.ts +45 -0
  188. package/src/types/brands.ts +32 -0
  189. package/src/types/config.ts +79 -0
  190. package/src/types/document.ts +30 -0
  191. package/src/types/index.ts +66 -0
  192. package/src/types/job.ts +46 -0
  193. package/src/types/progress.ts +9 -0
  194. package/src/types/result.test.ts +44 -0
  195. package/src/types/result.ts +41 -0
  196. package/src/types/search.ts +95 -0
  197. package/src/types/store.test.ts +69 -0
  198. package/src/types/store.ts +47 -0
  199. package/src/utils/type-guards.test.ts +346 -0
  200. package/src/utils/type-guards.ts +61 -0
  201. package/src/workers/background-worker-cli.ts +105 -0
  202. package/src/workers/background-worker.test.ts +178 -0
  203. package/src/workers/background-worker.ts +294 -0
  204. package/src/workers/spawn-worker.test.ts +128 -0
  205. package/src/workers/spawn-worker.ts +49 -0
  206. package/tests/analysis/ast-parser.test.ts +98 -0
  207. package/tests/analysis/code-graph.test.ts +60 -0
  208. package/tests/fixtures/README.md +114 -0
  209. package/tests/fixtures/code-snippets/api/error-handling.ts +267 -0
  210. package/tests/fixtures/code-snippets/api/rest-controller.ts +303 -0
  211. package/tests/fixtures/code-snippets/auth/jwt-auth.ts +213 -0
  212. package/tests/fixtures/code-snippets/auth/oauth-flow.ts +245 -0
  213. package/tests/fixtures/code-snippets/database/repository-pattern.ts +272 -0
  214. package/tests/fixtures/corpus/VERSION.md +25 -0
  215. package/tests/fixtures/corpus/articles/jwt-authentication.md +97 -0
  216. package/tests/fixtures/corpus/articles/react-hooks-patterns.md +127 -0
  217. package/tests/fixtures/corpus/articles/typescript-generics.md +111 -0
  218. package/tests/fixtures/corpus/documentation/express-middleware.md +71 -0
  219. package/tests/fixtures/corpus/documentation/express-routing.md +83 -0
  220. package/tests/fixtures/corpus/documentation/node-streams.md +78 -0
  221. package/tests/fixtures/corpus/oss-repos/express/History.md +3871 -0
  222. package/tests/fixtures/corpus/oss-repos/express/LICENSE +24 -0
  223. package/tests/fixtures/corpus/oss-repos/express/Readme.md +276 -0
  224. package/tests/fixtures/corpus/oss-repos/express/SECURITY.md +56 -0
  225. package/tests/fixtures/corpus/oss-repos/express/benchmarks/Makefile +17 -0
  226. package/tests/fixtures/corpus/oss-repos/express/benchmarks/README.md +34 -0
  227. package/tests/fixtures/corpus/oss-repos/express/benchmarks/middleware.js +20 -0
  228. package/tests/fixtures/corpus/oss-repos/express/benchmarks/run +18 -0
  229. package/tests/fixtures/corpus/oss-repos/express/examples/README.md +29 -0
  230. package/tests/fixtures/corpus/oss-repos/express/examples/auth/index.js +134 -0
  231. package/tests/fixtures/corpus/oss-repos/express/examples/auth/views/foot.ejs +2 -0
  232. package/tests/fixtures/corpus/oss-repos/express/examples/auth/views/head.ejs +20 -0
  233. package/tests/fixtures/corpus/oss-repos/express/examples/auth/views/login.ejs +21 -0
  234. package/tests/fixtures/corpus/oss-repos/express/examples/content-negotiation/db.js +9 -0
  235. package/tests/fixtures/corpus/oss-repos/express/examples/content-negotiation/index.js +46 -0
  236. package/tests/fixtures/corpus/oss-repos/express/examples/content-negotiation/users.js +19 -0
  237. package/tests/fixtures/corpus/oss-repos/express/examples/cookie-sessions/index.js +25 -0
  238. package/tests/fixtures/corpus/oss-repos/express/examples/cookies/index.js +53 -0
  239. package/tests/fixtures/corpus/oss-repos/express/examples/downloads/files/CCTV/345/244/247/350/265/233/344/270/212/346/265/267/345/210/206/350/265/233/345/214/272.txt +2 -0
  240. package/tests/fixtures/corpus/oss-repos/express/examples/downloads/files/amazing.txt +1 -0
  241. package/tests/fixtures/corpus/oss-repos/express/examples/downloads/files/notes/groceries.txt +3 -0
  242. package/tests/fixtures/corpus/oss-repos/express/examples/downloads/index.js +40 -0
  243. package/tests/fixtures/corpus/oss-repos/express/examples/ejs/index.js +57 -0
  244. package/tests/fixtures/corpus/oss-repos/express/examples/ejs/public/stylesheets/style.css +4 -0
  245. package/tests/fixtures/corpus/oss-repos/express/examples/ejs/views/footer.html +2 -0
  246. package/tests/fixtures/corpus/oss-repos/express/examples/ejs/views/header.html +9 -0
  247. package/tests/fixtures/corpus/oss-repos/express/examples/ejs/views/users.html +10 -0
  248. package/tests/fixtures/corpus/oss-repos/express/examples/error/index.js +53 -0
  249. package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/index.js +103 -0
  250. package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/views/404.ejs +3 -0
  251. package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/views/500.ejs +8 -0
  252. package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/views/error_header.ejs +10 -0
  253. package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/views/footer.ejs +2 -0
  254. package/tests/fixtures/corpus/oss-repos/express/examples/error-pages/views/index.ejs +20 -0
  255. package/tests/fixtures/corpus/oss-repos/express/examples/hello-world/index.js +15 -0
  256. package/tests/fixtures/corpus/oss-repos/express/examples/markdown/index.js +44 -0
  257. package/tests/fixtures/corpus/oss-repos/express/examples/markdown/views/index.md +4 -0
  258. package/tests/fixtures/corpus/oss-repos/express/examples/multi-router/controllers/api_v1.js +15 -0
  259. package/tests/fixtures/corpus/oss-repos/express/examples/multi-router/controllers/api_v2.js +15 -0
  260. package/tests/fixtures/corpus/oss-repos/express/examples/multi-router/index.js +18 -0
  261. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/main/index.js +5 -0
  262. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/pet/index.js +31 -0
  263. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/pet/views/edit.ejs +17 -0
  264. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/pet/views/show.ejs +15 -0
  265. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/user/index.js +41 -0
  266. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/user/views/edit.hbs +27 -0
  267. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/user/views/list.hbs +18 -0
  268. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/user/views/show.hbs +31 -0
  269. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/controllers/user-pet/index.js +22 -0
  270. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/db.js +16 -0
  271. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/index.js +95 -0
  272. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/lib/boot.js +83 -0
  273. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/public/style.css +14 -0
  274. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/views/404.ejs +13 -0
  275. package/tests/fixtures/corpus/oss-repos/express/examples/mvc/views/5xx.ejs +13 -0
  276. package/tests/fixtures/corpus/oss-repos/express/examples/online/index.js +61 -0
  277. package/tests/fixtures/corpus/oss-repos/express/examples/params/index.js +74 -0
  278. package/tests/fixtures/corpus/oss-repos/express/examples/resource/index.js +95 -0
  279. package/tests/fixtures/corpus/oss-repos/express/examples/route-map/index.js +75 -0
  280. package/tests/fixtures/corpus/oss-repos/express/examples/route-middleware/index.js +90 -0
  281. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/index.js +55 -0
  282. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/post.js +13 -0
  283. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/public/style.css +24 -0
  284. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/site.js +5 -0
  285. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/user.js +47 -0
  286. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/footer.ejs +2 -0
  287. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/header.ejs +9 -0
  288. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/index.ejs +10 -0
  289. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/posts/index.ejs +12 -0
  290. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/users/edit.ejs +23 -0
  291. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/users/index.ejs +14 -0
  292. package/tests/fixtures/corpus/oss-repos/express/examples/route-separation/views/users/view.ejs +9 -0
  293. package/tests/fixtures/corpus/oss-repos/express/examples/search/index.js +61 -0
  294. package/tests/fixtures/corpus/oss-repos/express/examples/search/public/client.js +15 -0
  295. package/tests/fixtures/corpus/oss-repos/express/examples/search/public/index.html +21 -0
  296. package/tests/fixtures/corpus/oss-repos/express/examples/session/index.js +37 -0
  297. package/tests/fixtures/corpus/oss-repos/express/examples/session/redis.js +39 -0
  298. package/tests/fixtures/corpus/oss-repos/express/examples/static-files/index.js +43 -0
  299. package/tests/fixtures/corpus/oss-repos/express/examples/static-files/public/css/style.css +3 -0
  300. package/tests/fixtures/corpus/oss-repos/express/examples/static-files/public/hello.txt +1 -0
  301. package/tests/fixtures/corpus/oss-repos/express/examples/static-files/public/js/app.js +1 -0
  302. package/tests/fixtures/corpus/oss-repos/express/examples/vhost/index.js +53 -0
  303. package/tests/fixtures/corpus/oss-repos/express/examples/view-constructor/github-view.js +53 -0
  304. package/tests/fixtures/corpus/oss-repos/express/examples/view-constructor/index.js +48 -0
  305. package/tests/fixtures/corpus/oss-repos/express/examples/view-locals/index.js +155 -0
  306. package/tests/fixtures/corpus/oss-repos/express/examples/view-locals/user.js +36 -0
  307. package/tests/fixtures/corpus/oss-repos/express/examples/view-locals/views/index.ejs +20 -0
  308. package/tests/fixtures/corpus/oss-repos/express/examples/web-service/index.js +117 -0
  309. package/tests/fixtures/corpus/oss-repos/express/index.js +11 -0
  310. package/tests/fixtures/corpus/oss-repos/express/lib/application.js +631 -0
  311. package/tests/fixtures/corpus/oss-repos/express/lib/express.js +81 -0
  312. package/tests/fixtures/corpus/oss-repos/express/lib/request.js +514 -0
  313. package/tests/fixtures/corpus/oss-repos/express/lib/response.js +1053 -0
  314. package/tests/fixtures/corpus/oss-repos/express/lib/utils.js +271 -0
  315. package/tests/fixtures/corpus/oss-repos/express/lib/view.js +205 -0
  316. package/tests/fixtures/corpus/oss-repos/express/package.json +99 -0
  317. package/tests/fixtures/corpus/oss-repos/express/test/Route.js +274 -0
  318. package/tests/fixtures/corpus/oss-repos/express/test/Router.js +636 -0
  319. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/auth.js +117 -0
  320. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/content-negotiation.js +49 -0
  321. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/cookie-sessions.js +38 -0
  322. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/cookies.js +71 -0
  323. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/downloads.js +47 -0
  324. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/ejs.js +17 -0
  325. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/error-pages.js +99 -0
  326. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/error.js +29 -0
  327. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/hello-world.js +21 -0
  328. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/markdown.js +21 -0
  329. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/multi-router.js +44 -0
  330. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/mvc.js +132 -0
  331. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/params.js +44 -0
  332. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/resource.js +68 -0
  333. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/route-map.js +45 -0
  334. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/route-separation.js +97 -0
  335. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/vhost.js +46 -0
  336. package/tests/fixtures/corpus/oss-repos/express/test/acceptance/web-service.js +105 -0
  337. package/tests/fixtures/corpus/oss-repos/express/test/app.all.js +38 -0
  338. package/tests/fixtures/corpus/oss-repos/express/test/app.engine.js +83 -0
  339. package/tests/fixtures/corpus/oss-repos/express/test/app.head.js +66 -0
  340. package/tests/fixtures/corpus/oss-repos/express/test/app.js +120 -0
  341. package/tests/fixtures/corpus/oss-repos/express/test/app.listen.js +55 -0
  342. package/tests/fixtures/corpus/oss-repos/express/test/app.locals.js +26 -0
  343. package/tests/fixtures/corpus/oss-repos/express/test/app.options.js +116 -0
  344. package/tests/fixtures/corpus/oss-repos/express/test/app.param.js +323 -0
  345. package/tests/fixtures/corpus/oss-repos/express/test/app.render.js +374 -0
  346. package/tests/fixtures/corpus/oss-repos/express/test/app.request.js +143 -0
  347. package/tests/fixtures/corpus/oss-repos/express/test/app.response.js +143 -0
  348. package/tests/fixtures/corpus/oss-repos/express/test/app.route.js +197 -0
  349. package/tests/fixtures/corpus/oss-repos/express/test/app.router.js +1217 -0
  350. package/tests/fixtures/corpus/oss-repos/express/test/app.routes.error.js +62 -0
  351. package/tests/fixtures/corpus/oss-repos/express/test/app.use.js +542 -0
  352. package/tests/fixtures/corpus/oss-repos/express/test/config.js +207 -0
  353. package/tests/fixtures/corpus/oss-repos/express/test/exports.js +82 -0
  354. package/tests/fixtures/corpus/oss-repos/express/test/express.json.js +755 -0
  355. package/tests/fixtures/corpus/oss-repos/express/test/express.raw.js +513 -0
  356. package/tests/fixtures/corpus/oss-repos/express/test/express.static.js +815 -0
  357. package/tests/fixtures/corpus/oss-repos/express/test/express.text.js +566 -0
  358. package/tests/fixtures/corpus/oss-repos/express/test/express.urlencoded.js +828 -0
  359. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/% of dogs.txt +1 -0
  360. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/.name +1 -0
  361. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/blog/index.html +1 -0
  362. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/blog/post/index.tmpl +1 -0
  363. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/broken.send +0 -0
  364. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/default_layout/name.tmpl +1 -0
  365. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/default_layout/user.tmpl +1 -0
  366. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/email.tmpl +1 -0
  367. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/empty.txt +0 -0
  368. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/local_layout/user.tmpl +1 -0
  369. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/name.tmpl +1 -0
  370. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/name.txt +1 -0
  371. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/nums.txt +1 -0
  372. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/pets/names.txt +1 -0
  373. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/snow /342/230/203/.gitkeep +0 -0
  374. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/todo.html +1 -0
  375. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/todo.txt +1 -0
  376. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/user.html +1 -0
  377. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/user.tmpl +1 -0
  378. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/users/index.html +1 -0
  379. package/tests/fixtures/corpus/oss-repos/express/test/fixtures/users/tobi.txt +1 -0
  380. package/tests/fixtures/corpus/oss-repos/express/test/middleware.basic.js +42 -0
  381. package/tests/fixtures/corpus/oss-repos/express/test/regression.js +20 -0
  382. package/tests/fixtures/corpus/oss-repos/express/test/req.accepts.js +125 -0
  383. package/tests/fixtures/corpus/oss-repos/express/test/req.acceptsCharsets.js +50 -0
  384. package/tests/fixtures/corpus/oss-repos/express/test/req.acceptsEncodings.js +39 -0
  385. package/tests/fixtures/corpus/oss-repos/express/test/req.acceptsLanguages.js +57 -0
  386. package/tests/fixtures/corpus/oss-repos/express/test/req.baseUrl.js +88 -0
  387. package/tests/fixtures/corpus/oss-repos/express/test/req.fresh.js +70 -0
  388. package/tests/fixtures/corpus/oss-repos/express/test/req.get.js +60 -0
  389. package/tests/fixtures/corpus/oss-repos/express/test/req.host.js +156 -0
  390. package/tests/fixtures/corpus/oss-repos/express/test/req.hostname.js +188 -0
  391. package/tests/fixtures/corpus/oss-repos/express/test/req.ip.js +113 -0
  392. package/tests/fixtures/corpus/oss-repos/express/test/req.ips.js +71 -0
  393. package/tests/fixtures/corpus/oss-repos/express/test/req.is.js +169 -0
  394. package/tests/fixtures/corpus/oss-repos/express/test/req.path.js +20 -0
  395. package/tests/fixtures/corpus/oss-repos/express/test/req.protocol.js +113 -0
  396. package/tests/fixtures/corpus/oss-repos/express/test/req.query.js +106 -0
  397. package/tests/fixtures/corpus/oss-repos/express/test/req.range.js +104 -0
  398. package/tests/fixtures/corpus/oss-repos/express/test/req.route.js +28 -0
  399. package/tests/fixtures/corpus/oss-repos/express/test/req.secure.js +101 -0
  400. package/tests/fixtures/corpus/oss-repos/express/test/req.signedCookies.js +37 -0
  401. package/tests/fixtures/corpus/oss-repos/express/test/req.stale.js +50 -0
  402. package/tests/fixtures/corpus/oss-repos/express/test/req.subdomains.js +173 -0
  403. package/tests/fixtures/corpus/oss-repos/express/test/req.xhr.js +42 -0
  404. package/tests/fixtures/corpus/oss-repos/express/test/res.append.js +116 -0
  405. package/tests/fixtures/corpus/oss-repos/express/test/res.attachment.js +79 -0
  406. package/tests/fixtures/corpus/oss-repos/express/test/res.clearCookie.js +62 -0
  407. package/tests/fixtures/corpus/oss-repos/express/test/res.cookie.js +295 -0
  408. package/tests/fixtures/corpus/oss-repos/express/test/res.download.js +487 -0
  409. package/tests/fixtures/corpus/oss-repos/express/test/res.format.js +248 -0
  410. package/tests/fixtures/corpus/oss-repos/express/test/res.get.js +21 -0
  411. package/tests/fixtures/corpus/oss-repos/express/test/res.json.js +186 -0
  412. package/tests/fixtures/corpus/oss-repos/express/test/res.jsonp.js +344 -0
  413. package/tests/fixtures/corpus/oss-repos/express/test/res.links.js +65 -0
  414. package/tests/fixtures/corpus/oss-repos/express/test/res.locals.js +40 -0
  415. package/tests/fixtures/corpus/oss-repos/express/test/res.location.js +316 -0
  416. package/tests/fixtures/corpus/oss-repos/express/test/res.redirect.js +214 -0
  417. package/tests/fixtures/corpus/oss-repos/express/test/res.render.js +367 -0
  418. package/tests/fixtures/corpus/oss-repos/express/test/res.send.js +569 -0
  419. package/tests/fixtures/corpus/oss-repos/express/test/res.sendFile.js +913 -0
  420. package/tests/fixtures/corpus/oss-repos/express/test/res.sendStatus.js +44 -0
  421. package/tests/fixtures/corpus/oss-repos/express/test/res.set.js +124 -0
  422. package/tests/fixtures/corpus/oss-repos/express/test/res.status.js +206 -0
  423. package/tests/fixtures/corpus/oss-repos/express/test/res.type.js +46 -0
  424. package/tests/fixtures/corpus/oss-repos/express/test/res.vary.js +90 -0
  425. package/tests/fixtures/corpus/oss-repos/express/test/support/env.js +3 -0
  426. package/tests/fixtures/corpus/oss-repos/express/test/support/tmpl.js +36 -0
  427. package/tests/fixtures/corpus/oss-repos/express/test/support/utils.js +86 -0
  428. package/tests/fixtures/corpus/oss-repos/express/test/utils.js +83 -0
  429. package/tests/fixtures/corpus/oss-repos/hono/.devcontainer/Dockerfile +11 -0
  430. package/tests/fixtures/corpus/oss-repos/hono/.devcontainer/devcontainer.json +21 -0
  431. package/tests/fixtures/corpus/oss-repos/hono/.devcontainer/docker-compose.yml +18 -0
  432. package/tests/fixtures/corpus/oss-repos/hono/.eslintignore +1 -0
  433. package/tests/fixtures/corpus/oss-repos/hono/.eslintrc.cjs +9 -0
  434. package/tests/fixtures/corpus/oss-repos/hono/.gitpod.yml +9 -0
  435. package/tests/fixtures/corpus/oss-repos/hono/.prettierrc +9 -0
  436. package/tests/fixtures/corpus/oss-repos/hono/.vitest.config/jsx-runtime-default.ts +15 -0
  437. package/tests/fixtures/corpus/oss-repos/hono/.vitest.config/jsx-runtime-dom.ts +15 -0
  438. package/tests/fixtures/corpus/oss-repos/hono/.vitest.config/setup-vitest.ts +47 -0
  439. package/tests/fixtures/corpus/oss-repos/hono/LICENSE +21 -0
  440. package/tests/fixtures/corpus/oss-repos/hono/README.md +91 -0
  441. package/tests/fixtures/corpus/oss-repos/hono/build.ts +80 -0
  442. package/tests/fixtures/corpus/oss-repos/hono/bun.lockb +0 -0
  443. package/tests/fixtures/corpus/oss-repos/hono/bunfig.toml +7 -0
  444. package/tests/fixtures/corpus/oss-repos/hono/codecov.yml +13 -0
  445. package/tests/fixtures/corpus/oss-repos/hono/docs/CODE_OF_CONDUCT.md +128 -0
  446. package/tests/fixtures/corpus/oss-repos/hono/docs/CONTRIBUTING.md +62 -0
  447. package/tests/fixtures/corpus/oss-repos/hono/docs/MIGRATION.md +295 -0
  448. package/tests/fixtures/corpus/oss-repos/hono/docs/images/hono-logo.png +0 -0
  449. package/tests/fixtures/corpus/oss-repos/hono/docs/images/hono-logo.pxm +0 -0
  450. package/tests/fixtures/corpus/oss-repos/hono/docs/images/hono-logo.svg +6 -0
  451. package/tests/fixtures/corpus/oss-repos/hono/docs/images/hono-title.png +0 -0
  452. package/tests/fixtures/corpus/oss-repos/hono/docs/images/hono-title.pxm +0 -0
  453. package/tests/fixtures/corpus/oss-repos/hono/jsr.json +119 -0
  454. package/tests/fixtures/corpus/oss-repos/hono/package.cjs.json +3 -0
  455. package/tests/fixtures/corpus/oss-repos/hono/package.json +650 -0
  456. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/aws-lambda/handler.ts +492 -0
  457. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/aws-lambda/index.ts +13 -0
  458. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/aws-lambda/types.ts +144 -0
  459. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/conninfo.ts +28 -0
  460. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/index.ts +9 -0
  461. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/serve-static.ts +35 -0
  462. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/server.ts +30 -0
  463. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/ssg.ts +27 -0
  464. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/bun/websocket.ts +110 -0
  465. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-pages/handler.ts +120 -0
  466. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-pages/index.ts +7 -0
  467. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/conninfo.ts +7 -0
  468. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/index.ts +8 -0
  469. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/serve-static-module.ts +12 -0
  470. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/serve-static.ts +39 -0
  471. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/utils.ts +50 -0
  472. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/cloudflare-workers/websocket.ts +50 -0
  473. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/conninfo.ts +17 -0
  474. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/deno.d.ts +28 -0
  475. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/index.ts +9 -0
  476. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/serve-static.ts +40 -0
  477. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/ssg.ts +27 -0
  478. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/deno/websocket.ts +51 -0
  479. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/lambda-edge/conninfo.ts +15 -0
  480. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/lambda-edge/handler.ts +189 -0
  481. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/lambda-edge/index.ts +14 -0
  482. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/netlify/handler.ts +10 -0
  483. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/netlify/index.ts +6 -0
  484. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/netlify/mod.ts +1 -0
  485. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/service-worker/handler.ts +34 -0
  486. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/service-worker/index.ts +5 -0
  487. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/service-worker/types.ts +14 -0
  488. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/vercel/conninfo.ts +8 -0
  489. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/vercel/handler.ts +9 -0
  490. package/tests/fixtures/corpus/oss-repos/hono/src/adapter/vercel/index.ts +7 -0
  491. package/tests/fixtures/corpus/oss-repos/hono/src/client/client.ts +214 -0
  492. package/tests/fixtures/corpus/oss-repos/hono/src/client/index.ts +14 -0
  493. package/tests/fixtures/corpus/oss-repos/hono/src/client/types.ts +180 -0
  494. package/tests/fixtures/corpus/oss-repos/hono/src/client/utils.ts +54 -0
  495. package/tests/fixtures/corpus/oss-repos/hono/src/compose.ts +94 -0
  496. package/tests/fixtures/corpus/oss-repos/hono/src/context.ts +914 -0
  497. package/tests/fixtures/corpus/oss-repos/hono/src/helper/accepts/accepts.ts +81 -0
  498. package/tests/fixtures/corpus/oss-repos/hono/src/helper/accepts/index.ts +6 -0
  499. package/tests/fixtures/corpus/oss-repos/hono/src/helper/adapter/index.ts +85 -0
  500. package/tests/fixtures/corpus/oss-repos/hono/src/helper/conninfo/index.ts +6 -0
  501. package/tests/fixtures/corpus/oss-repos/hono/src/helper/conninfo/types.ts +45 -0
  502. package/tests/fixtures/corpus/oss-repos/hono/src/helper/cookie/index.ts +130 -0
  503. package/tests/fixtures/corpus/oss-repos/hono/src/helper/css/common.ts +243 -0
  504. package/tests/fixtures/corpus/oss-repos/hono/src/helper/css/index.ts +220 -0
  505. package/tests/fixtures/corpus/oss-repos/hono/src/helper/dev/index.ts +79 -0
  506. package/tests/fixtures/corpus/oss-repos/hono/src/helper/factory/index.ts +246 -0
  507. package/tests/fixtures/corpus/oss-repos/hono/src/helper/html/index.ts +56 -0
  508. package/tests/fixtures/corpus/oss-repos/hono/src/helper/ssg/index.ts +13 -0
  509. package/tests/fixtures/corpus/oss-repos/hono/src/helper/ssg/middleware.ts +79 -0
  510. package/tests/fixtures/corpus/oss-repos/hono/src/helper/ssg/ssg.ts +388 -0
  511. package/tests/fixtures/corpus/oss-repos/hono/src/helper/ssg/utils.ts +71 -0
  512. package/tests/fixtures/corpus/oss-repos/hono/src/helper/streaming/index.ts +9 -0
  513. package/tests/fixtures/corpus/oss-repos/hono/src/helper/streaming/sse.ts +89 -0
  514. package/tests/fixtures/corpus/oss-repos/hono/src/helper/streaming/stream.ts +36 -0
  515. package/tests/fixtures/corpus/oss-repos/hono/src/helper/streaming/text.ts +15 -0
  516. package/tests/fixtures/corpus/oss-repos/hono/src/helper/testing/index.ts +26 -0
  517. package/tests/fixtures/corpus/oss-repos/hono/src/helper/websocket/index.ts +57 -0
  518. package/tests/fixtures/corpus/oss-repos/hono/src/hono-base.ts +523 -0
  519. package/tests/fixtures/corpus/oss-repos/hono/src/hono.ts +34 -0
  520. package/tests/fixtures/corpus/oss-repos/hono/src/http-exception.ts +78 -0
  521. package/tests/fixtures/corpus/oss-repos/hono/src/index.ts +51 -0
  522. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/base.ts +419 -0
  523. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/children.ts +20 -0
  524. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/components.ts +195 -0
  525. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/constants.ts +5 -0
  526. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/context.ts +50 -0
  527. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/client.ts +89 -0
  528. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/components.ts +39 -0
  529. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/context.ts +52 -0
  530. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/css.ts +246 -0
  531. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/hooks/index.ts +91 -0
  532. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/index.ts +159 -0
  533. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/intrinsic-element/components.ts +398 -0
  534. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/jsx-dev-runtime.ts +22 -0
  535. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/jsx-runtime.ts +7 -0
  536. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/render.ts +772 -0
  537. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/server.ts +70 -0
  538. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/dom/utils.ts +7 -0
  539. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/hooks/index.ts +426 -0
  540. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/index.ts +114 -0
  541. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/intrinsic-element/common.ts +11 -0
  542. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/intrinsic-element/components.ts +196 -0
  543. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/intrinsic-elements.ts +924 -0
  544. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/jsx-dev-runtime.ts +26 -0
  545. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/jsx-runtime.ts +18 -0
  546. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/streaming.ts +184 -0
  547. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/types.ts +41 -0
  548. package/tests/fixtures/corpus/oss-repos/hono/src/jsx/utils.ts +36 -0
  549. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/basic-auth/index.ts +128 -0
  550. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/bearer-auth/index.ts +159 -0
  551. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/body-limit/index.ts +115 -0
  552. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/cache/index.ts +127 -0
  553. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/combine/index.ts +153 -0
  554. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/compress/index.ts +79 -0
  555. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/context-storage/index.ts +55 -0
  556. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/cors/index.ts +141 -0
  557. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/csrf/index.ts +90 -0
  558. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/etag/index.ts +88 -0
  559. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/ip-restriction/index.ts +178 -0
  560. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/jsx-renderer/index.ts +158 -0
  561. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/jwt/index.ts +8 -0
  562. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/jwt/jwt.ts +159 -0
  563. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/logger/index.ts +93 -0
  564. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/method-override/index.ts +146 -0
  565. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/powered-by/index.ts +13 -0
  566. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/pretty-json/index.ts +50 -0
  567. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/request-id/index.ts +8 -0
  568. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/request-id/request-id.ts +59 -0
  569. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/secure-headers/index.ts +8 -0
  570. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/secure-headers/permissions-policy.ts +86 -0
  571. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/secure-headers/secure-headers.ts +319 -0
  572. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/serve-static/index.ts +140 -0
  573. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/timeout/index.ts +58 -0
  574. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/timing/index.ts +7 -0
  575. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/timing/timing.ts +225 -0
  576. package/tests/fixtures/corpus/oss-repos/hono/src/middleware/trailing-slash/index.ts +71 -0
  577. package/tests/fixtures/corpus/oss-repos/hono/src/preset/quick.ts +24 -0
  578. package/tests/fixtures/corpus/oss-repos/hono/src/preset/tiny.ts +20 -0
  579. package/tests/fixtures/corpus/oss-repos/hono/src/request.ts +403 -0
  580. package/tests/fixtures/corpus/oss-repos/hono/src/router/linear-router/index.ts +6 -0
  581. package/tests/fixtures/corpus/oss-repos/hono/src/router/linear-router/router.ts +132 -0
  582. package/tests/fixtures/corpus/oss-repos/hono/src/router/pattern-router/index.ts +6 -0
  583. package/tests/fixtures/corpus/oss-repos/hono/src/router/pattern-router/router.ts +54 -0
  584. package/tests/fixtures/corpus/oss-repos/hono/src/router/reg-exp-router/index.ts +6 -0
  585. package/tests/fixtures/corpus/oss-repos/hono/src/router/reg-exp-router/node.ts +159 -0
  586. package/tests/fixtures/corpus/oss-repos/hono/src/router/reg-exp-router/router.ts +274 -0
  587. package/tests/fixtures/corpus/oss-repos/hono/src/router/reg-exp-router/trie.ts +74 -0
  588. package/tests/fixtures/corpus/oss-repos/hono/src/router/smart-router/index.ts +6 -0
  589. package/tests/fixtures/corpus/oss-repos/hono/src/router/smart-router/router.ts +69 -0
  590. package/tests/fixtures/corpus/oss-repos/hono/src/router/trie-router/index.ts +6 -0
  591. package/tests/fixtures/corpus/oss-repos/hono/src/router/trie-router/node.ts +205 -0
  592. package/tests/fixtures/corpus/oss-repos/hono/src/router/trie-router/router.ts +28 -0
  593. package/tests/fixtures/corpus/oss-repos/hono/src/router.ts +103 -0
  594. package/tests/fixtures/corpus/oss-repos/hono/src/types.ts +2009 -0
  595. package/tests/fixtures/corpus/oss-repos/hono/src/utils/basic-auth.ts +26 -0
  596. package/tests/fixtures/corpus/oss-repos/hono/src/utils/body.ts +225 -0
  597. package/tests/fixtures/corpus/oss-repos/hono/src/utils/buffer.ts +65 -0
  598. package/tests/fixtures/corpus/oss-repos/hono/src/utils/color.ts +26 -0
  599. package/tests/fixtures/corpus/oss-repos/hono/src/utils/concurrent.ts +55 -0
  600. package/tests/fixtures/corpus/oss-repos/hono/src/utils/cookie.ts +230 -0
  601. package/tests/fixtures/corpus/oss-repos/hono/src/utils/crypto.ts +65 -0
  602. package/tests/fixtures/corpus/oss-repos/hono/src/utils/encode.ts +34 -0
  603. package/tests/fixtures/corpus/oss-repos/hono/src/utils/filepath.ts +56 -0
  604. package/tests/fixtures/corpus/oss-repos/hono/src/utils/handler.ts +15 -0
  605. package/tests/fixtures/corpus/oss-repos/hono/src/utils/html.ts +182 -0
  606. package/tests/fixtures/corpus/oss-repos/hono/src/utils/http-status.ts +69 -0
  607. package/tests/fixtures/corpus/oss-repos/hono/src/utils/ipaddr.ts +113 -0
  608. package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/index.ts +7 -0
  609. package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/jwa.ts +23 -0
  610. package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/jws.ts +226 -0
  611. package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/jwt.ts +114 -0
  612. package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/types.ts +83 -0
  613. package/tests/fixtures/corpus/oss-repos/hono/src/utils/jwt/utf8.ts +7 -0
  614. package/tests/fixtures/corpus/oss-repos/hono/src/utils/mime.ts +142 -0
  615. package/tests/fixtures/corpus/oss-repos/hono/src/utils/stream.ts +96 -0
  616. package/tests/fixtures/corpus/oss-repos/hono/src/utils/types.ts +105 -0
  617. package/tests/fixtures/corpus/oss-repos/hono/src/utils/url.ts +310 -0
  618. package/tests/fixtures/corpus/oss-repos/hono/src/validator/index.ts +7 -0
  619. package/tests/fixtures/corpus/oss-repos/hono/src/validator/validator.ts +151 -0
  620. package/tests/fixtures/corpus/oss-repos/hono/tsconfig.build.json +23 -0
  621. package/tests/fixtures/corpus/oss-repos/hono/tsconfig.json +28 -0
  622. package/tests/fixtures/corpus/oss-repos/hono/vitest.config.ts +34 -0
  623. package/tests/fixtures/corpus/oss-repos/hono/yarn.lock +6232 -0
  624. package/tests/fixtures/documentation/api-reference.md +412 -0
  625. package/tests/fixtures/documentation/architecture.md +214 -0
  626. package/tests/fixtures/documentation/deployment-guide.md +420 -0
  627. package/tests/fixtures/github-readmes/express.md +133 -0
  628. package/tests/fixtures/github-readmes/nextjs.md +106 -0
  629. package/tests/fixtures/github-readmes/react.md +74 -0
  630. package/tests/fixtures/github-readmes/typescript.md +93 -0
  631. package/tests/fixtures/github-readmes/vite.md +79 -0
  632. package/tests/fixtures/queries/core.json +125 -0
  633. package/tests/fixtures/queries/extended.json +427 -0
  634. package/tests/fixtures/queries/generated/.gitkeep +0 -0
  635. package/tests/fixtures/test-server.ts +267 -0
  636. package/tests/helpers/performance-metrics.ts +387 -0
  637. package/tests/helpers/search-relevance.ts +381 -0
  638. package/tests/integration/cli-consistency.test.ts +299 -0
  639. package/tests/integration/cli.test.ts +69 -0
  640. package/tests/integration/e2e-workflow.test.ts +612 -0
  641. package/tests/integration/python-bridge.test.ts +183 -0
  642. package/tests/integration/search-quality.test.ts +718 -0
  643. package/tests/integration/stress.test.ts +326 -0
  644. package/tests/mcp/server.test.ts +15 -0
  645. package/tests/scripts/schemas/evaluation.json +44 -0
  646. package/tests/scripts/schemas/query-generation.json +21 -0
  647. package/tests/services/code-unit.service.test.ts +47 -0
  648. package/tests/services/search.progressive-context.test.ts +35 -0
  649. package/tsconfig.json +34 -0
  650. package/tsup.config.ts +15 -0
  651. package/turndown-plugin-gfm.d.ts +29 -0
  652. package/vitest.config.ts +79 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/cli/program.ts","../src/cli/commands/store.ts","../src/cli/commands/search.ts","../src/cli/commands/index-cmd.ts","../src/cli/commands/serve.ts","../src/server/app.ts","../src/cli/commands/crawl.ts","../src/cli/commands/setup.ts","../src/defaults/repos.ts","../src/cli/commands/mcp.ts","../src/cli/commands/plugin-api.ts","../src/analysis/dependency-usage-analyzer.ts","../src/analysis/repo-url-resolver.ts","../src/plugin/commands.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { createProgram, getGlobalOptions } from './cli/program.js';\nimport { createStoreCommand } from './cli/commands/store.js';\nimport { createSearchCommand } from './cli/commands/search.js';\nimport { createIndexCommand } from './cli/commands/index-cmd.js';\nimport { createServeCommand } from './cli/commands/serve.js';\nimport { createCrawlCommand } from './cli/commands/crawl.js';\nimport { createSetupCommand } from './cli/commands/setup.js';\nimport { createMCPCommand } from './cli/commands/mcp.js';\nimport { createAddRepoCommand, createAddFolderCommand, createStoresCommand, createSuggestCommand } from './cli/commands/plugin-api.js';\n\n// Default paths\nconst DEFAULT_DATA_DIR = join(homedir(), '.bluera', 'bluera-knowledge', 'data');\nconst DEFAULT_CONFIG = join(homedir(), '.bluera', 'bluera-knowledge', 'config.json');\nconst DEFAULT_REPOS_DIR = join(homedir(), '.bluera', 'bluera-knowledge', 'repos');\n\n/**\n * Format a command and its subcommands recursively for comprehensive help output.\n */\nfunction formatCommandHelp(cmd: Command, indent: string = ''): string[] {\n const lines: string[] = [];\n const name = cmd.name();\n const desc = cmd.description();\n const args = cmd.registeredArguments.map(a => {\n const req = a.required;\n return req ? `<${a.name()}>` : `[${a.name()}]`;\n }).join(' ');\n\n // Command header with arguments\n lines.push(`${indent}${name}${args ? ' ' + args : ''}`);\n if (desc) {\n lines.push(`${indent} ${desc}`);\n }\n\n // Options (skip -h, --help which is auto-added)\n const options = cmd.options.filter(o => o.flags !== '-h, --help');\n for (const opt of options) {\n lines.push(`${indent} ${opt.flags.padEnd(28)} ${opt.description}`);\n }\n\n // Subcommands (recursive)\n const subcommands = cmd.commands.filter(c => c.name() !== 'help');\n for (const sub of subcommands) {\n lines.push('');\n lines.push(...formatCommandHelp(sub, indent + ' '));\n }\n\n return lines;\n}\n\n/**\n * Print comprehensive help showing all commands, subcommands, and options.\n */\nfunction printFullHelp(program: Command): void {\n console.log('bluera-knowledge - CLI tool for managing knowledge stores with semantic search\\n');\n\n // Active paths\n console.log('Paths:');\n console.log(` data ${DEFAULT_DATA_DIR}`);\n console.log(` config ${DEFAULT_CONFIG}`);\n console.log(` repos ${DEFAULT_REPOS_DIR}`);\n\n // Global options\n console.log('\\nGlobal options:');\n const globalOpts = program.options.filter(o => o.flags !== '-h, --help' && o.flags !== '-V, --version');\n for (const opt of globalOpts) {\n console.log(` ${opt.flags.padEnd(28)} ${opt.description}`);\n }\n\n console.log('\\nCommands:\\n');\n\n // All commands except help\n const commands = program.commands.filter(c => c.name() !== 'help');\n for (const cmd of commands) {\n console.log(formatCommandHelp(cmd).join('\\n'));\n console.log('');\n }\n}\n\nconst program = createProgram();\n\n// Plugin API commands (simple interface)\nprogram.addCommand(createAddRepoCommand(() => getGlobalOptions(program)));\nprogram.addCommand(createAddFolderCommand(() => getGlobalOptions(program)));\nprogram.addCommand(createStoresCommand(() => getGlobalOptions(program)));\nprogram.addCommand(createSuggestCommand(() => getGlobalOptions(program)));\n\n// Advanced CLI commands\nprogram.addCommand(createStoreCommand(() => getGlobalOptions(program)));\nprogram.addCommand(createSearchCommand(() => getGlobalOptions(program)));\nprogram.addCommand(createIndexCommand(() => getGlobalOptions(program)));\nprogram.addCommand(createServeCommand(() => getGlobalOptions(program)));\nprogram.addCommand(createCrawlCommand(() => getGlobalOptions(program)));\nprogram.addCommand(createSetupCommand(() => getGlobalOptions(program)));\nprogram.addCommand(createMCPCommand(() => getGlobalOptions(program)));\n\n// Show comprehensive help when no arguments provided\nif (process.argv.length <= 2) {\n printFullHelp(program);\n process.exit(0);\n}\n\nprogram.parse();\n","import { Command } from 'commander';\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\n\ninterface PackageJson {\n version: string;\n}\n\nfunction getVersion(): string {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const content = readFileSync(join(__dirname, '../package.json'), 'utf-8');\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const pkg: PackageJson = JSON.parse(content);\n return pkg.version;\n}\n\nconst version = getVersion();\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('bluera-knowledge')\n .description('CLI tool for managing knowledge stores with semantic search')\n .version(version);\n\n program\n .option('-c, --config <path>', 'Path to config file')\n .option('-d, --data-dir <path>', 'Data directory')\n .option('-p, --project-root <path>', 'Project root directory (for resolving relative paths)')\n .option('-f, --format <format>', 'Output format: json | table | plain', 'table')\n .option('-q, --quiet', 'Suppress non-essential output')\n .option('-v, --verbose', 'Enable verbose logging');\n\n return program;\n}\n\nexport interface GlobalOptions {\n config?: string | undefined;\n dataDir?: string | undefined;\n projectRoot?: string | undefined;\n format: 'json' | 'table' | 'plain';\n quiet?: boolean | undefined;\n verbose?: boolean | undefined;\n}\n\nexport function getGlobalOptions(program: Command): GlobalOptions {\n const opts = program.opts<GlobalOptions>();\n return {\n config: opts.config,\n dataDir: opts.dataDir,\n projectRoot: opts.projectRoot,\n format: opts.format,\n quiet: opts.quiet,\n verbose: opts.verbose,\n };\n}\n","import { Command } from 'commander';\nimport { createServices, destroyServices } from '../../services/index.js';\nimport type { GlobalOptions } from '../program.js';\nimport type { StoreType } from '../../types/store.js';\n\nexport function createStoreCommand(getOptions: () => GlobalOptions): Command {\n const store = new Command('store').description('Manage knowledge stores (collections of indexed documents)');\n\n store\n .command('list')\n .description('Show all stores with their type (file/repo/web) and ID')\n .option('-t, --type <type>', 'Filter by type: file, repo, or web')\n .action(async (options: { type?: StoreType }) => {\n const globalOpts = getOptions();\n const services = await createServices(globalOpts.config, globalOpts.dataDir);\n try {\n const stores = await services.store.list(options.type);\n\n if (globalOpts.format === 'json') {\n console.log(JSON.stringify(stores, null, 2));\n } else if (globalOpts.quiet === true) {\n // Quiet mode: just list store names, one per line\n for (const s of stores) {\n console.log(s.name);\n }\n } else {\n if (stores.length === 0) {\n console.log('No stores found.');\n } else {\n console.log('\\nStores:\\n');\n for (const s of stores) {\n console.log(` ${s.name} (${s.type}) - ${s.id}`);\n }\n console.log('');\n }\n }\n } finally {\n await destroyServices(services);\n }\n });\n\n store\n .command('create <name>')\n .description('Create a new store pointing to a local path or URL')\n .requiredOption('-t, --type <type>', 'Store type: file (local dir), repo (git), web (crawled site)')\n .requiredOption('-s, --source <path>', 'Local path for file/repo stores, URL for web stores')\n .option('-d, --description <desc>', 'Optional description for the store')\n .option('--tags <tags>', 'Comma-separated tags for filtering')\n .action(async (name: string, options: {\n type: StoreType;\n source: string;\n description?: string;\n tags?: string;\n }) => {\n const globalOpts = getOptions();\n const services = await createServices(globalOpts.config, globalOpts.dataDir);\n try {\n const result = await services.store.create({\n name,\n type: options.type,\n path: options.type !== 'web' ? options.source : undefined,\n url: options.type === 'web' ? options.source : undefined,\n description: options.description,\n tags: options.tags?.split(',').map((t) => t.trim()),\n });\n\n if (result.success) {\n if (globalOpts.format === 'json') {\n console.log(JSON.stringify(result.data, null, 2));\n } else {\n console.log(`\\nCreated store: ${result.data.name} (${result.data.id})\\n`);\n }\n } else {\n console.error(`Error: ${result.error.message}`);\n process.exit(1);\n }\n } finally {\n await destroyServices(services);\n }\n });\n\n store\n .command('info <store>')\n .description('Show store details: ID, type, path/URL, timestamps')\n .action(async (storeIdOrName: string) => {\n const globalOpts = getOptions();\n const services = await createServices(globalOpts.config, globalOpts.dataDir);\n try {\n const s = await services.store.getByIdOrName(storeIdOrName);\n\n if (s === undefined) {\n console.error(`Error: Store not found: ${storeIdOrName}`);\n process.exit(3);\n }\n\n if (globalOpts.format === 'json') {\n console.log(JSON.stringify(s, null, 2));\n } else {\n console.log(`\\nStore: ${s.name}`);\n console.log(` ID: ${s.id}`);\n console.log(` Type: ${s.type}`);\n if ('path' in s) console.log(` Path: ${s.path}`);\n if ('url' in s && s.url !== undefined) console.log(` URL: ${s.url}`);\n if (s.description !== undefined) console.log(` Description: ${s.description}`);\n console.log(` Created: ${s.createdAt.toISOString()}`);\n console.log(` Updated: ${s.updatedAt.toISOString()}`);\n console.log('');\n }\n } finally {\n await destroyServices(services);\n }\n });\n\n store\n .command('delete <store>')\n .description('Remove store and its indexed documents from LanceDB')\n .option('-f, --force', 'Delete without confirmation prompt')\n .option('-y, --yes', 'Alias for --force')\n .action(async (storeIdOrName: string, options: { force?: boolean; yes?: boolean }) => {\n const globalOpts = getOptions();\n const services = await createServices(globalOpts.config, globalOpts.dataDir);\n try {\n const s = await services.store.getByIdOrName(storeIdOrName);\n\n if (s === undefined) {\n console.error(`Error: Store not found: ${storeIdOrName}`);\n process.exit(3);\n }\n\n // Require --force or -y in non-TTY mode, prompt in TTY mode\n const skipConfirmation = options.force === true || options.yes === true;\n if (!skipConfirmation) {\n if (!process.stdin.isTTY) {\n console.error('Error: Use --force or -y to delete without confirmation in non-interactive mode');\n process.exit(1);\n }\n // Interactive confirmation\n const readline = await import('node:readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const answer = await new Promise<string>((resolve) => {\n rl.question(`Delete store \"${s.name}\"? [y/N] `, resolve);\n });\n rl.close();\n if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 'yes') {\n console.log('Cancelled.');\n process.exit(0);\n }\n }\n\n const result = await services.store.delete(s.id);\n\n if (result.success) {\n console.log(`Deleted store: ${s.name}`);\n } else {\n console.error(`Error: ${result.error.message}`);\n process.exit(1);\n }\n } finally {\n await destroyServices(services);\n }\n });\n\n return store;\n}\n","import { Command } from 'commander';\nimport { createServices, destroyServices } from '../../services/index.js';\nimport type { GlobalOptions } from '../program.js';\nimport type { SearchMode, DetailLevel } from '../../types/search.js';\n\nexport function createSearchCommand(getOptions: () => GlobalOptions): Command {\n const search = new Command('search')\n .description('Search indexed documents using vector similarity + full-text matching')\n .argument('<query>', 'Search query')\n .option('-s, --stores <stores>', 'Limit search to specific stores (comma-separated IDs or names)')\n .option('-m, --mode <mode>', 'vector (embeddings only), fts (text only), hybrid (both, default)', 'hybrid')\n .option('-n, --limit <count>', 'Maximum results to return (default: 10)', '10')\n .option('-t, --threshold <score>', 'Minimum score 0-1; omit low-relevance results')\n .option('--include-content', 'Show full document content, not just preview snippet')\n .option('--detail <level>', 'Context detail: minimal, contextual, full (default: minimal)', 'minimal')\n .action(async (query: string, options: {\n stores?: string;\n mode?: SearchMode;\n limit?: string;\n threshold?: string;\n includeContent?: boolean;\n detail?: DetailLevel;\n }) => {\n const globalOpts = getOptions();\n const services = await createServices(globalOpts.config, globalOpts.dataDir);\n try {\n // Get store IDs\n let storeIds = (await services.store.list()).map((s) => s.id);\n\n if (options.stores !== undefined) {\n const requestedStores = options.stores.split(',').map((s) => s.trim());\n const resolvedStores = [];\n\n for (const requested of requestedStores) {\n const store = await services.store.getByIdOrName(requested);\n if (store !== undefined) {\n resolvedStores.push(store.id);\n } else {\n console.error(`Error: Store not found: ${requested}`);\n process.exit(3);\n }\n }\n\n storeIds = resolvedStores;\n }\n\n if (storeIds.length === 0) {\n console.error('No stores to search. Create a store first.');\n process.exit(1);\n }\n\n // Initialize LanceDB for each store\n for (const storeId of storeIds) {\n await services.lance.initialize(storeId);\n }\n\n const results = await services.search.search({\n query,\n stores: storeIds,\n mode: options.mode ?? 'hybrid',\n limit: parseInt(options.limit ?? '10', 10),\n threshold: options.threshold !== undefined ? parseFloat(options.threshold) : undefined,\n includeContent: options.includeContent,\n detail: options.detail ?? 'minimal',\n });\n\n if (globalOpts.format === 'json') {\n console.log(JSON.stringify(results, null, 2));\n } else if (globalOpts.quiet === true) {\n // Quiet mode: just list matching paths/URLs, one per line\n for (const r of results.results) {\n const path = r.metadata.path ?? r.metadata.url ?? 'unknown';\n console.log(path);\n }\n } else {\n console.log(`\\nSearch: \"${query}\"`);\n console.log(`Mode: ${results.mode} | Detail: ${String(options.detail)} | Stores: ${String(results.stores.length)} | Results: ${String(results.totalResults)} | Time: ${String(results.timeMs)}ms\\n`);\n\n if (results.results.length === 0) {\n console.log('No results found.\\n');\n } else {\n for (let i = 0; i < results.results.length; i++) {\n const r = results.results[i];\n if (r === undefined) continue;\n\n if (r.summary) {\n console.log(`${String(i + 1)}. [${r.score.toFixed(2)}] ${r.summary.type}: ${r.summary.name}`);\n console.log(` ${r.summary.location}`);\n console.log(` ${r.summary.purpose}`);\n\n if (r.context && options.detail !== 'minimal') {\n console.log(` Imports: ${r.context.keyImports.slice(0, 3).join(', ')}`);\n console.log(` Related: ${r.context.relatedConcepts.slice(0, 3).join(', ')}`);\n }\n\n console.log();\n } else {\n // Fallback to old format\n const path = r.metadata.path ?? r.metadata.url ?? 'unknown';\n console.log(`${String(i + 1)}. [${r.score.toFixed(2)}] ${path}`);\n const preview = r.highlight ?? r.content.slice(0, 150).replace(/\\n/g, ' ') + (r.content.length > 150 ? '...' : '');\n console.log(` ${preview}\\n`);\n }\n }\n }\n }\n } finally {\n await destroyServices(services);\n }\n });\n\n return search;\n}\n","import { Command } from 'commander';\nimport ora, { type Ora } from 'ora';\nimport { createServices, destroyServices } from '../../services/index.js';\nimport type { GlobalOptions } from '../program.js';\n\nexport function createIndexCommand(getOptions: () => GlobalOptions): Command {\n const index = new Command('index')\n .description('Scan store files, chunk text, generate embeddings, save to LanceDB')\n .argument('<store>', 'Store ID or name')\n .option('--force', 'Re-index all files even if unchanged')\n .action(async (storeIdOrName: string, _options: { force?: boolean }) => {\n const globalOpts = getOptions();\n const services = await createServices(globalOpts.config, globalOpts.dataDir);\n try {\n const store = await services.store.getByIdOrName(storeIdOrName);\n\n if (store === undefined) {\n console.error(`Error: Store not found: ${storeIdOrName}`);\n process.exit(3);\n }\n\n // Use spinner in interactive mode (not quiet, not json output)\n const isInteractive = process.stdout.isTTY && globalOpts.quiet !== true && globalOpts.format !== 'json';\n let spinner: Ora | undefined;\n\n if (isInteractive) {\n spinner = ora(`Indexing store: ${store.name}`).start();\n } else if (globalOpts.quiet !== true && globalOpts.format !== 'json') {\n console.log(`Indexing store: ${store.name}`);\n }\n\n await services.lance.initialize(store.id);\n\n const result = await services.index.indexStore(store, (event) => {\n if (event.type === 'progress') {\n if (spinner) {\n spinner.text = `Indexing: ${String(event.current)}/${String(event.total)} files - ${event.message}`;\n }\n }\n });\n\n if (result.success) {\n if (globalOpts.format === 'json') {\n console.log(JSON.stringify(result.data, null, 2));\n } else {\n const message = `Indexed ${String(result.data.documentsIndexed)} documents, ${String(result.data.chunksCreated)} chunks in ${String(result.data.timeMs)}ms`;\n if (spinner !== undefined) {\n spinner.succeed(message);\n } else if (globalOpts.quiet !== true) {\n console.log(message);\n }\n }\n } else {\n const message = `Error: ${result.error.message}`;\n if (spinner !== undefined) {\n spinner.fail(message);\n } else {\n console.error(message);\n }\n process.exit(4);\n }\n } finally {\n await destroyServices(services);\n }\n });\n\n index\n .command('watch <store>')\n .description('Watch store directory; re-index when files change')\n .option('--debounce <ms>', 'Wait N ms after last change before re-indexing (default: 1000)', '1000')\n .action(async (storeIdOrName: string, options: { debounce?: string }) => {\n const globalOpts = getOptions();\n const services = await createServices(globalOpts.config, globalOpts.dataDir);\n\n const store = await services.store.getByIdOrName(storeIdOrName);\n if (store === undefined || (store.type !== 'file' && store.type !== 'repo')) {\n console.error(`Error: File/repo store not found: ${storeIdOrName}`);\n process.exit(3);\n }\n\n const { WatchService } = await import('../../services/watch.service.js');\n const watchService = new WatchService(services.index, services.lance);\n\n if (globalOpts.quiet !== true) {\n console.log(`Watching ${store.name} for changes...`);\n }\n await watchService.watch(store, parseInt(options.debounce ?? '1000', 10), () => {\n if (globalOpts.quiet !== true) {\n console.log(`Re-indexed ${store.name}`);\n }\n });\n\n // Keep process alive\n process.on('SIGINT', () => {\n void (async (): Promise<void> => {\n await watchService.unwatchAll();\n process.exit(0);\n })().catch(() => {\n // Error during shutdown - process.exit already called\n });\n });\n });\n\n return index;\n}\n","import { Command } from 'commander';\nimport { serve } from '@hono/node-server';\nimport { createServices } from '../../services/index.js';\nimport { createApp } from '../../server/app.js';\nimport type { GlobalOptions } from '../program.js';\n\nexport function createServeCommand(getOptions: () => GlobalOptions): Command {\n return new Command('serve')\n .description('Start HTTP API server for programmatic search access')\n .option('-p, --port <port>', 'Port to listen on (default: 3847)', '3847')\n .option('--host <host>', 'Bind address (default: 127.0.0.1, use 0.0.0.0 for all interfaces)', '127.0.0.1')\n .action(async (options: { port?: string; host?: string }) => {\n const globalOpts = getOptions();\n const services = await createServices(globalOpts.config, globalOpts.dataDir);\n const app = createApp(services);\n\n const port = parseInt(options.port ?? '3847', 10);\n const host = options.host ?? '127.0.0.1';\n\n console.log(`Starting server on http://${host}:${String(port)}`);\n\n serve({\n fetch: app.fetch,\n port,\n hostname: host,\n });\n });\n}\n","import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { z } from 'zod';\nimport type { ServiceContainer } from '../services/index.js';\nimport type { SearchQuery } from '../types/search.js';\nimport { createStoreId } from '../types/brands.js';\n\n// HTTP API validation schemas (consistent with MCP schemas)\nconst CreateStoreBodySchema = z.object({\n name: z.string().min(1, 'Store name must be a non-empty string'),\n type: z.enum(['file', 'repo', 'web']),\n path: z.string().min(1).optional(),\n url: z.string().min(1).optional(),\n description: z.string().optional(),\n tags: z.array(z.string()).optional(),\n branch: z.string().optional(),\n depth: z.number().int().positive().optional(),\n}).refine(\n (data) => {\n switch (data.type) {\n case 'file': return data.path !== undefined;\n case 'web': return data.url !== undefined;\n case 'repo': return data.path !== undefined || data.url !== undefined;\n }\n },\n { message: 'Missing required field: file stores need path, web stores need url, repo stores need path or url' }\n);\n\nconst SearchBodySchema = z.object({\n query: z.string().min(1, 'Query must be a non-empty string'),\n detail: z.enum(['minimal', 'contextual', 'full']).optional(),\n limit: z.number().int().positive().optional(),\n stores: z.array(z.string()).optional(),\n});\n\nexport function createApp(services: ServiceContainer): Hono {\n const app = new Hono();\n\n app.use('*', cors());\n\n // Health check\n app.get('/health', (c) => c.json({ status: 'ok' }));\n\n // Stores\n app.get('/api/stores', async (c) => {\n const stores = await services.store.list();\n return c.json(stores);\n });\n\n app.post('/api/stores', async (c) => {\n const jsonData: unknown = await c.req.json();\n const parseResult = CreateStoreBodySchema.safeParse(jsonData);\n if (!parseResult.success) {\n return c.json({ error: parseResult.error.issues[0]?.message ?? 'Invalid request body' }, 400);\n }\n const result = await services.store.create(parseResult.data);\n if (result.success) {\n return c.json(result.data, 201);\n }\n return c.json({ error: result.error.message }, 400);\n });\n\n app.get('/api/stores/:id', async (c) => {\n const store = await services.store.getByIdOrName(c.req.param('id'));\n if (!store) return c.json({ error: 'Not found' }, 404);\n return c.json(store);\n });\n\n app.delete('/api/stores/:id', async (c) => {\n const store = await services.store.getByIdOrName(c.req.param('id'));\n if (!store) return c.json({ error: 'Not found' }, 404);\n const result = await services.store.delete(store.id);\n if (result.success) return c.json({ deleted: true });\n return c.json({ error: result.error.message }, 400);\n });\n\n // Search\n app.post('/api/search', async (c) => {\n const jsonData: unknown = await c.req.json();\n const parseResult = SearchBodySchema.safeParse(jsonData);\n if (!parseResult.success) {\n return c.json({ error: parseResult.error.issues[0]?.message ?? 'Invalid request body' }, 400);\n }\n\n const storeIds = (await services.store.list()).map(s => s.id);\n\n for (const id of storeIds) {\n await services.lance.initialize(id);\n }\n\n // Convert user-provided store strings to StoreIds, or use all stores\n const requestedStores = parseResult.data.stores !== undefined\n ? parseResult.data.stores.map(s => createStoreId(s))\n : storeIds;\n\n const query: SearchQuery = {\n query: parseResult.data.query,\n detail: parseResult.data.detail ?? 'minimal',\n limit: parseResult.data.limit ?? 10,\n stores: requestedStores,\n };\n const results = await services.search.search(query);\n return c.json(results);\n });\n\n // Index\n app.post('/api/stores/:id/index', async (c) => {\n const store = await services.store.getByIdOrName(c.req.param('id'));\n if (!store) return c.json({ error: 'Not found' }, 404);\n\n await services.lance.initialize(store.id);\n const result = await services.index.indexStore(store);\n\n if (result.success) return c.json(result.data);\n return c.json({ error: result.error.message }, 400);\n });\n\n return app;\n}\n","import { Command } from 'commander';\nimport { createHash } from 'node:crypto';\nimport ora, { type Ora } from 'ora';\nimport { createServices, destroyServices } from '../../services/index.js';\nimport { IntelligentCrawler, type CrawlProgress } from '../../crawl/intelligent-crawler.js';\nimport { createDocumentId } from '../../types/brands.js';\nimport type { GlobalOptions } from '../program.js';\nimport type { Document } from '../../types/document.js';\n\nexport function createCrawlCommand(getOptions: () => GlobalOptions): Command {\n return new Command('crawl')\n .description('Crawl web pages with natural language control and index into store')\n .argument('<url>', 'URL to crawl')\n .argument('<store>', 'Target web store to add crawled content to')\n .option('--crawl <instruction>', 'Natural language instruction for what to crawl (e.g., \"all Getting Started pages\")')\n .option('--extract <instruction>', 'Natural language instruction for what to extract (e.g., \"extract API references\")')\n .option('--simple', 'Use simple BFS mode instead of intelligent crawling')\n .option('--max-pages <number>', 'Maximum number of pages to crawl', '50')\n .option('--headless', 'Use headless browser for JavaScript-rendered sites')\n .action(async (url: string, storeIdOrName: string, cmdOptions: {\n crawl?: string;\n extract?: string;\n simple?: boolean;\n maxPages?: string;\n headless?: boolean;\n }) => {\n const globalOpts = getOptions();\n const services = await createServices(globalOpts.config, globalOpts.dataDir);\n\n const store = await services.store.getByIdOrName(storeIdOrName);\n if (!store || store.type !== 'web') {\n console.error(`Error: Web store not found: ${storeIdOrName}`);\n process.exit(3);\n }\n\n const maxPages = cmdOptions.maxPages !== undefined ? parseInt(cmdOptions.maxPages) : 50;\n\n // Use spinner in interactive mode\n const isInteractive = process.stdout.isTTY && globalOpts.quiet !== true && globalOpts.format !== 'json';\n let spinner: Ora | undefined;\n\n if (isInteractive) {\n const mode = cmdOptions.simple === true ? 'simple' : 'intelligent';\n spinner = ora(`Crawling ${url} (${mode} mode)`).start();\n } else if (globalOpts.quiet !== true && globalOpts.format !== 'json') {\n console.log(`Crawling ${url}`);\n }\n\n const crawler = new IntelligentCrawler();\n let pagesIndexed = 0;\n\n // Listen for progress events\n crawler.on('progress', (progress: CrawlProgress) => {\n if (spinner) {\n if (progress.type === 'strategy') {\n spinner.text = progress.message !== undefined ? progress.message : 'Analyzing crawl strategy...';\n } else if (progress.type === 'page') {\n const url = progress.currentUrl !== undefined ? progress.currentUrl : 'unknown';\n spinner.text = `Crawling ${String(progress.pagesVisited + 1)}/${String(maxPages)} - ${url}`;\n } else if (progress.type === 'extraction') {\n const url = progress.currentUrl !== undefined ? progress.currentUrl : 'unknown';\n spinner.text = `Extracting from ${url}...`;\n } else if (progress.type === 'error' && progress.message !== undefined) {\n spinner.warn(progress.message);\n }\n }\n });\n\n try {\n await services.lance.initialize(store.id);\n const docs: Document[] = [];\n\n // Crawl pages using IntelligentCrawler\n for await (const result of crawler.crawl(url, {\n ...(cmdOptions.crawl !== undefined && { crawlInstruction: cmdOptions.crawl }),\n ...(cmdOptions.extract !== undefined && { extractInstruction: cmdOptions.extract }),\n maxPages,\n ...(cmdOptions.simple !== undefined && { simple: cmdOptions.simple }),\n useHeadless: cmdOptions.headless ?? false,\n })) {\n // Embed and index the content (use extracted if available, otherwise markdown)\n const contentToEmbed = result.extracted !== undefined ? result.extracted : result.markdown;\n const vector = await services.embeddings.embed(contentToEmbed);\n\n docs.push({\n id: createDocumentId(`${store.id}-${createHash('md5').update(result.url).digest('hex')}`),\n content: contentToEmbed,\n vector,\n metadata: {\n type: 'web',\n storeId: store.id,\n url: result.url,\n title: result.title,\n extracted: result.extracted !== undefined,\n depth: result.depth,\n indexedAt: new Date(),\n },\n });\n\n pagesIndexed++;\n }\n\n // Index all documents\n if (docs.length > 0) {\n if (spinner) {\n spinner.text = 'Indexing documents...';\n }\n await services.lance.addDocuments(store.id, docs);\n }\n\n const crawlResult = {\n success: true,\n store: store.name,\n url,\n pagesCrawled: pagesIndexed,\n mode: cmdOptions.simple === true ? 'simple' : 'intelligent',\n hadCrawlInstruction: cmdOptions.crawl !== undefined,\n hadExtractInstruction: cmdOptions.extract !== undefined,\n };\n\n if (globalOpts.format === 'json') {\n console.log(JSON.stringify(crawlResult, null, 2));\n } else if (spinner !== undefined) {\n spinner.succeed(`Crawled and indexed ${String(pagesIndexed)} pages`);\n } else if (globalOpts.quiet !== true) {\n console.log(`Crawled and indexed ${String(pagesIndexed)} pages`);\n }\n } catch (error) {\n const message = `Crawl failed: ${error instanceof Error ? error.message : String(error)}`;\n if (spinner) {\n spinner.fail(message);\n } else {\n console.error(`Error: ${message}`);\n }\n process.exit(6);\n } finally {\n await crawler.stop();\n await destroyServices(services);\n }\n });\n}\n","import { Command } from 'commander';\nimport { spawnSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport ora from 'ora';\nimport { createServices, destroyServices } from '../../services/index.js';\nimport { DEFAULT_REPOS, type DefaultRepo } from '../../defaults/repos.js';\nimport type { GlobalOptions } from '../program.js';\n\nconst DEFAULT_REPOS_DIR = join(homedir(), '.bluera', 'bluera-knowledge', 'repos');\n\nexport function createSetupCommand(getOptions: () => GlobalOptions): Command {\n const setup = new Command('setup')\n .description('Quick-start with pre-configured Claude/Anthropic documentation repos');\n\n setup\n .command('repos')\n .description('Clone repos to ~/.bluera/bluera-knowledge/repos/, create stores, index all content')\n .option('--repos-dir <path>', 'Clone destination (default: ~/.bluera/bluera-knowledge/repos/)', DEFAULT_REPOS_DIR)\n .option('--skip-clone', 'Don\\'t clone; assume repos already exist locally')\n .option('--skip-index', 'Clone and create stores but don\\'t index yet')\n .option('--only <names>', 'Only process matching repos (comma-separated, partial match)')\n .option('--list', 'Print available repos without cloning/indexing')\n .action(async (options: {\n reposDir: string;\n skipClone?: boolean;\n skipIndex?: boolean;\n only?: string;\n list?: boolean;\n }) => {\n const globalOpts = getOptions();\n\n // List mode: just show available repos\n if (options.list === true) {\n console.log('\\nDefault repositories:\\n');\n for (const repo of DEFAULT_REPOS) {\n console.log(` ${repo.name}`);\n console.log(` URL: ${repo.url}`);\n console.log(` Description: ${repo.description}`);\n console.log(` Tags: ${repo.tags.join(', ')}`);\n console.log('');\n }\n return;\n }\n\n const services = await createServices(globalOpts.config, globalOpts.dataDir);\n try {\n // Filter repos if --only specified\n let repos: readonly DefaultRepo[] = DEFAULT_REPOS;\n if (options.only !== undefined && options.only !== '') {\n const onlyNames = options.only.split(',').map(n => n.trim().toLowerCase());\n repos = DEFAULT_REPOS.filter(r =>\n onlyNames.some(n => r.name.toLowerCase().includes(n))\n );\n if (repos.length === 0) {\n console.error(`No repos matched: ${options.only}`);\n console.log('Available repos:', DEFAULT_REPOS.map(r => r.name).join(', '));\n process.exit(1);\n }\n }\n\n console.log(`\\nSetting up ${String(repos.length)} repositories...\\n`);\n\n // Ensure repos directory exists\n await mkdir(options.reposDir, { recursive: true });\n\n for (const repo of repos) {\n const repoPath = join(options.reposDir, repo.name);\n const spinner = ora(`Processing ${repo.name}`).start();\n\n try {\n // Step 1: Clone if needed\n if (options.skipClone !== true) {\n if (existsSync(repoPath)) {\n spinner.text = `${repo.name}: Already cloned, pulling latest...`;\n const pullResult = spawnSync('git', ['pull', '--ff-only'], { cwd: repoPath, stdio: 'pipe' });\n if (pullResult.status !== 0) {\n // Pull failed (maybe diverged), that's okay\n spinner.text = `${repo.name}: Pull skipped (local changes)`;\n }\n } else {\n spinner.text = `${repo.name}: Cloning...`;\n const cloneResult = spawnSync('git', ['clone', repo.url, repoPath], { stdio: 'pipe' });\n if (cloneResult.status !== 0) {\n const errorMessage = cloneResult.stderr.length > 0\n ? cloneResult.stderr.toString()\n : 'Git clone failed';\n throw new Error(errorMessage);\n }\n }\n }\n\n // Step 2: Create store if needed\n spinner.text = `${repo.name}: Creating store...`;\n const existingStore = await services.store.getByIdOrName(repo.name);\n\n let storeId: string;\n if (existingStore) {\n storeId = existingStore.id;\n spinner.text = `${repo.name}: Store already exists`;\n } else {\n const result = await services.store.create({\n name: repo.name,\n type: 'repo',\n path: repoPath,\n description: repo.description,\n tags: repo.tags,\n });\n\n if (!result.success) {\n throw new Error(result.error instanceof Error ? result.error.message : String(result.error));\n }\n storeId = result.data.id;\n }\n\n // Step 3: Index if needed\n if (options.skipIndex !== true) {\n spinner.text = `${repo.name}: Indexing...`;\n const store = await services.store.getByIdOrName(storeId);\n if (store) {\n await services.lance.initialize(store.id);\n const indexResult = await services.index.indexStore(store, (event) => {\n if (event.type === 'progress') {\n spinner.text = `${repo.name}: Indexing ${String(event.current)}/${String(event.total)} files`;\n }\n });\n\n if (indexResult.success) {\n spinner.succeed(\n `${repo.name}: ${String(indexResult.data.documentsIndexed)} docs, ${String(indexResult.data.chunksCreated)} chunks`\n );\n } else {\n throw new Error(indexResult.error instanceof Error ? indexResult.error.message : String(indexResult.error));\n }\n }\n } else {\n spinner.succeed(`${repo.name}: Ready (indexing skipped)`);\n }\n } catch (error) {\n spinner.fail(`${repo.name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n console.log('\\nSetup complete! Use \"bluera-knowledge search <query>\" to search.\\n');\n } finally {\n await destroyServices(services);\n }\n });\n\n return setup;\n}\n","/**\n * Default repositories for quick setup.\n * These are Anthropic/Claude-related repositories that provide\n * useful knowledge for Claude Code development.\n */\n\nexport interface DefaultRepo {\n /** Git URL for cloning */\n url: string;\n /** Friendly name for the store */\n name: string;\n /** Description of what this repo contains */\n description: string;\n /** Tags for categorization */\n tags: string[];\n}\n\nexport const DEFAULT_REPOS: readonly DefaultRepo[] = [\n {\n url: 'git@github.com:ericbuess/claude-code-docs.git',\n name: 'claude-code-docs',\n description: 'Claude Code documentation',\n tags: ['claude', 'docs', 'claude-code'],\n },\n {\n url: 'git@github.com:anthropics/claude-code.git',\n name: 'claude-code',\n description: 'Claude Code CLI tool source',\n tags: ['claude', 'cli', 'anthropic'],\n },\n {\n url: 'git@github.com:anthropics/claude-agent-sdk-python.git',\n name: 'claude-agent-sdk-python',\n description: 'Claude Agent SDK for Python',\n tags: ['claude', 'sdk', 'python', 'agents'],\n },\n {\n url: 'git@github.com:anthropics/skills.git',\n name: 'claude-skills',\n description: 'Claude skills and capabilities',\n tags: ['claude', 'skills'],\n },\n {\n url: 'git@github.com:anthropics/claude-quickstarts.git',\n name: 'claude-quickstarts',\n description: 'Claude quickstart examples and tutorials',\n tags: ['claude', 'examples', 'tutorials'],\n },\n {\n url: 'git@github.com:anthropics/claude-plugins-official.git',\n name: 'claude-plugins',\n description: 'Official Claude plugins',\n tags: ['claude', 'plugins'],\n },\n {\n url: 'git@github.com:anthropics/claude-agent-sdk-typescript.git',\n name: 'claude-agent-sdk-typescript',\n description: 'Claude Agent SDK for TypeScript',\n tags: ['claude', 'sdk', 'typescript', 'agents'],\n },\n {\n url: 'git@github.com:anthropics/claude-agent-sdk-demos.git',\n name: 'claude-agent-sdk-demos',\n description: 'Claude Agent SDK demo applications',\n tags: ['claude', 'sdk', 'demos', 'examples'],\n },\n];\n","import { Command } from 'commander';\nimport type { GlobalOptions } from '../program.js';\nimport { runMCPServer } from '../../mcp/server.js';\n\nexport function createMCPCommand(getOptions: () => GlobalOptions): Command {\n const mcp = new Command('mcp')\n .description('Start MCP (Model Context Protocol) server for AI agent integration')\n .action(async () => {\n const opts = getOptions();\n\n await runMCPServer({\n dataDir: opts.dataDir,\n config: opts.config\n });\n });\n\n return mcp;\n}\n","import { Command } from 'commander';\nimport { handleAddRepo, handleAddFolder, handleStores, handleSuggest } from '../../plugin/commands.js';\nimport type { GlobalOptions } from '../program.js';\n\n/**\n * CLI commands that mirror the plugin API for consistency.\n * These commands provide a simpler interface that matches the plugin commands.\n */\n\nexport function createAddRepoCommand(_getOptions: () => GlobalOptions): Command {\n return new Command('add-repo')\n .description('Clone and index a library source repository')\n .argument('<url>', 'Git repository URL')\n .option('--name <name>', 'Store name (defaults to repo name)')\n .option('--branch <branch>', 'Git branch to clone')\n .action(async (url: string, options: { name?: string; branch?: string }) => {\n await handleAddRepo({ url, ...options });\n });\n}\n\nexport function createAddFolderCommand(_getOptions: () => GlobalOptions): Command {\n return new Command('add-folder')\n .description('Index a local folder of reference material')\n .argument('<path>', 'Folder path to index')\n .option('--name <name>', 'Store name (defaults to folder name)')\n .action(async (path: string, options: { name?: string }) => {\n await handleAddFolder({ path, ...options });\n });\n}\n\nexport function createStoresCommand(_getOptions: () => GlobalOptions): Command {\n return new Command('stores')\n .description('List all indexed library stores')\n .action(async () => {\n await handleStores();\n });\n}\n\nexport function createSuggestCommand(_getOptions: () => GlobalOptions): Command {\n return new Command('suggest')\n .description('Suggest important dependencies to add to knowledge stores')\n .action(async () => {\n await handleSuggest();\n });\n}\n","import { readFile, readdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, extname } from 'node:path';\nimport { ASTParser } from './ast-parser.js';\nimport type { Result } from '../types/result.js';\nimport { ok, err } from '../types/result.js';\nimport type { SupportedLanguage } from './repo-url-resolver.js';\n\nconst TEXT_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',\n '.py', '.rb', '.go', '.java', '.rs', '.php',\n '.md', '.txt', '.json', '.yml', '.yaml', '.toml'\n]);\n\nexport interface PackageUsage {\n packageName: string;\n importCount: number;\n fileCount: number;\n files: string[];\n isDevDependency: boolean;\n language: SupportedLanguage;\n}\n\nexport interface DependencyAnalysisResult {\n usages: PackageUsage[];\n totalFilesScanned: number;\n skippedFiles: number;\n analysisTimeMs: number;\n}\n\ninterface DeclaredDependency {\n name: string;\n isDev: boolean;\n language: SupportedLanguage;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport class DependencyUsageAnalyzer {\n private readonly astParser: ASTParser;\n\n constructor() {\n this.astParser = new ASTParser();\n }\n\n async analyze(\n projectRoot: string,\n onProgress?: (current: number, total: number, message: string) => void\n ): Promise<Result<DependencyAnalysisResult>> {\n const startTime = Date.now();\n\n try {\n // 1. Read declared dependencies from package.json/requirements.txt\n const declaredDeps = await this.readDeclaredDependencies(projectRoot);\n\n if (declaredDeps.size === 0) {\n return ok({\n usages: [],\n totalFilesScanned: 0,\n skippedFiles: 0,\n analysisTimeMs: Date.now() - startTime\n });\n }\n\n // 2. Scan all source files\n const files = await this.scanDirectory(projectRoot);\n\n if (files.length === 0) {\n return ok({\n usages: [],\n totalFilesScanned: 0,\n skippedFiles: 0,\n analysisTimeMs: Date.now() - startTime\n });\n }\n\n // 3. Count imports for each package\n const usageMap = new Map<string, PackageUsage>();\n let processedCount = 0;\n let skippedCount = 0;\n\n for (const filePath of files) {\n try {\n const content = await readFile(filePath, 'utf-8');\n const imports = this.extractImportsForFile(filePath, content);\n\n for (const importInfo of imports) {\n const packageName = this.extractPackageName(importInfo.source);\n\n if (packageName !== null && declaredDeps.has(packageName)) {\n const dep = declaredDeps.get(packageName);\n if (dep !== undefined) {\n this.incrementUsage(\n usageMap,\n packageName,\n filePath,\n dep.isDev,\n dep.language\n );\n }\n }\n }\n\n processedCount++;\n if (onProgress !== undefined && processedCount % 10 === 0) {\n onProgress(processedCount, files.length, `Analyzed ${String(processedCount)}/${String(files.length)} files`);\n }\n } catch {\n // Skip files that can't be read or parsed\n skippedCount++;\n }\n }\n\n // 4. Sort by usage frequency\n const sortedUsages = Array.from(usageMap.values())\n .sort((a, b) => b.importCount - a.importCount);\n\n return ok({\n usages: sortedUsages,\n totalFilesScanned: processedCount,\n skippedFiles: skippedCount,\n analysisTimeMs: Date.now() - startTime\n });\n } catch (error) {\n const errorObj = new Error(\n error instanceof Error ? error.message : 'Unknown error during analysis'\n );\n errorObj.name = 'ANALYSIS_ERROR';\n return err(errorObj);\n }\n }\n\n private extractPackageName(importSource: string): string | null {\n // Relative imports (./foo, ../bar, /absolute) -> null\n if (importSource.startsWith('.') || importSource.startsWith('/')) {\n return null;\n }\n\n // Node built-ins (node:fs, node:path) -> null\n if (importSource.startsWith('node:')) {\n return null;\n }\n\n // Scoped packages: @org/package/path -> @org/package\n if (importSource.startsWith('@')) {\n const parts = importSource.split('/');\n if (parts.length >= 2 && parts[0] !== undefined && parts[1] !== undefined) {\n return `${parts[0]}/${parts[1]}`;\n }\n return null;\n }\n\n // Regular packages: lodash/get -> lodash\n const firstPart = importSource.split('/')[0];\n return firstPart ?? null;\n }\n\n private extractImportsForFile(filePath: string, content: string): Array<{ source: string }> {\n const ext = extname(filePath);\n\n // JavaScript/TypeScript - use AST parser\n if (['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'].includes(ext)) {\n try {\n return this.astParser.extractImports(content);\n } catch {\n // Fallback to regex for malformed files\n return this.extractImportsRegex(content, 'javascript');\n }\n }\n\n // Python - use regex\n if (ext === '.py') {\n return this.extractImportsRegex(content, 'python');\n }\n\n return [];\n }\n\n private extractImportsRegex(content: string, language: 'javascript' | 'python'): Array<{ source: string }> {\n const imports: Array<{ source: string }> = [];\n\n if (language === 'javascript') {\n // Match: import ... from 'package'\n // Match: require('package')\n const importPattern = /import\\s+.*?from\\s+['\"]([^'\"]+)['\"]/g;\n const requirePattern = /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n\n for (const match of content.matchAll(importPattern)) {\n if (match[1] !== undefined) imports.push({ source: match[1] });\n }\n\n for (const match of content.matchAll(requirePattern)) {\n if (match[1] !== undefined) imports.push({ source: match[1] });\n }\n } else {\n // Match: import package\n // Match: from package import ...\n const importPattern = /^import\\s+([a-zA-Z0-9_]+)/gm;\n const fromPattern = /^from\\s+([a-zA-Z0-9_]+)/gm;\n\n for (const match of content.matchAll(importPattern)) {\n if (match[1] !== undefined) imports.push({ source: match[1] });\n }\n\n for (const match of content.matchAll(fromPattern)) {\n if (match[1] !== undefined) imports.push({ source: match[1] });\n }\n }\n\n return imports;\n }\n\n private incrementUsage(\n usageMap: Map<string, PackageUsage>,\n packageName: string,\n filePath: string,\n isDevDependency: boolean,\n language: SupportedLanguage\n ): void {\n const existing = usageMap.get(packageName);\n\n if (existing) {\n existing.importCount++;\n if (!existing.files.includes(filePath)) {\n existing.fileCount++;\n existing.files.push(filePath);\n }\n } else {\n usageMap.set(packageName, {\n packageName,\n importCount: 1,\n fileCount: 1,\n files: [filePath],\n isDevDependency,\n language\n });\n }\n }\n\n private async scanDirectory(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Skip common ignored directories\n if (!['node_modules', '.git', 'dist', 'build', 'coverage', '__pycache__', '.venv', 'venv'].includes(entry.name)) {\n files.push(...(await this.scanDirectory(fullPath)));\n }\n } else if (entry.isFile()) {\n const ext = extname(entry.name);\n if (TEXT_EXTENSIONS.has(ext)) {\n files.push(fullPath);\n }\n }\n }\n } catch {\n // Ignore permission errors\n }\n\n return files;\n }\n\n private async readDeclaredDependencies(\n projectRoot: string\n ): Promise<Map<string, DeclaredDependency>> {\n const deps = new Map<string, DeclaredDependency>();\n\n // Read package.json (Node.js)\n const packageJsonPath = join(projectRoot, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const content = await readFile(packageJsonPath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n\n if (isRecord(parsed)) {\n // Regular dependencies\n if (isRecord(parsed['dependencies'])) {\n for (const name of Object.keys(parsed['dependencies'])) {\n deps.set(name, { name, isDev: false, language: 'javascript' });\n }\n }\n\n // Dev dependencies\n if (isRecord(parsed['devDependencies'])) {\n for (const name of Object.keys(parsed['devDependencies'])) {\n deps.set(name, { name, isDev: true, language: 'javascript' });\n }\n }\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n // Read requirements.txt (Python)\n const reqPath = join(projectRoot, 'requirements.txt');\n if (existsSync(reqPath)) {\n try {\n const content = await readFile(reqPath, 'utf-8');\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === '' || trimmed.startsWith('#')) continue;\n\n // Parse package name (before ==, >=, etc.)\n const match = /^([a-zA-Z0-9_-]+)/.exec(trimmed);\n if (match !== null && match[1] !== undefined) {\n const name = match[1].toLowerCase();\n deps.set(name, { name, isDev: false, language: 'python' });\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Read pyproject.toml (Python)\n const pyprojectPath = join(projectRoot, 'pyproject.toml');\n if (existsSync(pyprojectPath)) {\n try {\n const content = await readFile(pyprojectPath, 'utf-8');\n // Simple regex extraction (good enough for dependency names)\n const depMatches = content.matchAll(/\"([a-zA-Z0-9_-]+)\"/g);\n\n for (const match of depMatches) {\n if (match[1] !== undefined) {\n const name = match[1].toLowerCase();\n deps.set(name, { name, isDev: false, language: 'python' });\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Read Cargo.toml (Rust)\n const cargoPath = join(projectRoot, 'Cargo.toml');\n if (existsSync(cargoPath)) {\n try {\n const content = await readFile(cargoPath, 'utf-8');\n // Match [dependencies] section entries like: serde = \"1.0\"\n // or serde = { version = \"1.0\", features = [...] }\n const inDepsSection = /\\[dependencies\\]([\\s\\S]*?)(?=\\n\\[|$)/;\n const depsMatch = inDepsSection.exec(content);\n if (depsMatch !== null && depsMatch[1] !== undefined) {\n const depsSection = depsMatch[1];\n // Match crate names at start of lines\n const cratePattern = /^([a-zA-Z0-9_-]+)\\s*=/gm;\n for (const match of depsSection.matchAll(cratePattern)) {\n if (match[1] !== undefined) {\n deps.set(match[1], { name: match[1], isDev: false, language: 'rust' });\n }\n }\n }\n\n // Also check [dev-dependencies]\n const inDevDepsSection = /\\[dev-dependencies\\]([\\s\\S]*?)(?=\\n\\[|$)/;\n const devDepsMatch = inDevDepsSection.exec(content);\n if (devDepsMatch !== null && devDepsMatch[1] !== undefined) {\n const devDepsSection = devDepsMatch[1];\n const cratePattern = /^([a-zA-Z0-9_-]+)\\s*=/gm;\n for (const match of devDepsSection.matchAll(cratePattern)) {\n if (match[1] !== undefined) {\n deps.set(match[1], { name: match[1], isDev: true, language: 'rust' });\n }\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Read go.mod (Go)\n const goModPath = join(projectRoot, 'go.mod');\n if (existsSync(goModPath)) {\n try {\n const content = await readFile(goModPath, 'utf-8');\n // Match require blocks and single requires\n // require github.com/gorilla/mux v1.8.0\n // require (\n // github.com/gorilla/mux v1.8.0\n // )\n const requirePattern = /^\\s*([a-zA-Z0-9._/-]+)\\s+v[\\d.]+/gm;\n for (const match of content.matchAll(requirePattern)) {\n if (match[1] !== undefined && !match[1].startsWith('//')) {\n // Go modules use the full path as the name\n deps.set(match[1], { name: match[1], isDev: false, language: 'go' });\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n return deps;\n }\n}\n","export interface RepoSearchResult {\n url: string | null;\n confidence: 'high' | 'medium' | 'low';\n source: 'registry' | 'search' | 'fallback';\n}\n\n/**\n * Type guard to check if a value is a non-null object\n */\nfunction isObject(value: unknown): value is Record<PropertyKey, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport type SupportedLanguage = 'javascript' | 'python' | 'rust' | 'go';\n\nexport class RepoUrlResolver {\n /**\n * Find the GitHub repository URL for a package\n */\n async findRepoUrl(\n packageName: string,\n language: SupportedLanguage = 'javascript'\n ): Promise<RepoSearchResult> {\n // Strategy 1: Try package registry API (fast, accurate)\n let registryUrl: string | null = null;\n\n switch (language) {\n case 'javascript':\n registryUrl = await this.tryNpmRegistry(packageName);\n break;\n case 'python':\n registryUrl = await this.tryPyPiRegistry(packageName);\n break;\n case 'rust':\n registryUrl = await this.tryCratesRegistry(packageName);\n break;\n case 'go':\n registryUrl = await this.tryGoModule(packageName);\n break;\n }\n\n if (registryUrl !== null) {\n return { url: registryUrl, confidence: 'high', source: 'registry' };\n }\n\n // Strategy 2: No URL found\n return { url: null, confidence: 'low', source: 'fallback' };\n }\n\n /**\n * Query NPM registry for package metadata\n */\n private async tryNpmRegistry(packageName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://registry.npmjs.org/${packageName}`);\n\n if (!response.ok) {\n return null;\n }\n\n const data: unknown = await response.json();\n if (!isObject(data)) {\n return null;\n }\n\n // Extract repository URL - safely access nested property\n if ('repository' in data) {\n const repo = data['repository'];\n if (isObject(repo) && 'url' in repo) {\n const urlValue = repo['url'];\n const url = String(urlValue);\n return this.normalizeRepoUrl(url);\n }\n\n if (typeof repo === 'string') {\n return this.normalizeRepoUrl(repo);\n }\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Query PyPI registry for package metadata\n */\n private async tryPyPiRegistry(packageName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://pypi.org/pypi/${packageName}/json`);\n\n if (!response.ok) {\n return null;\n }\n\n const data: unknown = await response.json();\n if (!isObject(data)) {\n return null;\n }\n\n // Extract repository URL from project URLs\n if ('info' in data) {\n const info = data['info'];\n if (isObject(info) && 'project_urls' in info) {\n const projectUrls = info['project_urls'];\n\n if (isObject(projectUrls)) {\n // Try various common keys\n const urlKeys = ['Source', 'Repository', 'Code', 'Homepage'];\n\n for (const key of urlKeys) {\n if (key in projectUrls) {\n const urlValue = projectUrls[key];\n const url = String(urlValue);\n if (url.includes('github.com')) {\n return this.normalizeRepoUrl(url);\n }\n }\n }\n }\n }\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Query crates.io registry for Rust crate metadata\n */\n private async tryCratesRegistry(crateName: string): Promise<string | null> {\n try {\n const response = await fetch(`https://crates.io/api/v1/crates/${crateName}`, {\n headers: {\n // crates.io requires a User-Agent header\n 'User-Agent': 'bluera-knowledge (https://github.com/blueraai/bluera-knowledge)',\n },\n });\n\n if (!response.ok) {\n return null;\n }\n\n const data: unknown = await response.json();\n if (!isObject(data)) {\n return null;\n }\n\n // Extract repository URL from crate metadata\n if ('crate' in data) {\n const crate = data['crate'];\n if (isObject(crate) && 'repository' in crate) {\n const repo = crate['repository'];\n if (typeof repo === 'string') {\n return this.normalizeRepoUrl(repo);\n }\n }\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Resolve Go module to GitHub repository\n * Go modules often use GitHub URLs directly (e.g., github.com/gorilla/mux)\n */\n private async tryGoModule(moduleName: string): Promise<string | null> {\n try {\n // Go modules that start with github.com are already GitHub URLs\n if (moduleName.startsWith('github.com/')) {\n // Extract owner/repo from module path (e.g., github.com/gorilla/mux/v2 -> github.com/gorilla/mux)\n const parts = moduleName.split('/');\n const owner = parts[1];\n const repo = parts[2];\n if (owner !== undefined && repo !== undefined) {\n return `https://github.com/${owner}/${repo}`;\n }\n }\n\n // For other modules, try pkg.go.dev API\n // The pkg.go.dev API returns module info including repository URL\n const response = await fetch(`https://proxy.golang.org/${moduleName}/@latest`, {\n headers: {\n 'User-Agent': 'bluera-knowledge (https://github.com/blueraai/bluera-knowledge)',\n },\n });\n\n if (!response.ok) {\n return null;\n }\n\n // The Go proxy returns module info, but repository URL needs to be inferred\n // from the module path or VCS info. For now, we only support direct GitHub modules.\n // Most popular Go packages use github.com paths anyway.\n return null;\n } catch {\n return null;\n }\n }\n\n /**\n * Normalize various repository URL formats to standard GitHub URL\n */\n private normalizeRepoUrl(url: string): string | null {\n // Remove git+ prefix\n let normalized = url.replace(/^git\\+/, '');\n\n // Remove .git suffix\n normalized = normalized.replace(/\\.git$/, '');\n\n // Convert git:// to https://\n normalized = normalized.replace(/^git:\\/\\//, 'https://');\n\n // Convert ssh:// to https://\n normalized = normalized.replace(/^ssh:\\/\\/git@/, 'https://');\n\n // Convert git@github.com: to https://github.com/\n normalized = normalized.replace(/^git@github\\.com:/, 'https://github.com/');\n\n // Only return if it's a GitHub URL\n if (normalized.includes('github.com')) {\n return normalized;\n }\n\n return null;\n }\n}\n","import { createServices } from '../services/index.js';\nimport { extractRepoName } from './git-clone.js';\nimport { DependencyUsageAnalyzer } from '../analysis/dependency-usage-analyzer.js';\nimport { RepoUrlResolver } from '../analysis/repo-url-resolver.js';\nimport ora from 'ora';\n\nexport async function handleSearch(args: {\n query: string;\n stores?: string;\n limit?: string;\n}): Promise<void> {\n // PWD is set by Claude Code to user's project directory\n const services = await createServices(undefined, undefined, process.env['PWD']);\n const storeNames = args.stores?.split(',').map((s: string) => s.trim());\n\n const allStores = await services.store.list();\n const targetStores = storeNames !== undefined\n ? allStores.filter((s) => storeNames.includes(s.name))\n : allStores;\n\n if (targetStores.length === 0) {\n console.error('No stores found to search');\n process.exit(1);\n }\n\n // Initialize stores\n for (const store of targetStores) {\n await services.lance.initialize(store.id);\n }\n\n const results = await services.search.search({\n query: args.query,\n stores: targetStores.map((s) => s.id),\n mode: 'hybrid',\n limit: parseInt(args.limit ?? '10', 10),\n detail: 'contextual'\n });\n\n console.log(`Found ${String(results.totalResults)} results:\\n`);\n for (const r of results.results) {\n if (r.summary !== undefined) {\n console.log(`Score: ${r.score.toFixed(2)} - ${r.summary.location}`);\n console.log(r.summary.purpose);\n }\n console.log('---');\n }\n}\n\nexport async function handleAddRepo(args: {\n url: string;\n name?: string;\n branch?: string;\n}): Promise<void> {\n // PWD is set by Claude Code to user's project directory\n const services = await createServices(undefined, undefined, process.env['PWD']);\n const storeName = args.name ?? extractRepoName(args.url);\n\n console.log(`Cloning ${args.url}...`);\n\n const result = await services.store.create({\n name: storeName,\n type: 'repo',\n url: args.url,\n ...(args.branch !== undefined ? { branch: args.branch } : {})\n });\n\n if (!result.success) {\n console.error(`Error: ${result.error.message}`);\n process.exit(1);\n }\n\n console.log(`Created store: ${storeName} (${result.data.id})`);\n if ('path' in result.data) {\n console.log(`Location: ${result.data.path}`);\n }\n\n // Auto-index\n console.log('\\nIndexing...');\n const indexResult = await services.index.indexStore(result.data);\n\n if (indexResult.success) {\n console.log(`Indexed ${String(indexResult.data.documentsIndexed)} files`);\n } else {\n console.error(`Indexing failed: ${indexResult.error.message}`);\n }\n}\n\nexport async function handleAddFolder(args: {\n path: string;\n name?: string;\n}): Promise<void> {\n // PWD is set by Claude Code to user's project directory\n const services = await createServices(undefined, undefined, process.env['PWD']);\n const { basename } = await import('node:path');\n const storeName = args.name ?? basename(args.path);\n\n console.log(`Adding folder: ${args.path}...`);\n\n const result = await services.store.create({\n name: storeName,\n type: 'file',\n path: args.path\n });\n\n if (!result.success) {\n console.error(`Error: ${result.error.message}`);\n process.exit(1);\n }\n\n console.log(`Created store: ${storeName} (${result.data.id})`);\n if ('path' in result.data) {\n console.log(`Location: ${result.data.path}`);\n }\n\n // Auto-index\n console.log('\\nIndexing...');\n const indexResult = await services.index.indexStore(result.data);\n\n if (indexResult.success) {\n console.log(`Indexed ${String(indexResult.data.documentsIndexed)} files`);\n } else {\n console.error(`Indexing failed: ${indexResult.error.message}`);\n }\n}\n\nexport async function handleIndex(args: {\n store: string;\n}): Promise<void> {\n // PWD is set by Claude Code to user's project directory\n const services = await createServices(undefined, undefined, process.env['PWD']);\n const store = await services.store.getByIdOrName(args.store);\n\n if (store === undefined) {\n console.error(`Store not found: ${args.store}`);\n process.exit(1);\n }\n\n console.log(`Indexing ${store.name}...`);\n const result = await services.index.indexStore(store);\n\n if (result.success) {\n console.log(`Indexed ${String(result.data.documentsIndexed)} documents in ${String(result.data.timeMs)}ms`);\n } else {\n console.error(`Error: ${result.error.message}`);\n process.exit(1);\n }\n}\n\nexport async function handleStores(): Promise<void> {\n // PWD is set by Claude Code to user's project directory\n const services = await createServices(undefined, undefined, process.env['PWD']);\n const stores = await services.store.list();\n\n if (stores.length === 0) {\n console.log('No stores found.');\n console.log('\\nCreate a store with:');\n console.log(' /bluera-knowledge:add-repo <url> --name=<name>');\n console.log(' /bluera-knowledge:add-folder <path> --name=<name>');\n return;\n }\n\n // Table header\n console.log('| Name | Type | ID | Source |');\n console.log('|------|------|----|--------------------|');\n\n // Table rows\n for (const store of stores) {\n const name = store.name;\n const type = store.type;\n const id = store.id;\n let source = '';\n\n if ('url' in store && store.url !== undefined) {\n source = store.url;\n } else if ('path' in store) {\n source = store.path;\n }\n\n console.log(`| ${name} | ${type} | ${id.substring(0, 8)}... | ${source} |`);\n }\n}\n\nexport async function handleSuggest(): Promise<void> {\n // PWD is set by Claude Code to user's project directory\n const projectRoot = process.env['PWD'] ?? process.cwd();\n\n console.log('Analyzing project dependencies...\\n');\n\n // Create analyzer instance\n const services = await createServices(undefined, undefined, projectRoot);\n const analyzer = new DependencyUsageAnalyzer();\n const resolver = new RepoUrlResolver();\n\n // Analyze with progress indicator\n const spinner = ora('Scanning source files...').start();\n\n const result = await analyzer.analyze(projectRoot, (current, total, message) => {\n spinner.text = `${message} (${String(current)}/${String(total)})`;\n });\n\n spinner.stop();\n\n if (!result.success) {\n console.error(`Error: ${result.error.message}`);\n process.exit(1);\n }\n\n const { usages, totalFilesScanned, skippedFiles } = result.data;\n\n console.log(`✔ Scanned ${String(totalFilesScanned)} files${skippedFiles > 0 ? ` (skipped ${String(skippedFiles)})` : ''}\\n`);\n\n if (usages.length === 0) {\n console.log('No external dependencies found in this project.');\n console.log('\\nMake sure you have a package.json or requirements.txt file.');\n return;\n }\n\n // Filter out packages already in stores\n const existingStores = await services.store.list();\n const existingRepoNames = new Set(existingStores.map(s => s.name));\n\n const newUsages = usages.filter(u => !existingRepoNames.has(u.packageName));\n\n if (newUsages.length === 0) {\n console.log('✔ All dependencies are already in knowledge stores!');\n return;\n }\n\n // Show top 5 suggestions\n const topSuggestions = newUsages.slice(0, 5);\n\n console.log('Top dependencies by usage in this project:\\n');\n topSuggestions.forEach((usage, i) => {\n console.log(`${String(i + 1)}. ${usage.packageName}`);\n console.log(` ${String(usage.importCount)} imports across ${String(usage.fileCount)} files\\n`);\n });\n\n console.log('Searching for repository URLs...\\n');\n\n // For each package, find repo URL\n for (const usage of topSuggestions) {\n const repoResult = await resolver.findRepoUrl(\n usage.packageName,\n usage.language\n );\n\n if (repoResult.url !== null) {\n console.log(`✔ ${usage.packageName}: ${repoResult.url}`);\n console.log(` /bluera-knowledge:add-repo ${repoResult.url} --name=${usage.packageName}\\n`);\n } else {\n console.log(`✗ ${usage.packageName}: Could not find repository URL`);\n console.log(` You can manually add it: /bluera-knowledge:add-repo <url> --name=${usage.packageName}\\n`);\n }\n }\n\n console.log('Use the commands above to add repositories to your knowledge stores.');\n}\n"],"mappings":"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","names":["homedir","join","__filename","__dirname","program","Command","Command","Command","Command","Command","Command","Command","Command","Command","ora","Command","ora","url","Command","join","ora","join","Command","ora","Command","Command","Command","existsSync","join","join","existsSync","ora","ora","Command","join","homedir","DEFAULT_REPOS_DIR","program"]}
@@ -0,0 +1,15 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+
3
+ /**
4
+ * Configuration options for the MCP server
5
+ */
6
+ interface MCPServerOptions {
7
+ dataDir?: string | undefined;
8
+ config?: string | undefined;
9
+ projectRoot?: string | undefined;
10
+ }
11
+
12
+ declare function createMCPServer(options: MCPServerOptions): Server;
13
+ declare function runMCPServer(options: MCPServerOptions): Promise<void>;
14
+
15
+ export { createMCPServer, runMCPServer };
@@ -0,0 +1,11 @@
1
+ import {
2
+ createMCPServer,
3
+ runMCPServer
4
+ } from "../chunk-J7J6LXOJ.js";
5
+ import "../chunk-5QMHZUC4.js";
6
+ import "../chunk-L2YVNC63.js";
7
+ export {
8
+ createMCPServer,
9
+ runMCPServer
10
+ };
11
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,7 @@
1
+ import {
2
+ WatchService
3
+ } from "./chunk-L2YVNC63.js";
4
+ export {
5
+ WatchService
6
+ };
7
+ //# sourceMappingURL=watch.service-YAIKKDCF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1,310 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ IntelligentCrawler
4
+ } from "../chunk-BICFAWMN.js";
5
+ import {
6
+ JobService,
7
+ createDocumentId,
8
+ createServices,
9
+ createStoreId
10
+ } from "../chunk-5QMHZUC4.js";
11
+ import "../chunk-L2YVNC63.js";
12
+
13
+ // src/workers/background-worker-cli.ts
14
+ import fs from "fs";
15
+ import path from "path";
16
+
17
+ // src/workers/background-worker.ts
18
+ import { createHash } from "crypto";
19
+ var BackgroundWorker = class {
20
+ constructor(jobService, storeService, indexService, lanceStore, embeddingEngine) {
21
+ this.jobService = jobService;
22
+ this.storeService = storeService;
23
+ this.indexService = indexService;
24
+ this.lanceStore = lanceStore;
25
+ this.embeddingEngine = embeddingEngine;
26
+ }
27
+ /**
28
+ * Execute a job based on its type
29
+ */
30
+ async executeJob(jobId) {
31
+ const job = this.jobService.getJob(jobId);
32
+ if (!job) {
33
+ throw new Error(`Job ${jobId} not found`);
34
+ }
35
+ try {
36
+ this.jobService.updateJob(jobId, {
37
+ status: "running",
38
+ message: `Starting ${job.type} operation...`,
39
+ progress: 0,
40
+ details: { startedAt: (/* @__PURE__ */ new Date()).toISOString() }
41
+ });
42
+ switch (job.type) {
43
+ case "clone":
44
+ await this.executeCloneJob(job);
45
+ break;
46
+ case "index":
47
+ await this.executeIndexJob(job);
48
+ break;
49
+ case "crawl":
50
+ await this.executeCrawlJob(job);
51
+ break;
52
+ default:
53
+ throw new Error(`Unknown job type: ${String(job.type)}`);
54
+ }
55
+ this.jobService.updateJob(jobId, {
56
+ status: "completed",
57
+ progress: 100,
58
+ message: `${job.type} operation completed successfully`,
59
+ details: { completedAt: (/* @__PURE__ */ new Date()).toISOString() }
60
+ });
61
+ } catch (error) {
62
+ const errorDetails = {
63
+ completedAt: (/* @__PURE__ */ new Date()).toISOString()
64
+ };
65
+ if (error instanceof Error && error.stack !== void 0) {
66
+ errorDetails["error"] = error.stack;
67
+ } else {
68
+ errorDetails["error"] = String(error);
69
+ }
70
+ this.jobService.updateJob(jobId, {
71
+ status: "failed",
72
+ message: error instanceof Error ? error.message : "Unknown error",
73
+ details: errorDetails
74
+ });
75
+ throw error;
76
+ }
77
+ }
78
+ /**
79
+ * Execute a clone job (git clone + initial indexing)
80
+ */
81
+ async executeCloneJob(job) {
82
+ const { storeId } = job.details;
83
+ if (storeId === void 0 || typeof storeId !== "string") {
84
+ throw new Error("Store ID required for clone job");
85
+ }
86
+ const store = await this.storeService.get(createStoreId(storeId));
87
+ if (!store) {
88
+ throw new Error(`Store ${storeId} not found`);
89
+ }
90
+ this.jobService.updateJob(job.id, {
91
+ status: "running",
92
+ message: "Repository cloned, starting indexing...",
93
+ progress: 30
94
+ });
95
+ const result = await this.indexService.indexStore(store, (event) => {
96
+ const currentJob = this.jobService.getJob(job.id);
97
+ if (currentJob?.status === "cancelled") {
98
+ throw new Error("Job cancelled by user");
99
+ }
100
+ const indexProgress = event.current / event.total * 70;
101
+ const totalProgress = 30 + indexProgress;
102
+ this.jobService.updateJob(job.id, {
103
+ message: `Indexed ${String(event.current)}/${String(event.total)} files`,
104
+ progress: Math.min(99, totalProgress),
105
+ // Cap at 99 until fully complete
106
+ details: {
107
+ filesProcessed: event.current,
108
+ totalFiles: event.total
109
+ }
110
+ });
111
+ });
112
+ if (!result.success) {
113
+ throw result.error;
114
+ }
115
+ }
116
+ /**
117
+ * Execute an index job (re-indexing existing store)
118
+ */
119
+ async executeIndexJob(job) {
120
+ const { storeId } = job.details;
121
+ if (storeId === void 0 || typeof storeId !== "string") {
122
+ throw new Error("Store ID required for index job");
123
+ }
124
+ const store = await this.storeService.getByIdOrName(createStoreId(storeId));
125
+ if (!store) {
126
+ throw new Error(`Store ${storeId} not found`);
127
+ }
128
+ const result = await this.indexService.indexStore(store, (event) => {
129
+ const currentJob = this.jobService.getJob(job.id);
130
+ if (currentJob?.status === "cancelled") {
131
+ throw new Error("Job cancelled by user");
132
+ }
133
+ const progress = event.current / event.total * 100;
134
+ this.jobService.updateJob(job.id, {
135
+ message: `Indexed ${String(event.current)}/${String(event.total)} files`,
136
+ progress: Math.min(99, progress),
137
+ // Cap at 99 until fully complete
138
+ details: {
139
+ filesProcessed: event.current,
140
+ totalFiles: event.total
141
+ }
142
+ });
143
+ });
144
+ if (!result.success) {
145
+ throw result.error;
146
+ }
147
+ }
148
+ /**
149
+ * Execute a crawl job (web crawling + indexing)
150
+ */
151
+ async executeCrawlJob(job) {
152
+ const {
153
+ storeId,
154
+ url,
155
+ crawlInstruction,
156
+ extractInstruction,
157
+ maxPages,
158
+ simple,
159
+ useHeadless
160
+ } = job.details;
161
+ if (storeId === void 0 || typeof storeId !== "string") {
162
+ throw new Error("Store ID required for crawl job");
163
+ }
164
+ if (url === void 0 || typeof url !== "string") {
165
+ throw new Error("URL required for crawl job");
166
+ }
167
+ const store = await this.storeService.get(createStoreId(storeId));
168
+ if (!store || store.type !== "web") {
169
+ throw new Error(`Web store ${storeId} not found`);
170
+ }
171
+ const resolvedMaxPages = typeof maxPages === "number" ? maxPages : 50;
172
+ const crawler = new IntelligentCrawler();
173
+ crawler.on("progress", (progress) => {
174
+ const currentJob = this.jobService.getJob(job.id);
175
+ if (currentJob?.status === "cancelled") {
176
+ void crawler.stop();
177
+ return;
178
+ }
179
+ const crawlProgress = progress.pagesVisited / resolvedMaxPages * 80;
180
+ this.jobService.updateJob(job.id, {
181
+ message: progress.message ?? `Crawling page ${String(progress.pagesVisited)}/${String(resolvedMaxPages)}`,
182
+ progress: Math.min(80, crawlProgress),
183
+ details: { pagesCrawled: progress.pagesVisited }
184
+ });
185
+ });
186
+ try {
187
+ await this.lanceStore.initialize(store.id);
188
+ const docs = [];
189
+ const crawlOptions = {
190
+ maxPages: resolvedMaxPages,
191
+ simple: simple ?? false,
192
+ useHeadless: useHeadless ?? false
193
+ };
194
+ if (crawlInstruction !== void 0) {
195
+ crawlOptions.crawlInstruction = crawlInstruction;
196
+ }
197
+ if (extractInstruction !== void 0) {
198
+ crawlOptions.extractInstruction = extractInstruction;
199
+ }
200
+ for await (const result of crawler.crawl(url, crawlOptions)) {
201
+ const currentJob = this.jobService.getJob(job.id);
202
+ if (currentJob?.status === "cancelled") {
203
+ throw new Error("Job cancelled by user");
204
+ }
205
+ const contentToEmbed = result.extracted ?? result.markdown;
206
+ const vector = await this.embeddingEngine.embed(contentToEmbed);
207
+ docs.push({
208
+ id: createDocumentId(`${store.id}-${createHash("md5").update(result.url).digest("hex")}`),
209
+ content: contentToEmbed,
210
+ vector,
211
+ metadata: {
212
+ type: "web",
213
+ storeId: store.id,
214
+ url: result.url,
215
+ title: result.title,
216
+ extracted: result.extracted !== void 0,
217
+ depth: result.depth,
218
+ indexedAt: /* @__PURE__ */ new Date()
219
+ }
220
+ });
221
+ }
222
+ if (docs.length > 0) {
223
+ this.jobService.updateJob(job.id, {
224
+ message: "Indexing crawled documents...",
225
+ progress: 85
226
+ });
227
+ await this.lanceStore.addDocuments(store.id, docs);
228
+ }
229
+ this.jobService.updateJob(job.id, {
230
+ message: `Crawled and indexed ${String(docs.length)} pages`,
231
+ progress: 100,
232
+ details: { pagesCrawled: docs.length }
233
+ });
234
+ } finally {
235
+ await crawler.stop();
236
+ }
237
+ }
238
+ };
239
+
240
+ // src/workers/background-worker-cli.ts
241
+ async function main() {
242
+ const jobId = process.argv[2];
243
+ const dataDir = process.env["BLUERA_DATA_DIR"];
244
+ if (jobId === void 0 || jobId === "") {
245
+ console.error("Error: Job ID required");
246
+ console.error("Usage: background-worker-cli <job-id>");
247
+ process.exit(1);
248
+ }
249
+ const jobService = new JobService(dataDir);
250
+ const services = await createServices(void 0, dataDir);
251
+ const pidFile = path.join(
252
+ jobService["jobsDir"],
253
+ // Access private field for PID path
254
+ `${jobId}.pid`
255
+ );
256
+ try {
257
+ fs.writeFileSync(pidFile, process.pid.toString(), "utf-8");
258
+ } catch (error) {
259
+ console.error("Warning: Could not write PID file:", error);
260
+ }
261
+ process.on("SIGTERM", () => {
262
+ console.log(`[${jobId}] Received SIGTERM, cancelling job...`);
263
+ jobService.updateJob(jobId, {
264
+ status: "cancelled",
265
+ message: "Job cancelled by user"
266
+ });
267
+ try {
268
+ if (fs.existsSync(pidFile)) {
269
+ fs.unlinkSync(pidFile);
270
+ }
271
+ } catch (error) {
272
+ console.error("Warning: Could not remove PID file:", error);
273
+ }
274
+ process.exit(0);
275
+ });
276
+ const worker = new BackgroundWorker(
277
+ jobService,
278
+ services.store,
279
+ services.index,
280
+ services.lance,
281
+ services.embeddings
282
+ );
283
+ try {
284
+ await worker.executeJob(jobId);
285
+ try {
286
+ if (fs.existsSync(pidFile)) {
287
+ fs.unlinkSync(pidFile);
288
+ }
289
+ } catch (error) {
290
+ console.error("Warning: Could not remove PID file:", error);
291
+ }
292
+ console.log(`[${jobId}] Job completed successfully`);
293
+ process.exit(0);
294
+ } catch (error) {
295
+ console.error(`[${jobId}] Job failed:`, error);
296
+ try {
297
+ if (fs.existsSync(pidFile)) {
298
+ fs.unlinkSync(pidFile);
299
+ }
300
+ } catch (cleanupError) {
301
+ console.error("Warning: Could not remove PID file:", cleanupError);
302
+ }
303
+ process.exit(1);
304
+ }
305
+ }
306
+ main().catch((error) => {
307
+ console.error("Fatal error in background worker:", error);
308
+ process.exit(1);
309
+ });
310
+ //# sourceMappingURL=background-worker-cli.js.map