@ngao/search 0.1.0 → 0.1.2

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 (259) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.env.example +7 -0
  3. package/.eslintrc.json +20 -0
  4. package/.github/workflows/build.yml +39 -0
  5. package/.github/workflows/release.yml +34 -0
  6. package/.github/workflows/test.yml +35 -0
  7. package/.mcp-config.json +14 -0
  8. package/.prettierrc.json +10 -0
  9. package/LICENSE +17 -0
  10. package/Makefile +26 -0
  11. package/README.md +57 -172
  12. package/config.example.json +8 -0
  13. package/dist/backend/api/search-engine.d.ts +40 -0
  14. package/dist/backend/api/search-engine.d.ts.map +1 -0
  15. package/dist/backend/api/search-engine.js +227 -0
  16. package/dist/backend/api/search-engine.js.map +1 -0
  17. package/dist/backend/core/block-impl.d.ts +32 -0
  18. package/dist/backend/core/block-impl.d.ts.map +1 -0
  19. package/dist/backend/core/block-impl.js +33 -0
  20. package/dist/backend/core/block-impl.js.map +1 -0
  21. package/dist/backend/core/config-loader.d.ts +68 -0
  22. package/dist/backend/core/config-loader.d.ts.map +1 -0
  23. package/dist/backend/core/config-loader.js +234 -0
  24. package/dist/backend/core/config-loader.js.map +1 -0
  25. package/dist/backend/core/constants.d.ts +39 -0
  26. package/dist/backend/core/constants.d.ts.map +1 -0
  27. package/dist/backend/core/constants.js +57 -0
  28. package/dist/backend/core/constants.js.map +1 -0
  29. package/dist/backend/core/enums.d.ts +54 -0
  30. package/dist/backend/core/enums.d.ts.map +1 -0
  31. package/dist/backend/core/enums.js +61 -0
  32. package/dist/backend/core/enums.js.map +1 -0
  33. package/dist/backend/core/errors.d.ts +83 -0
  34. package/dist/backend/core/errors.d.ts.map +1 -0
  35. package/dist/backend/core/errors.js +151 -0
  36. package/dist/backend/core/errors.js.map +1 -0
  37. package/dist/backend/core/logger.d.ts +68 -0
  38. package/dist/backend/core/logger.d.ts.map +1 -0
  39. package/dist/backend/core/logger.js +151 -0
  40. package/dist/backend/core/logger.js.map +1 -0
  41. package/dist/backend/core/models.d.ts +332 -0
  42. package/dist/backend/core/models.d.ts.map +1 -0
  43. package/dist/backend/core/models.js +6 -0
  44. package/dist/backend/core/models.js.map +1 -0
  45. package/dist/backend/core/service-types.d.ts +184 -0
  46. package/dist/backend/core/service-types.d.ts.map +1 -0
  47. package/dist/backend/core/service-types.js +7 -0
  48. package/dist/backend/core/service-types.js.map +1 -0
  49. package/dist/backend/core/types.d.ts +219 -0
  50. package/dist/backend/core/types.d.ts.map +1 -0
  51. package/dist/backend/core/types.js +109 -0
  52. package/dist/backend/core/types.js.map +1 -0
  53. package/dist/backend/index.d.ts +5 -0
  54. package/dist/backend/index.d.ts.map +1 -0
  55. package/dist/backend/index.js +13 -0
  56. package/dist/backend/index.js.map +1 -0
  57. package/dist/backend/indexing/block-extractor.d.ts +22 -0
  58. package/dist/backend/indexing/block-extractor.d.ts.map +1 -0
  59. package/dist/backend/indexing/block-extractor.js +52 -0
  60. package/dist/backend/indexing/block-extractor.js.map +1 -0
  61. package/dist/backend/indexing/index-builder.d.ts +26 -0
  62. package/dist/backend/indexing/index-builder.d.ts.map +1 -0
  63. package/dist/backend/indexing/index-builder.js +71 -0
  64. package/dist/backend/indexing/index-builder.js.map +1 -0
  65. package/dist/backend/parsers/base-file-parser.d.ts +134 -0
  66. package/dist/backend/parsers/base-file-parser.d.ts.map +1 -0
  67. package/dist/backend/parsers/base-file-parser.js +149 -0
  68. package/dist/backend/parsers/base-file-parser.js.map +1 -0
  69. package/dist/backend/parsers/javascript-parser.d.ts +36 -0
  70. package/dist/backend/parsers/javascript-parser.d.ts.map +1 -0
  71. package/dist/backend/parsers/javascript-parser.js +194 -0
  72. package/dist/backend/parsers/javascript-parser.js.map +1 -0
  73. package/dist/backend/parsers/json-parser.d.ts +15 -0
  74. package/dist/backend/parsers/json-parser.d.ts.map +1 -0
  75. package/dist/backend/parsers/json-parser.js +75 -0
  76. package/dist/backend/parsers/json-parser.js.map +1 -0
  77. package/dist/backend/parsers/markdown-parser.d.ts +17 -0
  78. package/dist/backend/parsers/markdown-parser.d.ts.map +1 -0
  79. package/dist/backend/parsers/markdown-parser.js +94 -0
  80. package/dist/backend/parsers/markdown-parser.js.map +1 -0
  81. package/dist/backend/parsers/parser-factory.d.ts +43 -0
  82. package/dist/backend/parsers/parser-factory.d.ts.map +1 -0
  83. package/dist/backend/parsers/parser-factory.js +149 -0
  84. package/dist/backend/parsers/parser-factory.js.map +1 -0
  85. package/dist/backend/parsers/python-parser.d.ts +21 -0
  86. package/dist/backend/parsers/python-parser.d.ts.map +1 -0
  87. package/dist/backend/parsers/python-parser.js +185 -0
  88. package/dist/backend/parsers/python-parser.js.map +1 -0
  89. package/dist/backend/parsers/yaml-parser.d.ts +16 -0
  90. package/dist/backend/parsers/yaml-parser.d.ts.map +1 -0
  91. package/dist/backend/parsers/yaml-parser.js +81 -0
  92. package/dist/backend/parsers/yaml-parser.js.map +1 -0
  93. package/dist/backend/repositories/implementations/lancedb-block-repository.d.ts +125 -0
  94. package/dist/backend/repositories/implementations/lancedb-block-repository.d.ts.map +1 -0
  95. package/dist/backend/repositories/implementations/lancedb-block-repository.js +505 -0
  96. package/dist/backend/repositories/implementations/lancedb-block-repository.js.map +1 -0
  97. package/dist/backend/repositories/implementations/lancedb-metadata-repository.d.ts +107 -0
  98. package/dist/backend/repositories/implementations/lancedb-metadata-repository.d.ts.map +1 -0
  99. package/dist/backend/repositories/implementations/lancedb-metadata-repository.js +275 -0
  100. package/dist/backend/repositories/implementations/lancedb-metadata-repository.js.map +1 -0
  101. package/dist/backend/repositories/implementations/memory-cache.d.ts +18 -0
  102. package/dist/backend/repositories/implementations/memory-cache.d.ts.map +1 -0
  103. package/dist/backend/repositories/implementations/memory-cache.js +53 -0
  104. package/dist/backend/repositories/implementations/memory-cache.js.map +1 -0
  105. package/dist/backend/repositories/repository.interface.d.ts +334 -0
  106. package/dist/backend/repositories/repository.interface.d.ts.map +1 -0
  107. package/dist/backend/repositories/repository.interface.js +7 -0
  108. package/dist/backend/repositories/repository.interface.js.map +1 -0
  109. package/dist/backend/search/context-extractor.d.ts +29 -0
  110. package/dist/backend/search/context-extractor.d.ts.map +1 -0
  111. package/dist/backend/search/context-extractor.js +106 -0
  112. package/dist/backend/search/context-extractor.js.map +1 -0
  113. package/dist/backend/search/multi-index-searcher.d.ts +28 -0
  114. package/dist/backend/search/multi-index-searcher.d.ts.map +1 -0
  115. package/dist/backend/search/multi-index-searcher.js +81 -0
  116. package/dist/backend/search/multi-index-searcher.js.map +1 -0
  117. package/dist/backend/search/query-parser.d.ts +37 -0
  118. package/dist/backend/search/query-parser.d.ts.map +1 -0
  119. package/dist/backend/search/query-parser.js +145 -0
  120. package/dist/backend/search/query-parser.js.map +1 -0
  121. package/dist/backend/search/ranking-engine.d.ts +31 -0
  122. package/dist/backend/search/ranking-engine.d.ts.map +1 -0
  123. package/dist/backend/search/ranking-engine.js +165 -0
  124. package/dist/backend/search/ranking-engine.js.map +1 -0
  125. package/dist/backend/search/result-formatter.d.ts +29 -0
  126. package/dist/backend/search/result-formatter.d.ts.map +1 -0
  127. package/dist/backend/search/result-formatter.js +70 -0
  128. package/dist/backend/search/result-formatter.js.map +1 -0
  129. package/dist/backend/service-types.d.ts +184 -0
  130. package/dist/backend/service-types.d.ts.map +1 -0
  131. package/dist/backend/service-types.js +7 -0
  132. package/dist/backend/service-types.js.map +1 -0
  133. package/dist/backend/services/embedding-service.d.ts +75 -0
  134. package/dist/backend/services/embedding-service.d.ts.map +1 -0
  135. package/dist/backend/services/embedding-service.js +298 -0
  136. package/dist/backend/services/embedding-service.js.map +1 -0
  137. package/dist/backend/services/file-watcher.d.ts +17 -0
  138. package/dist/backend/services/file-watcher.d.ts.map +1 -0
  139. package/dist/backend/services/file-watcher.js +92 -0
  140. package/dist/backend/services/file-watcher.js.map +1 -0
  141. package/dist/backend/services/index-information-service.d.ts +114 -0
  142. package/dist/backend/services/index-information-service.d.ts.map +1 -0
  143. package/dist/backend/services/index-information-service.js +104 -0
  144. package/dist/backend/services/index-information-service.js.map +1 -0
  145. package/dist/backend/services/ngao-search-service.d.ts +107 -0
  146. package/dist/backend/services/ngao-search-service.d.ts.map +1 -0
  147. package/dist/backend/services/ngao-search-service.js +384 -0
  148. package/dist/backend/services/ngao-search-service.js.map +1 -0
  149. package/dist/backend/services/quantization-service.d.ts +53 -0
  150. package/dist/backend/services/quantization-service.d.ts.map +1 -0
  151. package/dist/backend/services/quantization-service.js +84 -0
  152. package/dist/backend/services/quantization-service.js.map +1 -0
  153. package/dist/backend/services/reindex-manager.d.ts +25 -0
  154. package/dist/backend/services/reindex-manager.d.ts.map +1 -0
  155. package/dist/backend/services/reindex-manager.js +78 -0
  156. package/dist/backend/services/reindex-manager.js.map +1 -0
  157. package/dist/backend/services/session-manager.d.ts +115 -0
  158. package/dist/backend/services/session-manager.d.ts.map +1 -0
  159. package/dist/backend/services/session-manager.js +150 -0
  160. package/dist/backend/services/session-manager.js.map +1 -0
  161. package/dist/backend/services/vector-search-service.d.ts +81 -0
  162. package/dist/backend/services/vector-search-service.d.ts.map +1 -0
  163. package/dist/backend/services/vector-search-service.js +143 -0
  164. package/dist/backend/services/vector-search-service.js.map +1 -0
  165. package/dist/backend/utils/file-utils.d.ts +92 -0
  166. package/dist/backend/utils/file-utils.d.ts.map +1 -0
  167. package/dist/backend/utils/file-utils.js +247 -0
  168. package/dist/backend/utils/file-utils.js.map +1 -0
  169. package/dist/cli/setup.d.ts +4 -0
  170. package/dist/cli/setup.d.ts.map +1 -0
  171. package/dist/cli/setup.js +138 -0
  172. package/dist/cli/setup.js.map +1 -0
  173. package/dist/index.d.ts +6 -0
  174. package/dist/index.d.ts.map +1 -0
  175. package/dist/index.js +22 -0
  176. package/dist/index.js.map +1 -0
  177. package/dist/main.d.ts +14 -0
  178. package/dist/main.d.ts.map +1 -0
  179. package/dist/main.js +7 -67075
  180. package/dist/main.js.map +1 -0
  181. package/dist/mcp/tool-schemas.d.ts +205 -0
  182. package/dist/mcp/tool-schemas.d.ts.map +1 -0
  183. package/dist/mcp/tool-schemas.js +391 -0
  184. package/dist/mcp/tool-schemas.js.map +1 -0
  185. package/dist/server/logger.d.ts +50 -0
  186. package/dist/server/logger.d.ts.map +1 -0
  187. package/dist/server/logger.js +77 -0
  188. package/dist/server/logger.js.map +1 -0
  189. package/dist/server/tool-registry.d.ts +64 -0
  190. package/dist/server/tool-registry.d.ts.map +1 -0
  191. package/dist/server/tool-registry.js +93 -0
  192. package/dist/server/tool-registry.js.map +1 -0
  193. package/dist/server/transports/mcp-transport.d.ts +31 -0
  194. package/dist/server/transports/mcp-transport.d.ts.map +1 -0
  195. package/dist/server/transports/mcp-transport.js +331 -0
  196. package/dist/server/transports/mcp-transport.js.map +1 -0
  197. package/dist/server/transports/rest-transport.d.ts +36 -0
  198. package/dist/server/transports/rest-transport.d.ts.map +1 -0
  199. package/dist/server/transports/rest-transport.js +250 -0
  200. package/dist/server/transports/rest-transport.js.map +1 -0
  201. package/docs/API.md +116 -0
  202. package/docs/ARCHITECTURE.md +101 -0
  203. package/docs/FILE_WATCHING.md +120 -0
  204. package/docs/INSTALLATION.md +87 -0
  205. package/docs/MCP_INTEGRATION.md +108 -0
  206. package/docs/README.md +288 -0
  207. package/docs/USAGE.md +123 -0
  208. package/docs/architecture-design-standards/01_ARCHITECTURE.md +863 -0
  209. package/docs/architecture-design-standards/02_SEARCH_ENGINE_DESIGN.md +958 -0
  210. package/docs/architecture-design-standards/03_DATAFLOW.md +1000 -0
  211. package/docs/architecture-design-standards/04_VISUAL_GUIDE.md +922 -0
  212. package/docs/architecture-design-standards/05_REPOSITORY_PATTERN_GUIDE.md +503 -0
  213. package/docs/architecture-design-standards/06_IMPLEMENTATION_PATTERNS.md +1026 -0
  214. package/docs/architecture-design-standards/07_TYPESCRIPT_GUIDE.md +1027 -0
  215. package/docs/architecture-design-standards/08_CODING_STANDARDS.md +1274 -0
  216. package/docs/reference/01_START_HERE.md +108 -0
  217. package/docs/reference/02_QUICK_REFERENCE.md +363 -0
  218. package/docs/reference/03_DOCUMENTATION_INDEX.md +293 -0
  219. package/docs/reference/04_DELIVERY_SUMMARY.md +463 -0
  220. package/docs/reference/05_IMPLEMENTATION_OVERVIEW.md +319 -0
  221. package/docs/reference/06_RESEARCH_SUMMARY.md +519 -0
  222. package/docs/tracking/03_IMPLEMENTATION_ROADMAP.md +788 -0
  223. package/jest.config.json +12 -0
  224. package/package.json +46 -53
  225. package/prepend-shebang.js +18 -0
  226. package/scripts/setup-mcp.sh +66 -0
  227. package/src/backend/index.ts +5 -0
  228. package/src/backend/service-types.ts +219 -0
  229. package/src/backend/services/file-watcher.ts +79 -0
  230. package/src/backend/services/ngao-search-service.ts +430 -0
  231. package/src/backend/services/reindex-manager.ts +90 -0
  232. package/src/backend/services/session-manager.ts +214 -0
  233. package/src/cli/setup.ts +122 -0
  234. package/src/index.ts +6 -0
  235. package/src/main.ts +225 -0
  236. package/src/mcp/tool-schemas.ts +439 -0
  237. package/src/server/logger.ts +88 -0
  238. package/src/server/tool-registry.ts +117 -0
  239. package/src/server/transports/mcp-transport.ts +374 -0
  240. package/src/server/transports/rest-transport.ts +258 -0
  241. package/tests/unit/agent-tools.test.ts +454 -0
  242. package/tests/unit/file-watcher.test.d.ts +2 -0
  243. package/tests/unit/file-watcher.test.d.ts.map +1 -0
  244. package/tests/unit/file-watcher.test.js +9 -0
  245. package/tests/unit/file-watcher.test.js.map +1 -0
  246. package/tests/unit/file-watcher.test.ts +7 -0
  247. package/tests/unit/search-integration.test.ts +256 -0
  248. package/tests/unit/services.test.d.ts +2 -0
  249. package/tests/unit/services.test.d.ts.map +1 -0
  250. package/tests/unit/services.test.js +9 -0
  251. package/tests/unit/services.test.js.map +1 -0
  252. package/tests/unit/services.test.ts +7 -0
  253. package/tsconfig.json +23 -0
  254. package/webpack.backend.config.js +60 -0
  255. package/webpack.config.js +34 -0
  256. package/models/Xenova/all-MiniLM-L6-v2/config.json +0 -25
  257. package/models/Xenova/all-MiniLM-L6-v2/onnx/model_quantized.onnx +0 -0
  258. package/models/Xenova/all-MiniLM-L6-v2/tokenizer.json +0 -30686
  259. package/models/Xenova/all-MiniLM-L6-v2/tokenizer_config.json +0 -15
