fabricatio-novel
AI-powered novel generation — outline to publication-ready EPUB.
Full dataflow and generation-logic walkthrough: docs/superpowers/specs/2026-08-21-novel-generation-dataflow.md
Installation
pip install fabricatio[novel]
# or
uv pip install fabricatio[novel]
For the CLI tool:
pip install fabricatio-novel[cli]
Pipeline
Generation runs a staged, template-driven pipeline over a context tree
(NovelContext → ChapterContext → StoryContext → SceneContext), with every plan and
character state proposed by the LLM in batched calls:
- Metadata — outline →
NovelPlan(title, description, word count, global writing constraint, bible) - Characters — bible roster → one
CharacterSpan(start + end card) per character for the whole novel - Chapters — chapter plans, then N-1 boundary cards per character so chapter 1 starts at the roster start and the last chapter ends at the roster end
- Stories — per chapter: story plans, then S-1 boundary cards per character anchored on the chapter's start/end
- Scenes — per story: scene plans; the story's spans are broadcast to every scene, which is where the prose is actually written
- Assembly — the composed context tree becomes a
Novel;NovelBuilder(Rust/PyO3) produces the EPUB
Character state is two pure cards, never an interpolated chain: the LLM is only asked for the coarsest boundary states, and code stitches them so continuity is guaranteed. Single-child levels inherit their parent's spans with no LLM call.
The CLI runs the pipeline as a staged workflow (DebugNovelWorkflow), persisting a
whole-tree JSON snapshot after every stage so any wrong result is traceable:
01_init → 02_metadata → 03_characters → 04_chapter_plans → 05_story_plans
→ 06_scene_plans → 07_scenes → 08_novel → 09_export
An optional RAG variant (RagDebugNovelWorkflow) retrieves WritingStyleDocument
entries from LanceDB once per story and renders them raw into the scene prompts.
Data Flow & Prompt Assembly
The pipeline follows one principle: every LLM touchpoint is a template plus named context variables, and nothing else. Each stage renders a Handlebars template from the current context channel; planner calls parse the reply into validated pydantic models, while the single prose call captures raw paragraphs. Everything between calls — word-count allocation, character-arc stitching, prefix propagation, assembly — is deterministic code.
LLM call inventory
| Stage | Template · prompted with | Yields |
|---|---|---|
| Metadata | novel_metadata_requirement ← outline, language, constraint |
NovelPlan (adopted onto the root) |
| Roster spans | novel_character_span ← bible prompt block, title, description |
CharacterSpan[] — skipped without a roster |
| Chapter plans | chapter_plan ← outline, novel fields, word count, styles, constraint, characters |
ChapterPlan[] |
| Chapter boundaries | chapter_character_span ← roster spans, chapter titles/descriptions |
N−1 boundary cards per character |
| Story plans | story_plan ← chapter fields, styles, constraint, characters, cast |
StoryPlan[] |
| Story boundaries | story_character_span ← chapter spans, story titles/descriptions |
S−1 boundary cards per character |
| Scene plans | scene_plan ← story fields, styles, constraint, characters, cast |
ScenePlan[] |
| Scene prose | scene_requirement ← 11 variables, see below |
plain prose → Scene.content |
Templates live in templates/built-in/ and are selectable through the
Configuration keys below.
What flows down the tree
Plans materialize into child contexts via from_plan; each level then passes state down:
- Running manuscript — an append-only
ContextLog; every walk seeds each child with exactly the bytes that precede it in the final book (iter_prefixed_contexts) - Setting bible — rendered once at the root into a
setting_bibleprefix entry; every descendant inherits it through its own log - Word budget — each level splits its
expected_word_countamong children by plan weight - Writing constraint — accumulated verbatim down the chain
- Character arcs — the roster fixes both endpoints; intermediate boundary cards are proposed per level and stitched in code; scenes receive the finished span list read-only
Composed prose flows back up: scene content enters the logs, and Novel.from_context
aggregates the whole tree for export.
How a scene prompt is assembled
The scene write is the only content-producing call, so its prompt is engineered for
provider prefix caching: every row above ## Scene is byte-identical across the scenes
of a story, and divergence starts exactly at the per-scene tail.
Key Classes
Context channels
| Class | Role |
|---|---|
NovelContext |
Root channel: outline, language, roster charactor_span, chapter_context |
ChapterContext |
Chapter channel: charactor_span, story_context, heading block |
StoryContext |
Story channel: charactor_span, scene_context, accumulated writing_styles, optional rag retrieval settings |
SceneContext |
Leaf channel: broadcast charactor_span, content (the only composed prose) |
CharacterSpan |
Start + end CharacterCard; derive_child_spans stitches boundary cards |
ContextLog / ContextEntry |
Append-only manuscript log per channel: append, branch (fork history), clear (fresh fork); renders the prefixed-content prompt streams |
SeriesBible |
characters name list + background_settings fact list; rendered once into a setting_bible prefix entry at the root |
Every channel carries its running manuscript as an append-only ContextLog: composed
blocks enter as frozen ContextEntry records, parents seed children with pure log snapshots,
and prompts render them exactly like the former prefixed-content strings. Logs support
with_entry/with_entries appends, branch() to fork alternative continuations from any
point (copy-on-write), and clear() which returns a fresh empty log while the original
history stays intact.
Plans & models
| Class | Description |
|---|---|
NovelPlan |
Novel metadata: title, description, word count, global constraint, bible |
ChapterPlan / StoryPlan / ScenePlan |
Weighted per-element plans (title, description, weight, style, constraint, cast) |
Scene / Story / Chapter / Novel |
Materialized output tree with word-count satisfaction |
WritingStyleDocument / EnrichedDocument |
LanceDB-backed writing-style references |
Capabilities (mixins)
| Class | Description |
|---|---|
SceneCompose |
Scene requirement rendering + prose generation |
StoryCompose |
Scene planning, scene write preparation, serial scene composition |
ChapterCompose |
Story planning, draft_story_spans (S-1 boundary cards), story composition |
NovelCompose |
Metadata, prepare_character_span (roster), chapter planning, draft_chapter_spans (N-1 boundary cards) |
RAGCompose |
Retrieves style docs once per story; extends scene prompts |
BibleCompose |
Creates/updates the setting bible from an outline |
Actions (staged workflow)
| Action | Stage |
|---|---|
InitNovelContext |
01_init — build context from outline/language/constraint/bible |
MetadataStage |
02_metadata — propose novel plan |
CharactersStage |
03_characters — propose roster spans |
ChapterPlanStage |
04_chapter_plans — plan chapters + draft boundaries |
StoryPlanStage |
05_story_plans — plan stories + draft boundaries |
ScenePlanStage / RagScenePlanStage |
06_scene_plans — plan scenes (with RAG) |
SceneWriteStage / RagSceneWriteStage |
07_scenes — broadcast spans + write scene prose |
AssembleStage |
08_novel — materialize Novel |
DumpNovelStage |
export — JSON always; EPUB and/or per-chapter chapters/NN.txt per format |
Workflows
| Workflow | Description |
|---|---|
DebugNovelWorkflow |
Outline → exported novel (--format epub|txt|both), one stage per action with per-stage snapshots |
RagDebugNovelWorkflow |
Same, with writing-style RAG per story |
Rust / PyO3
| Symbol | Description |
|---|---|
NovelBuilder |
Builder for EPUB 3.0 novels: title/description/authors, chapters (auto-XHTML), cover, fonts, CSS, TOC |
text_to_xhtml_paragraphs |
Plain text → <p>-wrapped XHTML paragraphs |
Configuration
All options below are read through the fabricatio configuration chain (see the
Configuration Guide). Set them under the
[ext.novel] table in fabricatio.toml, equivalently under
[tool.fabricatio.ext.novel] in pyproject.toml, or via
FABRICATIO_EXT__NOVEL__<FIELD_UPPER> environment variables.
[ext.novel]
novel_metadata_requirement_template = "built-in/novel_metadata_requirement"
| Option | Type | Default | Description |
|---|---|---|---|
novel_metadata_requirement_template |
str |
"built-in/novel_metadata_requirement" |
template used to extract the novel metadata (title, synopsis, word count) from the outline. |
chapter_plan_template |
str |
"built-in/chapter_plan" |
template used to plan the chapters of the novel from the outline and metadata. |
story_plan_template |
str |
"built-in/story_plan" |
template used to plan the stories of a chapter. |
scene_plan_template |
str |
"built-in/scene_plan" |
template used to plan the scenes of a story. |
scene_requirement_template |
str |
"built-in/scene_requirement" |
template used to write a single scene in full prose. |
render_chapter_xhtml_template |
str |
"built-in/render_chapter_xhtml" |
template used to render a chapter as a full XHTML document. |
setting_bible_characters_template |
str |
"built-in/setting_bible_characters" |
template used to propose the bible's character roster as a list of plain strings, one character per item. |
setting_bible_background_template |
str |
"built-in/setting_bible_background" |
template used to propose the bible's background settings as a list of strings. |
setting_bible_context_template |
str |
"built-in/setting_bible_context" |
template that renders the bible into the block seeded into the running manuscript prefix. |
setting_bible_export_template |
str |
"built-in/setting_bible_export" |
template used to render the bible as a human-readable markdown document. |
writing_style_as_prompt_template |
str |
"built-in/writing_style_as_prompt" |
template used to render writing style documents as prompts. |
enriched_as_prompt_template |
str |
"built-in/enriched_as_prompt" |
template used to render enriched reference documents as prompts. |
novel_character_span_template |
str |
"built-in/novel_character_span" |
template used to propose the novel roster as one CharacterSpan per character. |
chapter_character_span_template |
str |
"built-in/chapter_character_span" |
template used to draft the N-1 chapter-boundary cards from the novel roster spans. |
story_character_span_template |
str |
"built-in/story_character_span" |
template used to draft the S-1 story-boundary cards from the chapter's spans. |
Access at runtime: from fabricatio_novel.config import novel_config.
Usage
CLI
# Generate a novel from an outline
fanvl w -o "In a world where dreams are currency..."
# Generate with writing style RAG (LanceDB)
fanvl wr -o "In a world where dreams are currency..." -rq "Hemingway terse prose style"
# Constrain generation with a setting bible + global writing constraint
fanvl w -o "..." -b settings/bible.json -c "first person view throughout"
# Export as plain text instead of (or besides) EPUB: chapters/01.txt, 02.txt, …
fanvl w -o "..." --format both
fanvl w -o "..." --format txt
# Create / update / show the setting bible
fanvl bible create -o "In a world where dreams are currency..." --out settings/bible.json
fanvl bible update settings/bible.json -o "..." --sections characters
fanvl bible show settings/bible.json
# Store reference texts as writing style documents in LanceDB
fanvl store-refs ./corpus/*.txt
fanvl enrich-refs ./corpus/*.txt -eg "Extract world-building facts"
Programmatic
from fabricatio_novel.workflows.novel import DebugNovelWorkflow
from fabricatio_core import Event
event = Event.instantiate("write")
event.payload["novel_outline"] = "In a world where dreams are currency..."
role = Role.with_bio(name="writer").subscribe(event, DebugNovelWorkflow).dispatch()
EPUB Builder (Rust)
from fabricatio_novel.rust import NovelBuilder, text_to_xhtml_paragraphs
xhtml = text_to_xhtml_paragraphs(raw_chapter_text)
builder = (
NovelBuilder()
.new_novel()
.set_title("My Novel")
.add_author("Author Name")
.add_chapter("Chapter 1", xhtml)
.add_inline_toc()
)
builder.export("output.epub")
Dependencies
fabricatio-core— Core interfaces, template management, LLM capabilitiesfabricatio-character— Character card modelspydantic— Data validation via models- Optional:
fabricatio-lancedb— writing style RAG,typer— CLI
License
MIT — see LICENSE
Metadata
Release files for fabricatio-novel 0.21.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 25.7 MB
Release files / fabricatio_novel-0.21.2-cp314-cp314-win_amd64.whl
| Download URL | fabricatio_novel-0.21.2-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
f289e5932bb2e01e313bfe7960b01a1282d3e1af79586844dcde2e1a08e0ed89
|
|
BLAKE2b-256 checksum How to use checksums |
6e97f19604550a4cb5b324c8ef791daa5860c9305f3f6bf7372f459c72829149
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp314-cp314-manylinux_2_34_x86_64.whl
| Download URL | fabricatio_novel-0.21.2-cp314-cp314-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.14 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
358ad775f0cd7324cf64d81c31172996cc6ea8351c4e47d8e895a5a4027ee8cf
|
|
BLAKE2b-256 checksum How to use checksums |
760739d1768b3b4554d049b563deb0fc1a419c5e2d663b45852a4b7705b7e8c4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp314-cp314-manylinux_2_34_aarch64.whl
| Download URL | fabricatio_novel-0.21.2-cp314-cp314-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.14 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
4b05cdfebaa4a3945d059b25dd5d3816aaad2805b5f84035a4eca0894d69ab02
|
|
BLAKE2b-256 checksum How to use checksums |
c149d825c1e42b4a65fedc8ec169c4a412f71b2a66b941a3787702fed0e73f49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | fabricatio_novel-0.21.2-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
977a51ceeae727a4d6b0a2dd62badfded4861dc0b38713dffca98aabc28c71c4
|
|
BLAKE2b-256 checksum How to use checksums |
319de9ecc67ea8d791ffe25bed427f8c2f2c204d26fefcf02c4b9043ce48673f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp313-cp313-win_amd64.whl
| Download URL | fabricatio_novel-0.21.2-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
56a598feda37b1b4d99496f933ed981f54d26d2bfaea3fb94193474e5503ddf0
|
|
BLAKE2b-256 checksum How to use checksums |
c33900c811ea3f8e2459b81c31b52c48b612edd9468cc8e056049f140a59bc9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp313-cp313-manylinux_2_34_x86_64.whl
| Download URL | fabricatio_novel-0.21.2-cp313-cp313-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
6b0f872c3d774f9c93bc86d4003a99474373af530dd111d23519de904f99eabc
|
|
BLAKE2b-256 checksum How to use checksums |
ed4df677964df8458597d5ac646563bd1550f7c626fff345caad327df4d9c58d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp313-cp313-manylinux_2_34_aarch64.whl
| Download URL | fabricatio_novel-0.21.2-cp313-cp313-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
e907734db23c5fab47a92d0fb4b5d3b989f8bab8c3120c7739aa7872c4342331
|
|
BLAKE2b-256 checksum How to use checksums |
a1a7eaf481324442e0ed36880677b86ddefbaf386d4cc38d66f731edcc11e246
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | fabricatio_novel-0.21.2-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
3c0f6f16f961d2f1d5c3d1c1ebc7ad98896935380023c67dd35f7f2d5b4fd363
|
|
BLAKE2b-256 checksum How to use checksums |
5dfd385e5ec5f9d6de998e6e172eaa37160b08321b7c58241ef2d760a5417c60
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp312-cp312-win_amd64.whl
| Download URL | fabricatio_novel-0.21.2-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
1e4db9bcd3ce6b5fa7698a820df0c9d9bc09c5787bde4e3471408987b5a4f0ef
|
|
BLAKE2b-256 checksum How to use checksums |
3ff01b56464849373276fd8f182a211a08c723d374785b289114b202f62a27bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp312-cp312-manylinux_2_34_x86_64.whl
| Download URL | fabricatio_novel-0.21.2-cp312-cp312-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
ac652c31820b859c388ed2fc315b24f6b54898c803d8d66a64e3d9374ec8da9b
|
|
BLAKE2b-256 checksum How to use checksums |
80e7d12a2859e543a06dc78d8ca61b436b740f8e045e6b2761f51f72b36ce41a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp312-cp312-manylinux_2_34_aarch64.whl
| Download URL | fabricatio_novel-0.21.2-cp312-cp312-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
4261248c437d5e44f0b87db367f7e030516d9c3b6b60bd9a763d0c28313b09ac
|
|
BLAKE2b-256 checksum How to use checksums |
1370cf003ae8678731ceb9db6369247900a0e8726b2d8822b18b54ee75b17277
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fabricatio_novel-0.21.2-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | fabricatio_novel-0.21.2-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7c27aa2cce6fe3d4f3f6add593f33f9e10ca9b8ac27ca7ed2cefbf1d6e706890
|
|
BLAKE2b-256 checksum How to use checksums |
0df2ab5d90763d963afb9001ad0f4f051540cb9b49a17b995421290982b0e570
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|