Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
9894dc0
fix: log level not reconfigurable at runtime
thaihoang2011 Nov 26, 2025
08369cb
fix: log level not reconfigurable at runtime
thaihoang2011 Nov 28, 2025
285b792
fix: resolve Windows compatibility issues in test suite
minh0306 Dec 5, 2025
e7b3a60
chore(release): update README and RELEASE_NOTES for version 0.7.4
minh0306 Dec 5, 2025
7b4520e
fix: add explicit UTF-8 encoding to all file operations in test_websi…
minh0306 Dec 5, 2025
fe79b80
Merge pull request #73 from martin-papy/bugfix/57
minh362000 Dec 8, 2025
b0da3b9
chore: update dependencies in pyproject.toml
Dec 8, 2025
444466d
Merge pull request #75 from martin-papy/bugfix/60
thanhbuingoc-cbtw Dec 8, 2025
d0b575d
Merge branch 'hotfix/0.7.4' of https://github.com/martin-papy/qdrant-…
thaihoang2011 Dec 8, 2025
e3aaa52
fix: update logging configuration to include log level in reconfigure…
thaihoang2011 Dec 9, 2025
79d6abe
fix: correct unpacking of logging configuration in LoggingConfig
thaihoang2011 Dec 9, 2025
8dcd271
Merge pull request #63 from martin-papy/bugfix/58
thanhbuingoc-cbtw Dec 9, 2025
c9adda4
chore: split oversized file to comply with model size constraints
minh0306 Dec 9, 2025
9df1c78
fix: update qdrant-client API from search() to query_points()
thanhbuingoc-cbtw Dec 8, 2025
044f0ae
Merge pull request #79 from martin-papy/bugfix/58
thanhbuingoc-cbtw Dec 9, 2025
502c7c5
Merge pull request #78 from martin-papy/bugfix/74
thanhbuingoc-cbtw Dec 9, 2025
0e83180
fix: fix missing spacy in mcp-server dependencies. Fix #67
minh0306 Dec 10, 2025
1a8e9b6
Merge pull request #82 from martin-papy/bugfix/67
thanhbuingoc-cbtw Dec 10, 2025
3917bcc
fix:improve mock payload structure and test robustness
minh0306 Dec 10, 2025
f2e6166
fix: incorrect indentation
minh0306 Dec 10, 2025
563e2b9
fix: use level parameter in MCP wrapper reconfigure()
Dec 10, 2025
8c03034
Merge pull request #84 from martin-papy/fix/logging-fallback-with-level
thanhbuingoc-cbtw Dec 10, 2025
5a53aa3
chore(release): update README and RELEASE_NOTES for version 0.7.4
thanhbuingoc-cbtw Dec 11, 2025
02b0733
chore(release): bump versions to 0.7.4
thanhbuingoc-cbtw Dec 11, 2025
886ce58
chore: update Release note for v0.7.4
minh0306 Dec 11, 2025
e16e454
fix: revert bump version
minh0306 Dec 11, 2025
a168da3
Merge pull request #83 from martin-papy/hotfix/0.7.4
martin-papy Dec 12, 2025
9fb3c56
chore: add .venv to .gitignore for virtual environment exclusion
martin-papy Dec 12, 2025
9478ab8
chore(release): bump versions; update classifiers and internal deps
martin-papy Dec 12, 2025
ed45fb6
test 1: remove unneccessary step and track time
huyenhothi Dec 18, 2025
ae9014c
test without export file step
huyenhothi Dec 18, 2025
51325e7
test: seperate 2 step - unit (without pytest-xdist) and integration
huyenhothi Dec 18, 2025
8270f2d
test: seperate 2 step - unit (with pytest-xdist) and integration
huyenhothi Dec 18, 2025
f89f892
test: test pytest-xdist again
huyenhothi Dec 19, 2025
5ac6348
test: add coverage command and combine report
huyenhothi Dec 19, 2025
33f3e51
test: test full scripts
huyenhothi Dec 19, 2025
0c5ed3a
test: new strategy
huyenhothi Dec 23, 2025
4fd5129
update name of branch
huyenhothi Dec 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 32 additions & 32 deletions .github/workflows/docs-auto.yml
Original file line number Diff line number Diff line change
Expand Up @@ -193,41 +193,41 @@ jobs:
exit 1
fi