@@ -0,0 +1,10 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(find:*)",
5
+ "Bash(xargs:*)",
6
+ "Bash(npm run build:*)",
7
+ "Bash(npm test:*)"
8
+ ]
9
+ }
10
+ }
package/.env.example ADDED
@@ -0,0 +1,7 @@
1
+ # ngao search Configuration
2
+ # Copy this to .env and customize for your environment
3
+
4
+ # Port for REST API (optional)
5
+ # Leave unset or set to 0 for random available port
6
+ # Set to specific port number (e.g., 3000) to use that port
7
+ PORT=
package/.eslintrc.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "parser": "@typescript-eslint/parser",
3
+ "parserOptions": {
4
+ "ecmaVersion": 2020,
5
+ "sourceType": "module"
6
+ },
7
+ "extends": [
8
+ "eslint:recommended",
9
+ "plugin:@typescript-eslint/recommended"
10
+ ],
11
+ "rules": {
12
+ "@typescript-eslint/no-explicit-any": "warn",
13
+ "@typescript-eslint/explicit-module-boundary-types": "off",
14
+ "no-console": "off"
15
+ },
16
+ "env": {
17
+ "node": true,
18
+ "es6": true
19
+ }
20
+ }
@@ -0,0 +1,39 @@
1
+ name: Build
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ${{ matrix.os }}
12
+
13
+ strategy:
14
+ matrix:
15
+ os: [ubuntu-latest, macos-latest, windows-latest]
16
+ node-version: [20.x]
17
+
18
+ steps:
19
+ - uses: actions/checkout@v3
20
+
21
+ - name: Use Node.js ${{ matrix.node-version }}
22
+ uses: actions/setup-node@v3
23
+ with:
24
+ node-version: ${{ matrix.node-version }}
25
+
26
+ - name: Install dependencies
27
+ run: npm ci
28
+
29
+ - name: Build application
30
+ run: npm run build
31
+
32
+ - name: Build CLI binary
33
+ run: npm run build:cli
34
+
35
+ - name: Upload artifacts
36
+ uses: actions/upload-artifact@v3
37
+ with:
38
+ name: ngao-search-${{ matrix.os }}
39
+ path: bin/
@@ -0,0 +1,34 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ jobs:
9
+ release:
10
+ runs-on: ${{ matrix.os }}
11
+
12
+ strategy:
13
+ matrix:
14
+ os: [ubuntu-latest, macos-latest, windows-latest]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v3
18
+
19
+ - uses: actions/setup-node@v3
20
+ with:
21
+ node-version: '20'
22
+
23
+ - name: Install dependencies
24
+ run: npm ci
25
+
26
+ - name: Build CLI binary
27
+ run: npm run build:cli
28
+
29
+ - name: Create Release
30
+ uses: softprops/action-gh-release@v1
31
+ with:
32
+ files: bin/ngao-search*
33
+ env:
34
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,35 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, develop ]
6
+ pull_request:
7
+ branches: [ main, develop ]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+
13
+ strategy:
14
+ matrix:
15
+ node-version: [18.x, 20.x]
16
+
17
+ steps:
18
+ - uses: actions/checkout@v3
19
+
20
+ - name: Use Node.js ${{ matrix.node-version }}
21
+ uses: actions/setup-node@v3
22
+ with:
23
+ node-version: ${{ matrix.node-version }}
24
+
25
+ - name: Install dependencies
26
+ run: npm ci
27
+
28
+ - name: Type check
29
+ run: npx tsc --noEmit
30
+
31
+ - name: Run tests
32
+ run: npm test
33
+
34
+ - name: Run linter
35
+ run: npm run lint
@@ -0,0 +1,14 @@
1
+ {
2
+ "mcpServers": {
3
+ "ngao-search": {
4
+ "command": "node",
5
+ "args": [
6
+ "dist/main.js"
7
+ ],
8
+ "env": {
9
+ "MCP_TRANSPORT": "stdio"
10
+ },
11
+ "cwd": "/Users/tuanva/Desktop/ngao-search"
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "semi": true,
3
+ "trailingComma": "es5",
4
+ "singleQuote": true,
5
+ "printWidth": 100,
6
+ "tabWidth": 2,
7
+ "useTabs": false,
8
+ "arrowParens": "always",
9
+ "endOfLine": "lf"
10
+ }
package/LICENSE ADDED
@@ -0,0 +1,17 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ Copyright 2026 Ngao Search Contributors
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
package/Makefile ADDED
@@ -0,0 +1,26 @@
1
+ .PHONY: all build build-js build-cli clean test dev install
2
+
3
+ all: clean build
4
+
5
+ build: build-js
6
+
7
+ build-js:
8
+ npm run build
9
+
10
+ build-cli:
11
+ npm run build:cli
12
+
13
+ clean:
14
+ rm -rf dist/ bin/
15
+
16
+ test:
17
+ npm test
18
+
19
+ dev:
20
+ npm run dev
21
+
22
+ install:
23
+ npm install
24
+
25
+ start:
26
+ npm start
package/README.md CHANGED
@@ -1,219 +1,104 @@
1
- # ngao search
1
+ # Ngao Search - MCP Server
2
2
 
3
- A Model Context Protocol (MCP) server for local code and document search with LLM-friendly output.
3
+ Claude Desktop MCP Server for code search with file watching, REST API, and Model Context Protocol integration.
4
+
5
+ > **Note:** This is the MCP server package for Claude Desktop integration. If you're looking for the core search library to embed in your own applications, see [`@ngao/search-core`](https://www.npmjs.com/package/@ngao/search-core).
4
6
 
5
7
  ## Features
6
8
 
7
- - 🔍 **Multi-Format Indexing**: Python, Markdown, JavaScript/TypeScript, JSON, YAML
8
- - 🧠 **LLM-Optimized**: Results formatted specifically for AI model consumption
9
- - 📊 **Smart Ranking**: Multi-factor relevance scoring
10
- - 🚀 **Fast Local Search**: No network dependency, instant results
11
- - 📚 **Context-Aware**: Includes surrounding code context in results
12
- - 🔄 **Incremental Indexing**: Only reindexes changed files
13
- - 💾 **Persistent Storage**: LanceDB integration for data persistence across restarts
14
- - 🤖 **Vector Search**: Semantic similarity search with embeddings support
9
+ - 🔍 Full-text and semantic code search
10
+ - 👁️ Automatic file watching and reindexing
11
+ - 🌐 REST API server
12
+ - 🔌 Model Context Protocol (MCP) integration
13
+ - 🖥️ Interactive CLI
14
+ - 📊 Session and search history management
15
15
 
16
16
  ## Installation
17
17
 
18
18
  ```bash
19
- npm install
20
- npm run build
21
- ```
22
-
23
- ## Usage
24
-
25
- ### As a Library
26
-
27
- ```typescript
28
- import { SearchEngine } from 'ngao-search-mcp';
29
- import {
30
- InMemoryBlockRepository,
31
- InMemoryMetadataRepository,
32
- } from 'ngao-search-mcp';
33
-
34
- // Create repositories
35
- const blockRepo = new InMemoryBlockRepository();
36
- const metadataRepo = new InMemoryMetadataRepository();
37
-
38
- // Create search engine
39
- const engine = new SearchEngine(blockRepo, metadataRepo);
40
-
41
- // Index a directory
42
- const stats = await engine.indexDirectory('./src');
43
- console.log(`Indexed ${stats.totalBlocks} blocks from ${stats.totalFiles} files`);
44
-
45
- // Search
46
- const results = await engine.search('authentication handler');
47
- console.log(`Found ${results.length} results`);
19
+ npm install -g @ngao/search
48
20
  ```
49
21
 
50
- ### As MCP Server
51
-
52
- ```typescript
53
- import { McpServer, handleToolCall } from 'ngao-search-mcp';
22
+ Or use directly:
54
23
 
55
- const server = new McpServer();
56
-
57
- // Get available tools
58
- const tools = server.getTools();
59
-
60
- // Handle tool calls
61
- const result = await handleToolCall(server, 'search', {
62
- query: 'authentication',
63
- maxResults: 10,
64
- });
24
+ ```bash
25
+ npx @ngao/search
65
26
  ```
66
27
 
67
- ## Architecture
28
+ ### Pre-downloaded Models
68
29
 
69
- ### Core Components
30
+ Embedding models are **included with @ngao/search-core** dependency.
70
31
 
71
- - **SearchEngine**: Main facade implementing ISearchEngine interface
72
- - **Parsers**: File type-specific parsers (Python, Markdown, JavaScript, etc.)
73
- - **Repositories**: Abstract data access layer
74
- - **Indexing**: Block extraction and index building
75
- - **Search**: Query parsing, ranking, and result formatting
76
- - **MCP Server**: Protocol implementation for tool exposure
32
+ The core library contains pre-downloaded models - no additional downloads needed!
77
33
 
78
- ### Design Patterns
34
+ See the [Installation Guide](./docs/INSTALLATION.md) for details.
79
35
 
80
- - **Repository Pattern**: Flexible storage backend (in-memory for tests, SQLite for production)
81
- - **Facade Pattern**: Single entry point via SearchEngine
82
- - **Factory Pattern**: Parser selection by file type
83
- - **Dependency Injection**: Explicit dependency management
36
+ ## Quick Start
84
37
 
85
- ## Project Structure
38
+ ### Setup
86
39
 
40
+ ```bash
41
+ npx @ngao/search --setup
87
42
  ```
88
- src/
89
- ├── core/ # Models, types, constants, errors
90
- ├── parsers/ # File type parsers
91
- ├── repositories/ # Data access interfaces & implementations
92
- ├── indexing/ # Block extraction & index building
93
- ├── search/ # Query, ranking, formatting
94
- ├── api/ # SearchEngine facade
95
- ├── mcp/ # MCP server implementation
96
- └── utils/ # Utility functions
97
-
98
- tests/
99
- ├── unit/ # Unit tests
100
- └── integration/ # Integration tests
101
- ```
102
-
103
- ## Coding Standards
104
-
105
- All code follows strict TypeScript conventions:
106
43
 
107
- - **Type Safety**: No `any` types, strict mode enabled
108
- - ✅ **Naming**: PascalCase classes, camelCase methods, UPPER_SNAKE_CASE constants
109
- - ✅ **Architecture**: Clear separation of concerns
110
- - ✅ **Documentation**: JSDoc comments for public APIs
111
- - ✅ **Testing**: Unit and integration tests
112
-
113
- ## Configuration
44
+ This will guide you through setting up a search index for your project.
114
45
 
115
- Environment variables:
46
+ ### Search via CLI
116
47
 
117
48
  ```bash
118
- PORT=3000 # REST API port (optional, defaults to random available port)
49
+ npx @ngao/search search "function name"
119
50
  ```
120
51
 
121
- ### Storage
122
-
123
- ngao search uses **LanceDB** for persistent storage:
52
+ ### Start REST API Server
124
53
 
125
54
  ```bash
126
- ~/.ngao-search/
127
- ├── blocks.lance # Indexed code blocks with embeddings
128
- └── metadata.lance # File metadata and statistics
55
+ npx @ngao/search --server --port 3000
129
56
  ```
130
57
 
131
- Data persists across restarts. To reset, simply delete the `~/.ngao-search` directory.
132
-
133
- ## Development
58
+ Then use the API:
134
59
 
135
60
  ```bash
136
- # Build
137
- npm run build
138
-
139
- # Type check
140
- npm run type-check
141
-
142
- # Lint
143
- npm run lint
144
- npm run lint:fix
145
-
146
- # Format
147
- npm run format
148
- npm run format:check
149
-
150
- # Test
151
- npm test
152
- npm run test:watch
153
- npm run test:coverage
61
+ curl http://localhost:3000/api/search?q=useState
154
62
  ```
155
63
 
156
- ## Supported File Types
157
-
158
- | Format | Extensions | Features |
159
- |--------|-----------|----------|
160
- | Python | `.py`, `.pyi` | Functions, classes, methods, docstrings |
161
- | Markdown | `.md`, `.markdown`, `.mdx` | Headings, paragraphs, code blocks |
162
- | JavaScript | `.js`, `.jsx`, `.mjs` | Functions, classes, exports, hooks |
163
- | TypeScript | `.ts`, `.tsx` | Types, interfaces, classes, functions |
164
- | JSON | `.json`, `.jsonc` | Keys, nested structures |
165
- | YAML | `.yaml`, `.yml` | Keys, values, nested structures |
166
-
167
- ## Algorithm Details
64
+ ### Start MCP Server
168
65
 
169
- ### Ranking Formula
170
-
171
- ```
172
- Score = 0.35 × KeywordMatch + 0.25 × Position + 0.20 × ScopeSpecificity
173
- + 0.10 × Recency + 0.10 × Frequency
66
+ ```bash
67
+ npx @ngao/search --mcp
174
68
  ```
175
69
 
176
- ### Indexing
177
-
178
- - **Inverted Index**: Maps keywords to source blocks
179
- - **Block Registry**: Direct block access by ID
180
- - **Scope Hierarchy**: Quick navigation by scope path
181
- - **Metadata**: Change detection via file hashing
182
-
183
- ## API Reference
184
-
185
- ### ISearchEngine
186
-
187
- ```typescript
188
- search(query: string, options?: SearchOptions): Promise<SearchResult[]>
189
- indexDirectory(dirPath: string, options?: IndexOptions): Promise<IndexStats>
190
- getStats(): Promise<IndexStats>
191
- clearIndex(): Promise<void>
192
- ```
70
+ ## Configuration
193
71
 
194
- ### IBlockRepository
72
+ Create a `config.json` file in your project root:
195
73
 
196
- ```typescript
197
- findById(id: string): Promise<Block | null>
198
- findAll(): Promise<Block[]>
199
- save(entity: Block): Promise<Block>
200
- delete(id: string): Promise<boolean>
201
- findByFilePath(filePath: string): Promise<Block[]>
202
- searchByKeyword(keyword: string): Promise<Block[]>
74
+ ```json
75
+ {
76
+ "projectRoot": "/path/to/project",
77
+ "language": "typescript",
78
+ "indexDirectory": ".ngao/index",
79
+ "watchMode": true,
80
+ "autoReindex": true
81
+ }
203
82
  ```
204
83
 
205
- ## Performance
84
+ ## Documentation
206
85
 
207
- - Indexing: ~1000 blocks/second (single-threaded)
208
- - Search: <100ms for typical queries
209
- - Memory: ~1KB per indexed block (in-memory)
210
- - Storage: ~500 bytes per block (SQLite)
86
+ - [Installation Guide](./docs/INSTALLATION.md)
87
+ - [Usage Guide](./docs/USAGE.md)
88
+ - [API Documentation](./docs/API.md)
89
+ - [MCP Integration](./docs/MCP_INTEGRATION.md)
90
+ - [File Watching](./docs/FILE_WATCHING.md)
211
91
 
212
- ## License
92
+ ## Architecture
213
93
 
214
- MIT
94
+ This application is built on top of [`@ngao/search-core`](https://www.npmjs.com/package/@ngao/search-core), providing additional features:
215
95
 
216
- ## Contributing
96
+ - File watching (Chokidar)
97
+ - HTTP REST API (Express)
98
+ - MCP protocol transport
99
+ - CLI interface
100
+ - Session management
217
101
 
218
- Contributions are welcome! Please feel free to submit issues and pull requests.
102
+ ## License
219
103
 
104
+ Apache-2.0
@@ -0,0 +1,8 @@
1
+ {
2
+ "databasePath": "./data/index.db",
3
+ "cacheTtlSeconds": 3600,
4
+ "maxIndexSizeMb": 1000,
5
+ "maxSearchResults": 100,
6
+ "logLevel": "INFO",
7
+ "enableMetrics": false
8
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * SearchEngine Facade Implementation
3
+ * Main public API for NGAO Search
4
+ * Updated: LanceDB-based storage with vector embeddings
5
+ */
6
+ import 'reflect-metadata';
7
+ import { ISearchEngine, ILogger } from '../core/types';
8
+ import { SearchResult, IndexStats, SearchOptions, IndexOptions } from '../core/models';
9
+ import { IBlockRepository, IMetadataRepository } from '../repositories/repository.interface';
10
+ /**
11
+ * SearchEngine implements ISearchEngine interface
12
+ * Orchestrates all components for search and indexing
13
+ * Storage: LanceDB (persistent, with vector embeddings)
14
+ */
15
+ export declare class SearchEngine implements ISearchEngine {
16
+ private _blockRepository;
17
+ private _metadataRepository;
18
+ private _parserFactory;
19
+ private _queryParser;
20
+ private _blockExtractor;
21
+ private _searcher;
22
+ private _rankingEngine;
23
+ private _contextExtractor;
24
+ private _logger;
25
+ private _embeddingService;
26
+ private _quantizationService;
27
+ private _enableVectorSearch;
28
+ constructor(blockRepository: IBlockRepository, metadataRepository: IMetadataRepository, logger?: ILogger, options?: {
29
+ enableVectorSearch?: boolean;
30
+ });
31
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
32
+ indexDirectory(dirPath: string, options?: IndexOptions & {
33
+ includePaths?: string[];
34
+ excludePaths?: string[];
35
+ }): Promise<IndexStats>;
36
+ getStats(): Promise<IndexStats>;
37
+ clearIndex(): Promise<void>;
38
+ private _shouldReindexFile;
39
+ }
40
+ //# sourceMappingURL=search-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-engine.d.ts","sourceRoot":"","sources":["../../../src/backend/api/search-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,OAAO,EAAkC,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAc7F;;;;GAIG;AACH,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,mBAAmB,CAAU;gBAGnC,eAAe,EAAE,gBAAgB,EACjC,kBAAkB,EAAE,mBAAmB,EACvC,MAAM,CAAC,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QACR,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IA8BU,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA2DvE,cAAc,CACzB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC5E,OAAO,CAAC,UAAU,CAAC;IA2GT,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAuB/B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAK1B,kBAAkB;CAiBjC"}