@mhalder/qdrant-mcp-server 3.1.2 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ /sdk/** linguist-generated
@@ -0,0 +1,6 @@
1
+ {
2
+ "type": "module",
3
+ "dependencies": {
4
+ "typescript": "5.9.3"
5
+ }
6
+ }
@@ -0,0 +1,83 @@
1
+ import {
2
+ dag,
3
+ Container,
4
+ Directory,
5
+ object,
6
+ func,
7
+ argument,
8
+ } from "@dagger.io/dagger"
9
+
10
+ const SUPPORTED_NODE_VERSIONS = ["22", "24"]
11
+
12
+ @object()
13
+ export class Ci {
14
+ private base(source: Directory, nodeVersion: string): Container {
15
+ if (!SUPPORTED_NODE_VERSIONS.includes(nodeVersion)) {
16
+ throw new Error(
17
+ `Unsupported Node version "${nodeVersion}". Must be one of: ${SUPPORTED_NODE_VERSIONS.join(", ")}`,
18
+ )
19
+ }
20
+
21
+ let ctr = dag
22
+ .container()
23
+ .from(`node:${nodeVersion}-slim`)
24
+ .withExec(["apt-get", "update"])
25
+ .withExec([
26
+ "apt-get",
27
+ "install",
28
+ "-y",
29
+ "--no-install-recommends",
30
+ "python3",
31
+ "make",
32
+ "g++",
33
+ "git",
34
+ ])
35
+ .withMountedDirectory("/app", source)
36
+ .withWorkdir("/app")
37
+ // Dagger context directories exclude .git dirs but may include
38
+ // a .git worktree file pointing to a host path. Remove it and
39
+ // init a fresh repo so integration tests pass.
40
+ .withExec(["rm", "-rf", ".git"])
41
+ .withExec(["git", "init"])
42
+ .withExec(["git", "config", "user.email", "ci@dagger"])
43
+ .withExec(["git", "config", "user.name", "CI"])
44
+ .withExec(["git", "add", "."])
45
+ .withExec(["git", "commit", "-m", "init", "--allow-empty"])
46
+
47
+ if (nodeVersion.startsWith("24")) {
48
+ ctr = ctr.withEnvVariable("CXXFLAGS", "-std=c++20")
49
+ }
50
+
51
+ return ctr.withExec(["npm", "ci"])
52
+ }
53
+
54
+ @func()
55
+ check(
56
+ @argument({ defaultPath: "/" }) source: Directory,
57
+ nodeVersion: string = "22",
58
+ ): Container {
59
+ return this.base(source, nodeVersion)
60
+ .withExec(["npm", "run", "type-check"])
61
+ .withExec(["npm", "run", "build"])
62
+ }
63
+
64
+ @func()
65
+ async test(
66
+ @argument({ defaultPath: "/" }) source: Directory,
67
+ nodeVersion: string = "22",
68
+ ): Promise<Directory> {
69
+ return this.check(source, nodeVersion)
70
+ .withExec(["npm", "run", "test:coverage"])
71
+ .withExec(["npm", "run", "test:providers"])
72
+ .directory("/app/coverage")
73
+ }
74
+
75
+ @func()
76
+ async testAll(
77
+ @argument({ defaultPath: "/" }) source: Directory,
78
+ ): Promise<string> {
79
+ const versions = ["22", "24"]
80
+ await Promise.all(versions.map((v) => this.test(source, v)))
81
+ return `All tests passed on Node ${versions.join(", ")}`
82
+ }
83
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "moduleResolution": "Node",
5
+ "experimentalDecorators": true,
6
+ "strict": true,
7
+ "skipLibCheck": true,
8
+ "paths": {
9
+ "@dagger.io/dagger": ["./sdk/index.ts"],
10
+ "@dagger.io/dagger/telemetry": ["./sdk/telemetry.ts"]
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,8 @@
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ typescript@5.9.3:
6
+ version "5.9.3"
7
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f"
8
+ integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==
@@ -7,43 +7,33 @@ on:
7
7
  branches: [main]
8
8
 
9
9
  jobs:
10
- build-and-test:
11
- name: Build and Test
10
+ test:
11
+ name: Test (Node ${{ matrix.node-version }})
12
12
  runs-on: ubuntu-latest
13
-
14
13
  strategy:
15
14
  matrix:
16
- node-version: [22.x, 24.x]
15
+ node-version: ["22", "24"]
17
16
 
18
17
  steps:
19
- - name: Checkout code
20
- uses: actions/checkout@v4
18
+ - uses: actions/checkout@v4
21
19
 
22
- - name: Setup Node.js ${{ matrix.node-version }}
23
- uses: actions/setup-node@v4
20
+ - name: Run tests via Dagger
21
+ uses: dagger/dagger-for-github@v7
24
22
  with:
25
- node-version: ${{ matrix.node-version }}
26
- cache: "npm"
27
-
28
- - name: Install dependencies
29
- run: npm ci
30
- env:
31
- # Node 24 requires C++20 for native modules
32
- CXXFLAGS: ${{ matrix.node-version == '24.x' && '-std=c++20' || '' }}
33
-
34
- - name: Type check
35
- run: npm run type-check
23
+ verb: call
24
+ args: test --source=. --node-version=${{ matrix.node-version }}
25
+ version: "0.19.10"
36
26
 
37
- - name: Build project
38
- run: npm run build
39
-
40
- - name: Run tests with coverage
41
- run: npm run test:coverage
42
-
43
- - name: Run provider verification tests
44
- run: npm run test:providers
27
+ - name: Export coverage
28
+ if: matrix.node-version == '22'
29
+ uses: dagger/dagger-for-github@v7
30
+ with:
31
+ verb: call
32
+ args: test --source=. --node-version=22 export --path=./coverage
33
+ version: "0.19.10"
45
34
 
46
35
  - name: Upload coverage to Codecov
36
+ if: matrix.node-version == '22'
47
37
  uses: codecov/codecov-action@v4
48
38
  continue-on-error: true
49
39
  with:
@@ -18,32 +18,29 @@ jobs:
18
18
  if: "!contains(github.event.head_commit.message, '[skip ci]')"
19
19
 
20
20
  steps:
21
- - name: Checkout code
22
- uses: actions/checkout@v4
21
+ - uses: actions/checkout@v4
23
22
  with:
24
23
  fetch-depth: 0
25
24
  persist-credentials: false
26
25
 
27
- - name: Setup Node.js
28
- uses: actions/setup-node@v4
26
+ # Dagger gate: type-check + build validation
27
+ - name: Check via Dagger
28
+ uses: dagger/dagger-for-github@v7
29
29
  with:
30
- node-version: '22.x'
31
- cache: 'npm'
30
+ verb: call
31
+ args: check --source=. --node-version=22
32
+ version: "0.19.10"
32
33
 
33
- - name: Install dependencies
34
- run: npm ci
35
-
36
- - name: Type check
37
- run: npm run type-check
38
-
39
- - name: Build project
40
- run: npm run build
41
-
42
- - name: Run tests
43
- run: npm test -- --run
34
+ # Native release (needs OIDC token for npm provenance)
35
+ - uses: actions/setup-node@v4
36
+ with:
37
+ node-version: "22.x"
38
+ cache: "npm"
44
39
 
45
- - name: Run provider verification tests
46
- run: npm run test:providers
40
+ - run: npm ci
41
+ - run: npm run build
42
+ - run: npm test -- --run
43
+ - run: npm run test:providers
47
44
 
48
45
  - name: Release
49
46
  env:
package/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## <small>3.2.1 (2026-01-30)</small>
2
+
3
+ * Merge pull request #52 from mhalder/feat/dagger ([da115bb](https://github.com/mhalder/qdrant-mcp-server/commit/da115bb)), closes [#52](https://github.com/mhalder/qdrant-mcp-server/issues/52)
4
+ * fix(dagger): validate node version and pin engine version ([61625b9](https://github.com/mhalder/qdrant-mcp-server/commit/61625b9))
5
+ * style(dagger): reformat package.json ([c22ca40](https://github.com/mhalder/qdrant-mcp-server/commit/c22ca40))
6
+ * ci(dagger): replace GHA CI with Dagger TypeScript module ([d79a77e](https://github.com/mhalder/qdrant-mcp-server/commit/d79a77e))
7
+
8
+ ## 3.2.0 (2026-01-24)
9
+
10
+ * Merge pull request #51 from mhalder/feat/advanced-search ([e99311b](https://github.com/mhalder/qdrant-mcp-server/commit/e99311b)), closes [#51](https://github.com/mhalder/qdrant-mcp-server/issues/51)
11
+ * fix(federated): rank within repo+type groups for fair RRF interleaving ([958411a](https://github.com/mhalder/qdrant-mcp-server/commit/958411a))
12
+ * fix(federated): use segment comparison for path matching ([9de2b85](https://github.com/mhalder/qdrant-mcp-server/commit/9de2b85))
13
+ * docs(contributing): simplify and remove redundancy ([393a918](https://github.com/mhalder/qdrant-mcp-server/commit/393a918))
14
+ * docs(readme): fix Claude Code MCP config path and format ([4c338f0](https://github.com/mhalder/qdrant-mcp-server/commit/4c338f0))
15
+ * docs(readme): simplify quick start config and add usage examples ([e3a8978](https://github.com/mhalder/qdrant-mcp-server/commit/e3a8978))
16
+ * feat(tools): add contextual and federated search tools ([48d880e](https://github.com/mhalder/qdrant-mcp-server/commit/48d880e))
17
+ * chore(prompts): add git indexing prompt templates ([38607a8](https://github.com/mhalder/qdrant-mcp-server/commit/38607a8))
18
+
1
19
  ## <small>3.1.2 (2026-01-23)</small>
2
20
 
3
21
  * Merge pull request #50 from mhalder/fix/pathpattern-filter ([b12517f](https://github.com/mhalder/qdrant-mcp-server/commit/b12517f)), closes [#50](https://github.com/mhalder/qdrant-mcp-server/issues/50)
package/CONTRIBUTING.md CHANGED
@@ -2,171 +2,69 @@
2
2
 
3
3
  Thank you for your interest in contributing!
4
4
 
5
- ## Getting Started
5
+ ## Quick Start
6
6
 
7
7
  ```bash
8
- # 1. Fork and clone
8
+ # Fork and clone
9
9
  git clone https://github.com/YOUR_USERNAME/qdrant-mcp-server.git
10
10
  cd qdrant-mcp-server
11
11
  npm install
12
12
 
13
- # 2. Create feature branch
13
+ # Create feature branch
14
14
  git checkout -b feat/your-feature-name
15
15
 
16
- # 3. Make changes, add tests
17
-
18
- # 4. Verify
16
+ # Make changes, then verify
19
17
  npm test -- --run
20
18
  npm run type-check
21
19
  npm run build
22
20
 
23
- # 5. Commit with conventional format
21
+ # Commit with conventional format
24
22
  git commit -m "feat: add new feature"
25
23
  ```
26
24
 
27
25
  ## Development Commands
28
26
 
29
- | Command | Purpose |
30
- | ------------------------ | ---------------------------- |
31
- | `npm run build` | Build for production |
32
- | `npm run dev` | Development with auto-reload |
33
- | `npm test` | Run test suite |
34
- | `npm run test:ui` | Tests with UI |
35
- | `npm run test:coverage` | Coverage report |
36
- | `npm run test:providers` | Provider verification |
37
- | `npm run type-check` | TypeScript validation |
27
+ | Command | Purpose |
28
+ | ----------------------- | -------------------- |
29
+ | `npm run build` | Build for production |
30
+ | `npm run dev` | Dev with auto-reload |
31
+ | `npm test` | Run test suite |
32
+ | `npm run test:coverage` | Coverage report |
33
+ | `npm run type-check` | TypeScript check |
38
34
 
39
35
  ## Commit Convention
40
36
 
41
- This project uses [Conventional Commits](https://www.conventionalcommits.org/) for automated versioning and releases.
42
-
43
- ### Format
37
+ Use [Conventional Commits](https://www.conventionalcommits.org/):
44
38
 
45
39
  ```
46
40
  <type>(<scope>): <subject>
47
-
48
- <body>
49
-
50
- <footer>
51
- ```
52
-
53
- ### Types
54
-
55
- | Type | Description | Version Bump |
56
- | ---------- | ----------------------- | ------------- |
57
- | `feat` | New feature | Minor (1.x.0) |
58
- | `fix` | Bug fix | Patch (1.0.x) |
59
- | `docs` | Documentation | Patch |
60
- | `refactor` | Code refactoring | Patch |
61
- | `perf` | Performance improvement | Patch |
62
- | `test` | Adding/updating tests | None |
63
- | `chore` | Build/dependencies | None |
64
- | `ci` | CI/CD changes | None |
65
- | `style` | Code style/formatting | None |
66
-
67
- ### Breaking Changes
68
-
69
- Add `BREAKING CHANGE:` in body/footer or append `!` after type:
70
-
71
- ```bash
72
- feat!: remove Node 16 support
73
-
74
- BREAKING CHANGE: Node 16 is no longer supported
75
41
  ```
76
42
 
77
- This triggers a major version bump (x.0.0).
43
+ **Types:** `feat`, `fix`, `docs`, `refactor`, `perf`, `test`, `chore`, `ci`
78
44
 
79
- ### Examples
45
+ **Examples:**
80
46
 
81
47
  ```bash
82
- # Feature
83
- feat(embeddings): add support for new provider
84
-
85
- # Bug fix
86
- fix(search): correct similarity score calculation
87
-
88
- # Documentation
89
- docs: update installation instructions
90
-
91
- # Breaking change
92
- feat!: change collection schema format
48
+ feat(embeddings): add new provider
49
+ fix(search): correct score calculation
50
+ docs: update installation guide
51
+ feat!: breaking change (major version bump)
93
52
  ```
94
53
 
95
- ### Validation
96
-
97
- Commitlint enforces:
54
+ ## Pull Requests
98
55
 
99
- - Conventional commits format required
100
- - Valid type required
101
- - Subject must not be empty or end with period
102
- - Header max 100 characters
103
- - Subject must not start with uppercase
56
+ 1. Add tests for changes
57
+ 2. Update docs if needed
58
+ 3. Pass CI checks (build, type-check, tests)
59
+ 4. Use conventional commit format for PR title
104
60
 
105
- ## Pull Request Process
61
+ ## Releases
106
62
 
107
- 1. **Update docs** if needed
108
- 2. **Add tests** for changes
109
- 3. **Pass CI checks** (build, type-check, tests)
110
- 4. **Request review**
111
- 5. **Merge** after approval
112
-
113
- ### PR Title
114
-
115
- Use conventional commit format:
116
-
117
- ```
118
- feat: add new search feature
119
- fix: resolve connection timeout
120
- docs: improve setup documentation
121
- ```
122
-
123
- ## Release Process
124
-
125
- Automated via [semantic-release](https://semantic-release.gitbook.io/):
126
-
127
- - Releases on merge to `main`
128
- - Version follows [Semantic Versioning](https://semver.org/)
129
- - Changelog auto-generated from commits
130
- - Packages published to npm
131
-
132
- ### Version Bumps
63
+ Automated via [semantic-release](https://semantic-release.gitbook.io/) on merge to `main`:
133
64
 
134
65
  - `feat` → minor (1.x.0)
135
- - `fix`, `perf`, `docs`, `refactor` → patch (1.0.x)
136
- - `BREAKING CHANGE` → major (x.0.0)
137
-
138
- ## Testing
139
-
140
- - Write tests for all new features and bug fixes
141
- - Maintain or improve code coverage
142
- - Run full test suite before submitting PRs
143
- - Include both unit and integration tests
144
-
145
- ## Project Structure
146
-
147
- ```
148
- qdrant-mcp-server/
149
- ├── src/ # Source code
150
- │ ├── code/ # Code indexing and vectorization
151
- │ │ ├── chunker/ # AST-aware code chunking
152
- │ │ └── sync/ # File synchronization with Merkle trees
153
- │ ├── embeddings/ # Embedding providers (Ollama, OpenAI, Cohere, Voyage)
154
- │ ├── prompts/ # MCP prompt templates and registration
155
- │ ├── qdrant/ # Qdrant vector database client
156
- │ ├── resources/ # MCP resource definitions
157
- │ └── tools/ # MCP tool implementations
158
- │ ├── code.ts # Code indexing tools
159
- │ ├── collection.ts # Collection management
160
- │ ├── document.ts # Document operations
161
- │ ├── search.ts # Search tools (semantic + hybrid)
162
- │ ├── schemas.ts # Zod validation schemas
163
- │ └── index.ts # Tool registration orchestrator
164
- ├── build/ # Compiled output
165
- ├── examples/ # Usage examples
166
- ├── scripts/ # Utility scripts
167
- ├── .github/ # GitHub Actions workflows
168
- └── .husky/ # Git hooks
169
- ```
66
+ - `fix`, `docs`, `refactor`, `perf` → patch (1.0.x)
67
+ - `BREAKING CHANGE` or `!` → major (x.0.0)
170
68
 
171
69
  ## Questions?
172
70
 
package/README.md CHANGED
@@ -11,6 +11,7 @@ A Model Context Protocol (MCP) server providing semantic search capabilities usi
11
11
  - **Privacy-First**: Local embeddings and vector storage - data never leaves your machine
12
12
  - **Code Vectorization**: Intelligent codebase indexing with AST-aware chunking and semantic code search
13
13
  - **Git History Search**: Index commit history for semantic search over past changes, fixes, and patterns
14
+ - **Advanced Search**: Contextual search (code + git with correlations) and federated search across multiple repositories
14
15
  - **Multiple Providers**: Ollama (default), OpenAI, Cohere, and Voyage AI
15
16
  - **Hybrid Search**: Combine semantic and keyword search for better results
16
17
  - **Semantic Search**: Natural language search with metadata filtering
@@ -57,42 +58,33 @@ npm run build
57
58
 
58
59
  #### Local Setup (stdio transport)
59
60
 
60
- Add to `~/.claude/claude_code_config.json`:
61
+ ```bash
62
+ claude mcp add --transport stdio qdrant -- node /path/to/qdrant-mcp-server/build/index.js
63
+ ```
64
+
65
+ Or add to `~/.claude.json`:
61
66
 
62
67
  ```json
63
68
  {
64
69
  "mcpServers": {
65
70
  "qdrant": {
71
+ "type": "stdio",
66
72
  "command": "node",
67
- "args": ["/path/to/qdrant-mcp-server/build/index.js"],
68
- "env": {
69
- "QDRANT_URL": "http://localhost:6333",
70
- "EMBEDDING_BASE_URL": "http://localhost:11434"
71
- }
73
+ "args": ["/path/to/qdrant-mcp-server/build/index.js"]
72
74
  }
73
75
  }
74
76
  }
75
77
  ```
76
78
 
77
- #### Connecting to Secured Qdrant Instances
79
+ For Qdrant Cloud or secured instances, add `--env QDRANT_API_KEY=your-key` or set in env config.
78
80
 
79
- For Qdrant Cloud or self-hosted instances with API key authentication:
81
+ **Try it:**
80
82
 
81
- ```json
82
- {
83
- "mcpServers": {
84
- "qdrant": {
85
- "command": "node",
86
- "args": ["/path/to/qdrant-mcp-server/build/index.js"],
87
- "env": {
88
- "QDRANT_URL": "https://your-cluster.qdrant.io:6333",
89
- "QDRANT_API_KEY": "your-api-key-here",
90
- "EMBEDDING_BASE_URL": "http://localhost:11434"
91
- }
92
- }
93
- }
94
- }
95
83
  ```
84
+ Create a collection called "notes" and add a document about machine learning
85
+ ```
86
+
87
+ **Enable example prompts:** Copy `prompts.example.json` to `prompts.json` and restart. Use `/prompt` to list available prompts.
96
88
 
97
89
  #### Remote Setup (HTTP transport)
98
90
 
@@ -111,12 +103,19 @@ For Qdrant Cloud or self-hosted instances with API key authentication:
111
103
  TRANSPORT_MODE=http HTTP_PORT=3000 node build/index.js
112
104
  ```
113
105
 
114
- **Configure client:**
106
+ **Option 1: Using `claude mcp add`**
107
+
108
+ ```bash
109
+ claude mcp add --transport http qdrant http://your-server:3000/mcp
110
+ ```
111
+
112
+ **Option 2: Add to `~/.claude.json`**
115
113
 
116
114
  ```json
117
115
  {
118
116
  "mcpServers": {
119
117
  "qdrant": {
118
+ "type": "http",
120
119
  "url": "http://your-server:3000/mcp"
121
120
  }
122
121
  }
@@ -177,6 +176,13 @@ See [Advanced Configuration](#advanced-configuration) section below for all opti
177
176
  | `get_git_index_status` | Get indexing status and statistics for a repository's git history |
178
177
  | `clear_git_index` | Delete all indexed git history data for a repository |
179
178
 
179
+ ### Advanced Search
180
+
181
+ | Tool | Description |
182
+ | ------------------- | ----------------------------------------------------------------------------- |
183
+ | `contextual_search` | Combined code + git history search with file-commit correlations |
184
+ | `federated_search` | Search across multiple repositories with Reciprocal Rank Fusion (RRF) ranking |
185
+
180
186
  ### Resources
181
187
 
182
188
  - `qdrant://collections` - List all collections
@@ -231,14 +237,18 @@ If you place `prompts.json` in the project root, no additional configuration is
231
237
 
232
238
  See [`prompts.example.json`](prompts.example.json) for ready-to-use prompts including:
233
239
 
234
- - `find_similar_docs` - Semantic search with result explanation
235
240
  - `setup_rag_collection` - Create RAG-optimized collections
236
- - `analyze_collection` - Collection insights and recommendations
237
- - `bulk_add_documents` - Guided bulk document insertion
238
- - `search_with_filter` - Metadata filtering assistance
239
- - `compare_search_methods` - Semantic vs hybrid search comparison
240
- - `collection_maintenance` - Maintenance and cleanup workflows
241
+ - `analyze_and_optimize` - Collection insights and recommendations
242
+ - `compare_search_strategies` - Semantic vs hybrid search comparison
241
243
  - `migrate_to_hybrid` - Collection migration guide
244
+ - `debug_search_quality` - Troubleshoot poor search results
245
+ - `build_knowledge_base` - Structured documentation with metadata
246
+ - `index_git_history` - Index repository commit history for semantic search
247
+ - `search_project_history` - Search git history to understand feature implementations
248
+ - `investigate_code_with_history` - Deep dive into code with contextual search
249
+ - `cross_repo_search` - Search patterns across multiple repositories
250
+ - `trace_feature_evolution` - Track how features evolved over time
251
+ - `security_audit_search` - Find security-related code and fixes
242
252
 
243
253
  ### Template Syntax
244
254
 
@@ -484,6 +494,15 @@ Index and search your repository's git commit history using natural language. Pe
484
494
  - **Learning from History**: "Show me examples of API endpoint implementations"
485
495
  - **Code Archaeology**: "What changes were made to the payment system last year?"
486
496
 
497
+ ## Advanced Search
498
+
499
+ Combine code and git history search for deeper codebase understanding. Requires repositories to be indexed with both `index_codebase` and `index_git_history` first.
500
+
501
+ - **Contextual Search**: Query code + git history together with automatic file-commit correlations
502
+ - **Federated Search**: Search across multiple repositories with RRF ranking
503
+
504
+ See **[Advanced Search Examples](examples/advanced-search/)** for detailed usage, workflows, and scenarios.
505
+
487
506
  ## Examples
488
507
 
489
508
  See [examples/](examples/) directory for detailed guides:
@@ -494,6 +513,7 @@ See [examples/](examples/) directory for detailed guides:
494
513
  - **[Advanced Filtering](examples/filters/)** - Complex boolean filters
495
514
  - **[Rate Limiting](examples/rate-limiting/)** - Batch processing with cloud providers
496
515
  - **[Code Search](examples/code-search/)** - Index codebases and semantic code search
516
+ - **[Advanced Search](examples/advanced-search/)** - Contextual and federated search across repositories
497
517
 
498
518
  ## Advanced Configuration
499
519
 
@@ -594,15 +614,27 @@ npm test # Run test suite
594
614
  npm run test:coverage # Coverage report
595
615
  ```
596
616
 
617
+ ### Dagger (Portable CI)
618
+
619
+ The CI pipeline is implemented as a [Dagger](https://dagger.io/) TypeScript module, making it runnable locally or in any CI system:
620
+
621
+ ```bash
622
+ dagger call check --source=. # Type-check + build (Node 22)
623
+ dagger call check --source=. --node-version=24 # Type-check + build (Node 24)
624
+ dagger call test --source=. # Full test suite + coverage
625
+ dagger call test-all --source=. # Test on Node 22 + 24 in parallel
626
+ ```
627
+
597
628
  ### Testing
598
629
 
599
- **718 tests** across 26 test files with **97%+ coverage**:
630
+ **748 tests** across 27 test files with **97%+ coverage**:
600
631
 
601
632
  - **Unit Tests**: QdrantManager (56), Ollama (41), OpenAI (25), Cohere (29), Voyage (31), Factory (43), Prompts (50), Transport (15), MCP Server (19)
602
633
  - **Integration Tests**: Code indexer (56), scanner (15), chunker (24), synchronizer (42), snapshot (26), merkle tree (28)
603
634
  - **Git History Tests**: Git extractor (28), extractor integration (11), chunker (30), indexer (42), synchronizer (18)
635
+ - **Advanced Search Tests**: Federated tools (30) - normalizeScores, calculateRRFScore, buildCorrelations, contextual_search, federated_search
604
636
 
605
- **CI/CD**: GitHub Actions runs build, type-check, and tests on Node.js 22.x and 24.x for every push/PR.
637
+ **CI/CD**: [Dagger](https://dagger.io/) module runs build, type-check, and tests on Node.js 22 and 24. GitHub Actions invokes Dagger for CI and uses native `semantic-release` for publishing.
606
638
 
607
639
  ## Contributing
608
640