@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.
- package/.claude/settings.local.json +10 -0
- package/.env.example +7 -0
- package/.eslintrc.json +20 -0
- package/.github/workflows/build.yml +39 -0
- package/.github/workflows/release.yml +34 -0
- package/.github/workflows/test.yml +35 -0
- package/.mcp-config.json +14 -0
- package/.prettierrc.json +10 -0
- package/LICENSE +17 -0
- package/Makefile +26 -0
- package/README.md +57 -172
- package/config.example.json +8 -0
- package/dist/backend/api/search-engine.d.ts +40 -0
- package/dist/backend/api/search-engine.d.ts.map +1 -0
- package/dist/backend/api/search-engine.js +227 -0
- package/dist/backend/api/search-engine.js.map +1 -0
- package/dist/backend/core/block-impl.d.ts +32 -0
- package/dist/backend/core/block-impl.d.ts.map +1 -0
- package/dist/backend/core/block-impl.js +33 -0
- package/dist/backend/core/block-impl.js.map +1 -0
- package/dist/backend/core/config-loader.d.ts +68 -0
- package/dist/backend/core/config-loader.d.ts.map +1 -0
- package/dist/backend/core/config-loader.js +234 -0
- package/dist/backend/core/config-loader.js.map +1 -0
- package/dist/backend/core/constants.d.ts +39 -0
- package/dist/backend/core/constants.d.ts.map +1 -0
- package/dist/backend/core/constants.js +57 -0
- package/dist/backend/core/constants.js.map +1 -0
- package/dist/backend/core/enums.d.ts +54 -0
- package/dist/backend/core/enums.d.ts.map +1 -0
- package/dist/backend/core/enums.js +61 -0
- package/dist/backend/core/enums.js.map +1 -0
- package/dist/backend/core/errors.d.ts +83 -0
- package/dist/backend/core/errors.d.ts.map +1 -0
- package/dist/backend/core/errors.js +151 -0
- package/dist/backend/core/errors.js.map +1 -0
- package/dist/backend/core/logger.d.ts +68 -0
- package/dist/backend/core/logger.d.ts.map +1 -0
- package/dist/backend/core/logger.js +151 -0
- package/dist/backend/core/logger.js.map +1 -0
- package/dist/backend/core/models.d.ts +332 -0
- package/dist/backend/core/models.d.ts.map +1 -0
- package/dist/backend/core/models.js +6 -0
- package/dist/backend/core/models.js.map +1 -0
- package/dist/backend/core/service-types.d.ts +184 -0
- package/dist/backend/core/service-types.d.ts.map +1 -0
- package/dist/backend/core/service-types.js +7 -0
- package/dist/backend/core/service-types.js.map +1 -0
- package/dist/backend/core/types.d.ts +219 -0
- package/dist/backend/core/types.d.ts.map +1 -0
- package/dist/backend/core/types.js +109 -0
- package/dist/backend/core/types.js.map +1 -0
- package/dist/backend/index.d.ts +5 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +13 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/indexing/block-extractor.d.ts +22 -0
- package/dist/backend/indexing/block-extractor.d.ts.map +1 -0
- package/dist/backend/indexing/block-extractor.js +52 -0
- package/dist/backend/indexing/block-extractor.js.map +1 -0
- package/dist/backend/indexing/index-builder.d.ts +26 -0
- package/dist/backend/indexing/index-builder.d.ts.map +1 -0
- package/dist/backend/indexing/index-builder.js +71 -0
- package/dist/backend/indexing/index-builder.js.map +1 -0
- package/dist/backend/parsers/base-file-parser.d.ts +134 -0
- package/dist/backend/parsers/base-file-parser.d.ts.map +1 -0
- package/dist/backend/parsers/base-file-parser.js +149 -0
- package/dist/backend/parsers/base-file-parser.js.map +1 -0
- package/dist/backend/parsers/javascript-parser.d.ts +36 -0
- package/dist/backend/parsers/javascript-parser.d.ts.map +1 -0
- package/dist/backend/parsers/javascript-parser.js +194 -0
- package/dist/backend/parsers/javascript-parser.js.map +1 -0
- package/dist/backend/parsers/json-parser.d.ts +15 -0
- package/dist/backend/parsers/json-parser.d.ts.map +1 -0
- package/dist/backend/parsers/json-parser.js +75 -0
- package/dist/backend/parsers/json-parser.js.map +1 -0
- package/dist/backend/parsers/markdown-parser.d.ts +17 -0
- package/dist/backend/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/backend/parsers/markdown-parser.js +94 -0
- package/dist/backend/parsers/markdown-parser.js.map +1 -0
- package/dist/backend/parsers/parser-factory.d.ts +43 -0
- package/dist/backend/parsers/parser-factory.d.ts.map +1 -0
- package/dist/backend/parsers/parser-factory.js +149 -0
- package/dist/backend/parsers/parser-factory.js.map +1 -0
- package/dist/backend/parsers/python-parser.d.ts +21 -0
- package/dist/backend/parsers/python-parser.d.ts.map +1 -0
- package/dist/backend/parsers/python-parser.js +185 -0
- package/dist/backend/parsers/python-parser.js.map +1 -0
- package/dist/backend/parsers/yaml-parser.d.ts +16 -0
- package/dist/backend/parsers/yaml-parser.d.ts.map +1 -0
- package/dist/backend/parsers/yaml-parser.js +81 -0
- package/dist/backend/parsers/yaml-parser.js.map +1 -0
- package/dist/backend/repositories/implementations/lancedb-block-repository.d.ts +125 -0
- package/dist/backend/repositories/implementations/lancedb-block-repository.d.ts.map +1 -0
- package/dist/backend/repositories/implementations/lancedb-block-repository.js +505 -0
- package/dist/backend/repositories/implementations/lancedb-block-repository.js.map +1 -0
- package/dist/backend/repositories/implementations/lancedb-metadata-repository.d.ts +107 -0
- package/dist/backend/repositories/implementations/lancedb-metadata-repository.d.ts.map +1 -0
- package/dist/backend/repositories/implementations/lancedb-metadata-repository.js +275 -0
- package/dist/backend/repositories/implementations/lancedb-metadata-repository.js.map +1 -0
- package/dist/backend/repositories/implementations/memory-cache.d.ts +18 -0
- package/dist/backend/repositories/implementations/memory-cache.d.ts.map +1 -0
- package/dist/backend/repositories/implementations/memory-cache.js +53 -0
- package/dist/backend/repositories/implementations/memory-cache.js.map +1 -0
- package/dist/backend/repositories/repository.interface.d.ts +334 -0
- package/dist/backend/repositories/repository.interface.d.ts.map +1 -0
- package/dist/backend/repositories/repository.interface.js +7 -0
- package/dist/backend/repositories/repository.interface.js.map +1 -0
- package/dist/backend/search/context-extractor.d.ts +29 -0
- package/dist/backend/search/context-extractor.d.ts.map +1 -0
- package/dist/backend/search/context-extractor.js +106 -0
- package/dist/backend/search/context-extractor.js.map +1 -0
- package/dist/backend/search/multi-index-searcher.d.ts +28 -0
- package/dist/backend/search/multi-index-searcher.d.ts.map +1 -0
- package/dist/backend/search/multi-index-searcher.js +81 -0
- package/dist/backend/search/multi-index-searcher.js.map +1 -0
- package/dist/backend/search/query-parser.d.ts +37 -0
- package/dist/backend/search/query-parser.d.ts.map +1 -0
- package/dist/backend/search/query-parser.js +145 -0
- package/dist/backend/search/query-parser.js.map +1 -0
- package/dist/backend/search/ranking-engine.d.ts +31 -0
- package/dist/backend/search/ranking-engine.d.ts.map +1 -0
- package/dist/backend/search/ranking-engine.js +165 -0
- package/dist/backend/search/ranking-engine.js.map +1 -0
- package/dist/backend/search/result-formatter.d.ts +29 -0
- package/dist/backend/search/result-formatter.d.ts.map +1 -0
- package/dist/backend/search/result-formatter.js +70 -0
- package/dist/backend/search/result-formatter.js.map +1 -0
- package/dist/backend/service-types.d.ts +184 -0
- package/dist/backend/service-types.d.ts.map +1 -0
- package/dist/backend/service-types.js +7 -0
- package/dist/backend/service-types.js.map +1 -0
- package/dist/backend/services/embedding-service.d.ts +75 -0
- package/dist/backend/services/embedding-service.d.ts.map +1 -0
- package/dist/backend/services/embedding-service.js +298 -0
- package/dist/backend/services/embedding-service.js.map +1 -0
- package/dist/backend/services/file-watcher.d.ts +17 -0
- package/dist/backend/services/file-watcher.d.ts.map +1 -0
- package/dist/backend/services/file-watcher.js +92 -0
- package/dist/backend/services/file-watcher.js.map +1 -0
- package/dist/backend/services/index-information-service.d.ts +114 -0
- package/dist/backend/services/index-information-service.d.ts.map +1 -0
- package/dist/backend/services/index-information-service.js +104 -0
- package/dist/backend/services/index-information-service.js.map +1 -0
- package/dist/backend/services/ngao-search-service.d.ts +107 -0
- package/dist/backend/services/ngao-search-service.d.ts.map +1 -0
- package/dist/backend/services/ngao-search-service.js +384 -0
- package/dist/backend/services/ngao-search-service.js.map +1 -0
- package/dist/backend/services/quantization-service.d.ts +53 -0
- package/dist/backend/services/quantization-service.d.ts.map +1 -0
- package/dist/backend/services/quantization-service.js +84 -0
- package/dist/backend/services/quantization-service.js.map +1 -0
- package/dist/backend/services/reindex-manager.d.ts +25 -0
- package/dist/backend/services/reindex-manager.d.ts.map +1 -0
- package/dist/backend/services/reindex-manager.js +78 -0
- package/dist/backend/services/reindex-manager.js.map +1 -0
- package/dist/backend/services/session-manager.d.ts +115 -0
- package/dist/backend/services/session-manager.d.ts.map +1 -0
- package/dist/backend/services/session-manager.js +150 -0
- package/dist/backend/services/session-manager.js.map +1 -0
- package/dist/backend/services/vector-search-service.d.ts +81 -0
- package/dist/backend/services/vector-search-service.d.ts.map +1 -0
- package/dist/backend/services/vector-search-service.js +143 -0
- package/dist/backend/services/vector-search-service.js.map +1 -0
- package/dist/backend/utils/file-utils.d.ts +92 -0
- package/dist/backend/utils/file-utils.d.ts.map +1 -0
- package/dist/backend/utils/file-utils.js +247 -0
- package/dist/backend/utils/file-utils.js.map +1 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +138 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +14 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +7 -67075
- package/dist/main.js.map +1 -0
- package/dist/mcp/tool-schemas.d.ts +205 -0
- package/dist/mcp/tool-schemas.d.ts.map +1 -0
- package/dist/mcp/tool-schemas.js +391 -0
- package/dist/mcp/tool-schemas.js.map +1 -0
- package/dist/server/logger.d.ts +50 -0
- package/dist/server/logger.d.ts.map +1 -0
- package/dist/server/logger.js +77 -0
- package/dist/server/logger.js.map +1 -0
- package/dist/server/tool-registry.d.ts +64 -0
- package/dist/server/tool-registry.d.ts.map +1 -0
- package/dist/server/tool-registry.js +93 -0
- package/dist/server/tool-registry.js.map +1 -0
- package/dist/server/transports/mcp-transport.d.ts +31 -0
- package/dist/server/transports/mcp-transport.d.ts.map +1 -0
- package/dist/server/transports/mcp-transport.js +331 -0
- package/dist/server/transports/mcp-transport.js.map +1 -0
- package/dist/server/transports/rest-transport.d.ts +36 -0
- package/dist/server/transports/rest-transport.d.ts.map +1 -0
- package/dist/server/transports/rest-transport.js +250 -0
- package/dist/server/transports/rest-transport.js.map +1 -0
- package/docs/API.md +116 -0
- package/docs/ARCHITECTURE.md +101 -0
- package/docs/FILE_WATCHING.md +120 -0
- package/docs/INSTALLATION.md +87 -0
- package/docs/MCP_INTEGRATION.md +108 -0
- package/docs/README.md +288 -0
- package/docs/USAGE.md +123 -0
- package/docs/architecture-design-standards/01_ARCHITECTURE.md +863 -0
- package/docs/architecture-design-standards/02_SEARCH_ENGINE_DESIGN.md +958 -0
- package/docs/architecture-design-standards/03_DATAFLOW.md +1000 -0
- package/docs/architecture-design-standards/04_VISUAL_GUIDE.md +922 -0
- package/docs/architecture-design-standards/05_REPOSITORY_PATTERN_GUIDE.md +503 -0
- package/docs/architecture-design-standards/06_IMPLEMENTATION_PATTERNS.md +1026 -0
- package/docs/architecture-design-standards/07_TYPESCRIPT_GUIDE.md +1027 -0
- package/docs/architecture-design-standards/08_CODING_STANDARDS.md +1274 -0
- package/docs/reference/01_START_HERE.md +108 -0
- package/docs/reference/02_QUICK_REFERENCE.md +363 -0
- package/docs/reference/03_DOCUMENTATION_INDEX.md +293 -0
- package/docs/reference/04_DELIVERY_SUMMARY.md +463 -0
- package/docs/reference/05_IMPLEMENTATION_OVERVIEW.md +319 -0
- package/docs/reference/06_RESEARCH_SUMMARY.md +519 -0
- package/docs/tracking/03_IMPLEMENTATION_ROADMAP.md +788 -0
- package/jest.config.json +12 -0
- package/package.json +46 -53
- package/prepend-shebang.js +18 -0
- package/scripts/setup-mcp.sh +66 -0
- package/src/backend/index.ts +5 -0
- package/src/backend/service-types.ts +219 -0
- package/src/backend/services/file-watcher.ts +79 -0
- package/src/backend/services/ngao-search-service.ts +430 -0
- package/src/backend/services/reindex-manager.ts +90 -0
- package/src/backend/services/session-manager.ts +214 -0
- package/src/cli/setup.ts +122 -0
- package/src/index.ts +6 -0
- package/src/main.ts +225 -0
- package/src/mcp/tool-schemas.ts +439 -0
- package/src/server/logger.ts +88 -0
- package/src/server/tool-registry.ts +117 -0
- package/src/server/transports/mcp-transport.ts +374 -0
- package/src/server/transports/rest-transport.ts +258 -0
- package/tests/unit/agent-tools.test.ts +454 -0
- package/tests/unit/file-watcher.test.d.ts +2 -0
- package/tests/unit/file-watcher.test.d.ts.map +1 -0
- package/tests/unit/file-watcher.test.js +9 -0
- package/tests/unit/file-watcher.test.js.map +1 -0
- package/tests/unit/file-watcher.test.ts +7 -0
- package/tests/unit/search-integration.test.ts +256 -0
- package/tests/unit/services.test.d.ts +2 -0
- package/tests/unit/services.test.d.ts.map +1 -0
- package/tests/unit/services.test.js +9 -0
- package/tests/unit/services.test.js.map +1 -0
- package/tests/unit/services.test.ts +7 -0
- package/tsconfig.json +23 -0
- package/webpack.backend.config.js +60 -0
- package/webpack.config.js +34 -0
- package/models/Xenova/all-MiniLM-L6-v2/config.json +0 -25
- package/models/Xenova/all-MiniLM-L6-v2/onnx/model_quantized.onnx +0 -0
- package/models/Xenova/all-MiniLM-L6-v2/tokenizer.json +0 -30686
- package/models/Xenova/all-MiniLM-L6-v2/tokenizer_config.json +0 -15
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vector Search Service
|
|
4
|
+
* High-level API for semantic similarity search
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.VectorSearchService = void 0;
|
|
8
|
+
const logger_1 = require("../core/logger");
|
|
9
|
+
const embedding_service_1 = require("./embedding-service");
|
|
10
|
+
/**
|
|
11
|
+
* Vector search service for semantic similarity
|
|
12
|
+
*/
|
|
13
|
+
class VectorSearchService {
|
|
14
|
+
constructor(blockRepository, embeddingService, logger) {
|
|
15
|
+
this._blockRepository = blockRepository;
|
|
16
|
+
this._embeddingService = embeddingService || new embedding_service_1.EmbeddingService(logger);
|
|
17
|
+
this._logger = logger || new logger_1.NoOpLogger();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Initialize services
|
|
21
|
+
*/
|
|
22
|
+
async initialize() {
|
|
23
|
+
await this._embeddingService.initialize();
|
|
24
|
+
this._logger.info('Vector search service initialized');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Search by semantic similarity
|
|
28
|
+
*
|
|
29
|
+
* @param queryText - Query text
|
|
30
|
+
* @param options - Search options
|
|
31
|
+
* @returns Array of similar blocks with similarity scores
|
|
32
|
+
*/
|
|
33
|
+
async search(queryText, options = {}) {
|
|
34
|
+
try {
|
|
35
|
+
const limit = options.limit || 10;
|
|
36
|
+
const minSimilarity = options.minSimilarity || 0.3;
|
|
37
|
+
this._logger.debug('Vector search initiated', { queryText, limit, minSimilarity });
|
|
38
|
+
// Generate embedding for query
|
|
39
|
+
const queryEmbedding = await this._embeddingService.generate(queryText);
|
|
40
|
+
// Search in block repository
|
|
41
|
+
const results = await this._blockRepository.searchByVector(queryEmbedding, limit * 2, // Get more results for filtering
|
|
42
|
+
minSimilarity);
|
|
43
|
+
// Apply optional filters
|
|
44
|
+
let filtered = results;
|
|
45
|
+
if (options.filePathFilter) {
|
|
46
|
+
filtered = filtered.filter((r) => r.block.filePath.includes(options.filePathFilter));
|
|
47
|
+
}
|
|
48
|
+
if (options.itemTypeFilter) {
|
|
49
|
+
filtered = filtered.filter((r) => r.block.itemType === options.itemTypeFilter);
|
|
50
|
+
}
|
|
51
|
+
// Limit results
|
|
52
|
+
const final = filtered.slice(0, limit);
|
|
53
|
+
this._logger.debug('Vector search completed', { resultCount: final.length });
|
|
54
|
+
return final;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
this._logger.error('Error in vector search', error);
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Search with pre-generated embedding
|
|
63
|
+
* (Useful if you already have an embedding)
|
|
64
|
+
*/
|
|
65
|
+
async searchByEmbedding(embedding, options = {}) {
|
|
66
|
+
try {
|
|
67
|
+
const limit = options.limit || 10;
|
|
68
|
+
const minSimilarity = options.minSimilarity || 0.3;
|
|
69
|
+
this._logger.debug('Vector search by embedding', { limit, minSimilarity });
|
|
70
|
+
// Search in block repository
|
|
71
|
+
const results = await this._blockRepository.searchByVector(embedding, limit * 2, minSimilarity);
|
|
72
|
+
// Apply optional filters
|
|
73
|
+
let filtered = results;
|
|
74
|
+
if (options.filePathFilter) {
|
|
75
|
+
filtered = filtered.filter((r) => r.block.filePath.includes(options.filePathFilter));
|
|
76
|
+
}
|
|
77
|
+
if (options.itemTypeFilter) {
|
|
78
|
+
filtered = filtered.filter((r) => r.block.itemType === options.itemTypeFilter);
|
|
79
|
+
}
|
|
80
|
+
// Limit results
|
|
81
|
+
const final = filtered.slice(0, limit);
|
|
82
|
+
this._logger.debug('Vector search completed', { resultCount: final.length });
|
|
83
|
+
return final;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this._logger.error('Error in vector search', error);
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Find blocks similar to a given block
|
|
92
|
+
* (Useful for "similar items" feature)
|
|
93
|
+
*/
|
|
94
|
+
async findSimilarBlocks(blockId, options = {}) {
|
|
95
|
+
try {
|
|
96
|
+
// Find the reference block
|
|
97
|
+
const refBlock = await this._blockRepository.findById(blockId);
|
|
98
|
+
if (!refBlock || !refBlock.embedding) {
|
|
99
|
+
this._logger.warn('Reference block not found or has no embedding', { blockId });
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
this._logger.debug('Finding similar blocks', { blockId, limit: options.limit });
|
|
103
|
+
// Search using block's embedding
|
|
104
|
+
const results = await this.searchByEmbedding(Array.from(refBlock.embedding), options);
|
|
105
|
+
// Filter out the reference block itself
|
|
106
|
+
const filtered = results.filter((r) => r.block.id !== blockId);
|
|
107
|
+
return filtered;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
this._logger.error('Error finding similar blocks', error);
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get embedding dimension
|
|
116
|
+
*/
|
|
117
|
+
getDimension() {
|
|
118
|
+
return this._embeddingService.getDimension();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get model information
|
|
122
|
+
*/
|
|
123
|
+
getModelInfo() {
|
|
124
|
+
return {
|
|
125
|
+
name: this._embeddingService.getModelName(),
|
|
126
|
+
dimension: this._embeddingService.getDimension(),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if service is ready
|
|
131
|
+
*/
|
|
132
|
+
isReady() {
|
|
133
|
+
return this._embeddingService.isInitialized();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Validate similarity score
|
|
137
|
+
*/
|
|
138
|
+
validateSimilarityScore(score) {
|
|
139
|
+
return score >= 0 && score <= 1;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.VectorSearchService = VectorSearchService;
|
|
143
|
+
//# sourceMappingURL=vector-search-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-search-service.js","sourceRoot":"","sources":["../../../src/backend/services/vector-search-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility Functions for File Operations
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* File utility functions
|
|
6
|
+
*/
|
|
7
|
+
export declare class FileUtils {
|
|
8
|
+
/**
|
|
9
|
+
* Read file content asynchronously
|
|
10
|
+
*
|
|
11
|
+
* @param filePath - Path to file
|
|
12
|
+
* @returns File content as string
|
|
13
|
+
*/
|
|
14
|
+
static readFile(filePath: string): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Check if file exists
|
|
17
|
+
*
|
|
18
|
+
* @param filePath - Path to file
|
|
19
|
+
* @returns true if file exists
|
|
20
|
+
*/
|
|
21
|
+
static fileExists(filePath: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Get file size in bytes
|
|
24
|
+
*
|
|
25
|
+
* @param filePath - Path to file
|
|
26
|
+
* @returns File size
|
|
27
|
+
*/
|
|
28
|
+
static getFileSize(filePath: string): number;
|
|
29
|
+
/**
|
|
30
|
+
* Compute SHA256 hash of file
|
|
31
|
+
*
|
|
32
|
+
* @param filePath - Path to file
|
|
33
|
+
* @returns File hash
|
|
34
|
+
*/
|
|
35
|
+
static computeFileHash(filePath: string): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Find all files matching pattern recursively
|
|
38
|
+
*
|
|
39
|
+
* @param dirPath - Directory path
|
|
40
|
+
* @param extensions - File extensions to match (e.g., ['.py', '.md'])
|
|
41
|
+
* @param includePaths - Glob patterns to include (e.g., ['**\/*.ts', 'src/**'])
|
|
42
|
+
* @param excludePaths - Glob patterns to exclude (e.g., ['node_modules/**', 'dist/**'])
|
|
43
|
+
* @returns Array of matching file paths
|
|
44
|
+
* @throws SecurityError if path traversal attempt is detected
|
|
45
|
+
*/
|
|
46
|
+
static findFiles(dirPath: string, extensions: string[], includePaths?: string[], excludePaths?: string[]): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Check if a path matches any of the given glob patterns
|
|
49
|
+
*
|
|
50
|
+
* @param filePath - Relative file path
|
|
51
|
+
* @param patterns - Array of glob patterns
|
|
52
|
+
* @returns true if path matches any pattern
|
|
53
|
+
*/
|
|
54
|
+
private static _matchesAnyPattern;
|
|
55
|
+
/**
|
|
56
|
+
* Check if a path matches a glob pattern
|
|
57
|
+
* Supports: *, **, and literal paths
|
|
58
|
+
*
|
|
59
|
+
* @param filePath - Normalized relative file path
|
|
60
|
+
* @param pattern - Glob pattern
|
|
61
|
+
* @returns true if path matches pattern
|
|
62
|
+
*/
|
|
63
|
+
private static _matchesGlobPattern;
|
|
64
|
+
/**
|
|
65
|
+
* Validate that a path is safe and doesn't contain traversal attempts
|
|
66
|
+
*
|
|
67
|
+
* @param dirPath - Directory path to validate
|
|
68
|
+
* @throws SecurityError if path traversal is detected
|
|
69
|
+
*/
|
|
70
|
+
private static _validatePathSafety;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Path utility functions
|
|
74
|
+
*/
|
|
75
|
+
export declare class PathUtils {
|
|
76
|
+
/**
|
|
77
|
+
* Normalize path to use forward slashes
|
|
78
|
+
*
|
|
79
|
+
* @param filePath - Path to normalize
|
|
80
|
+
* @returns Normalized path
|
|
81
|
+
*/
|
|
82
|
+
static normalize(filePath: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* Get relative path from base directory
|
|
85
|
+
*
|
|
86
|
+
* @param filePath - Absolute file path
|
|
87
|
+
* @param basePath - Base directory path
|
|
88
|
+
* @returns Relative path
|
|
89
|
+
*/
|
|
90
|
+
static getRelativePath(filePath: string, basePath: string): string;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=file-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../../src/backend/utils/file-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH;;GAEG;AACH,qBAAa,SAAS;IACpB;;;;;OAKG;WACiB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI/D;;;;;OAKG;WACW,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAInD;;;;;OAKG;WACW,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IASnD;;;;;OAKG;WACiB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKtE;;;;;;;;;OASG;WACW,SAAS,CACrB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAAE,EACpB,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,MAAM,EAAE;IAyCX;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAajC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAmDlC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAoBnC;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB;;;;;OAKG;WACW,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIjD;;;;;;OAMG;WACW,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAG1E"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Utility Functions for File Operations
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
22
|
+
if (mod && mod.__esModule) return mod;
|
|
23
|
+
var result = {};
|
|
24
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
25
|
+
__setModuleDefault(result, mod);
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.PathUtils = exports.FileUtils = void 0;
|
|
30
|
+
const fs = __importStar(require("fs"));
|
|
31
|
+
const path = __importStar(require("path"));
|
|
32
|
+
const crypto = __importStar(require("crypto"));
|
|
33
|
+
/**
|
|
34
|
+
* Custom error for security violations
|
|
35
|
+
*/
|
|
36
|
+
class SecurityError extends Error {
|
|
37
|
+
constructor(message) {
|
|
38
|
+
super(message);
|
|
39
|
+
this.name = 'SecurityError';
|
|
40
|
+
Object.setPrototypeOf(this, SecurityError.prototype);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* File utility functions
|
|
45
|
+
*/
|
|
46
|
+
class FileUtils {
|
|
47
|
+
/**
|
|
48
|
+
* Read file content asynchronously
|
|
49
|
+
*
|
|
50
|
+
* @param filePath - Path to file
|
|
51
|
+
* @returns File content as string
|
|
52
|
+
*/
|
|
53
|
+
static async readFile(filePath) {
|
|
54
|
+
return fs.promises.readFile(filePath, 'utf-8');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if file exists
|
|
58
|
+
*
|
|
59
|
+
* @param filePath - Path to file
|
|
60
|
+
* @returns true if file exists
|
|
61
|
+
*/
|
|
62
|
+
static fileExists(filePath) {
|
|
63
|
+
return fs.existsSync(filePath);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get file size in bytes
|
|
67
|
+
*
|
|
68
|
+
* @param filePath - Path to file
|
|
69
|
+
* @returns File size
|
|
70
|
+
*/
|
|
71
|
+
static getFileSize(filePath) {
|
|
72
|
+
try {
|
|
73
|
+
const stats = fs.statSync(filePath);
|
|
74
|
+
return stats.size;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Compute SHA256 hash of file
|
|
82
|
+
*
|
|
83
|
+
* @param filePath - Path to file
|
|
84
|
+
* @returns File hash
|
|
85
|
+
*/
|
|
86
|
+
static async computeFileHash(filePath) {
|
|
87
|
+
const content = await this.readFile(filePath);
|
|
88
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Find all files matching pattern recursively
|
|
92
|
+
*
|
|
93
|
+
* @param dirPath - Directory path
|
|
94
|
+
* @param extensions - File extensions to match (e.g., ['.py', '.md'])
|
|
95
|
+
* @param includePaths - Glob patterns to include (e.g., ['**\/*.ts', 'src/**'])
|
|
96
|
+
* @param excludePaths - Glob patterns to exclude (e.g., ['node_modules/**', 'dist/**'])
|
|
97
|
+
* @returns Array of matching file paths
|
|
98
|
+
* @throws SecurityError if path traversal attempt is detected
|
|
99
|
+
*/
|
|
100
|
+
static findFiles(dirPath, extensions, includePaths, excludePaths) {
|
|
101
|
+
const results = [];
|
|
102
|
+
if (!fs.existsSync(dirPath)) {
|
|
103
|
+
return results;
|
|
104
|
+
}
|
|
105
|
+
// Security check: Prevent path traversal attacks
|
|
106
|
+
this._validatePathSafety(dirPath);
|
|
107
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
108
|
+
for (const entry of entries) {
|
|
109
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
110
|
+
const relativePath = path.relative(dirPath, fullPath);
|
|
111
|
+
// Check if path should be excluded
|
|
112
|
+
if (excludePaths && this._matchesAnyPattern(relativePath, excludePaths)) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (entry.isDirectory()) {
|
|
116
|
+
// Recursively search subdirectories
|
|
117
|
+
results.push(...this.findFiles(fullPath, extensions, includePaths, excludePaths));
|
|
118
|
+
}
|
|
119
|
+
else if (entry.isFile()) {
|
|
120
|
+
const ext = path.extname(entry.name);
|
|
121
|
+
// Check if file matches extension or include patterns
|
|
122
|
+
const matchesExtension = extensions.includes(ext);
|
|
123
|
+
const matchesInclude = !includePaths || includePaths.length === 0 || this._matchesAnyPattern(relativePath, includePaths);
|
|
124
|
+
if (matchesExtension && matchesInclude) {
|
|
125
|
+
results.push(fullPath);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return results;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Check if a path matches any of the given glob patterns
|
|
133
|
+
*
|
|
134
|
+
* @param filePath - Relative file path
|
|
135
|
+
* @param patterns - Array of glob patterns
|
|
136
|
+
* @returns true if path matches any pattern
|
|
137
|
+
*/
|
|
138
|
+
static _matchesAnyPattern(filePath, patterns) {
|
|
139
|
+
// Normalize path to use forward slashes for consistency
|
|
140
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
141
|
+
for (const pattern of patterns) {
|
|
142
|
+
if (this._matchesGlobPattern(normalizedPath, pattern)) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Check if a path matches a glob pattern
|
|
150
|
+
* Supports: *, **, and literal paths
|
|
151
|
+
*
|
|
152
|
+
* @param filePath - Normalized relative file path
|
|
153
|
+
* @param pattern - Glob pattern
|
|
154
|
+
* @returns true if path matches pattern
|
|
155
|
+
*/
|
|
156
|
+
static _matchesGlobPattern(filePath, pattern) {
|
|
157
|
+
const normalizedPattern = pattern.replace(/\\/g, '/');
|
|
158
|
+
// Handle ** (recursive wildcard)
|
|
159
|
+
if (normalizedPattern.includes('**')) {
|
|
160
|
+
// Pattern like "node_modules/**" or "**/dist"
|
|
161
|
+
if (normalizedPattern.endsWith('/**')) {
|
|
162
|
+
const prefix = normalizedPattern.slice(0, -3);
|
|
163
|
+
return filePath === prefix || filePath.startsWith(prefix + '/');
|
|
164
|
+
}
|
|
165
|
+
// Pattern like "**/node_modules" or "**/dist/..." or "**/*.ts"
|
|
166
|
+
if (normalizedPattern.startsWith('**/')) {
|
|
167
|
+
const suffix = normalizedPattern.slice(3);
|
|
168
|
+
// For patterns like "**/*.ts", match suffix against the filename
|
|
169
|
+
if (suffix.includes('*')) {
|
|
170
|
+
const lastSlash = filePath.lastIndexOf('/');
|
|
171
|
+
const filename = lastSlash === -1 ? filePath : filePath.substring(lastSlash + 1);
|
|
172
|
+
return this._matchesGlobPattern(filename, suffix);
|
|
173
|
+
}
|
|
174
|
+
// For literal suffixes like "**/node_modules"
|
|
175
|
+
return (filePath === suffix ||
|
|
176
|
+
filePath.endsWith('/' + suffix) ||
|
|
177
|
+
filePath.includes('/' + suffix + '/') ||
|
|
178
|
+
(filePath.includes('/') && this._matchesGlobPattern(filePath.slice(filePath.indexOf('/') + 1), pattern)));
|
|
179
|
+
}
|
|
180
|
+
// Pattern is just "**"
|
|
181
|
+
if (normalizedPattern === '**') {
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Handle * (single level wildcard)
|
|
186
|
+
if (normalizedPattern.includes('*') && !normalizedPattern.includes('**')) {
|
|
187
|
+
// Convert glob pattern to regex: * matches anything except /
|
|
188
|
+
const regexPattern = normalizedPattern
|
|
189
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape regex special chars
|
|
190
|
+
.replace(/\*/g, '[^/]*'); // * matches anything except /
|
|
191
|
+
return new RegExp(`^${regexPattern}$`).test(filePath);
|
|
192
|
+
}
|
|
193
|
+
// Literal match or exact match
|
|
194
|
+
return filePath === normalizedPattern || filePath.endsWith('/' + normalizedPattern);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Validate that a path is safe and doesn't contain traversal attempts
|
|
198
|
+
*
|
|
199
|
+
* @param dirPath - Directory path to validate
|
|
200
|
+
* @throws SecurityError if path traversal is detected
|
|
201
|
+
*/
|
|
202
|
+
static _validatePathSafety(dirPath) {
|
|
203
|
+
// Resolve to absolute path to prevent traversal
|
|
204
|
+
const resolved = path.resolve(dirPath);
|
|
205
|
+
const normalized = path.normalize(resolved);
|
|
206
|
+
// Check for null bytes (path traversal technique)
|
|
207
|
+
if (normalized.includes('\0')) {
|
|
208
|
+
throw new SecurityError('Path contains null bytes - potential security violation');
|
|
209
|
+
}
|
|
210
|
+
// Detect common traversal patterns
|
|
211
|
+
if (normalized.includes('..') || normalized.includes('~')) {
|
|
212
|
+
// Allow only if they're part of a legitimate resolved path
|
|
213
|
+
// Re-verify after resolution to ensure safety
|
|
214
|
+
const testPath = path.resolve(resolved);
|
|
215
|
+
if (!testPath.startsWith(path.resolve(resolved))) {
|
|
216
|
+
throw new SecurityError('Path traversal detected in directory path');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.FileUtils = FileUtils;
|
|
222
|
+
/**
|
|
223
|
+
* Path utility functions
|
|
224
|
+
*/
|
|
225
|
+
class PathUtils {
|
|
226
|
+
/**
|
|
227
|
+
* Normalize path to use forward slashes
|
|
228
|
+
*
|
|
229
|
+
* @param filePath - Path to normalize
|
|
230
|
+
* @returns Normalized path
|
|
231
|
+
*/
|
|
232
|
+
static normalize(filePath) {
|
|
233
|
+
return filePath.replace(/\\/g, '/');
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get relative path from base directory
|
|
237
|
+
*
|
|
238
|
+
* @param filePath - Absolute file path
|
|
239
|
+
* @param basePath - Base directory path
|
|
240
|
+
* @returns Relative path
|
|
241
|
+
*/
|
|
242
|
+
static getRelativePath(filePath, basePath) {
|
|
243
|
+
return path.relative(basePath, filePath);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
exports.PathUtils = PathUtils;
|
|
247
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../../src/backend/utils/file-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAqBA,wBAAsB,QAAQ,IAAI,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAmGhE"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.setupMCP = void 0;
|
|
27
|
+
const fs = __importStar(require("fs"));
|
|
28
|
+
const path = __importStar(require("path"));
|
|
29
|
+
const readline = __importStar(require("readline"));
|
|
30
|
+
const child_process_1 = require("child_process");
|
|
31
|
+
const uuid_1 = require("uuid");
|
|
32
|
+
const ngao_search_service_1 = require("../backend/services/ngao-search-service");
|
|
33
|
+
const rl = readline.createInterface({
|
|
34
|
+
input: process.stdin,
|
|
35
|
+
output: process.stdout,
|
|
36
|
+
});
|
|
37
|
+
function question(prompt) {
|
|
38
|
+
return new Promise((resolve) => {
|
|
39
|
+
rl.question(prompt, (answer) => {
|
|
40
|
+
resolve(answer);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function setupMCP() {
|
|
45
|
+
console.log('\nš§ NGAO Search - MCP Setup for Claude Code\n');
|
|
46
|
+
// Ask for project directory
|
|
47
|
+
const projectDir = await question('š Enter your project directory path (or press Enter for current): ');
|
|
48
|
+
const resolvedProjectDir = projectDir.trim() || process.cwd();
|
|
49
|
+
// Create .ngao-search config in project
|
|
50
|
+
const projectConfigPath = path.join(resolvedProjectDir, '.ngao-search.json');
|
|
51
|
+
if (!fs.existsSync(projectConfigPath)) {
|
|
52
|
+
// Generate UUID for this project to isolate its database
|
|
53
|
+
const projectUUID = (0, uuid_1.v4)();
|
|
54
|
+
const projectConfig = {
|
|
55
|
+
projectId: projectUUID,
|
|
56
|
+
includePaths: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.py', '**/*.md'],
|
|
57
|
+
excludePaths: ['node_modules/**', 'dist/**', '.git/**'],
|
|
58
|
+
};
|
|
59
|
+
fs.writeFileSync(projectConfigPath, JSON.stringify(projectConfig, null, 2));
|
|
60
|
+
console.log(`ā
Project config created: ${projectConfigPath}`);
|
|
61
|
+
console.log(`š Project ID: ${projectUUID}`);
|
|
62
|
+
}
|
|
63
|
+
// Create .mcp-config.json in project for reference
|
|
64
|
+
const mcpConfigPath = path.join(resolvedProjectDir, '.mcp-config.json');
|
|
65
|
+
const mcpConfig = {
|
|
66
|
+
mcpServers: {
|
|
67
|
+
'ngao-search': {
|
|
68
|
+
command: 'npx',
|
|
69
|
+
args: ['ngao-search'],
|
|
70
|
+
env: {
|
|
71
|
+
NGAO_SEARCH_PROJECT: resolvedProjectDir,
|
|
72
|
+
MCP_TRANSPORT: 'stdio',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2));
|
|
78
|
+
console.log(`ā
MCP config created: ${mcpConfigPath}`);
|
|
79
|
+
// Register with Claude Code CLI using `claude mcp add`
|
|
80
|
+
try {
|
|
81
|
+
console.log('\nš” Registering with Claude Code CLI...');
|
|
82
|
+
(0, child_process_1.execSync)(`cd "${resolvedProjectDir}" && claude mcp add -e NGAO_SEARCH_PROJECT="${resolvedProjectDir}" -e MCP_TRANSPORT=stdio -- ngao-search npx ngao-search`, { stdio: 'pipe' });
|
|
83
|
+
console.log('ā
MCP server registered with Claude Code CLI');
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.log('ā ļø Could not auto-register with Claude Code CLI.');
|
|
87
|
+
console.log(' Please run this command manually in your project directory:');
|
|
88
|
+
console.log(`\n cd "${resolvedProjectDir}"`);
|
|
89
|
+
console.log(' claude mcp add -e NGAO_SEARCH_PROJECT="' + resolvedProjectDir + '" -e MCP_TRANSPORT=stdio -- ngao-search npx ngao-search\n');
|
|
90
|
+
}
|
|
91
|
+
// Initialize database (embedding model will lazy-load on first search)
|
|
92
|
+
console.log('\nāļø Initializing database...');
|
|
93
|
+
let searchService = null;
|
|
94
|
+
try {
|
|
95
|
+
searchService = new ngao_search_service_1.NgaoSearchService(resolvedProjectDir);
|
|
96
|
+
await searchService.ensureInitialized();
|
|
97
|
+
console.log('ā
Database initialized');
|
|
98
|
+
console.log(' Embedding model will load on first search');
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
console.warn('ā ļø Warning: Could not initialize database');
|
|
102
|
+
console.warn(` Error: ${String(error)}`);
|
|
103
|
+
console.log(' Database will be initialized on first use instead.\n');
|
|
104
|
+
}
|
|
105
|
+
// Auto-index the project directory
|
|
106
|
+
if (searchService) {
|
|
107
|
+
console.log('\nš Auto-indexing project directory...');
|
|
108
|
+
try {
|
|
109
|
+
const indexResult = await searchService.autoIndexProjectDirectory(resolvedProjectDir);
|
|
110
|
+
if (indexResult.success && indexResult.stats) {
|
|
111
|
+
console.log('ā
Auto-indexing completed');
|
|
112
|
+
console.log(` š Indexed ${indexResult.stats.totalFiles} files with ${indexResult.stats.totalBlocks} code blocks`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.warn(`ā ļø Auto-indexing encountered issues: ${indexResult.error || 'Unknown error'}`);
|
|
116
|
+
console.log(' You can manually index later using the search tools\n');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.warn('ā ļø Warning: Could not auto-index project directory');
|
|
121
|
+
console.warn(` Error: ${String(error)}`);
|
|
122
|
+
console.log(' You can manually index later using the search tools\n');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Show setup instructions
|
|
126
|
+
console.log('\nš Setup Complete!\n');
|
|
127
|
+
console.log('⨠NGAO Search is now integrated with Claude Code');
|
|
128
|
+
console.log('\nā¹ļø Configuration Details:');
|
|
129
|
+
console.log('š Project directory: ' + resolvedProjectDir);
|
|
130
|
+
console.log('š Server port: Automatically assigned');
|
|
131
|
+
console.log('š Project config: ' + projectConfigPath);
|
|
132
|
+
console.log('š MCP config: ' + mcpConfigPath + '\n');
|
|
133
|
+
console.log('š You can now use NGAO Search in Claude Code!\n');
|
|
134
|
+
rl.close();
|
|
135
|
+
return { projectDir: resolvedProjectDir };
|
|
136
|
+
}
|
|
137
|
+
exports.setupMCP = setupMCP;
|
|
138
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|