Frank.Markdown + Frank.Mermaid → Novolis-Platform
Policies that keep the org coherent
name: Markdown Mermaid org migration overview: Migrate Frank.Markdown and Frank.Mermaid from frankhaugen into a new Novolis-Platform multi-package repo (novolis-markup), following the existing extract/rebuild playbook—not repo transfer—and archive the two personal repos after NuGet preview ships. todos:
- id: gov-signoff
content: "Update governance: novolis-markup domain, wave-10 brief, inventory, naming doc, migrate-frank-slice replacements, sunset banners" status: completed
- id: scaffold-repo
content: Create Novolis-Platform/novolis-markup scaffold (slnx, CI, release, global.json net10.0) status: completed
- id: migrate-markdown
content: Extract Frank.Markdown → src/Novolis.Markup.Markdown + port ~38 xUnit tests to TUnit status: completed
- id: migrate-mermaid
content: Extract Frank.Mermaid → src/Novolis.Markup.Mermaid + port tests; relocate or drop Docs sample status: completed
- id: registry-release
content: Register packages, ship 0.1.0-preview.1, archive frankhaugen/Frank.Markdown and Frank.Mermaid with sunset READMEs status: completed isProject: false
Repos found (frankhaugen)
| Repo | Role | NuGet | Deps | Novolis status |
|---|---|---|---|---|
| [Frank.Markdown](https://github.com/frankhaugen/Frank.Markdown) | Fluent GitHub-flavored Markdown builder | `Frank.Markdown` | None (library) | **Not migrated** — P1 hold in [frank-inventory.md](d:\novolis\novolis-governance\docs\frank-inventory.md) |
| [Frank.Mermaid](https://github.com/frankhaugen/Frank.Mermaid) | Fluent Mermaid diagram text builder (flowchart, sequence, gantt, …) | `Frank.Mermaid` | None (library) | **Not migrated** — not listed separately from Reflection |
| [Frank.Reflection.Mermaid](https://github.com/frankhaugen/Frank.Reflection) (package inside Reflection repo) | Reflection → `classDiagram` strings | `Frank.Reflection.Mermaid` | `Frank.Reflection` | **Already migrated** → `Novolis.CodeGen.Reflection.Mermaid` in [novolis-codegen](d:\novolis\novolis-codegen) |
Out of scope (per your choice): Frank.Blazor.Mermaid, Frank.MarkdownEditor (apps/UI).
Important distinction: Frank.Mermaid (standalone repo) and Frank.Reflection.Mermaid (codegen) are different libraries. Do not fold standalone Mermaid into novolis-codegen; keep reflection diagrams in Novolis.CodeGen.Reflection.Mermaid.
flowchart LR
subgraph personal [frankhaugen - wave 10]
FMd[Frank.Markdown]
FMe[Frank.Mermaid]
end
subgraph org [Novolis-Platform - NEW]
NmMd[Novolis.Markup.Markdown]
NmMe[Novolis.Markup.Mermaid]
end
subgraph codegen [novolis-codegen - done]
Rm[Novolis.CodeGen.Reflection.Mermaid]
end
FMd -->|extract| NmMd
FMe -->|extract| NmMe
FMd -.->|archive after ship| FMd
FMe -.->|archive after ship| FMeFrank.Reflection’s deferred Roslyn/doc path uses Frank.Markdown as a NuGet dependency (Frank.Reflection.Roslyn); that is a later codegen wave, not part of this repo merge.
Org repo name (chosen)
`novolis-markup`
| **GitHub repo** | `Novolis-Platform/novolis-markup` |
| **Domain** | `Markup` |
| **Packages** | `Novolis.Markup.Markdown`, `Novolis.Markup.Mermaid` |
| **Solution** | `Novolis.Markup.slnx` |
Why this name: Both libraries produce text markup consumed by docs tools (GitHub-flavored Markdown and Mermaid diagram syntax). The name is neutral, covers both facets, and does not collide with novolis-codegen (reflection/Roslyn) or novolis-templates.
Alternatives not used:
| Repo | Packages | Why skipped |
|---|---|---|
| `novolis-docs` | `Novolis.Docs.*` | Governance draft name; “docs” overlaps with governance/docs repos conceptually |
| `novolis-authoring` | `Novolis.Authoring.*` | Longer domain; less precise than “markup” |
Avoid: novolis-mermaid (excludes Markdown), novolis-markdown (excludes Mermaid), novolis-diagrams (misleading for Markdown).
Governance prerequisites (before coding)
Current frank-inventory.md non-goal: “Create `novolis-docs` for Markdown without governance approval.” Resolve by updating governance to `novolis-markup` instead:
- frank-naming-and-structure.md — add
novolis-markuprow + package mapping - frank-inventory.md — move Markdown/Mermaid from P1 hold → Wave 10; target
novolis-markup - New brief:
extraction-briefs/wave-10-markup.md - migrate-frank-slice.ps1 — add replacements:
Frank.Markdown→Novolis.Markup.MarkdownFrank.Mermaid→Novolis.Markup.Mermaid- frank-sunset-banners.md — wave row for both Frank repos
Target layout (matches Novolis convention)
novolis-markup/
src/Novolis.Markup.Markdown/
src/Novolis.Markup.Mermaid/
tests/Novolis.Markup.Markdown.Tests/
tests/Novolis.Markup.Mermaid.Tests/
Novolis.Markup.slnx
.novolis/packages.json
Directory.Build.props
Directory.Packages.props
global.json # net10.0, SDK 10.x (align with other waves)
.github/workflows/ # ci.yml + release.yml (copy from novolis-math or novolis-codegen)No cross-package ProjectReference between Markdown and Mermaid (both are independent today).
Migration steps (extract/rebuild, not git transfer)
Follow frank-migration-runbook.md:
- Scaffold
Novolis-Platform/novolis-markupfromnovolis-template-dotnet(or clone structure from novolis-math). - Source: shallow clone into
bootstrap/scratch/frank-eval/:
Frank.MarkdownFrank.Mermaid
- Extract with
migrate-frank-slice.ps1intosrc//tests/(two slices). - Tests — port xUnit → TUnit (naming.md):
- Frank.Markdown: ~38
[Fact]tests across 3 files (xUnit + Moq today) - Frank.Mermaid: tests under
Frank.Mermaid.Tests/(verify count during slice) - Drop xUnit/Moq/JetBrains test packages; use TUnit +
Novolis.Testing.TUnitonly if needed
- Build:
dotnet build/dotnet testonnet10.0. - Registry: add
novolis-registry/packages/novolis.markup.markdown.jsonandnovolis.markup.mermaid.json. - Release:
0.1.0-preview.1per package (same pattern as wave 5 codegen). - Personal repos — archive:
- Apply sunset banner from frank-sunset-banners.md pointing to
Novolis.Markup.*/novolis-markup - Archive
frankhaugen/Frank.Markdownandfrankhaugen/Frank.Mermaid - Optional: leave NuGet
Frank.*packages unlisted with README pointing toNovolis.Markup.*(no binding redirect required — different package IDs)
Do not use GitHub “Transfer repository” for these libs; Novolis policy is extract without history transfer.
Frank.Mermaid extras
Frank.Mermaid.Docssample project: move tosamples/Novolis.Markup.Mermaid.Docs/or drop if redundant with README examples.- README currently mentions “Blazor component” in places but the core package is renderer-agnostic diagram text — fix README during migration.
Dependency / downstream notes
| Consumer | Action after wave 10 |
|---|---|
| `Frank.Blazor.Mermaid` (personal, out of scope) | Would need `Novolis.Markup.Mermaid` if ever migrated |
| `Frank.Reflection.Roslyn` (deferred) | Switch `PackageReference` from `Frank.Markdown` → `Novolis.Markup.Markdown` when Roslyn wave runs |
| `novolis-codegen` | No change — keep `Novolis.CodeGen.Reflection.Mermaid` separate |
Suggested tracking
| Item | Action |
|---|---|
| Governance PR | Sign off `novolis-markup` domain + wave 10 brief |
| `novolis-markup` issue #1 | Migrate `Novolis.Markup.Markdown` |
| `novolis-markup` issue #2 | Migrate `Novolis.Markup.Mermaid` |
| `novolis-registry` PR | Two package entries |
| Personal repos | Archive after preview NuGet publish |