- name: Upload site artifact
uses: actions/upload-artifact@v4
with:
name: website-auto-${{ github.run_id }}
path: site
retention-days: 30
# - name: Upload site artifact
# uses: actions/upload-artifact@v4
# with:
# name: website-auto-${{ github.run_id }}
# path: site
# retention-days: 30

- name: Setup Pages (for deployment)
if: github.event_name == 'release' && needs.check-release.outputs.should-deploy == 'true'
uses: actions/configure-pages@v4
# - name: Setup Pages (for deployment)
# if: github.event_name == 'release' && needs.check-release.outputs.should-deploy == 'true'
# uses: actions/configure-pages@v4

- name: Upload site artifact for Pages (for deployment)
if: github.event_name == 'release' && needs.check-release.outputs.should-deploy == 'true'
uses: actions/upload-pages-artifact@v3
with:
path: site
# - name: Upload site artifact for Pages (for deployment)
# if: github.event_name == 'release' && needs.check-release.outputs.should-deploy == 'true'
# uses: actions/upload-pages-artifact@v3
# with:
# path: site

deploy:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
needs: [check-release, build-docs]
if: |
needs.build-docs.result == 'success' &&
github.event_name == 'release' &&
needs.check-release.outputs.should-deploy == 'true'
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
permissions:
pages: write
id-token: write
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
# deploy:
# name: Deploy to GitHub Pages
# runs-on: ubuntu-latest
# needs: [check-release, build-docs]
# if: |
# needs.build-docs.result == 'success' &&
# github.event_name == 'release' &&
# needs.check-release.outputs.should-deploy == 'true'
# environment:
# name: github-pages
# url: ${{ steps.deployment.outputs.page_url }}
# permissions:
# pages: write
# id-token: write
# steps:
# - name: Deploy to GitHub Pages
# id: deployment
# uses: actions/deploy-pages@v4

build-summary:
name: Build Summary
Expand Down
162 changes: 46 additions & 116 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,25 @@ jobs:
- name: Run core tests and generate coverage reports
run: |
cd packages/qdrant-loader-core
python -m pytest tests/ --cov=src --cov-report=xml:../../coverage-core.xml --cov-report=html:../../htmlcov-core -v
python -m pytest tests/ --cov=src -v

- name: Generate coverage reports
if: github.event_name == 'push' && github.ref_name == 'main'
run: |
cd packages/qdrant-loader-core
coverage xml -o ../../coverage-core.xml
coverage html -d ../../htmlcov-core

- name: Upload core coverage artifact
if: github.event_name == 'push' && github.ref_name == 'main'
uses: actions/upload-artifact@v4
with:
name: coverage-core-${{ github.run_id }}
path: |
htmlcov-core
coverage-core.xml
retention-days: 30

test-loader:
name: Test QDrant Loader
runs-on: ubuntu-latest
Expand All @@ -73,124 +82,31 @@ jobs:
pip install -e .[dev]
pip install -e packages/qdrant-loader

- name: Create .env.test file for loader
- name: Run loader unit tests
run: |
cd packages/qdrant-loader
cp tests/.env.test.template tests/.env.test

# Check if required secrets are set
if [ -z "${{ secrets.QDRANT_URL }}" ]; then
echo "Error: QDRANT_URL secret is not set"
exit 1
fi
if [ -z "${{ secrets.QDRANT_API_KEY }}" ]; then
echo "Error: QDRANT_API_KEY secret is not set"
exit 1
fi
if [ -z "${{ secrets.QDRANT_COLLECTION_NAME }}" ]; then
echo "Error: QDRANT_COLLECTION_NAME secret is not set"
exit 1
fi
if [ -z "${{ secrets.OPENAI_API_KEY }}" ]; then
echo "Error: OPENAI_API_KEY secret is not set"
exit 1
fi

# Replace environment variables with proper escaping
sed -i "s|QDRANT_URL=.*|QDRANT_URL=${{ secrets.QDRANT_URL }}|g" tests/.env.test
sed -i "s|QDRANT_API_KEY=.*|QDRANT_API_KEY=${{ secrets.QDRANT_API_KEY }}|g" tests/.env.test
sed -i "s|QDRANT_COLLECTION_NAME=.*|QDRANT_COLLECTION_NAME=${{ secrets.QDRANT_COLLECTION_NAME }}|g" tests/.env.test
sed -i "s|OPENAI_API_KEY=.*|OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}|g" tests/.env.test
sed -i "s|STATE_DB_PATH=.*|STATE_DB_PATH=:memory:|g" tests/.env.test

