- log_thread.py: thread-safe ContextVar bridge so executor threads can log
individual LLM calls and archive searches back to the event loop
- ai_log.py: init_thread_logging(), notify_entity_update(); WS now pushes
entity_update messages when book data changes after any plugin or batch run
- batch.py: replace batch_pending.json with batch_queue SQLite table;
run_batch_consumer() reads queue dynamically so new books can be added
while batch is running; add_to_queue() deduplicates
- migrate.py: fix _migrate_v1 (clear-on-startup bug); add _migrate_v2 for
batch_queue table
- _client.py / archive.py / identification.py: wrap each LLM API call and
archive search with log_thread start/finish entries
- api.py: POST /api/batch returns {already_running, added}; notify_entity_update
after identify pipeline
- models.default.yaml: strengthen ai_identify confidence-scoring instructions;
warn against placeholder data
- detail-render.js: book log entries show clickable ID + spine thumbnail;
book spine/title images open full-screen popup
- events.js: batch-start handles already_running+added; open-img-popup action
- init.js: entity_update WS handler; image popup close listeners
- overlays.css / index.html: full-screen image popup overlay
- eslint.config.js: add new globals; fix no-redeclare/no-unused-vars for
multi-file global architecture; all lint errors resolved
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
65 lines
1.5 KiB
TOML
65 lines
1.5 KiB
TOML
[tool.poetry]
|
|
name = "bookshelf"
|
|
version = "0.1.0"
|
|
description = "Photo-based book cataloger with AI identification"
|
|
authors = []
|
|
packages = [
|
|
{include = "app.py", from = "src"},
|
|
{include = "api.py", from = "src"},
|
|
{include = "config.py", from = "src"},
|
|
{include = "db.py", from = "src"},
|
|
{include = "errors.py", from = "src"},
|
|
{include = "files.py", from = "src"},
|
|
{include = "models.py", from = "src"},
|
|
{include = "logic", from = "src"},
|
|
{include = "plugins", from = "src"},
|
|
|
|
{include = "presubmit.py", from = "scripts"},
|
|
]
|
|
|
|
[tool.poetry.dependencies]
|
|
python = "^3.11"
|
|
fastapi = ">=0.111.0"
|
|
uvicorn = { version = ">=0.29.0", extras = ["standard"] }
|
|
python-multipart = ">=0.0.9"
|
|
openai = ">=1.0"
|
|
pyyaml = ">=6.0"
|
|
Pillow = ">=10.0"
|
|
aiofiles = ">=23.2.1"
|
|
httpx = ">=0.27"
|
|
mashumaro = "^3.20"
|
|
|
|
[tool.poetry.group.dev.dependencies]
|
|
black = ">=24.0.0"
|
|
flake8 = ">=7.0.0"
|
|
flake8-pyproject = ">=1.2.0"
|
|
pyright = ">=1.1"
|
|
pytest = ">=8.0"
|
|
numpy = "^2.4.2"
|
|
|
|
[tool.poetry.scripts]
|
|
serve = "app:main"
|
|
fmt = "presubmit:fmt"
|
|
presubmit = "presubmit:presubmit"
|
|
|
|
[tool.black]
|
|
line-length = 120
|
|
|
|
[tool.flake8]
|
|
max-line-length = 120
|
|
extend-ignore = ["E203"]
|
|
exclude = "node_modules/*"
|
|
|
|
[tool.pyright]
|
|
pythonVersion = "3.14"
|
|
typeCheckingMode = "strict"
|
|
include = ["src", "tests", "scripts"]
|
|
|
|
[tool.pytest.ini_options]
|
|
pythonpath = ["src"]
|
|
markers = ["network: live HTTP requests to external services (deselect with -m 'not network')"]
|
|
|
|
[build-system]
|
|
requires = ["poetry-core"]
|
|
build-backend = "poetry.core.masonry.api"
|