diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..2f9c70e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,48 @@ +# Changelog + +All notable changes to Library Desk will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.1.0] - 2025-12-11 + +### Added + +- **Smart Page Creation Endpoint** (`POST /wiki/pages/smart-create`) + - Combines HybridRAG research with LLM content generation + - Searches existing wiki, knowledge graph, and web for topic context + - Uses WikiPageWriter to synthesize findings into structured wiki content + - Auto-generates page path from topic if not provided + - Returns research summary with source counts + +- **Bidirectional Entity Linking** + - New shared utility (`entity_linking_utils.py`) for reusable entity linking + - Forward links: Links entities mentioned in new pages to existing entity pages + - Backward links: Updates existing pages that mention the new entity + - Runs automatically in background after smart page creation + +- **Version Management** + - Added `pyproject.toml` with project metadata and version + - Version is now read from `pyproject.toml` (single source of truth) + - Health check endpoint returns current version + - FastAPI docs show current version + +### Changed + +- Updated `config.py` to read version from `pyproject.toml` +- Updated `main.py` to use centralized version + +## [1.0.0] - 2025-12-10 + +### Added + +- Initial release extracted from portainer-core +- Wiki page management (`/wiki/pages` CRUD endpoints) +- HybridRAG search (`/query/hybrid`) with vector, graph, and web search +- Knowledge graph operations (`/graph/*`) +- Vector search operations (`/vector/*`) +- Knowledge consolidation from search results (`/consolidate/knowledge`) +- Entity linking and extraction +- Wiki.js change listener for auto-processing user edits +- Multi-tenant architecture with user namespace isolation diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..59d1933 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,31 @@ +[project] +name = "library-desk" +version = "1.1.0" +description = "Coordination service for The Library system - HybridRAG queries, document ingestion, entity extraction, and knowledge consolidation" +readme = "README.md" +requires-python = ">=3.12" +license = {text = "MIT"} +authors = [ + {name = "JP Schweitzer"} +] +keywords = ["rag", "knowledge-graph", "wiki", "semantic-search", "neo4j", "qdrant"] +classifiers = [ + "Development Status :: 4 - Beta", + "Framework :: FastAPI", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.12", +] + +[project.urls] +Homepage = "https://github.com/jpmschweitzer/library-desk" +Documentation = "https://github.com/jpmschweitzer/library-desk#readme" + +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.packages.find] +where = ["."] +include = ["src*"] diff --git a/src/config.py b/src/config.py index cad7767..0b4a291 100644 --- a/src/config.py +++ b/src/config.py @@ -4,9 +4,20 @@ Following best practices: modular settings, environment-based config. """ from functools import lru_cache +from pathlib import Path from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict +# Read version from pyproject.toml +try: + import tomllib + _pyproject_path = Path(__file__).parent.parent / "pyproject.toml" + with open(_pyproject_path, "rb") as f: + _pyproject = tomllib.load(f) + __version__ = _pyproject["project"]["version"] +except Exception: + __version__ = "0.0.0" # Fallback if pyproject.toml not found + class Settings(BaseSettings): """Application settings loaded from environment variables.""" @@ -75,7 +86,7 @@ class Settings(BaseSettings): # Application app_name: str = Field(default="Library Desk", description="Application name") - app_version: str = Field(default="1.0.0", description="Application version") + app_version: str = Field(default=__version__, description="Application version") debug: bool = Field(default=False, description="Debug mode") @property diff --git a/src/main.py b/src/main.py index 36d02c2..18f4166 100644 --- a/src/main.py +++ b/src/main.py @@ -16,7 +16,7 @@ from typing import Dict, Any import logging from pathlib import Path -from src.config import Settings, get_settings +from src.config import Settings, get_settings, __version__ from src.core.dependencies import verify_api_key # Configure logging @@ -30,7 +30,7 @@ logger = logging.getLogger(__name__) app = FastAPI( title="Library Desk API", description="Coordination service for The Library system - HybridRAG queries, document ingestion, entity extraction, and mind map generation", - version="1.0.0", + version=__version__, docs_url="/docs", redoc_url="/redoc", )