# Optional secrets - only replace if they exist
if [ -n "${{ secrets.REPO_TOKEN }}" ]; then
sed -i "s|REPO_TOKEN=.*|REPO_TOKEN=${{ secrets.REPO_TOKEN }}|g" tests/.env.test
fi
if [ -n "${{ secrets.REPO_URL }}" ]; then
sed -i "s|REPO_URL=.*|REPO_URL=${{ secrets.REPO_URL }}|g" tests/.env.test
fi
if [ -n "${{ secrets.CONFLUENCE_TOKEN }}" ]; then
sed -i "s|CONFLUENCE_TOKEN=.*|CONFLUENCE_TOKEN=${{ secrets.CONFLUENCE_TOKEN }}|g" tests/.env.test
fi
if [ -n "${{ secrets.CONFLUENCE_EMAIL }}" ]; then
sed -i "s|CONFLUENCE_EMAIL=.*|CONFLUENCE_EMAIL=${{ secrets.CONFLUENCE_EMAIL }}|g" tests/.env.test
fi
if [ -n "${{ secrets.CONFLUENCE_URL }}" ]; then
sed -i "s|CONFLUENCE_URL=.*|CONFLUENCE_URL=${{ secrets.CONFLUENCE_URL }}|g" tests/.env.test
fi
if [ -n "${{ secrets.CONFLUENCE_SPACE_KEY }}" ]; then
sed -i "s|CONFLUENCE_SPACE_KEY=.*|CONFLUENCE_SPACE_KEY=${{ secrets.CONFLUENCE_SPACE_KEY }}|g" tests/.env.test
fi
if [ -n "${{ secrets.JIRA_TOKEN }}" ]; then
sed -i "s|JIRA_TOKEN=.*|JIRA_TOKEN=${{ secrets.JIRA_TOKEN }}|g" tests/.env.test
fi
if [ -n "${{ secrets.JIRA_EMAIL }}" ]; then
sed -i "s|JIRA_EMAIL=.*|JIRA_EMAIL=${{ secrets.JIRA_EMAIL }}|g" tests/.env.test
fi
if [ -n "${{ secrets.JIRA_URL }}" ]; then
sed -i "s|JIRA_URL=.*|JIRA_URL=${{ secrets.JIRA_URL }}|g" tests/.env.test
fi
if [ -n "${{ secrets.JIRA_PROJECT_KEY }}" ]; then
sed -i "s|JIRA_PROJECT_KEY=.*|JIRA_PROJECT_KEY=${{ secrets.JIRA_PROJECT_KEY }}|g" tests/.env.test
fi

echo "Created .env.test file successfully"
echo "Contents (with secrets masked):"
sed 's/=.*/=***/' tests/.env.test
python -m pytest tests/unit -n 2 --cov=src --cov-report= -v

- name: Create config.test.yaml file for loader
- name: Run loader integration tests
if: |
(github.event_name == 'pull_request' &&
(github.event.pull_request.base.ref == 'dev' ||
github.event.pull_request.base.ref == 'main')) ||
(github.event_name == 'push' &&
(github.ref_name == 'develop' || github.ref_name == 'main'))
run: |
cd packages/qdrant-loader
cp tests/config.test.template.yaml tests/config.test.yaml

# Replace environment variables in YAML config
sed -i "s|\${QDRANT_URL}|${{ secrets.QDRANT_URL }}|g" tests/config.test.yaml
sed -i "s|\${QDRANT_API_KEY}|${{ secrets.QDRANT_API_KEY }}|g" tests/config.test.yaml
sed -i "s|\${QDRANT_COLLECTION_NAME}|${{ secrets.QDRANT_COLLECTION_NAME }}|g" tests/config.test.yaml

