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,1003 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { createStoreCommand } from './store.js';
3
+ import { createServices } from '../../services/index.js';
4
+ import type { GlobalOptions } from '../program.js';
5
+ import type { FileStore, RepoStore, WebStore } from '../../types/store.js';
6
+ import { createStoreId } from '../../types/brands.js';
7
+
8
+ vi.mock('../../services/index.js', () => ({
9
+ createServices: vi.fn(),
10
+ destroyServices: vi.fn().mockResolvedValue(undefined),
11
+ }));
12
+
13
+ describe('store command execution', () => {
14
+ let mockServices: any;
15
+ let consoleLogSpy: any;
16
+ let consoleErrorSpy: any;
17
+ let processExitSpy: any;
18
+ let getOptions: () => GlobalOptions;
19
+
20
+ beforeEach(() => {
21
+ vi.clearAllMocks();
22
+
23
+ mockServices = {
24
+ store: {
25
+ list: vi.fn(),
26
+ getByIdOrName: vi.fn(),
27
+ create: vi.fn(),
28
+ delete: vi.fn(),
29
+ },
30
+ };
31
+
32
+ vi.mocked(createServices).mockResolvedValue(mockServices);
33
+
34
+ consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
35
+ consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
36
+ processExitSpy = vi.spyOn(process, 'exit').mockImplementation((code) => {
37
+ throw new Error(`process.exit: ${code}`);
38
+ });
39
+
40
+ getOptions = () => ({
41
+ config: undefined,
42
+ dataDir: '/tmp/test',
43
+ quiet: false,
44
+ format: undefined,
45
+ });
46
+ });
47
+
48
+ afterEach(() => {
49
+ vi.restoreAllMocks();
50
+ });
51
+
52
+ describe('list subcommand', () => {
53
+ it('lists all stores in normal mode', async () => {
54
+ const mockStores: Array<FileStore | RepoStore | WebStore> = [
55
+ {
56
+ id: createStoreId('store-1'),
57
+ name: 'file-store',
58
+ type: 'file',
59
+ path: '/path/to/files',
60
+ createdAt: new Date(),
61
+ updatedAt: new Date(),
62
+ },
63
+ {
64
+ id: createStoreId('store-2'),
65
+ name: 'repo-store',
66
+ type: 'repo',
67
+ path: '/path/to/repo',
68
+ createdAt: new Date(),
69
+ updatedAt: new Date(),
70
+ },
71
+ {
72
+ id: createStoreId('store-3'),
73
+ name: 'web-store',
74
+ type: 'web',
75
+ url: 'https://example.com',
76
+ depth: 2,
77
+ createdAt: new Date(),
78
+ updatedAt: new Date(),
79
+ },
80
+ ];
81
+
82
+ mockServices.store.list.mockResolvedValue(mockStores);
83
+
84
+ const command = createStoreCommand(getOptions);
85
+ const listCommand = command.commands.find(c => c.name() === 'list');
86
+ const actionHandler = listCommand?._actionHandler;
87
+
88
+ await actionHandler!([]);
89
+
90
+ expect(mockServices.store.list).toHaveBeenCalledWith(undefined);
91
+ expect(consoleLogSpy).toHaveBeenCalledWith('\nStores:\n');
92
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('file-store (file)'));
93
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('repo-store (repo)'));
94
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('web-store (web)'));
95
+ });
96
+
97
+ it('lists stores filtered by type', async () => {
98
+ const mockStores: FileStore[] = [
99
+ {
100
+ id: createStoreId('store-1'),
101
+ name: 'file-store',
102
+ type: 'file',
103
+ path: '/path/to/files',
104
+ createdAt: new Date(),
105
+ updatedAt: new Date(),
106
+ },
107
+ ];
108
+
109
+ mockServices.store.list.mockResolvedValue(mockStores);
110
+
111
+ const command = createStoreCommand(getOptions);
112
+ const listCommand = command.commands.find(c => c.name() === 'list');
113
+ const actionHandler = listCommand?._actionHandler;
114
+
115
+ listCommand.parseOptions(['--type', 'file']);
116
+ await actionHandler!([]);
117
+
118
+ expect(mockServices.store.list).toHaveBeenCalledWith('file');
119
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('file-store (file)'));
120
+ });
121
+
122
+ it('shows message when no stores found', async () => {
123
+ mockServices.store.list.mockResolvedValue([]);
124
+
125
+ const command = createStoreCommand(getOptions);
126
+ const listCommand = command.commands.find(c => c.name() === 'list');
127
+ const actionHandler = listCommand?._actionHandler;
128
+
129
+ await actionHandler!([]);
130
+
131
+ expect(consoleLogSpy).toHaveBeenCalledWith('No stores found.');
132
+ });
133
+
134
+ it('outputs JSON when format is json', async () => {
135
+ const mockStores: FileStore[] = [
136
+ {
137
+ id: createStoreId('store-1'),
138
+ name: 'file-store',
139
+ type: 'file',
140
+ path: '/path/to/files',
141
+ createdAt: new Date(),
142
+ updatedAt: new Date(),
143
+ },
144
+ ];
145
+
146
+ mockServices.store.list.mockResolvedValue(mockStores);
147
+
148
+ getOptions = () => ({
149
+ config: undefined,
150
+ dataDir: '/tmp/test',
151
+ quiet: false,
152
+ format: 'json',
153
+ });
154
+
155
+ const command = createStoreCommand(getOptions);
156
+ const listCommand = command.commands.find(c => c.name() === 'list');
157
+ const actionHandler = listCommand?._actionHandler;
158
+
159
+ await actionHandler!([]);
160
+
161
+ const jsonOutput = consoleLogSpy.mock.calls[0][0];
162
+ expect(jsonOutput).toContain('"name": "file-store"');
163
+ expect(jsonOutput).toContain('"type": "file"');
164
+ });
165
+
166
+ it('outputs store names only in quiet mode', async () => {
167
+ const mockStores: Array<FileStore | RepoStore> = [
168
+ {
169
+ id: createStoreId('store-1'),
170
+ name: 'store1',
171
+ type: 'file',
172
+ path: '/path/to/files',
173
+ createdAt: new Date(),
174
+ updatedAt: new Date(),
175
+ },
176
+ {
177
+ id: createStoreId('store-2'),
178
+ name: 'store2',
179
+ type: 'repo',
180
+ path: '/path/to/repo',
181
+ createdAt: new Date(),
182
+ updatedAt: new Date(),
183
+ },
184
+ ];
185
+
186
+ mockServices.store.list.mockResolvedValue(mockStores);
187
+
188
+ getOptions = () => ({
189
+ config: undefined,
190
+ dataDir: '/tmp/test',
191
+ quiet: true,
192
+ format: undefined,
193
+ });
194
+
195
+ const command = createStoreCommand(getOptions);
196
+ const listCommand = command.commands.find(c => c.name() === 'list');
197
+ const actionHandler = listCommand?._actionHandler;
198
+
199
+ await actionHandler!([]);
200
+
201
+ expect(consoleLogSpy).toHaveBeenCalledWith('store1');
202
+ expect(consoleLogSpy).toHaveBeenCalledWith('store2');
203
+ });
204
+ });
205
+
206
+ describe('create subcommand', () => {
207
+ it('creates a file store successfully', async () => {
208
+ const mockStore: FileStore = {
209
+ id: createStoreId('new-store-1'),
210
+ name: 'my-files',
211
+ type: 'file',
212
+ path: '/path/to/files',
213
+ description: 'My file store',
214
+ createdAt: new Date(),
215
+ updatedAt: new Date(),
216
+ };
217
+
218
+ mockServices.store.create.mockResolvedValue({
219
+ success: true,
220
+ data: mockStore,
221
+ });
222
+
223
+ const command = createStoreCommand(getOptions);
224
+ const createCommand = command.commands.find(c => c.name() === 'create');
225
+ const actionHandler = createCommand?._actionHandler;
226
+
227
+ createCommand.parseOptions(['--type', 'file', '--source', '/path/to/files', '--description', 'My file store']);
228
+ await actionHandler!(['my-files']);
229
+
230
+ expect(mockServices.store.create).toHaveBeenCalledWith({
231
+ name: 'my-files',
232
+ type: 'file',
233
+ path: '/path/to/files',
234
+ url: undefined,
235
+ description: 'My file store',
236
+ tags: undefined,
237
+ });
238
+ expect(consoleLogSpy).toHaveBeenCalledWith(
239
+ expect.stringContaining('Created store: my-files')
240
+ );
241
+ expect(processExitSpy).not.toHaveBeenCalled();
242
+ });
243
+
244
+ it('creates a repo store successfully', async () => {
245
+ const mockStore: RepoStore = {
246
+ id: createStoreId('new-store-2'),
247
+ name: 'my-repo',
248
+ type: 'repo',
249
+ path: '/path/to/repo',
250
+ createdAt: new Date(),
251
+ updatedAt: new Date(),
252
+ };
253
+
254
+ mockServices.store.create.mockResolvedValue({
255
+ success: true,
256
+ data: mockStore,
257
+ });
258
+
259
+ const command = createStoreCommand(getOptions);
260
+ const createCommand = command.commands.find(c => c.name() === 'create');
261
+ const actionHandler = createCommand?._actionHandler;
262
+
263
+ createCommand.parseOptions(['--type', 'repo', '--source', '/path/to/repo']);
264
+ await actionHandler!(['my-repo']);
265
+
266
+ expect(mockServices.store.create).toHaveBeenCalledWith({
267
+ name: 'my-repo',
268
+ type: 'repo',
269
+ path: '/path/to/repo',
270
+ url: undefined,
271
+ description: undefined,
272
+ tags: undefined,
273
+ });
274
+ expect(consoleLogSpy).toHaveBeenCalledWith(
275
+ expect.stringContaining('Created store: my-repo')
276
+ );
277
+ });
278
+
279
+ it('creates a web store successfully', async () => {
280
+ const mockStore: WebStore = {
281
+ id: createStoreId('new-store-3'),
282
+ name: 'my-docs',
283
+ type: 'web',
284
+ url: 'https://docs.example.com',
285
+ depth: 2,
286
+ createdAt: new Date(),
287
+ updatedAt: new Date(),
288
+ };
289
+
290
+ mockServices.store.create.mockResolvedValue({
291
+ success: true,
292
+ data: mockStore,
293
+ });
294
+
295
+ const command = createStoreCommand(getOptions);
296
+ const createCommand = command.commands.find(c => c.name() === 'create');
297
+ const actionHandler = createCommand?._actionHandler;
298
+
299
+ createCommand.parseOptions(['--type', 'web', '--source', 'https://docs.example.com']);
300
+ await actionHandler!(['my-docs']);
301
+
302
+ expect(mockServices.store.create).toHaveBeenCalledWith({
303
+ name: 'my-docs',
304
+ type: 'web',
305
+ path: undefined,
306
+ url: 'https://docs.example.com',
307
+ description: undefined,
308
+ tags: undefined,
309
+ });
310
+ expect(consoleLogSpy).toHaveBeenCalledWith(
311
+ expect.stringContaining('Created store: my-docs')
312
+ );
313
+ });
314
+
315
+ it('creates store with tags', async () => {
316
+ const mockStore: FileStore = {
317
+ id: createStoreId('new-store-4'),
318
+ name: 'tagged-store',
319
+ type: 'file',
320
+ path: '/path/to/files',
321
+ tags: ['typescript', 'react', 'frontend'],
322
+ createdAt: new Date(),
323
+ updatedAt: new Date(),
324
+ };
325
+
326
+ mockServices.store.create.mockResolvedValue({
327
+ success: true,
328
+ data: mockStore,
329
+ });
330
+
331
+ const command = createStoreCommand(getOptions);
332
+ const createCommand = command.commands.find(c => c.name() === 'create');
333
+ const actionHandler = createCommand?._actionHandler;
334
+
335
+ createCommand.parseOptions(['--type', 'file', '--source', '/path/to/files', '--tags', 'typescript, react, frontend']);
336
+ await actionHandler!(['tagged-store']);
337
+
338
+ expect(mockServices.store.create).toHaveBeenCalledWith({
339
+ name: 'tagged-store',
340
+ type: 'file',
341
+ path: '/path/to/files',
342
+ url: undefined,
343
+ description: undefined,
344
+ tags: ['typescript', 'react', 'frontend'],
345
+ });
346
+ });
347
+
348
+ it('outputs JSON when format is json', async () => {
349
+ const mockStore: FileStore = {
350
+ id: createStoreId('new-store-5'),
351
+ name: 'json-store',
352
+ type: 'file',
353
+ path: '/path/to/files',
354
+ createdAt: new Date(),
355
+ updatedAt: new Date(),
356
+ };
357
+
358
+ mockServices.store.create.mockResolvedValue({
359
+ success: true,
360
+ data: mockStore,
361
+ });
362
+
363
+ getOptions = () => ({
364
+ config: undefined,
365
+ dataDir: '/tmp/test',
366
+ quiet: false,
367
+ format: 'json',
368
+ });
369
+
370
+ const command = createStoreCommand(getOptions);
371
+ const createCommand = command.commands.find(c => c.name() === 'create');
372
+ const actionHandler = createCommand?._actionHandler;
373
+
374
+ createCommand.parseOptions(['--type', 'file', '--source', '/path/to/files']);
375
+ await actionHandler!(['json-store']);
376
+
377
+ const jsonOutput = consoleLogSpy.mock.calls[0][0];
378
+ expect(jsonOutput).toContain('"name": "json-store"');
379
+ expect(jsonOutput).toContain('"type": "file"');
380
+ });
381
+
382
+ it('exits with code 1 when creation fails', async () => {
383
+ mockServices.store.create.mockResolvedValue({
384
+ success: false,
385
+ error: {
386
+ message: 'Store already exists',
387
+ },
388
+ });
389
+
390
+ const command = createStoreCommand(getOptions);
391
+ const createCommand = command.commands.find(c => c.name() === 'create');
392
+ const actionHandler = createCommand?._actionHandler;
393
+
394
+ createCommand.parseOptions(['--type', 'file', '--source', '/path/to/files']);
395
+ await expect(actionHandler!(['duplicate-store'])).rejects.toThrow('process.exit: 1');
396
+
397
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error: Store already exists');
398
+ expect(processExitSpy).toHaveBeenCalledWith(1);
399
+ });
400
+ });
401
+
402
+ describe('info subcommand', () => {
403
+ it('displays file store info in normal mode', async () => {
404
+ const mockStore: FileStore = {
405
+ id: createStoreId('store-1'),
406
+ name: 'my-store',
407
+ type: 'file',
408
+ path: '/path/to/files',
409
+ description: 'My file store',
410
+ createdAt: new Date('2024-01-01T00:00:00Z'),
411
+ updatedAt: new Date('2024-01-02T00:00:00Z'),
412
+ };
413
+
414
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
415
+
416
+ const command = createStoreCommand(getOptions);
417
+ const infoCommand = command.commands.find(c => c.name() === 'info');
418
+ const actionHandler = infoCommand?._actionHandler;
419
+
420
+ await actionHandler!(['my-store']);
421
+
422
+ expect(mockServices.store.getByIdOrName).toHaveBeenCalledWith('my-store');
423
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Store: my-store'));
424
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Type: file'));
425
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Path: /path/to/files'));
426
+ expect(consoleLogSpy).toHaveBeenCalledWith(
427
+ expect.stringContaining('Description: My file store')
428
+ );
429
+ expect(consoleLogSpy).toHaveBeenCalledWith(
430
+ expect.stringContaining('Created: 2024-01-01T00:00:00.000Z')
431
+ );
432
+ expect(consoleLogSpy).toHaveBeenCalledWith(
433
+ expect.stringContaining('Updated: 2024-01-02T00:00:00.000Z')
434
+ );
435
+ });
436
+
437
+ it('displays repo store info with URL', async () => {
438
+ const mockStore: RepoStore = {
439
+ id: createStoreId('store-2'),
440
+ name: 'my-repo',
441
+ type: 'repo',
442
+ path: '/path/to/repo',
443
+ url: 'https://github.com/user/repo.git',
444
+ branch: 'main',
445
+ createdAt: new Date('2024-01-01T00:00:00Z'),
446
+ updatedAt: new Date('2024-01-02T00:00:00Z'),
447
+ };
448
+
449
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
450
+
451
+ const command = createStoreCommand(getOptions);
452
+ const infoCommand = command.commands.find(c => c.name() === 'info');
453
+ const actionHandler = infoCommand?._actionHandler;
454
+
455
+ await actionHandler!(['my-repo']);
456
+
457
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Store: my-repo'));
458
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Type: repo'));
459
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Path: /path/to/repo'));
460
+ expect(consoleLogSpy).toHaveBeenCalledWith(
461
+ expect.stringContaining('URL: https://github.com/user/repo.git')
462
+ );
463
+ });
464
+
465
+ it('displays web store info', async () => {
466
+ const mockStore: WebStore = {
467
+ id: createStoreId('store-3'),
468
+ name: 'my-docs',
469
+ type: 'web',
470
+ url: 'https://docs.example.com',
471
+ depth: 3,
472
+ maxPages: 100,
473
+ createdAt: new Date('2024-01-01T00:00:00Z'),
474
+ updatedAt: new Date('2024-01-02T00:00:00Z'),
475
+ };
476
+
477
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
478
+
479
+ const command = createStoreCommand(getOptions);
480
+ const infoCommand = command.commands.find(c => c.name() === 'info');
481
+ const actionHandler = infoCommand?._actionHandler;
482
+
483
+ await actionHandler!(['my-docs']);
484
+
485
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Store: my-docs'));
486
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Type: web'));
487
+ expect(consoleLogSpy).toHaveBeenCalledWith(
488
+ expect.stringContaining('URL: https://docs.example.com')
489
+ );
490
+ });
491
+
492
+ it('outputs JSON when format is json', async () => {
493
+ const mockStore: FileStore = {
494
+ id: createStoreId('store-1'),
495
+ name: 'my-store',
496
+ type: 'file',
497
+ path: '/path/to/files',
498
+ createdAt: new Date(),
499
+ updatedAt: new Date(),
500
+ };
501
+
502
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
503
+
504
+ getOptions = () => ({
505
+ config: undefined,
506
+ dataDir: '/tmp/test',
507
+ quiet: false,
508
+ format: 'json',
509
+ });
510
+
511
+ const command = createStoreCommand(getOptions);
512
+ const infoCommand = command.commands.find(c => c.name() === 'info');
513
+ const actionHandler = infoCommand?._actionHandler;
514
+
515
+ await actionHandler!(['my-store']);
516
+
517
+ const jsonOutput = consoleLogSpy.mock.calls[0][0];
518
+ expect(jsonOutput).toContain('"name": "my-store"');
519
+ expect(jsonOutput).toContain('"type": "file"');
520
+ });
521
+
522
+ it('exits with code 3 when store not found', async () => {
523
+ mockServices.store.getByIdOrName.mockResolvedValue(undefined);
524
+
525
+ const command = createStoreCommand(getOptions);
526
+ const infoCommand = command.commands.find(c => c.name() === 'info');
527
+ const actionHandler = infoCommand?._actionHandler;
528
+
529
+ await expect(actionHandler!(['nonexistent'])).rejects.toThrow('process.exit: 3');
530
+
531
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error: Store not found: nonexistent');
532
+ expect(processExitSpy).toHaveBeenCalledWith(3);
533
+ });
534
+
535
+ it('can lookup store by ID', async () => {
536
+ const storeId = 'store-123';
537
+ const mockStore: FileStore = {
538
+ id: createStoreId(storeId),
539
+ name: 'my-store',
540
+ type: 'file',
541
+ path: '/path/to/files',
542
+ createdAt: new Date(),
543
+ updatedAt: new Date(),
544
+ };
545
+
546
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
547
+
548
+ const command = createStoreCommand(getOptions);
549
+ const infoCommand = command.commands.find(c => c.name() === 'info');
550
+ const actionHandler = infoCommand?._actionHandler;
551
+
552
+ await actionHandler!([storeId]);
553
+
554
+ expect(mockServices.store.getByIdOrName).toHaveBeenCalledWith(storeId);
555
+ expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('Store: my-store'));
556
+ });
557
+ });
558
+
559
+ describe('delete subcommand', () => {
560
+ it('deletes store with --force flag', async () => {
561
+ const mockStore: FileStore = {
562
+ id: createStoreId('store-1'),
563
+ name: 'delete-me',
564
+ type: 'file',
565
+ path: '/path/to/files',
566
+ createdAt: new Date(),
567
+ updatedAt: new Date(),
568
+ };
569
+
570
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
571
+ mockServices.store.delete.mockResolvedValue({
572
+ success: true,
573
+ });
574
+
575
+ const command = createStoreCommand(getOptions);
576
+ const deleteCommand = command.commands.find(c => c.name() === 'delete');
577
+ const actionHandler = deleteCommand?._actionHandler;
578
+
579
+ deleteCommand.parseOptions(['--force']);
580
+ await actionHandler!(['delete-me']);
581
+
582
+ expect(mockServices.store.getByIdOrName).toHaveBeenCalledWith('delete-me');
583
+ expect(mockServices.store.delete).toHaveBeenCalledWith(mockStore.id);
584
+ expect(consoleLogSpy).toHaveBeenCalledWith('Deleted store: delete-me');
585
+ expect(processExitSpy).not.toHaveBeenCalled();
586
+ });
587
+
588
+ it('deletes store with -y flag', async () => {
589
+ const mockStore: FileStore = {
590
+ id: createStoreId('store-1'),
591
+ name: 'delete-me',
592
+ type: 'file',
593
+ path: '/path/to/files',
594
+ createdAt: new Date(),
595
+ updatedAt: new Date(),
596
+ };
597
+
598
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
599
+ mockServices.store.delete.mockResolvedValue({
600
+ success: true,
601
+ });
602
+
603
+ const command = createStoreCommand(getOptions);
604
+ const deleteCommand = command.commands.find(c => c.name() === 'delete');
605
+ const actionHandler = deleteCommand?._actionHandler;
606
+
607
+ deleteCommand.parseOptions(['--yes']);
608
+ await actionHandler!(['delete-me']);
609
+
610
+ expect(mockServices.store.delete).toHaveBeenCalledWith(mockStore.id);
611
+ expect(consoleLogSpy).toHaveBeenCalledWith('Deleted store: delete-me');
612
+ });
613
+
614
+ it('exits with code 3 when store not found', async () => {
615
+ mockServices.store.getByIdOrName.mockResolvedValue(undefined);
616
+
617
+ const command = createStoreCommand(getOptions);
618
+ const deleteCommand = command.commands.find(c => c.name() === 'delete');
619
+ const actionHandler = deleteCommand?._actionHandler;
620
+
621
+ deleteCommand.parseOptions(['--force']);
622
+ await expect(actionHandler!(['nonexistent'])).rejects.toThrow('process.exit: 3');
623
+
624
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error: Store not found: nonexistent');
625
+ expect(processExitSpy).toHaveBeenCalledWith(3);
626
+ expect(mockServices.store.delete).not.toHaveBeenCalled();
627
+ });
628
+
629
+ it('exits with code 1 when deletion fails', async () => {
630
+ const mockStore: FileStore = {
631
+ id: createStoreId('store-1'),
632
+ name: 'locked-store',
633
+ type: 'file',
634
+ path: '/path/to/files',
635
+ createdAt: new Date(),
636
+ updatedAt: new Date(),
637
+ };
638
+
639
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
640
+ mockServices.store.delete.mockResolvedValue({
641
+ success: false,
642
+ error: {
643
+ message: 'Store is locked',
644
+ },
645
+ });
646
+
647
+ const command = createStoreCommand(getOptions);
648
+ const deleteCommand = command.commands.find(c => c.name() === 'delete');
649
+ const actionHandler = deleteCommand?._actionHandler;
650
+
651
+ deleteCommand.parseOptions(['--force']);
652
+ await expect(actionHandler!(['locked-store'])).rejects.toThrow('process.exit: 1');
653
+
654
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error: Store is locked');
655
+ expect(processExitSpy).toHaveBeenCalledWith(1);
656
+ });
657
+
658
+ it('exits with code 1 when force not provided in non-TTY mode', async () => {
659
+ const mockStore: FileStore = {
660
+ id: createStoreId('store-1'),
661
+ name: 'my-store',
662
+ type: 'file',
663
+ path: '/path/to/files',
664
+ createdAt: new Date(),
665
+ updatedAt: new Date(),
666
+ };
667
+
668
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
669
+
670
+ // Mock process.stdin.isTTY to be false
671
+ const originalIsTTY = process.stdin.isTTY;
672
+ Object.defineProperty(process.stdin, 'isTTY', {
673
+ value: false,
674
+ configurable: true,
675
+ });
676
+
677
+ const command = createStoreCommand(getOptions);
678
+ const deleteCommand = command.commands.find(c => c.name() === 'delete');
679
+ const actionHandler = deleteCommand?._actionHandler;
680
+
681
+ await expect(actionHandler!(['my-store'])).rejects.toThrow('process.exit: 1');
682
+
683
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
684
+ 'Error: Use --force or -y to delete without confirmation in non-interactive mode'
685
+ );
686
+ expect(processExitSpy).toHaveBeenCalledWith(1);
687
+ expect(mockServices.store.delete).not.toHaveBeenCalled();
688
+
689
+ // Restore original value
690
+ Object.defineProperty(process.stdin, 'isTTY', {
691
+ value: originalIsTTY,
692
+ configurable: true,
693
+ });
694
+ });
695
+
696
+ it('prompts for confirmation in TTY mode when user confirms', async () => {
697
+ const mockStore: FileStore = {
698
+ id: createStoreId('store-1'),
699
+ name: 'my-store',
700
+ type: 'file',
701
+ path: '/path/to/files',
702
+ createdAt: new Date(),
703
+ updatedAt: new Date(),
704
+ };
705
+
706
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
707
+ mockServices.store.delete.mockResolvedValue({
708
+ success: true,
709
+ });
710
+
711
+ // Mock process.stdin.isTTY to be true
712
+ const originalIsTTY = process.stdin.isTTY;
713
+ Object.defineProperty(process.stdin, 'isTTY', {
714
+ value: true,
715
+ configurable: true,
716
+ });
717
+
718
+ // Mock readline to simulate user typing 'y'
719
+ const mockReadline = {
720
+ question: vi.fn((prompt: string, callback: (answer: string) => void) => {
721
+ callback('y');
722
+ }),
723
+ close: vi.fn(),
724
+ };
725
+
726
+ vi.doMock('node:readline', () => ({
727
+ createInterface: vi.fn(() => mockReadline),
728
+ }));
729
+
730
+ const command = createStoreCommand(getOptions);
731
+ const deleteCommand = command.commands.find(c => c.name() === 'delete');
732
+ const actionHandler = deleteCommand?._actionHandler;
733
+
734
+ await actionHandler!(['my-store']);
735
+
736
+ expect(mockServices.store.delete).toHaveBeenCalledWith(mockStore.id);
737
+ expect(consoleLogSpy).toHaveBeenCalledWith('Deleted store: my-store');
738
+
739
+ // Restore original value
740
+ Object.defineProperty(process.stdin, 'isTTY', {
741
+ value: originalIsTTY,
742
+ configurable: true,
743
+ });
744
+ });
745
+
746
+ it('cancels deletion when user declines in TTY mode', async () => {
747
+ const mockStore: FileStore = {
748
+ id: createStoreId('store-1'),
749
+ name: 'my-store',
750
+ type: 'file',
751
+ path: '/path/to/files',
752
+ createdAt: new Date(),
753
+ updatedAt: new Date(),
754
+ };
755
+
756
+ mockServices.store.getByIdOrName.mockResolvedValue(mockStore);
757
+
758
+ // Mock process.stdin.isTTY to be true
759
+ const originalIsTTY = process.stdin.isTTY;
760
+ Object.defineProperty(process.stdin, 'isTTY', {
761
+ value: true,
762
+ configurable: true,
763
+ });
764
+
765
+ // Mock readline to simulate user typing 'n'
766
+ const mockReadline = {
767
+ question: vi.fn((prompt: string, callback: (answer: string) => void) => {
768
+ callback('n');
769
+ }),
770
+ close: vi.fn(),
771
+ };
772
+
773
+ vi.doMock('node:readline', () => ({
774
+ createInterface: vi.fn(() => mockReadline),
775
+ }));
776
+
777
+ const command = createStoreCommand(getOptions);
778
+ const deleteCommand = command.commands.find(c => c.name() === 'delete');
779
+ const actionHandler = deleteCommand?._actionHandler;
780
+
781
+ await expect(actionHandler!(['my-store'])).rejects.toThrow('process.exit: 0');
782
+
783
+ expect(consoleLogSpy).toHaveBeenCalledWith('Cancelled.');
784
+ expect(processExitSpy).toHaveBeenCalledWith(0);
785
+ expect(mockServices.store.delete).not.toHaveBeenCalled();
786
+
787
+ // Restore original value
788
+ Object.defineProperty(process.stdin, 'isTTY', {
789
+ value: originalIsTTY,
790
+ configurable: true,
791
+ });
792
+ });
793
+ });
794
+
795
+ describe('command structure', () => {
796
+ it('creates store command with all subcommands', () => {
797
+ const command = createStoreCommand(getOptions);
798
+
799
+ expect(command.name()).toBe('store');
800
+ expect(command.commands.length).toBe(4);
801
+ expect(command.commands.map(c => c.name())).toEqual(['list', 'create', 'info', 'delete']);
802
+ });
803
+
804
+ it('list subcommand has type option', () => {
805
+ const command = createStoreCommand(getOptions);
806
+ const listCommand = command.commands.find(c => c.name() === 'list');
807
+ const typeOption = listCommand?.options.find(o => o.long === '--type');
808
+
809
+ expect(typeOption).toBeDefined();
810
+ });
811
+
812
+ it('create subcommand has required options', () => {
813
+ const command = createStoreCommand(getOptions);
814
+ const createCommand = command.commands.find(c => c.name() === 'create');
815
+
816
+ const typeOption = createCommand?.options.find(o => o.long === '--type');
817
+ const sourceOption = createCommand?.options.find(o => o.long === '--source');
818
+ const descriptionOption = createCommand?.options.find(o => o.long === '--description');
819
+ const tagsOption = createCommand?.options.find(o => o.long === '--tags');
820
+
821
+ expect(typeOption).toBeDefined();
822
+ expect(typeOption?.mandatory).toBe(true);
823
+ expect(sourceOption).toBeDefined();
824
+ expect(sourceOption?.mandatory).toBe(true);
825
+ expect(descriptionOption).toBeDefined();
826
+ expect(descriptionOption?.mandatory).toBe(false);
827
+ expect(tagsOption).toBeDefined();
828
+ expect(tagsOption?.mandatory).toBe(false);
829
+ });
830
+
831
+ it('delete subcommand has force and yes options', () => {
832
+ const command = createStoreCommand(getOptions);
833
+ const deleteCommand = command.commands.find(c => c.name() === 'delete');
834
+
835
+ const forceOption = deleteCommand?.options.find(o => o.long === '--force');
836
+ const yesOption = deleteCommand?.options.find(o => o.long === '--yes');
837
+
838
+ expect(forceOption).toBeDefined();
839
+ expect(yesOption).toBeDefined();
840
+ });
841
+ });
842
+
843
+ describe('tags parsing', () => {
844
+ it('parses comma-separated tags correctly', async () => {
845
+ const mockStore: FileStore = {
846
+ id: createStoreId('store-1'),
847
+ name: 'tagged-store',
848
+ type: 'file',
849
+ path: '/path/to/files',
850
+ tags: ['tag1', 'tag2', 'tag3'],
851
+ createdAt: new Date(),
852
+ updatedAt: new Date(),
853
+ };
854
+
855
+ mockServices.store.create.mockResolvedValue({
856
+ success: true,
857
+ data: mockStore,
858
+ });
859
+
860
+ const command = createStoreCommand(getOptions);
861
+ const createCommand = command.commands.find(c => c.name() === 'create');
862
+ const actionHandler = createCommand?._actionHandler;
863
+
864
+ createCommand.parseOptions(['--type', 'file', '--source', '/path/to/files', '--tags', 'tag1, tag2, tag3']);
865
+ await actionHandler!(['tagged-store']);
866
+
867
+ expect(mockServices.store.create).toHaveBeenCalledWith(
868
+ expect.objectContaining({
869
+ tags: ['tag1', 'tag2', 'tag3'],
870
+ })
871
+ );
872
+ });
873
+
874
+ it('handles tags with extra whitespace', async () => {
875
+ const mockStore: FileStore = {
876
+ id: createStoreId('store-1'),
877
+ name: 'tagged-store',
878
+ type: 'file',
879
+ path: '/path/to/files',
880
+ tags: ['tag1', 'tag2'],
881
+ createdAt: new Date(),
882
+ updatedAt: new Date(),
883
+ };
884
+
885
+ mockServices.store.create.mockResolvedValue({
886
+ success: true,
887
+ data: mockStore,
888
+ });
889
+
890
+ const command = createStoreCommand(getOptions);
891
+ const createCommand = command.commands.find(c => c.name() === 'create');
892
+ const actionHandler = createCommand?._actionHandler;
893
+
894
+ createCommand.parseOptions(['--type', 'file', '--source', '/path/to/files', '--tags', ' tag1 , tag2 ']);
895
+ await actionHandler!(['tagged-store']);
896
+
897
+ expect(mockServices.store.create).toHaveBeenCalledWith(
898
+ expect.objectContaining({
899
+ tags: ['tag1', 'tag2'],
900
+ })
901
+ );
902
+ });
903
+ });
904
+
905
+ describe('source routing for store types', () => {
906
+ it('routes source to path for file stores', async () => {
907
+ const mockStore: FileStore = {
908
+ id: createStoreId('store-1'),
909
+ name: 'file-store',
910
+ type: 'file',
911
+ path: '/local/path',
912
+ createdAt: new Date(),
913
+ updatedAt: new Date(),
914
+ };
915
+
916
+ mockServices.store.create.mockResolvedValue({
917
+ success: true,
918
+ data: mockStore,
919
+ });
920
+
921
+ const command = createStoreCommand(getOptions);
922
+ const createCommand = command.commands.find(c => c.name() === 'create');
923
+ const actionHandler = createCommand?._actionHandler;
924
+
925
+ createCommand.parseOptions(['--type', 'file', '--source', '/local/path']);
926
+ await actionHandler!(['file-store']);
927
+
928
+ expect(mockServices.store.create).toHaveBeenCalledWith({
929
+ name: 'file-store',
930
+ type: 'file',
931
+ path: '/local/path',
932
+ url: undefined,
933
+ description: undefined,
934
+ tags: undefined,
935
+ });
936
+ });
937
+
938
+ it('routes source to path for repo stores', async () => {
939
+ const mockStore: RepoStore = {
940
+ id: createStoreId('store-2'),
941
+ name: 'repo-store',
942
+ type: 'repo',
943
+ path: '/repo/path',
944
+ createdAt: new Date(),
945
+ updatedAt: new Date(),
946
+ };
947
+
948
+ mockServices.store.create.mockResolvedValue({
949
+ success: true,
950
+ data: mockStore,
951
+ });
952
+
953
+ const command = createStoreCommand(getOptions);
954
+ const createCommand = command.commands.find(c => c.name() === 'create');
955
+ const actionHandler = createCommand?._actionHandler;
956
+
957
+ createCommand.parseOptions(['--type', 'repo', '--source', '/repo/path']);
958
+ await actionHandler!(['repo-store']);
959
+
960
+ expect(mockServices.store.create).toHaveBeenCalledWith({
961
+ name: 'repo-store',
962
+ type: 'repo',
963
+ path: '/repo/path',
964
+ url: undefined,
965
+ description: undefined,
966
+ tags: undefined,
967
+ });
968
+ });
969
+
970
+ it('routes source to url for web stores', async () => {
971
+ const mockStore: WebStore = {
972
+ id: createStoreId('store-3'),
973
+ name: 'web-store',
974
+ type: 'web',
975
+ url: 'https://example.com',
976
+ depth: 2,
977
+ createdAt: new Date(),
978
+ updatedAt: new Date(),
979
+ };
980
+
981
+ mockServices.store.create.mockResolvedValue({
982
+ success: true,
983
+ data: mockStore,
984
+ });
985
+
986
+ const command = createStoreCommand(getOptions);
987
+ const createCommand = command.commands.find(c => c.name() === 'create');
988
+ const actionHandler = createCommand?._actionHandler;
989
+
990
+ createCommand.parseOptions(['--type', 'web', '--source', 'https://example.com']);
991
+ await actionHandler!(['web-store']);
992
+
993
+ expect(mockServices.store.create).toHaveBeenCalledWith({
994
+ name: 'web-store',
995
+ type: 'web',
996
+ path: undefined,
997
+ url: 'https://example.com',
998
+ description: undefined,
999
+ tags: undefined,
1000
+ });
1001
+ });
1002
+ });
1003
+ });