125 lines
5.1 KiB
Markdown
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
|