# Optional environment variables - only replace if they exist
if [ -n "${{ secrets.REPO_TOKEN }}" ]; then
sed -i "s|\${REPO_TOKEN}|${{ secrets.REPO_TOKEN }}|g" tests/config.test.yaml
fi
if [ -n "${{ secrets.REPO_URL }}" ]; then
sed -i "s|\${REPO_URL}|${{ secrets.REPO_URL }}|g" tests/config.test.yaml
fi
if [ -n "${{ secrets.CONFLUENCE_TOKEN }}" ]; then
sed -i "s|\${CONFLUENCE_TOKEN}|${{ secrets.CONFLUENCE_TOKEN }}|g" tests/config.test.yaml
fi
if [ -n "${{ secrets.CONFLUENCE_EMAIL }}" ]; then
sed -i "s|\${CONFLUENCE_EMAIL}|${{ secrets.CONFLUENCE_EMAIL }}|g" tests/config.test.yaml
fi
if [ -n "${{ secrets.CONFLUENCE_URL }}" ]; then
sed -i "s|\${CONFLUENCE_URL}|${{ secrets.CONFLUENCE_URL }}|g" tests/config.test.yaml
fi
if [ -n "${{ secrets.CONFLUENCE_SPACE_KEY }}" ]; then
sed -i "s|\${CONFLUENCE_SPACE_KEY}|${{ secrets.CONFLUENCE_SPACE_KEY }}|g" tests/config.test.yaml
fi
if [ -n "${{ secrets.JIRA_TOKEN }}" ]; then
sed -i "s|\${JIRA_TOKEN}|${{ secrets.JIRA_TOKEN }}|g" tests/config.test.yaml
fi
if [ -n "${{ secrets.JIRA_EMAIL }}" ]; then
sed -i "s|\${JIRA_EMAIL}|${{ secrets.JIRA_EMAIL }}|g" tests/config.test.yaml
fi
if [ -n "${{ secrets.JIRA_URL }}" ]; then
sed -i "s|\${JIRA_URL}|${{ secrets.JIRA_URL }}|g" tests/config.test.yaml
fi
if [ -n "${{ secrets.JIRA_PROJECT_KEY }}" ]; then
sed -i "s|\${JIRA_PROJECT_KEY}|${{ secrets.JIRA_PROJECT_KEY }}|g" tests/config.test.yaml
fi

echo "Created config.test.yaml file successfully"
echo "YAML config structure:"
head -20 tests/config.test.yaml
python -m pytest tests/integration --cov=src --cov-append --cov-report= -v

- name: Run loader tests and generate coverage reports
- name: Generate coverage reports
if: github.event_name == 'push' && github.ref_name == 'main'
run: |
cd packages/qdrant-loader
python -m pytest tests/ --cov=src --cov-report=xml:../../coverage-loader.xml --cov-report=html:../../htmlcov-loader -v
coverage xml -o ../../coverage-loader.xml
coverage html -d ../../htmlcov-loader

- name: Upload loader coverage artifact
if: github.event_name == 'push' && github.ref_name == 'main'
uses: actions/upload-artifact@v4
with:
name: coverage-loader-${{ github.run_id }}
Expand Down Expand Up @@ -237,27 +153,41 @@ jobs:
echo "Error: QDRANT_COLLECTION_NAME secret is not set"
exit 1
fi
if [ -z "${{ secrets.OPENAI_API_KEY }}" ]; then
echo "Error: OPENAI_API_KEY secret is not set"
exit 1
fi

# Replace environment variables with secrets for integration tests
sed -i "s|QDRANT_URL=.*|QDRANT_URL=${{ secrets.QDRANT_URL }}|g" tests/.env.test
sed -i "s|QDRANT_API_KEY=.*|QDRANT_API_KEY=${{ secrets.QDRANT_API_KEY }}|g" tests/.env.test
sed -i "s|QDRANT_COLLECTION_NAME=.*|QDRANT_COLLECTION_NAME=${{ secrets.QDRANT_COLLECTION_NAME }}|g" tests/.env.test
sed -i "s|OPENAI_API_KEY=.*|OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}|g" tests/.env.test

echo "Created .env.test file for MCP server successfully"
echo "Contents (with secrets masked):"
sed 's/=.*/=***/' tests/.env.test

- name: Run MCP server tests and generate coverage reports
- name: Run MCP server unit tests
run: |
cd packages/qdrant-loader-mcp-server
python -m pytest tests/unit -n 2 --cov=src --cov-report= -v

- name: Run MCP server integration tests
if: |
(github.event_name == 'pull_request' &&
(github.event.pull_request.base.ref == 'dev' ||
github.event.pull_request.base.ref == 'main')) ||
(github.event_name == 'push' &&
(github.ref_name == 'develop' || github.ref_name == 'main'))
run: |
cd packages/qdrant-loader-mcp-server
python -m pytest tests/integration --cov=src --cov-append --cov-report= -v

