nexus/.planning/phases/43-documents-branding/43-01-SUMMARY.md

125 lines
5.1 KiB
Markdown

---
phase: 43-documents-branding
plan: 01
subsystem: api
tags: [playwright, pdf, pdf-renderer, archiver, puter-inference, typescript]
# Dependency graph
requires:
- phase: 41-diagrams-icons-theme-engine
provides: diagram-renderer.ts with resolveBrowserPath and Playwright launch pattern
- phase: 42-wallpapers-social-format-conversion-voice
provides: content-job-runner.ts switch pattern and wallpaper-renderer.ts stripMarkdownFences pattern
provides:
- pdf-renderer.ts — renderPdfDocument function using Playwright HTML-to-PDF for 4 docTypes
- PdfDocumentBundle and BrandKitBundle types exported from types.ts
- archiver package installed for ZIP operations (used by Plans 02-03)
- content-job-runner dispatches "pdf-document" jobType to renderPdfDocument
affects:
- 43-02 (brand-kit renderer will use BrandKitBundle type and archiver)
- 43-03 (document UI panel will use PdfDocumentBundle type)
# Tech tracking
tech-stack:
added: [archiver, "@types/archiver"]
patterns:
- buildPdfSystemPrompt function with docType switch for LLM prompt variation
- stripMarkdownFences local helper (same pattern as wallpaper-renderer — not imported, duplicated intentionally)
- try/finally browser lifecycle for Playwright cleanup
key-files:
created:
- server/src/services/renderers/pdf-renderer.ts
- server/src/__tests__/pdf-renderer.test.ts
modified:
- server/src/services/renderers/types.ts
- server/src/services/content-job-runner.ts
- server/package.json
key-decisions:
- "stripMarkdownFences duplicated locally in pdf-renderer — wallpaper-renderer does not export it and creating a shared util was not planned"
- "buildPdfSystemPrompt uses a switch with 4 distinct system prompt variants (report/invoice/api-docs/one-pager) — each has structurally different instructions for the LLM"
- "archiver installed now so Plans 02-03 can use it without an extra install step"
patterns-established:
- "PDF system prompts always include 'Use only inline CSS in a <style> block. No external URLs, no <link> tags, no <script> tags. Use web-safe system fonts' constraint"
- "Playwright page.pdf() with format A4, printBackground true, 20mm margins — standard PDF output configuration"
requirements-completed: [DOC-01, DOC-02, DOC-03]
# Metrics
duration: 5min
completed: 2026-04-04
---
# Phase 43 Plan 01: PDF Renderer Foundation Summary
**Playwright HTML-to-PDF renderer for 4 document types (report/invoice/api-docs/one-pager) with PdfDocumentBundle/BrandKitBundle types and content-job-runner wiring**
## Performance
- **Duration:** ~5 min
- **Started:** 2026-04-04T22:43:00Z
- **Completed:** 2026-04-04T22:45:11Z
- **Tasks:** 2
- **Files modified:** 5
## Accomplishments
- Created pdf-renderer.ts with renderPdfDocument: LLM generates HTML via puterChatComplete, Playwright renders to PDF, returns PdfDocumentBundle JSON
- Added PdfDocumentBundle and BrandKitBundle interfaces to types.ts and updated ContentBundle union
- Installed archiver + @types/archiver for Plans 02-03 ZIP operations
- Wired "pdf-document" jobType in content-job-runner switch with dynamic import pattern
- 6 unit tests pass covering all 4 docTypes + browser cleanup + system prompt variation
## Task Commits
Each task was committed atomically:
1. **Task 1: Install archiver, add bundle types, create pdf-renderer with tests** - `7c7394bf` (feat)
2. **Task 2: Wire pdf-document jobType into content-job-runner** - `16023234` (feat)
## Files Created/Modified
- `server/src/services/renderers/pdf-renderer.ts` - renderPdfDocument (Playwright HTML-to-PDF) + buildPdfSystemPrompt
- `server/src/__tests__/pdf-renderer.test.ts` - 6 unit tests with playwright-core/puter-inference mocks
- `server/src/services/renderers/types.ts` - PdfDocumentBundle and BrandKitBundle interfaces added, ContentBundle union updated
- `server/src/services/content-job-runner.ts` - "pdf-document" case added to renderContent switch
- `server/package.json` - archiver + @types/archiver added
## Decisions Made
- stripMarkdownFences was duplicated locally in pdf-renderer.ts rather than importing from wallpaper-renderer.ts because wallpaper-renderer does not export this helper. This follows the existing project pattern where it was also not exported.
- buildPdfSystemPrompt generates structurally distinct prompts per docType — report gets formal section structure, invoice gets financial table layout, api-docs gets endpoint reference format, one-pager gets visual impact layout.
## Deviations from Plan
None - plan executed exactly as written.
## Issues Encountered
None.
## User Setup Required
None - no external service configuration required.
## Next Phase Readiness
- Plan 43-02 (brand-kit renderer) can now import BrandKitBundle from types.ts and use archiver for ZIP output
- Plan 43-03 (document UI panel) can import PdfDocumentBundle and use the pdf-document jobType
- All 6 tests pass, TypeScript clean for modified files
---
*Phase: 43-documents-branding*
*Completed: 2026-04-04*
## Self-Check: PASSED
- pdf-renderer.ts: FOUND
- pdf-renderer.test.ts: FOUND
- SUMMARY.md: FOUND
- Task 1 commit 7c7394bf: FOUND
- Task 2 commit 16023234: FOUND