Commit Graph

4 Commits

Author SHA1 Message Date
hongjr03 9927d38c18 feat(cph): implement nested outline manifest and batch/combined export
ADR-0029 — nested outline manifest, supersedes ADR-0008's flat [[parts]]:
- cph-model: recursive loader over manifest.toml containers / element.toml
  leaves; Lesson.parts (pure elements, DFS order) + Lesson.outline (elements
  interleaved with section headings at their DFS-open position); rejects
  ambiguous/incomplete folders and root-vs-container table misplacement
- cph-diag: new DiagCode::ManifestMalformed for carrier-document structure
  errors (discharges an existing TODO)
- cph-typst: augmented manifest now serializes the outline (element/section
  entries) instead of a flat parts array
- render/lib.typ: render-lesson renders section headings at their depth
- examples/TH-141 migrated to 5 nested section containers + 3 root segments,
  byte-identical element order; smoke-verified via cph check/build + pdftotext

ADR-0030 — batch & combined export, extends ADR-0009/0011:
- cph build with no --target batches every declared target (repeatable
  --target for an explicit subset); any target failure => non-zero exit,
  per-target ledger, independent per-target execution
- cph-model: bundle.toml loader (directory + [info]/[targets.*]/ordered
  lessons with per-lesson target overrides)
- cph-typst: augmented bundle manifest (path-prefixed member outlines),
  Engine::{compile_check_bundle,build_bundle_pdf}
- render/lib.typ: render-bundle assembles member lessons under per-lesson
  headings, depth-shifts their own section headings, resets example/lemma
  counters at each lesson boundary by default
- cph-cli: `cph bundle <path> --target <name>` subcommand, same batching
  contract as `cph build`
- new bundle fixtures/tests (cph-model unit + cph-typst through-template PDF
  compile), smoke-verified via a real 2-lesson merged PDF

Verification: cargo fmt/clippy/test clean across the workspace (68 tests);
real cph check/build/bundle runs against TH-141 and a bundle fixture, PDF
content inspected via pdftotext.
2026-08-05 18:34:05 +08:00
sjfhsjfh cadf8ad0d3 test(examples): TH-141 to template model — exports/*.typ + manifest v2 (WU-E')
Acceptance fixture for ADR-0011's template build model. TH-141 gains
exports/student.typ + exports/teacher.typ (the framework default templates,
copied from render/templates/ — these should be auto-seeded at project creation,
out of scope this round). manifest.toml [targets.*] converted to v2: artifact =
{type="single-file", filepath} + a typst-compile step naming the template;
numbering removed (it now lives in the template).

Verified end-to-end through the new path (template compiled as main + augmented
manifest, no generated driver): `cph check` → 0 errors/0 warnings; `cph build`
student → 9pp PDF, teacher → 12pp PDF; numbering correct (一、 / 2.1 / 2.2, zero
"二、一"); real content rendered.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 10:06:31 +08:00
sjfhsjfh c93503de50 test(examples): TH-141 declares structured target build config (WU-E)
Acceptance fixture for the export-as-build model. TH-141's [targets.student] /
[targets.teacher] now carry artifact = "single-file" + an explicit per-level
heading numbering override (一、 / 1.1 / 1.1.1), exercising ADR-0009's
file-resident override path end-to-end.

Verified: `cph check` → 0 errors / 0 warnings; `cph build` both targets → PDFs
(student 9pp, teacher 12pp) with correct numbering — zero "二、一" occurrences
(the bug the override layer was missing to fix). numbly resolves offline through
the embedded engine via the vendored package.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 08:49:21 +08:00
sjfhsjfh c73a2c903f feat(examples): migrate TH-141 sample to declarative layout (WU-6)
Real-content fixture for the end-to-end pipeline. TH-141 (39 parts: 22 segment,
15 lemma, 2 example) migrated from the prototype's typst `#let parts` manifest
to ADR-0008: declarative manifest.toml (project+info+ordered parts+targets) +
per-element element.toml (kind + scalars; examples carry `source`). Content .typ
files copied byte-identical (no math corruption); per-element main.typ + meta.toml
dropped (wiring is now generated). Part order matches source exactly; 5 lemmas
have no proof.typ (optional); no cross-file imports / paralearn refs / figs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 01:33:40 +08:00