Lift books tooling into Novolis.Manuscript
Policies that keep the org coherent
name: Books tools to library overview: "Move books publish/authoring tooling into novolis-manuscript in two waves: first wire thin CLIs over existing Export.Audio / IO / catalog APIs and delete duplicated books logic; then lift QuestPDF book+reference print builders into Export.Pdf and extract metrics so books keeps content plus thin CI orchestration only." todos:
- id: wave1-clis
content: Add manuscript-audio + manuscript-book CLIs over Export.Audio / IO / catalog; NMP Chapters surgery; publish GPR status: completed
- id: wave1-books
content: Retarget/delete books generate-audiobook + book-tool; run-ci/pre-commit shell Manuscript CLIs status: completed
- id: wave2-pdf
content: Lift QuestPDF from compile-book/compile-reference into Export.Pdf; manuscript-print CLI; keep Studio API stable status: completed
- id: wave2-metrics
content: Extract compile-metrics into Manuscript.Metrics + CLI; books build.ps1 thin shells only status: completed
- id: wave2-books-delete
content: Delete books compile-* / QuestPDF; verify build.ps1 + run-ci green status: completed isProject: false
Locked decisions
| Decision | Choice |
|---|---|
| PDF strategy | **Lift** books QuestPDF document builders into Manuscript (preserve print look); do not wait on Markup-only parity |
| First PR tranche | **Audio + book-tool** over packages already used by Studio; PDF + metrics in a second wave |
| Books end state | Content + thin CI (`run-ci` / `build.ps1` shells) + Calypso/starsystems domain generators — no local QuestPDF/audio/surgery implementations |
flowchart LR
subgraph wave1 [Wave 1]
audioCli[manuscript audio CLI]
bookCli[manuscript book CLI]
exportAudio[Export.Audio]
msIO[Manuscript.IO]
facade[Manuscript catalog doctor]
audioCli --> exportAudio
bookCli --> msIO
bookCli --> facade
end
subgraph wave2 [Wave 2]
pdfLib[Export.Pdf QuestPDF lift]
metrics[Manuscript.Metrics]
compileBook[books compile-book delete]
compileRef[books compile-reference delete]
compileBook --> pdfLib
compileRef --> pdfLib
end
booksCi[books run-ci build.ps1] --> wave1
booksCi --> wave2Wave 1 — CLIs over existing packages (delete audio/surgery duplication)
Add packable / runnable CLIs in `novolis-manuscript`
Create d:\novolis\novolis-manuscript\tools\ (or a small src/Novolis.Manuscript.Cli with OutputType=Exe + pack as tool) with two entrypoints that PackageReference Manuscript packages (ProjectRef locally):
- `manuscript-audio` — CLI façade over `AudiobookPipeline` + `VoiceMapStore` + Edge TTS. Preserve books-compatible flags where Studio/CI need them (
--series/--book, jobs, chapter range, verify). Prefer library assembly over ffmpeg whereAudiobookAssembleralready covers M4B; keep optional ffprobe verify only if CI still requires duration checks.
- `manuscript-book` — CLI façade over `ManuscriptWorkspace`/`ManuscriptCatalog`/`ManuscriptDoctor` + `LegacyChapterSurgery`. Commands:
list-books,doctor,validate-order,validate-staged,insert-after/insert-between,promote-decimal,sync-filenames, optionalascii-scan. Extend surgery for NMPChapters/(rename type later if desired; behavior must work on migrated books tree).
Publish via merge → GPR float 2026.1.*.
Shrink books
| Books file | After Wave 1 |
|---|---|
| [`tools/audio/generate-audiobook.cs`](D:\repos\books\tools\audio\generate-audiobook.cs) | Delete or ~20-line shim that `dotnet run`s / invokes Manuscript CLI |
| [`tools/dev/book-tool.cs`](D:\repos\books\tools\dev\book-tool.cs) | Same — agent docs point at Manuscript CLI |
| [`tools/ci/run-ci.cs`](D:\repos\books\tools\ci\run-ci.cs) | Call Manuscript CLIs for audio staging / pre-commit validate-staged; keep invariants + staging + CalVer here |
| [`tools/apps/books-writer`](D:\repos\books\tools\apps\books-writer) | Retarget job shells to Manuscript CLIs **or** document Studio as canonical and leave writer as thin/deprecated |
Studio already uses packages in-process (`MainWindow.cs`); no change required beyond optional bump after publish.
Verify Wave 1
- Unit tests for CLI argument → API wiring (manuscript repo)
- Books:
dotnet run … manuscript-book doctoron Calypso; one audiobook chapter dry-run;run-ci --pre-commitgreen - No new local NuGet feeds
Wave 2 — Lift QuestPDF + metrics (delete compile-* implementations)
Export.Pdf fidelity lift
Move the QuestPDF document construction from:
into `Novolis.Manuscript.Export.Pdf` (replace or sit beside the thin Markup concat path). Public API shape:
ManuscriptBookPdfExporter.ExportBook(...)gains books-grade cover / chapter-metadata filtering / print-settings behavior (Studio already calls this — keep signature stable, deepen implementation)ExportReferenceSet/ dedicatedExportReferenceManualfor series reference TOC/tables
Add `manuscript-print` CLI (discover NMP books, write out/…) so books build.ps1 becomes a thin loop or single call.
Metrics
New packable Novolis.Manuscript.Metrics (or fold into Manuscript + CLI) porting `compile-metrics.cs` → JSON/MD overview. Wire into manuscript-print or manuscript-metrics CLI.
Delete from books after green
compile-book.cs,compile-reference.cs,compile-metrics.csbodies- QuestPDF package refs from books tools
- Update
build.ps1/run-cito invoke Manuscript CLIs only
Verify Wave 2
- Golden or smoke: Calypso + one reference PDF byte-size/page-count sanity vs prior
out/ - Full
pwsh -File D:\repos\books\build.ps1andrun-ciexit 0 - Studio ProjectRef PDF export still works
Explicitly stay in books
run-ciinvariants, release-staging, CalVergh release- Calypso /
tools/starsystems/ one-off lore generators - Content under
src/,style/,manuscript.yaml - Optional thin shims that only forward to Manuscript CLIs (acceptable until agents learn new paths)
PR / merge sequence
- novolis-manuscript Wave 1 CLIs + surgery NMP paths → publish GPR
- books Wave 1: retarget / delete generate-audiobook + book-tool; CI shells new CLIs
- novolis-manuscript Wave 2 QuestPDF + metrics → publish
- books Wave 2: delete compile-*; thin build.ps1
- Apps: bump floats only if pinned; Studio already package-native
Non-goals
- Moving Avalonia Writer host into manuscript (Studio in novolis-apps is the product host)
- Moving Calypso/AstroForge/starsystems into Manuscript
- Dual-tree content layout (NMP already landed)