feat(01-02): implement CLI launcher, packaging entry point, and shared config resolver
- paperforge_lite/cli.py: argparse CLI with global --vault, subcommands paths/status/selection-sync/index-refresh/deep-reading/ocr (ocr defaults to run action)
- paperforge_lite/__main__.py: python -m paperforge_lite fallback entry point
- paperforge_lite/config.py: shared resolver (load_vault_config, resolve_vault, paperforge_paths, paths_as_strings, load_simple_env) matching Plan 01 contract
- pyproject.toml: setuptools build, paperforge-lite package, Python >=3.10, dependencies from requirements.txt, [project.scripts] paperforge=paperforge_lite.cli:main
- paperforge_lite/__init__.py: package init (version 1.0.0)
CLI loads .env from vault root and <system_dir>/PaperForge/.env before worker dispatch, matching legacy pipeline behavior.
2026-04-23 03:44:26 +00:00
|
|
|
[build-system]
|
|
|
|
|
requires = ["setuptools>=68.0"]
|
|
|
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
|
|
|
|
|
|
[project]
|
2026-04-24 08:15:13 +00:00
|
|
|
name = "paperforge"
|
2026-04-28 14:41:48 +00:00
|
|
|
dynamic = ["version"]
|
2026-04-27 17:25:51 +00:00
|
|
|
description = "PaperForge — Obsidian + Zotero literature pipeline CLI"
|
feat(01-02): implement CLI launcher, packaging entry point, and shared config resolver
- paperforge_lite/cli.py: argparse CLI with global --vault, subcommands paths/status/selection-sync/index-refresh/deep-reading/ocr (ocr defaults to run action)
- paperforge_lite/__main__.py: python -m paperforge_lite fallback entry point
- paperforge_lite/config.py: shared resolver (load_vault_config, resolve_vault, paperforge_paths, paths_as_strings, load_simple_env) matching Plan 01 contract
- pyproject.toml: setuptools build, paperforge-lite package, Python >=3.10, dependencies from requirements.txt, [project.scripts] paperforge=paperforge_lite.cli:main
- paperforge_lite/__init__.py: package init (version 1.0.0)
CLI loads .env from vault root and <system_dir>/PaperForge/.env before worker dispatch, matching legacy pipeline behavior.
2026-04-23 03:44:26 +00:00
|
|
|
readme = "README.md"
|
|
|
|
|
requires-python = ">=3.10"
|
2026-05-01 03:37:50 +00:00
|
|
|
license = {text = "CC BY-NC-SA 4.0"}
|
feat(01-02): implement CLI launcher, packaging entry point, and shared config resolver
- paperforge_lite/cli.py: argparse CLI with global --vault, subcommands paths/status/selection-sync/index-refresh/deep-reading/ocr (ocr defaults to run action)
- paperforge_lite/__main__.py: python -m paperforge_lite fallback entry point
- paperforge_lite/config.py: shared resolver (load_vault_config, resolve_vault, paperforge_paths, paths_as_strings, load_simple_env) matching Plan 01 contract
- pyproject.toml: setuptools build, paperforge-lite package, Python >=3.10, dependencies from requirements.txt, [project.scripts] paperforge=paperforge_lite.cli:main
- paperforge_lite/__init__.py: package init (version 1.0.0)
CLI loads .env from vault root and <system_dir>/PaperForge/.env before worker dispatch, matching legacy pipeline behavior.
2026-04-23 03:44:26 +00:00
|
|
|
authors = [
|
|
|
|
|
{name = "PaperForge Contributors"}
|
|
|
|
|
]
|
|
|
|
|
classifiers = [
|
|
|
|
|
"Development Status :: 4 - Beta",
|
|
|
|
|
"Environment :: Console",
|
|
|
|
|
"Intended Audience :: Science/Research",
|
|
|
|
|
"License :: OSI Approved :: MIT License",
|
|
|
|
|
"Operating System :: OS Independent",
|
|
|
|
|
"Programming Language :: Python :: 3",
|
|
|
|
|
"Programming Language :: Python :: 3.10",
|
|
|
|
|
"Programming Language :: Python :: 3.11",
|
|
|
|
|
"Programming Language :: Python :: 3.12",
|
|
|
|
|
"Topic :: Scientific/Engineering :: Information Analysis",
|
|
|
|
|
]
|
|
|
|
|
dependencies = [
|
|
|
|
|
"requests>=2.31.0",
|
|
|
|
|
"pymupdf>=1.23.0",
|
|
|
|
|
"pillow>=10.0.0",
|
2026-04-27 09:29:13 +00:00
|
|
|
"tenacity>=8.2.0",
|
|
|
|
|
"tqdm>=4.66.0",
|
2026-05-03 16:29:08 +00:00
|
|
|
"filelock>=3.13.0",
|
2026-05-08 05:25:27 +00:00
|
|
|
"pyyaml>=6.0",
|
feat(01-02): implement CLI launcher, packaging entry point, and shared config resolver
- paperforge_lite/cli.py: argparse CLI with global --vault, subcommands paths/status/selection-sync/index-refresh/deep-reading/ocr (ocr defaults to run action)
- paperforge_lite/__main__.py: python -m paperforge_lite fallback entry point
- paperforge_lite/config.py: shared resolver (load_vault_config, resolve_vault, paperforge_paths, paths_as_strings, load_simple_env) matching Plan 01 contract
- pyproject.toml: setuptools build, paperforge-lite package, Python >=3.10, dependencies from requirements.txt, [project.scripts] paperforge=paperforge_lite.cli:main
- paperforge_lite/__init__.py: package init (version 1.0.0)
CLI loads .env from vault root and <system_dir>/PaperForge/.env before worker dispatch, matching legacy pipeline behavior.
2026-04-23 03:44:26 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
[project.optional-dependencies]
|
|
|
|
|
test = [
|
|
|
|
|
"pytest>=7.4.0",
|
feat(52-golden-datasets-cli-contracts): add CLI contract tests with snapshot integration
- tests/cli/ with conftest.py (cli_invoker, vault_builder, mock_ocr_backend fixtures)
- test_contract_helpers.py with normalize_snapshot, assert_valid_json, assert_json_shape
- 3 test files covering all 8 CLI commands (paths, status, sync, ocr, doctor,
repair, context, setup) with exit code, output shape, and error contracts
- fixtures/ocr/mock_ocr_backend.py with 4 mock modes (success, pending, error, timeout)
- pyproject.toml: added pytest-snapshot, responses, pytest-timeout, pytest-mock,
coverage; added testpaths and layer markers
- All 27 tests pass (CLI-01, CLI-02, CLI-03 satisfied)
2026-05-08 15:32:03 +00:00
|
|
|
"pytest-snapshot>=0.9.0",
|
|
|
|
|
"pytest-timeout>=2.2.0",
|
|
|
|
|
"responses>=0.25.0",
|
|
|
|
|
"pytest-mock>=3.12.0",
|
|
|
|
|
"coverage>=7.4.0",
|
2026-04-27 09:40:47 +00:00
|
|
|
"ruff>=0.4.0",
|
feat(01-02): implement CLI launcher, packaging entry point, and shared config resolver
- paperforge_lite/cli.py: argparse CLI with global --vault, subcommands paths/status/selection-sync/index-refresh/deep-reading/ocr (ocr defaults to run action)
- paperforge_lite/__main__.py: python -m paperforge_lite fallback entry point
- paperforge_lite/config.py: shared resolver (load_vault_config, resolve_vault, paperforge_paths, paths_as_strings, load_simple_env) matching Plan 01 contract
- pyproject.toml: setuptools build, paperforge-lite package, Python >=3.10, dependencies from requirements.txt, [project.scripts] paperforge=paperforge_lite.cli:main
- paperforge_lite/__init__.py: package init (version 1.0.0)
CLI loads .env from vault root and <system_dir>/PaperForge/.env before worker dispatch, matching legacy pipeline behavior.
2026-04-23 03:44:26 +00:00
|
|
|
]
|
2026-05-14 13:56:28 +00:00
|
|
|
vector = [
|
|
|
|
|
"chromadb>=0.5.0",
|
|
|
|
|
"openai>=1.0.0",
|
|
|
|
|
]
|
feat(01-02): implement CLI launcher, packaging entry point, and shared config resolver
- paperforge_lite/cli.py: argparse CLI with global --vault, subcommands paths/status/selection-sync/index-refresh/deep-reading/ocr (ocr defaults to run action)
- paperforge_lite/__main__.py: python -m paperforge_lite fallback entry point
- paperforge_lite/config.py: shared resolver (load_vault_config, resolve_vault, paperforge_paths, paths_as_strings, load_simple_env) matching Plan 01 contract
- pyproject.toml: setuptools build, paperforge-lite package, Python >=3.10, dependencies from requirements.txt, [project.scripts] paperforge=paperforge_lite.cli:main
- paperforge_lite/__init__.py: package init (version 1.0.0)
CLI loads .env from vault root and <system_dir>/PaperForge/.env before worker dispatch, matching legacy pipeline behavior.
2026-04-23 03:44:26 +00:00
|
|
|
|
|
|
|
|
[project.scripts]
|
2026-04-24 08:15:13 +00:00
|
|
|
paperforge = "paperforge.cli:main"
|
feat(01-02): implement CLI launcher, packaging entry point, and shared config resolver
- paperforge_lite/cli.py: argparse CLI with global --vault, subcommands paths/status/selection-sync/index-refresh/deep-reading/ocr (ocr defaults to run action)
- paperforge_lite/__main__.py: python -m paperforge_lite fallback entry point
- paperforge_lite/config.py: shared resolver (load_vault_config, resolve_vault, paperforge_paths, paths_as_strings, load_simple_env) matching Plan 01 contract
- pyproject.toml: setuptools build, paperforge-lite package, Python >=3.10, dependencies from requirements.txt, [project.scripts] paperforge=paperforge_lite.cli:main
- paperforge_lite/__init__.py: package init (version 1.0.0)
CLI loads .env from vault root and <system_dir>/PaperForge/.env before worker dispatch, matching legacy pipeline behavior.
2026-04-23 03:44:26 +00:00
|
|
|
|
|
|
|
|
[tool.setuptools.packages.find]
|
|
|
|
|
where = ["."]
|
2026-04-24 08:15:13 +00:00
|
|
|
include = ["paperforge*"]
|
feat(01-02): implement CLI launcher, packaging entry point, and shared config resolver
- paperforge_lite/cli.py: argparse CLI with global --vault, subcommands paths/status/selection-sync/index-refresh/deep-reading/ocr (ocr defaults to run action)
- paperforge_lite/__main__.py: python -m paperforge_lite fallback entry point
- paperforge_lite/config.py: shared resolver (load_vault_config, resolve_vault, paperforge_paths, paths_as_strings, load_simple_env) matching Plan 01 contract
- pyproject.toml: setuptools build, paperforge-lite package, Python >=3.10, dependencies from requirements.txt, [project.scripts] paperforge=paperforge_lite.cli:main
- paperforge_lite/__init__.py: package init (version 1.0.0)
CLI loads .env from vault root and <system_dir>/PaperForge/.env before worker dispatch, matching legacy pipeline behavior.
2026-04-23 03:44:26 +00:00
|
|
|
|
2026-04-28 14:41:48 +00:00
|
|
|
[tool.setuptools.dynamic]
|
|
|
|
|
version = {attr = "paperforge.__version__"}
|
|
|
|
|
|
feat(01-02): implement CLI launcher, packaging entry point, and shared config resolver
- paperforge_lite/cli.py: argparse CLI with global --vault, subcommands paths/status/selection-sync/index-refresh/deep-reading/ocr (ocr defaults to run action)
- paperforge_lite/__main__.py: python -m paperforge_lite fallback entry point
- paperforge_lite/config.py: shared resolver (load_vault_config, resolve_vault, paperforge_paths, paths_as_strings, load_simple_env) matching Plan 01 contract
- pyproject.toml: setuptools build, paperforge-lite package, Python >=3.10, dependencies from requirements.txt, [project.scripts] paperforge=paperforge_lite.cli:main
- paperforge_lite/__init__.py: package init (version 1.0.0)
CLI loads .env from vault root and <system_dir>/PaperForge/.env before worker dispatch, matching legacy pipeline behavior.
2026-04-23 03:44:26 +00:00
|
|
|
[tool.setuptools.package-data]
|
2026-04-27 13:41:47 +00:00
|
|
|
paperforge = [
|
|
|
|
|
"py.typed",
|
2026-05-14 14:58:03 +00:00
|
|
|
"skills/paperforge/**",
|
2026-04-27 14:52:03 +00:00
|
|
|
"command_files/*.md",
|
2026-04-28 17:06:59 +00:00
|
|
|
"plugin/*.css",
|
2026-04-28 06:17:13 +00:00
|
|
|
"plugin/*.js",
|
|
|
|
|
"plugin/*.json",
|
2026-04-27 13:41:47 +00:00
|
|
|
]
|
2026-04-23 12:49:10 +00:00
|
|
|
|
|
|
|
|
[tool.pytest.ini_options]
|
feat(52-golden-datasets-cli-contracts): add CLI contract tests with snapshot integration
- tests/cli/ with conftest.py (cli_invoker, vault_builder, mock_ocr_backend fixtures)
- test_contract_helpers.py with normalize_snapshot, assert_valid_json, assert_json_shape
- 3 test files covering all 8 CLI commands (paths, status, sync, ocr, doctor,
repair, context, setup) with exit code, output shape, and error contracts
- fixtures/ocr/mock_ocr_backend.py with 4 mock modes (success, pending, error, timeout)
- pyproject.toml: added pytest-snapshot, responses, pytest-timeout, pytest-mock,
coverage; added testpaths and layer markers
- All 27 tests pass (CLI-01, CLI-02, CLI-03 satisfied)
2026-05-08 15:32:03 +00:00
|
|
|
addopts = "--ignore=tests/sandbox/00_TestVault/ --strict-markers"
|
2026-05-12 09:59:37 +00:00
|
|
|
testpaths = ["tests/unit", "tests/cli", "tests/e2e", "tests/journey", "tests/chaos", "tests/audit", "tests/integration"]
|
feat(52-golden-datasets-cli-contracts): add CLI contract tests with snapshot integration
- tests/cli/ with conftest.py (cli_invoker, vault_builder, mock_ocr_backend fixtures)
- test_contract_helpers.py with normalize_snapshot, assert_valid_json, assert_json_shape
- 3 test files covering all 8 CLI commands (paths, status, sync, ocr, doctor,
repair, context, setup) with exit code, output shape, and error contracts
- fixtures/ocr/mock_ocr_backend.py with 4 mock modes (success, pending, error, timeout)
- pyproject.toml: added pytest-snapshot, responses, pytest-timeout, pytest-mock,
coverage; added testpaths and layer markers
- All 27 tests pass (CLI-01, CLI-02, CLI-03 satisfied)
2026-05-08 15:32:03 +00:00
|
|
|
markers = [
|
|
|
|
|
"unit: Unit tests (Level 1) — fast, isolated",
|
|
|
|
|
"cli: CLI contract tests (Level 2) — subprocess boundary",
|
|
|
|
|
"e2e: End-to-end tests (Level 4) — temp vault",
|
|
|
|
|
"journey: User journey tests (Level 5) — full workflows",
|
|
|
|
|
"chaos: Destructive tests (Level 6) — abnormal scenarios",
|
2026-05-09 09:05:07 +00:00
|
|
|
"audit: Consistency audit tests — validate L1 mocks against L4 real pipeline output",
|
2026-05-12 09:59:37 +00:00
|
|
|
"integration: Integration tests — multi-component workflows",
|
feat(52-golden-datasets-cli-contracts): add CLI contract tests with snapshot integration
- tests/cli/ with conftest.py (cli_invoker, vault_builder, mock_ocr_backend fixtures)
- test_contract_helpers.py with normalize_snapshot, assert_valid_json, assert_json_shape
- 3 test files covering all 8 CLI commands (paths, status, sync, ocr, doctor,
repair, context, setup) with exit code, output shape, and error contracts
- fixtures/ocr/mock_ocr_backend.py with 4 mock modes (success, pending, error, timeout)
- pyproject.toml: added pytest-snapshot, responses, pytest-timeout, pytest-mock,
coverage; added testpaths and layer markers
- All 27 tests pass (CLI-01, CLI-02, CLI-03 satisfied)
2026-05-08 15:32:03 +00:00
|
|
|
"slow: Tests that take >30s (skip during development)",
|
|
|
|
|
"snapshot: Tests that use snapshot comparison",
|
|
|
|
|
]
|
2026-04-27 09:29:13 +00:00
|
|
|
|
|
|
|
|
[tool.ruff]
|
|
|
|
|
target-version = "py310"
|
|
|
|
|
line-length = 120
|
2026-04-27 09:40:47 +00:00
|
|
|
exclude = ["paperforge/skills"]
|
2026-04-27 09:29:13 +00:00
|
|
|
|
|
|
|
|
[tool.ruff.lint]
|
|
|
|
|
select = ["E", "F", "I", "UP", "B", "SIM"]
|
|
|
|
|
ignore = ["B904"] # raise-within-try is intentional in many worker error paths
|
|
|
|
|
|
2026-04-27 09:40:47 +00:00
|
|
|
[tool.ruff.lint.per-file-ignores]
|
|
|
|
|
# Pre-existing: undefined names in update.py (GITHUB_REPO etc. defined below function defs)
|
|
|
|
|
"paperforge/worker/update.py" = ["F821"]
|
|
|
|
|
# Pre-existing: undefined names in sync.py (run_search_sources, run_ingest_candidates)
|
|
|
|
|
"paperforge/worker/sync.py" = ["F821", "B007", "E501"]
|
|
|
|
|
# Pre-existing: style suggestions not part of dead code removal
|
|
|
|
|
"paperforge/worker/ocr.py" = ["SIM102", "E501", "B905"]
|
|
|
|
|
"paperforge/worker/repair.py" = ["SIM102"]
|
|
|
|
|
"paperforge/ocr_diagnostics.py" = ["E501", "SIM105"]
|
|
|
|
|
# Pre-existing: importability check in status.py uses try/except imports
|
|
|
|
|
"paperforge/worker/status.py" = ["F401"]
|
|
|
|
|
# Pre-existing: test files use patterns incompatible with strict ruff rules
|
|
|
|
|
"tests/**" = ["E501", "E402", "SIM117", "SIM108", "F841", "B007", "SIM103", "SIM105", "SIM222", "B905"]
|
|
|
|
|
# Pre-existing: scripts with formatting not part of this cleanup
|
|
|
|
|
"scripts/consistency_audit.py" = ["SIM110", "SIM102"]
|
|
|
|
|
"scripts/welcome.py" = ["E501"]
|
|
|
|
|
"scripts/validate_setup.py" = ["E501"]
|
|
|
|
|
|
2026-04-27 09:29:13 +00:00
|
|
|
[tool.ruff.format]
|
|
|
|
|
quote-style = "double"
|