- name: Generate coverage reports
if: github.event_name == 'push' && github.ref_name == 'main'
run: |
cd packages/qdrant-loader-mcp-server
python -m pytest tests/ --cov=src --cov-report=xml:../../coverage-mcp.xml --cov-report=html:../../htmlcov-mcp -v
coverage xml -o ../../coverage-mcp.xml
coverage html -d ../../htmlcov-mcp

- name: Upload MCP server coverage artifact
if: github.event_name == 'push' && github.ref_name == 'main'
uses: actions/upload-artifact@v4
with:
name: coverage-mcp-${{ github.run_id }}
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ wheels/

# Virtual Environment
venv/
.venv/
env/
ENV/

Expand Down
9 changes: 7 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
[![Test Coverage](https://img.shields.io/badge/coverage-view%20reports-blue)](https://qdrant-loader.net/coverage/)
[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)

📋 **[Release Notes v0.7.3](./RELEASE_NOTES.md)** - Latest improvements and bug fixes
📋 **[Release Notes v0.7.4](./RELEASE_NOTES.md)** - Latest improvements and bug fixes

A comprehensive toolkit for loading data into Qdrant vector database with advanced MCP server support for AI-powered development workflows.

Expand Down Expand Up @@ -177,7 +177,12 @@ Add to your Cursor settings (`.cursor/mcp.json`):
"mcpServers": {
"qdrant-loader": {
"command": "/path/to/venv/bin/mcp-qdrant-loader",
"args": ["--config", "/path/to/your/config.yaml", "--env", "/path/to/your/.env"]
"args": [
"--config",
"/path/to/your/config.yaml",
"--env",
"/path/to/your/.env"
]
}
}
}
Expand Down
28 changes: 26 additions & 2 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,29 @@
# Release Notes

## Version 0.7.4 - December 11, 2025

### 🐛 Bug Fixes

#### Compatibility & Platform Support

- **Fixed Windows asyncio event loop crashes** ([#57](https://github.com/martin-papy/qdrant-loader/issues/57)): Resolved critical issues with asyncio signal handling and stdio support on the Windows platform

#### Logging System Improvements

- **Fixed --log-level CLI option** ([#58](https://github.com/martin-papy/qdrant-loader/issues/58)): Resolved issue where --log-level DEBUG command line argument was not working after logging initialization

#### Dependency management

- **Added missing prometheus-client dependency** ([#60](https://github.com/martin-papy/qdrant-loader/issues/60)): Fixed missing prometheus-client package that was causing import errors
- **Deprecated import fixes** ([#61](https://github.com/martin-papy/qdrant-loader/issues/61)): Resolved deprecated langchain.text_splitter import warnings
- **Added missing Spacy dependency** ([#67](https://github.com/martin-papy/qdrant-loader/issues/67)): Fixed missing spacy package that was causing Cursor MCP crash on startup

#### MCP Integration Updates

- **Fixed MCP Search API compatibility** ([#74](https://github.com/martin-papy/qdrant-loader/issues/74)): Resolved incompatibility issues with qdrant-client 1.16

#### Test Suite Cross-Platform Support

## Version 0.7.3 - Sept 11, 2025

### Logging System Fixes
Expand Down Expand Up @@ -85,7 +109,7 @@
- **CLI Transport Selection**: Added `--transport` option to choose between stdio and HTTP modes
- **Health Check Endpoints**: Built-in monitoring and health check capabilities for production deployment

#### 📊 Structured Output & Protocol Features
#### 📊 Structured Output & Protocol Features

- **Structured Tool Output**: Enhanced tool responses with JSON-structured content while maintaining backward compatibility
- **Tool Behavioral Annotations**: Added annotations for all 8 tools indicating read-only and compute-intensive operations
Expand All @@ -95,7 +119,7 @@
#### 🔄 Backward Compatibility & Migration

- **Zero Breaking Changes**: Existing stdio clients continue to work unchanged
- **Seamless Migration Path**: Easy transition between transport modes without configuration changes
- **Seamless Migration Path**: Easy transition between transport modes without configuration changes
- **Legacy Support**: Full support for existing MCP 2024-11-05 clients
- **Configuration Compatibility**: All existing configurations work with new transport layer

Expand Down
2 changes: 1 addition & 1 deletion packages/qdrant-loader-core/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "qdrant-loader-core"
version = "0.7.3"
version = "0.7.4"
description = "Shared core for provider-agnostic LLM support and configuration mapping for qdrant-loader ecosystem"
readme = "README.md"
requires-python = ">=3.12"
Expand Down
Loading
Loading