This release is a pre-release and may not be stable for production use.
fabricatio-typst
Academic article generation and Typst document tooling, built on Fabricatio's event-based agent framework.
Installation
pip install fabricatio[typst]
For RAG-backed article writing:
pip install fabricatio[typst,rag]
Overview
Two layers compose this package:
Rust extension (fabricatio_typst.rust) — performance-critical utilities:
- TeX-to-Typst math conversion (raw LaTeX and delimited
$/$$/\(/\[math) - BibTeX bibliography management with fuzzy citation lookup
- Typst comment manipulation and YAML front-matter handling
- Markdown section extraction
Python layer — staged, typed academic content generation:
- Extract paper essences and propose structured research proposals
- Plan an article level by level — article, chapters, sections, subsections — then write every subsection against the running text
- RAG-backed composition that retrieves each subsection's own references and cites them inline
- Store and query article chunks in LanceDB
- Compile
.typdocuments to PDF, PNG, or SVG via thetypstcompiler
Rust API
from fabricatio_typst.rust import (
BibManager,
tex_to_typst,
convert_all_tex_math,
comment,
uncomment,
strip_comment,
split_out_metadata,
to_metadata,
extract_body,
replace_thesis_body,
extract_sections,
fix_misplaced_labels,
)
TeX Conversion
| Function | Description |
|---|---|
tex_to_typst(string) |
Convert raw LaTeX code to Typst math |
convert_all_tex_math(string) |
Convert $, $$, \(, \[ math delimiters to Typst $ |
tex_to_typst(r"\frac{1}{\sqrt{x^2 + 1}}")
# => '#frac(1, sqrt(x^2 + 1))'
convert_all_tex_math("Einstein's $E = mc^2$ is famous.")
# => "Einstein's $E = m c^2$ is famous."
Comment Utilities
| Function | Description |
|---|---|
comment(string) |
Prepend // to every line |
uncomment(string) |
Remove // prefix from every line |
strip_comment(string) |
Strip leading and trailing comment lines |
BibManager
Loads a BibTeX bibliography file and provides fuzzy citation lookup.
bib = BibManager("references.bib")
cite_key = bib.get_cite_key_by_title("Attention Is All You Need")
# => "vaswani2017attention"
key = bib.get_cite_key_fuzzy("transformers attention mechanism")
authors = bib.get_author_by_key(key)
abstract = bib.get_abstract_by_key(key)
| Method | Description |
|---|---|
get_cite_key_by_title(title) |
Exact-match citation key by title |
get_cite_key_by_title_fuzzy(title) |
Fuzzy-match citation key by title |
get_cite_key_fuzzy(query) |
Fuzzy-match citation key by arbitrary query |
list_titles(is_verbatim=False) |
List all bibliography titles |
get_author_by_key(key) |
Authors for a citation key |
get_year_by_key(key) |
Publication year for a citation key |
get_abstract_by_key(key) |
Abstract for a citation key |
get_title_by_key(key) |
Title for a citation key |
get_field_by_key(key, field) |
Arbitrary BibTeX field for a citation key |
Document Utilities
| Function | Description |
|---|---|
split_out_metadata(string) |
Extract YAML front matter as (metadata, rest) |
to_metadata(data) |
Serialize Python object to YAML comment block |
extract_body(string, wrapper) |
Extract content between wrapper markers |
replace_thesis_body(string, wrapper, new_body) |
Replace content between wrapper markers |
extract_sections(string, level=1, section_char="#") |
Parse markdown sections at given header level |
fix_misplaced_labels(string) |
Move \<label\> tags outside display math blocks |
Python Models
Hierarchical article representation from proposal through completed paper:
| Model | Description |
|---|---|
ArticleProposal |
Research proposal: problems, approaches, methods, aims, keywords |
ArticleEssence |
Semantic fingerprint: title, authors, equations, figures, contributions |
ArticleOutline |
Hierarchical outline: chapters → sections → subsections |
ArticleChapterOutline |
Chapter-level outline node |
ArticleSectionOutline |
Section-level outline node |
ArticleSubsectionOutline |
Subsection-level outline node |
Article |
Complete paper with full content and validation |
ArticleChapter |
Chapter with sections |
ArticleSection |
Section with subsections |
ArticleSubsection |
Subsection with paragraphs |
Paragraph |
Structured paragraph blueprint with word count |
ArticleChunk |
LanceDB-storable chunk with bibtex metadata |
ArticleEssenceStorable |
ArticleEssence with LanceDB storage capability |
CitationManager |
Deduplicated, iteratively expanded citation set for RAG |
ChunkKwargs |
TypedDict for chunking parameters |
The staged pipeline plans through one flat plan model per level and writes into a typed context tree; the outline ladder above is the artifact that tree assembles into:
| Model | Description |
|---|---|
WeightedPlan |
One unit's plan: heading, elaboration, aims, weight, and its writing styles and constraints |
ArticlePlan / ChapterPlan / SectionPlan / SubsectionPlan |
Per-level plans, each carrying its own expected-count band for the planner model |
ArticleContext / ChapterContext / SectionContext / SubsectionContext |
The typed context tree the pipeline plans and writes into; a leaf holds the composed prose |
Actions
Each action is a Fabricatio Action — an async callable unit in the agent workflow. Available actions:
Content Extraction
| Action | Description |
|---|---|
ExtractArticleEssence |
Extract article essences from files on disk |
FixArticleEssence |
Fix extracted essences using BibTeX reference data |
ExtractOutlineFromRaw |
Parse an outline from raw text |
Staged Composition
Every stage runs one segment of the compose_article chain and then persists a
whole-tree snapshot under <persist_dir>/stage_<name>, so a wrong result can be traced
back to the stage that produced it.
| Stage | Description |
|---|---|
InitArticleContext |
Build the root context from the briefing, resolve the run's skills, fire the before hook |
ProposeArticleProposalStage |
Propose the research proposal from the briefing |
ProposeArticlePlanStage |
Propose the article's own plan: title, description, styles, constraints, word count |
PlanArticleChaptersStage |
Plan the chapters and allocate the article's word count across them |
PlanSectionsStage |
Plan every chapter's sections |
PlanSubsectionsStage |
Plan every section's subsections |
ComposeSubsectionsStage |
Write every subsection in prefix order |
AssembleArticleStage |
Assemble the context tree into an Article and record its outline |
DumpArticleStage |
Dump the article's typst source to article_output_path |
DumpOutlineStage |
Dump the planned outline alone: the structure-only deliverable |
The actions below are the run's side utilities:
| Action | Description |
|---|---|
LoadArticle |
Load a complete article from outline + Typst code |
ExtractOutlineFromRaw |
Parse an outline from raw text |
FixIntrospectedErrors |
Repair the errors an outline's own checks report, against a ruleset |
WriteChapterSummary |
Write summaries for each chapter |
WriteResearchContentSummary |
Write a research content summary |
RAG-Backed Writing
| Action | Description |
|---|---|
RagComposeSubsectionsStage |
The content stage with citation-aware RAG: every subsection retrieves its own references |
TweakArticleLancedbRAG |
Refine article content using LanceDB RAG |
ChunkArticle |
Split an article into storeable chunks |
StoreArticleEssence |
Store article essences into LanceDB |
Compilation
| Action | Description |
|---|---|
CompileTypstDocument |
Compile a .typ file or source string to PDF/PNG/SVG |
CompileArticle |
Compile a previously dumped article .typ to PDF |
from pathlib import Path
from fabricatio_typst.actions.article import CompileArticle, CompileTypstDocument
# Compile a standalone .typ file
result = await CompileTypstDocument().act({
"typst_source": Path("paper.typ"),
"output_path": Path("paper.pdf"),
})
# result["compiled_path"] → Path("paper.pdf")
# Compile a generated article (after DumpFinalizedOutput)
result = await CompileArticle().act({
"article_path": Path("output.typ"),
})
# result["compiled_path"] → Path("output.pdf")
Citation Capability
CitationLancedbRAG — citation-aware iterative search that expands queries over multiple rounds and deduplicates by bibtex key.
CitationSubsectionCompose — the composition leaf that mixes that search into a
subsection's write: retrieval is seeded with the running text and the subsection's own
plan, the model writes [[n]] markers, and the manager rewrites them into typst @cite
notation paragraph by paragraph.
Workflows
Pre-composed action pipelines:
| Workflow | Steps |
|---|---|
ArticleWorkflow |
The nine stages above: a briefing in, article.typ out |
OutlineArticleWorkflow |
The planning stages, then DumpOutlineStage |
RagArticleWorkflow |
ArticleWorkflow with RagComposeSubsectionsStage as the content stage |
CompileArticleWorkflow |
Compile a .typ article to PDF |
StoreArticle |
ExtractArticleEssence → StoreArticleEssence |
The task init context carries the run's inputs: article_briefing or
article_briefing_path, article_language (detected from the briefing when unset),
writing_constraint, skills, persist_dir (the stage snapshots) and
article_output_path (the dumped deliverable). Driving the stages directly keeps the
same inputs and writes into the same context:
from pathlib import Path
from fabricatio_typst.workflows.article import ArticleWorkflow
cxt = {
"article_briefing_path": Path("article_briefing.txt"),
"article_output_path": Path("article.typ"),
"persist_dir": Path("persistent"),
}
for stage in ArticleWorkflow.iter_actions():
cxt = await stage.act(cxt)
print(cxt["task_output"]) # Path("article.typ")
Dependencies
fabricatio-core— agent framework and core modelsfabricatio-tool— filesystem utilitiesfabricatio-capabilities— capability mixins (Extract, WordCount, FinalizedDumpAble, etc.)fabricatio-context— the typed context log the pipeline's trees narrowfabricatio-skill— skill documents the planning and writing prompts rendertypst— Typst compiler Python bindings (for compilation actions)
Optional for the staged pipeline:
fabricatio-improve,fabricatio-rule— the ruleset-driven repair pass (CensoredSubsectionRepair)
Optional for RAG features:
fabricatio-lancedb— vector storage and retrieval
CLI
The package includes the ttm (TeX to Typst Math) binary:
# Convert math in a file
ttm file input.md -o output.md
# Convert raw LaTeX string
ttm raw "\frac{a}{b}"
# Convert a string with math delimiters
ttm string "The formula $\int_0^\infty e^{-x} dx$ is useful."
Configuration
All options below are read through the fabricatio configuration chain (see the
Configuration Guide). Set them under the
[ext.typst] table in fabricatio.toml, equivalently under
[tool.fabricatio.ext.typst] in pyproject.toml, or via
FABRICATIO_EXT__TYPST__<FIELD_UPPER> environment variables.
[ext.typst]
chap_summary_template = "built-in/chap_summary"
| Option | Type | Default | Description |
|---|---|---|---|
chap_summary_template |
str |
"built-in/chap_summary" |
The name of the chap summary template which will be used to generate a chapter summary. |
research_content_summary_template |
str |
"built-in/research_content_summary" |
The name of the research content summary template which will be used to generate a summary of research content. |
paragraph_sep |
str |
"// - - -" |
The separator used to separate paragraphs. |
article_wrapper |
str |
"// =-=-=-=-=-=-=-=-=-=" |
The wrapper used to wrap an article. |
extract_essence_template |
str |
"built-in/extract_essence" |
The name of the extract essence template which will be used to extract the essence of a text. |
article_metadata_requirement_template |
str |
"built-in/article_metadata_requirement" |
The name of the template used to propose the article's own plan. |
article_plan_requirement_template |
str |
"built-in/article_plan_requirement" |
The name of the template used to plan the children of one article node. |
subsection_requirement_template |
str |
"built-in/subsection_requirement" |
The name of the template used to write the prose of one subsection. |
Access at runtime: from fabricatio_typst.config import typst_config.
License
MIT — see LICENSE
Metadata
Release files for fabricatio-typst 1.0.0.dev0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 44.2 MB
Release files / fabricatio_typst-1.0.0.dev0-cp314-cp314-win_amd64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
234162e9646a65d494910241d803f1803ffb8df0a209a482b88f83b5fb766664
|
|
BLAKE2b-256 checksum How to use checksums |
97be922d597d20c60dcbf0031671f4c2b69f3f39555716d0b992ee789371adb1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp314-cp314-manylinux_2_34_x86_64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp314-cp314-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 4.0 MB |
| Tags | CPython 3.14 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
59357baf6b2397564792d0ed7e9b7e48f9a55ce7c96c9d52635ce2d1430d0568
|
|
BLAKE2b-256 checksum How to use checksums |
b329ce4c44f006c674d77b78bc3d47cfadb2c9c5cbe43bfe292bfd793df2057d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp314-cp314-manylinux_2_34_aarch64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp314-cp314-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.14 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
75e8b4ea4456e709c3455ca4c6ae8dbe3309f5dbe0bd6e800848847b9858c76c
|
|
BLAKE2b-256 checksum How to use checksums |
ddc064e479ae3e1ef7d66eeb3c656a99728d48c01187064121977b770ce2d9ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.5 MB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7999cb8f016fc67a8030cb56e377a08832e313fa6f75b1993aab833fa2da47a3
|
|
BLAKE2b-256 checksum How to use checksums |
7753531ef7d41ba0475ced4d1eb1603fd47ba63041ae3c7007ed2efaafae1dbb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp313-cp313-win_amd64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
fe9d0934f1834737185e618b797945c67214fcd03920767fd7be737aabac279a
|
|
BLAKE2b-256 checksum How to use checksums |
29ede8d6cabbbc5abe18d2b29afbddabe97b22bfc50ff22b40a0c962e005ab05
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp313-cp313-manylinux_2_34_x86_64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp313-cp313-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 4.0 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
615e0966aeb8c23013f4a6fdff544b52fb041298369283b13db7408cc4dd1b38
|
|
BLAKE2b-256 checksum How to use checksums |
170bc1eb7853179994429cb4ea835e6324ce66d3d065f787ea5bd67bb67134a0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp313-cp313-manylinux_2_34_aarch64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp313-cp313-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
7da5c715a677ae206f5152ad326749b88b9605a9d6e51b0ce60055f708007b47
|
|
BLAKE2b-256 checksum How to use checksums |
1e1222a798b25a74b4e015d31ecae63b228aa9c3602d1f1a89d6127160b05933
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.5 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
ed382bb4f352a74e2b31c67751186a3a236435f67fe587bbede5b1219d25bd97
|
|
BLAKE2b-256 checksum How to use checksums |
f0a5ef98adc45c08d92e96007fe836eedabf349e78267980e013b904ff7feb15
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp312-cp312-win_amd64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
691ac15cbcc138221167b80b7e3d546dbd134a592c627ded083206c7986f7983
|
|
BLAKE2b-256 checksum How to use checksums |
e047ed926188f23ccf906b9ed7cb38c5f3427290aa2ee4b497cebdaeb6584c31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp312-cp312-manylinux_2_34_x86_64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp312-cp312-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 4.0 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
14e2366177e41a3bb8e70c32d5b4be78f0f724395cc7c77dc6a03a6ba0186905
|
|
BLAKE2b-256 checksum How to use checksums |
745d576517fd58eddc854d994b181dea14c52fafcd31a56df1ef6ec9fd14aad5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp312-cp312-manylinux_2_34_aarch64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp312-cp312-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
fe13ca638968a4db10bfe73eb8c127abeb26ee55950c9ca86383c668cec9257e
|
|
BLAKE2b-256 checksum How to use checksums |
f0dddc90cbecea8e68fa635678ca5759881c7080887951d4c32d3b27099008bc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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_typst-1.0.0.dev0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | fabricatio_typst-1.0.0.dev0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.5 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a927aa2cbbe79381cf4fb89cba9deb8f6165c5b45928035c85b5b4ab391a9a9a
|
|
BLAKE2b-256 checksum How to use checksums |
fdaea470472442bdc84113fdf1bf2c224339a8ec758b38016728644aca3fe7c2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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}
|