The export reads ChatGPT's and Claude's undocumented internal web APIs, which can change shape without notice; the worst failure for a backup tool is a silent one (skipped/mis-parsed content with no error). Add a `canary` command + BaseProvider.check_drift() (overridden by ChatGPT/Claude) that fetches one listing page + one conversation per provider and asserts only the normalizer's load-bearing fields — not the full response shape, which churns harmlessly. The top silent risk it guards is a renamed retrieval-tool author bypassing the hidden-content collapse. ERROR findings exit non-zero; WARN findings are surfaced but non-fatal so a backup run is never blocked. Also retires the in-app watch mode and headless StartOS direction from the roadmap (tool stays a local, manually-run CLI) and updates docs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
39 lines
838 B
TOML
39 lines
838 B
TOML
[build-system]
|
|
requires = ["setuptools>=68", "wheel"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "ai-chat-exporter"
|
|
version = "0.7.0"
|
|
description = "Export ChatGPT and Claude conversation history to Markdown for personal archival in Joplin"
|
|
requires-python = ">=3.11"
|
|
dependencies = [
|
|
"requests==2.31.0",
|
|
"curl_cffi==0.14.0",
|
|
"click==8.1.7",
|
|
"python-dotenv==1.0.1",
|
|
"rich==13.7.1",
|
|
"python-slugify==8.0.4",
|
|
"PyJWT==2.8.0",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = [
|
|
"pytest==8.1.1",
|
|
"pytest-mock==3.14.0",
|
|
"responses==0.25.3",
|
|
]
|
|
|
|
[project.scripts]
|
|
ai-chat-exporter = "src.main:cli"
|
|
|
|
[tool.setuptools.packages.find]
|
|
where = ["."]
|
|
include = ["src*"]
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
python_files = ["test_*.py"]
|
|
python_classes = ["Test*"]
|
|
python_functions = ["test_*"]
|