Skip to content

v0.5.0 — Export to Markdown & PDF + Model Selection#7

Merged
msitarzewski merged 4 commits intomainfrom
v0.5.0
Feb 18, 2026
Merged

v0.5.0 — Export to Markdown & PDF + Model Selection#7
msitarzewski merged 4 commits intomainfrom
v0.5.0

Conversation

@msitarzewski
Copy link
Owner

Summary

  • Export command: duh export <id> --format pdf/markdown --content full/decision --no-dissent -o file. Decision-first markdown layout, PDF with formatted markdown rendering (bold, italic, lists, code blocks).
  • PDF export API: GET /api/threads/{id}/export?format=pdf&content=full&dissent=true returns PDF StreamingResponse.
  • Web UI export: ExportMenu component on thread detail page with 4 options (Markdown/PDF x decision/full). Client-side markdown, server-side PDF.
  • Model selection controls: --proposer, --challengers, --panel CLI flags + API fields. proposer_eligible flag on ModelInfo. Perplexity set as challengers-only.
  • Provider updates: Added claude-sonnet-4-6, updated model catalogs.
  • 1539 Python + 122 Vitest = 1661 tests, all passing. Ruff clean, mypy clean.

Test plan

  • duh export <id> --format markdown — decision-first full report
  • duh export <id> --format markdown --content decision — decision only
  • duh export <id> --format markdown --content decision --no-dissent — no dissent
  • duh export <id> --format pdf -o out.pdf — valid PDF with formatted content
  • uv run pytest tests/ -q — 1539 passed
  • cd web && npm run build && npm test — 122 passed
  • Web UI: thread detail page → Export dropdown → download markdown/PDF

🤖 Generated with Claude Code

msitarzewski and others added 4 commits February 17, 2026 17:45
Multi-user auth (JWT + RBAC), PostgreSQL support (asyncpg + connection
pooling), Perplexity provider, Prometheus metrics, extended health checks,
backup/restore CLI, per-user rate limiting, Playwright E2E tests, load
tests, production deployment docs. 1354 Python tests + 12 load tests,
ruff clean. Fix: create_all only for in-memory SQLite, file-based DBs
use alembic exclusively.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Export command: --format pdf/markdown, --content full/decision,
  --no-dissent, -o/--output. Decision-first markdown layout.
- PDF export with fpdf2: markdown-to-HTML rendering (bold, italic,
  lists, code, headers), Unicode sanitization for core PDF fonts.
- API endpoint: GET /api/threads/{id}/export?format=pdf&content=full
- Web UI: ExportMenu component on thread detail page + live consensus.
  Client-side markdown generation, server-side PDF via API.
- Consensus store: question field for export context.
- Model selection: --proposer, --challengers, --panel CLI flags,
  proposer_eligible flag on ModelInfo, Perplexity challengers-only.
- Provider updates: claude-sonnet-4-6, updated catalogs.
- 1539 Python + 122 Vitest tests (1661 total), all passing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- rbac.py: add return type annotation to require_role()
- google.py: fix _build_contents return type, suppress SDK
  type stub mismatch on generate_content contents arg

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Contributions and votes from SQLAlchemy relationships have no guaranteed
order across platforms. Use role/model-based lookup instead of positional
index access.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@msitarzewski msitarzewski merged commit 60320f5 into main Feb 18, 2026
1 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant