forgegraph 0.0.1__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. {forgegraph-0.0.1 → forgegraph-0.2.0}/.gitignore +1 -0
  2. {forgegraph-0.0.1 → forgegraph-0.2.0}/.pre-commit-config.yaml +3 -2
  3. forgegraph-0.2.0/CHANGELOG.md +48 -0
  4. forgegraph-0.2.0/CONTRIBUTING.md +39 -0
  5. forgegraph-0.2.0/PKG-INFO +190 -0
  6. forgegraph-0.2.0/README.md +165 -0
  7. {forgegraph-0.0.1 → forgegraph-0.2.0}/TRADEMARKS.md +1 -1
  8. forgegraph-0.2.0/docs/architecture.md +613 -0
  9. {forgegraph-0.0.1 → forgegraph-0.2.0}/docs/build-plan.md +80 -104
  10. forgegraph-0.2.0/docs/decisions.md +222 -0
  11. forgegraph-0.2.0/docs/forgemark-repro-reattach.md +80 -0
  12. forgegraph-0.2.0/docs/forgemark-request.md +56 -0
  13. forgegraph-0.2.0/docs/specs/catalog/base_format.md +22 -0
  14. forgegraph-0.2.0/docs/specs/catalog/base_theme.md +222 -0
  15. forgegraph-0.2.0/docs/specs/catalog/graph_type_xy.md +202 -0
  16. forgegraph-0.2.0/docs/specs/catalog/layer_error_bar.md +26 -0
  17. forgegraph-0.2.0/docs/specs/catalog/layer_note.md +20 -0
  18. forgegraph-0.2.0/docs/specs/catalog/layer_reference_line.md +36 -0
  19. forgegraph-0.2.0/docs/specs/config/config.md +5 -0
  20. forgegraph-0.2.0/docs/specs/format/base_format.md +22 -0
  21. forgegraph-0.2.0/docs/specs/format/base_layout_format.md +14 -0
  22. forgegraph-0.2.0/docs/specs/graph_type/xy.md +90 -0
  23. forgegraph-0.2.0/docs/specs/graphspec/polarization.md +142 -0
  24. forgegraph-0.2.0/docs/specs/layer/error_bar.md +16 -0
  25. forgegraph-0.2.0/docs/specs/layer/note.md +12 -0
  26. forgegraph-0.2.0/docs/specs/layer/reference_line.md +19 -0
  27. forgegraph-0.2.0/docs/specs/layout/base_layout.md +30 -0
  28. forgegraph-0.2.0/docs/specs/pack/acme/formats/slide.md +16 -0
  29. forgegraph-0.2.0/docs/specs/pack/acme/graphspecs/polarization-curve.md +35 -0
  30. forgegraph-0.2.0/docs/specs/pack/acme/layouts/dashboard.md +18 -0
  31. forgegraph-0.2.0/docs/specs/pack/acme/pack.md +9 -0
  32. forgegraph-0.2.0/docs/specs/pack/acme/schedules/workday.md +17 -0
  33. forgegraph-0.2.0/docs/specs/pack/acme/themes/acme.md +28 -0
  34. forgegraph-0.2.0/docs/specs/pack/forgegraph_base.md +9 -0
  35. forgegraph-0.2.0/docs/specs/provenance/provenance.md +27 -0
  36. forgegraph-0.2.0/docs/specs/schedule/base_schedule.md +30 -0
  37. forgegraph-0.2.0/docs/specs/theme/base_theme.md +161 -0
  38. forgegraph-0.2.0/examples/packs/acme/formats/slide.yaml +12 -0
  39. forgegraph-0.2.0/examples/packs/acme/graphspecs/polarization-curve.yaml +31 -0
  40. forgegraph-0.2.0/examples/packs/acme/layouts/dashboard.yaml +14 -0
  41. forgegraph-0.2.0/examples/packs/acme/pack.yaml +5 -0
  42. forgegraph-0.2.0/examples/packs/acme/references/house.md +10 -0
  43. forgegraph-0.2.0/examples/packs/acme/schedules/workday.yaml +13 -0
  44. forgegraph-0.2.0/examples/packs/acme/themes/acme.yaml +24 -0
  45. forgegraph-0.2.0/examples/sample-data/README.md +38 -0
  46. forgegraph-0.2.0/examples/sample-data/air_passengers.csv +145 -0
  47. forgegraph-0.2.0/examples/sample-data/air_passengers_by_month.csv +13 -0
  48. forgegraph-0.2.0/examples/sample-data/anscombe.csv +45 -0
  49. forgegraph-0.2.0/examples/sample-data/assay_summary.csv +31 -0
  50. forgegraph-0.2.0/examples/sample-data/cell_durability.csv +299 -0
  51. forgegraph-0.2.0/examples/sample-data/cell_polarization.csv +100 -0
  52. forgegraph-0.2.0/examples/sample-data/co2_monthly.csv +803 -0
  53. forgegraph-0.2.0/examples/sample-data/diamonds.csv +15001 -0
  54. forgegraph-0.2.0/examples/sample-data/dose_response.csv +91 -0
  55. forgegraph-0.2.0/examples/sample-data/economics.csv +577 -0
  56. forgegraph-0.2.0/examples/sample-data/enzyme_kinetics.csv +25 -0
  57. forgegraph-0.2.0/examples/sample-data/fmri.csv +1065 -0
  58. forgegraph-0.2.0/examples/sample-data/gapminder.csv +661 -0
  59. forgegraph-0.2.0/examples/sample-data/geyser.csv +273 -0
  60. forgegraph-0.2.0/examples/sample-data/growth.csv +545 -0
  61. forgegraph-0.2.0/examples/sample-data/iris.csv +151 -0
  62. forgegraph-0.2.0/examples/sample-data/lab_export.xlsx +0 -0
  63. forgegraph-0.2.0/examples/sample-data/lab_runs.xlsx +0 -0
  64. forgegraph-0.2.0/examples/sample-data/penguins.csv +345 -0
  65. forgegraph-0.2.0/examples/sample-data/seaice.csv +1827 -0
  66. forgegraph-0.2.0/examples/sample-data/sensor_log_eu.csv +49 -0
  67. forgegraph-0.2.0/examples/sample-data/stocks.csv +561 -0
  68. forgegraph-0.2.0/examples/sample-data/tips.csv +245 -0
  69. forgegraph-0.2.0/examples/sample-data/weather.xlsx +0 -0
  70. {forgegraph-0.0.1 → forgegraph-0.2.0}/pyproject.toml +21 -11
  71. forgegraph-0.2.0/scripts/build_api_notebook.py +196 -0
  72. forgegraph-0.2.0/scripts/build_bundled_skill.py +48 -0
  73. forgegraph-0.2.0/scripts/build_example_data.py +102 -0
  74. forgegraph-0.2.0/scripts/build_recreations.py +125 -0
  75. forgegraph-0.2.0/scripts/build_sample_data.py +567 -0
  76. {forgegraph-0.0.1 → forgegraph-0.2.0}/scripts/check_denylist.py +10 -1
  77. forgegraph-0.2.0/scripts/forgemark.py +13 -0
  78. forgegraph-0.2.0/scripts/mirror_specs.py +23 -0
  79. forgegraph-0.2.0/scripts/report_skill_evals.py +129 -0
  80. forgegraph-0.2.0/scripts/run_skill_evals.py +941 -0
  81. forgegraph-0.2.0/scripts/smoke_installed.py +103 -0
  82. forgegraph-0.2.0/scripts/visual_changelog.py +134 -0
  83. forgegraph-0.2.0/src/forgegraph/__init__.py +58 -0
  84. forgegraph-0.2.0/src/forgegraph/__main__.py +5 -0
  85. forgegraph-0.2.0/src/forgegraph/canvas.py +147 -0
  86. forgegraph-0.2.0/src/forgegraph/catalog/build.py +362 -0
  87. forgegraph-0.2.0/src/forgegraph/catalog/examples.py +120 -0
  88. forgegraph-0.2.0/src/forgegraph/catalog/files.py +224 -0
  89. forgegraph-0.2.0/src/forgegraph/catalog/forgemark.py +59 -0
  90. forgegraph-0.2.0/src/forgegraph/catalog/page.py +276 -0
  91. forgegraph-0.2.0/src/forgegraph/catalogs/graph_types/xy.yaml +198 -0
  92. forgegraph-0.2.0/src/forgegraph/catalogs/layers/error_bar.yaml +22 -0
  93. forgegraph-0.2.0/src/forgegraph/catalogs/layers/note.yaml +16 -0
  94. forgegraph-0.2.0/src/forgegraph/catalogs/layers/reference_line.yaml +32 -0
  95. forgegraph-0.2.0/src/forgegraph/cli/__init__.py +740 -0
  96. forgegraph-0.2.0/src/forgegraph/drawing/axes.py +681 -0
  97. forgegraph-0.2.0/src/forgegraph/drawing/colorbar.py +99 -0
  98. forgegraph-0.2.0/src/forgegraph/drawing/export.py +134 -0
  99. forgegraph-0.2.0/src/forgegraph/drawing/figure.py +319 -0
  100. forgegraph-0.2.0/src/forgegraph/drawing/key.py +277 -0
  101. forgegraph-0.2.0/src/forgegraph/drawing/labels.py +312 -0
  102. forgegraph-0.2.0/src/forgegraph/drawing/layers.py +560 -0
  103. forgegraph-0.2.0/src/forgegraph/drawing/lint.py +290 -0
  104. forgegraph-0.2.0/src/forgegraph/drawing/marks.py +636 -0
  105. forgegraph-0.2.0/src/forgegraph/drawing/markup.py +42 -0
  106. forgegraph-0.2.0/src/forgegraph/drawing/page.py +219 -0
  107. forgegraph-0.2.0/src/forgegraph/drawing/spacing.py +173 -0
  108. forgegraph-0.2.0/src/forgegraph/drawing/style.py +186 -0
  109. forgegraph-0.2.0/src/forgegraph/drawing/text.py +187 -0
  110. forgegraph-0.2.0/src/forgegraph/drawing/ticks.py +482 -0
  111. forgegraph-0.2.0/src/forgegraph/drawing/xy.py +852 -0
  112. forgegraph-0.2.0/src/forgegraph/fonts/IBMPlexSerif-Bold.ttf +0 -0
  113. forgegraph-0.2.0/src/forgegraph/fonts/IBMPlexSerif-Light.ttf +0 -0
  114. forgegraph-0.2.0/src/forgegraph/fonts/IBMPlexSerif-Medium.ttf +0 -0
  115. forgegraph-0.2.0/src/forgegraph/fonts/IBMPlexSerif-Regular.ttf +0 -0
  116. forgegraph-0.2.0/src/forgegraph/fonts/IBMPlexSerif-SemiBold.ttf +0 -0
  117. forgegraph-0.2.0/src/forgegraph/fonts/OFL-IBMPlexSerif.txt +93 -0
  118. forgegraph-0.2.0/src/forgegraph/fonts/OFL-Roboto.txt +93 -0
  119. forgegraph-0.2.0/src/forgegraph/fonts/Roboto-Bold.ttf +0 -0
  120. forgegraph-0.2.0/src/forgegraph/fonts/Roboto-Italic.ttf +0 -0
  121. forgegraph-0.2.0/src/forgegraph/fonts/Roboto-Light.ttf +0 -0
  122. forgegraph-0.2.0/src/forgegraph/fonts/Roboto-Medium.ttf +0 -0
  123. forgegraph-0.2.0/src/forgegraph/fonts/Roboto-Regular.ttf +0 -0
  124. forgegraph-0.2.0/src/forgegraph/fonts/Roboto-SemiBold.ttf +0 -0
  125. forgegraph-0.2.0/src/forgegraph/fonts/SourceSans3-Light.ttf +0 -0
  126. forgegraph-0.2.0/src/forgegraph/fonts/SourceSans3-Medium.ttf +0 -0
  127. forgegraph-0.2.0/src/forgegraph/fonts/__init__.py +61 -0
  128. forgegraph-0.2.0/src/forgegraph/graph.py +563 -0
  129. forgegraph-0.2.0/src/forgegraph/graph_types/__init__.py +1 -0
  130. forgegraph-0.2.0/src/forgegraph/graph_types/xy.yaml +85 -0
  131. forgegraph-0.2.0/src/forgegraph/jobs/__init__.py +9 -0
  132. forgegraph-0.2.0/src/forgegraph/jobs/run.py +413 -0
  133. forgegraph-0.2.0/src/forgegraph/jobs/status.py +82 -0
  134. forgegraph-0.2.0/src/forgegraph/layers/error_bar.yaml +12 -0
  135. forgegraph-0.2.0/src/forgegraph/layers/note.yaml +8 -0
  136. forgegraph-0.2.0/src/forgegraph/layers/reference_line.yaml +15 -0
  137. forgegraph-0.2.0/src/forgegraph/layouts/__init__.py +639 -0
  138. forgegraph-0.2.0/src/forgegraph/layouts/arrange.py +403 -0
  139. forgegraph-0.2.0/src/forgegraph/packs/__init__.py +270 -0
  140. forgegraph-0.2.0/src/forgegraph/packs/config.toml +1 -0
  141. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/catalogs/formats/base_format.yaml +18 -0
  142. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/catalogs/formats/base_layout_format.yaml +9 -0
  143. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/catalogs/themes/base_theme.yaml +218 -0
  144. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/formats/base_format.yaml +18 -0
  145. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/formats/base_layout_format.yaml +10 -0
  146. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/graphspecs/dated.parquet +0 -0
  147. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/graphspecs/fanned.parquet +0 -0
  148. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/graphspecs/polarization.parquet +0 -0
  149. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/graphspecs/polarization.yaml +138 -0
  150. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/graphspecs/reinforced.parquet +0 -0
  151. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/layouts/base_layout.yaml +26 -0
  152. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/pack.yaml +5 -0
  153. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/schedules/base_schedule.yaml +26 -0
  154. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/themes/base_theme.yaml +157 -0
  155. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/catalogs/formats/compact_format.yaml +9 -0
  156. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/catalogs/themes/base_theme.yaml +26 -0
  157. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/formats/compact_format.yaml +13 -0
  158. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/graphspecs/dated.parquet +0 -0
  159. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/graphspecs/example.yaml +13 -0
  160. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/graphspecs/fanned.parquet +0 -0
  161. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/graphspecs/polarization.parquet +0 -0
  162. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/graphspecs/reinforced.parquet +0 -0
  163. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/pack.yaml +5 -0
  164. forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/themes/base_theme.yaml +72 -0
  165. forgegraph-0.2.0/src/forgegraph/skill/__init__.py +82 -0
  166. forgegraph-0.2.0/src/forgegraph/skill/forgegraph/SKILL.md +50 -0
  167. forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/bars.yaml +35 -0
  168. forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/figure.layout.yaml +16 -0
  169. forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/figure.schedule.yaml +11 -0
  170. forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/layers.yaml +37 -0
  171. forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/xy.parquet +0 -0
  172. forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/xy.yaml +25 -0
  173. forgegraph-0.2.0/src/forgegraph/skill/forgegraph/references/requests.md +7 -0
  174. forgegraph-0.2.0/src/forgegraph/skill/forgegraph/references/themes_formats_configs.md +44 -0
  175. forgegraph-0.2.0/src/forgegraph/spec/__init__.py +9 -0
  176. forgegraph-0.2.0/src/forgegraph/spec/common.py +11 -0
  177. forgegraph-0.2.0/src/forgegraph/spec/documents.py +874 -0
  178. forgegraph-0.2.0/src/forgegraph/spec/layout.py +288 -0
  179. forgegraph-0.2.0/src/forgegraph/spec/parameters.py +468 -0
  180. forgegraph-0.2.0/src/forgegraph/spec/provenance.py +63 -0
  181. forgegraph-0.2.0/src/forgegraph/spec/provenance.yaml +23 -0
  182. forgegraph-0.2.0/src/forgegraph/spec/schedule.py +227 -0
  183. forgegraph-0.2.0/tests/baselines/crowded_runs.png +0 -0
  184. forgegraph-0.2.0/tests/baselines/flow_sweep_wide.png +0 -0
  185. forgegraph-0.2.0/tests/baselines/fuel_by_size.png +0 -0
  186. forgegraph-0.2.0/tests/baselines/layout_anode_layers.png +0 -0
  187. forgegraph-0.2.0/tests/baselines/layout_screening_and_rate.png +0 -0
  188. forgegraph-0.2.0/tests/baselines/polarization.png +0 -0
  189. forgegraph-0.2.0/tests/baselines/polarization_narrow.png +0 -0
  190. forgegraph-0.2.0/tests/baselines/precipitation_loglog.png +0 -0
  191. forgegraph-0.2.0/tests/baselines/replicates.png +0 -0
  192. forgegraph-0.2.0/tests/baselines/screening_scatter.png +0 -0
  193. forgegraph-0.2.0/tests/baselines/separator_colorbar.png +0 -0
  194. forgegraph-0.2.0/tests/conftest.py +30 -0
  195. forgegraph-0.2.0/tests/fixtures/catalog_comments.html +130 -0
  196. forgegraph-0.2.0/tests/pack_helpers.py +25 -0
  197. forgegraph-0.2.0/tests/recreations.py +483 -0
  198. forgegraph-0.2.0/tests/render_helpers.py +96 -0
  199. forgegraph-0.2.0/tests/spec_mirror.py +221 -0
  200. forgegraph-0.2.0/tests/test_axes.py +439 -0
  201. forgegraph-0.2.0/tests/test_blank.py +56 -0
  202. forgegraph-0.2.0/tests/test_catalog.py +290 -0
  203. forgegraph-0.2.0/tests/test_cli.py +364 -0
  204. {forgegraph-0.0.1 → forgegraph-0.2.0}/tests/test_denylist.py +8 -0
  205. forgegraph-0.2.0/tests/test_jobs.py +286 -0
  206. forgegraph-0.2.0/tests/test_key_position.py +77 -0
  207. forgegraph-0.2.0/tests/test_layers.py +513 -0
  208. forgegraph-0.2.0/tests/test_layout.py +642 -0
  209. forgegraph-0.2.0/tests/test_lint.py +105 -0
  210. forgegraph-0.2.0/tests/test_marks.py +350 -0
  211. forgegraph-0.2.0/tests/test_markup.py +31 -0
  212. forgegraph-0.2.0/tests/test_packs.py +404 -0
  213. forgegraph-0.2.0/tests/test_perturbation.py +48 -0
  214. forgegraph-0.2.0/tests/test_regression.py +42 -0
  215. forgegraph-0.2.0/tests/test_render.py +779 -0
  216. forgegraph-0.2.0/tests/test_schedule.py +85 -0
  217. {forgegraph-0.0.1 → forgegraph-0.2.0}/tests/test_smoke.py +3 -2
  218. forgegraph-0.2.0/tests/test_spec_mirrors.py +14 -0
  219. forgegraph-0.2.0/tests/test_specs.py +542 -0
  220. forgegraph-0.2.0/tests/test_text.py +140 -0
  221. {forgegraph-0.0.1 → forgegraph-0.2.0}/uv.lock +76 -159
  222. forgegraph-0.0.1/.github/workflows/ci.yml +0 -63
  223. forgegraph-0.0.1/.github/workflows/publish.yml +0 -17
  224. forgegraph-0.0.1/CONTRIBUTING.md +0 -15
  225. forgegraph-0.0.1/PKG-INFO +0 -42
  226. forgegraph-0.0.1/README.md +0 -13
  227. forgegraph-0.0.1/docs/architecture.md +0 -640
  228. forgegraph-0.0.1/docs/decisions.md +0 -7
  229. forgegraph-0.0.1/src/forgegraph/__init__.py +0 -10
  230. forgegraph-0.0.1/src/forgegraph/charts/__init__.py +0 -1
  231. forgegraph-0.0.1/src/forgegraph/cli/__init__.py +0 -22
  232. forgegraph-0.0.1/src/forgegraph/data/__init__.py +0 -1
  233. forgegraph-0.0.1/src/forgegraph/formats/__init__.py +0 -1
  234. forgegraph-0.0.1/src/forgegraph/jobs/__init__.py +0 -1
  235. forgegraph-0.0.1/src/forgegraph/layers/__init__.py +0 -1
  236. forgegraph-0.0.1/src/forgegraph/layout/__init__.py +0 -1
  237. forgegraph-0.0.1/src/forgegraph/packs/__init__.py +0 -1
  238. forgegraph-0.0.1/src/forgegraph/skill/__init__.py +0 -1
  239. forgegraph-0.0.1/src/forgegraph/spec/__init__.py +0 -3
  240. forgegraph-0.0.1/src/forgegraph/themes/__init__.py +0 -21
  241. {forgegraph-0.0.1 → forgegraph-0.2.0}/LICENSE +0 -0
  242. {forgegraph-0.0.1 → forgegraph-0.2.0}/docs/initial specification.md +0 -0
  243. {forgegraph-0.0.1 → forgegraph-0.2.0}/src/forgegraph/catalog/__init__.py +0 -0
  244. {forgegraph-0.0.1/src/forgegraph/render → forgegraph-0.2.0/src/forgegraph/drawing}/__init__.py +0 -0
  245. {forgegraph-0.0.1/src/forgegraph/themes → forgegraph-0.2.0/src/forgegraph}/fonts/OFL-SourceSans3.md +0 -0
  246. {forgegraph-0.0.1/src/forgegraph/themes → forgegraph-0.2.0/src/forgegraph}/fonts/SourceSans3-Bold.ttf +0 -0
  247. {forgegraph-0.0.1/src/forgegraph/themes → forgegraph-0.2.0/src/forgegraph}/fonts/SourceSans3-It.ttf +0 -0
  248. {forgegraph-0.0.1/src/forgegraph/themes → forgegraph-0.2.0/src/forgegraph}/fonts/SourceSans3-Regular.ttf +0 -0
  249. {forgegraph-0.0.1/src/forgegraph/themes → forgegraph-0.2.0/src/forgegraph}/fonts/SourceSans3-Semibold.ttf +0 -0
@@ -18,3 +18,4 @@ dist/
18
18
  .coverage
19
19
  htmlcov/
20
20
  .ipynb_checkpoints/
21
+ .cache/
@@ -5,11 +5,12 @@ repos:
5
5
  - id: check-yaml
6
6
  - id: check-toml
7
7
  - id: end-of-file-fixer
8
- exclude: \.md$
8
+ exclude: \.md$|^(review|catalog)/
9
9
  - id: trailing-whitespace
10
- exclude: \.md$
10
+ exclude: \.md$|^(review|catalog)/
11
11
  - id: check-added-large-files
12
12
  args: [--maxkb=600]
13
+ exclude: ^(review|catalog)/ # self-contained HTML pages embed their images
13
14
  - repo: https://github.com/astral-sh/ruff-pre-commit
14
15
  rev: v0.17.1
15
16
  hooks:
@@ -0,0 +1,48 @@
1
+ # Changelog
2
+
3
+ ForgeGraph follows [semantic versioning](https://semver.org). Before 1.0, a minor version may change how graphs look or how specs are written. From 0.1.0 on, each release's entry links its visual changelog: before and after images of every catalog card and regression graph that changed, made with `scripts/visual_changelog.py`.
4
+
5
+ ## 0.2.0 (2026-10-24)
6
+
7
+ Images that changed: the [visual changelog](review/visual-changelog/0.2.0.html).
8
+
9
+ ### Changed
10
+
11
+ - Error bars are black by default in both built-in themes, and their color (`layer.error_bar.color`) is a variable parameter: a GraphSpec may set `series` or any hex color.
12
+ - Three internal modules are renamed so none shares a name with the API: `forgegraph.render` is `forgegraph.drawing`, `forgegraph.layout` is `forgegraph.layouts` and `forgegraph.blank` is `forgegraph.canvas`. `import forgegraph.layouts as m` now gives the module, not `fg.layout`. The API is unchanged.
13
+
14
+ ### Fixed
15
+
16
+ - `forgegraph --version` and `--help` no longer load matplotlib and pandas, so they answer at once, even on a new install. The API loads on first use.
17
+ - The README and the skill's reference say when the main config is written: the first time a command reads the configs, such as `catalog` or `render`.
18
+ - Error bars on side-by-side bars (`series.offset: side_by_side`) are drawn on their own bars. Before, every series but the middle one had its error bars drawn where they were first placed, before layout, usually off the axes.
19
+
20
+ ## 0.1.0 (2026-10-24)
21
+
22
+ The first public release.
23
+
24
+ ### Added
25
+
26
+ - **GraphSpecs:** a graph described in YAML or as a Python dict, drawn with `forgegraph render` or `fg.render`; `fg.xy` draws straight from a DataFrame.
27
+ - **The `xy` graph type:**
28
+ - lines, markers and bars: grouped, stacked, 100 % stacked and horizontal;
29
+ - dates and log axes, value labels, a benchmark series;
30
+ - series named beside their lines or in a key.
31
+ - **Layers:** reference lines, notes and error bars, from the data or given.
32
+ - **Themes and formats:** a theme fixes what must stay the same and gives defaults for the rest; a format sets size, base font size, file types and resolution.
33
+ - **Packs and configs:**
34
+ - every named spec comes from a pack, named `pack/name`; ForgeGraph's own is `forgegraph_base`, and `forgegraph_base_2` is a second look in this repository;
35
+ - the main config (written on first use, or named by `FORGEGRAPH_CONFIG`) and folder configs (`forgegraph.toml`) say which packs may be used;
36
+ - a pack only a folder config lists is non-standard: it works, and what's drawn with it is watermarked.
37
+ - **Lint on every render:** overlapping or clipped text, a key covering data, fonts too small for the format, missing fonts, dropped rows and more.
38
+ - **Provenance:** every saved file (PNG, JPEG, TIFF, SVG, PDF and HTML) records its GraphSpec and the specs it was drawn with, at the format's provenance level; `forgegraph load` reads it back.
39
+ - **Layouts:** several GraphSpecs in one figure, with spanning tiles, blank cells and set widths; tabs, and HTML dashboards.
40
+ - **Scheduled renders:** schedule files, `forgegraph job run`, a status file, `on_failure` and `on_success` hooks, a "data as of" footnote and a stale banner.
41
+ - **The themed canvas:** `forgegraph.blank(theme, format)` for what no graph type can draw, always watermarked as non-standard.
42
+ - **The agent skill** for Claude Code, installed with `forgegraph skill install`, with reference notes for themes, formats and configs, and for filing requests.
43
+ - **Commands:** `render`, `explain`, `catalog`, `schema`, `pack-notes`, `load`, `job run` and `skill install`, each with `--json`.
44
+ - **Catalogs:** a page for each pack in this repository, with a card for every parameter.
45
+
46
+ ## 0.0.1 (2026-10-17)
47
+
48
+ The name, reserved on PyPI. No functionality.
@@ -0,0 +1,39 @@
1
+ # Contributing
2
+
3
+ Contributions are welcome. For a bug or a feature request, open an [issue](https://github.com/sskaye/forgegraph/issues). For a change, open a pull request with tests, after running the checks below.
4
+
5
+ ## Development setup
6
+
7
+ ```bash
8
+ uv sync
9
+ uv run pre-commit install
10
+ ```
11
+
12
+ While you work, `uv run pytest` runs the development suite: every test not marked slow, in parallel. The full suite adds the slow ones (every catalog card drawn, the image baselines, the catalog pages, and any test over a second). CI runs it on every pull request, and it's the one to run before a release:
13
+
14
+ ```bash
15
+ uv run pytest --full && uv run ruff check . && uv run pyright
16
+ ```
17
+
18
+ Mark a new test `@pytest.mark.slow` if it takes over a second (`uv run pytest --durations=20` lists the slowest).
19
+
20
+ ## After changing a definition or how graphs are drawn
21
+
22
+ A new or changed parameter needs its card in the matching catalog file under `src/forgegraph/catalogs/`; the build refuses a catalog that misses one.
23
+
24
+
25
+ Rebuild the review catalog (it keeps its review comments; Node 18+ is needed once it has some), and the image baselines if graphs look different on purpose:
26
+
27
+ ```bash
28
+ uv run forgegraph catalog build
29
+ uv run forgegraph catalog build --pack forgegraph_base_2
30
+ uv run python scripts/mirror_specs.py
31
+ uv run python scripts/build_recreations.py --baselines
32
+ ```
33
+
34
+ `uv run python scripts/visual_changelog.py main` then shows every image that changed.
35
+
36
+ ## Requesting a chart type
37
+
38
+ Open a GitHub issue describing the graph you need, ideally with an example image or sketch and a little sample data. No code is needed.
39
+
@@ -0,0 +1,190 @@
1
+ Metadata-Version: 2.5
2
+ Name: forgegraph
3
+ Version: 0.2.0
4
+ Summary: Consistent, high-quality graphs from pandas DataFrames, for people and AI agents. Early development.
5
+ Project-URL: Repository, https://github.com/sskaye/forgegraph
6
+ Author: Steven Kaye
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 1 - Planning
10
+ Classifier: Intended Audience :: Science/Research
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Topic :: Scientific/Engineering :: Visualization
16
+ Requires-Python: >=3.12
17
+ Requires-Dist: matplotlib>=3.9
18
+ Requires-Dist: packaging>=23
19
+ Requires-Dist: pandas>=2.2
20
+ Requires-Dist: pyarrow>=17
21
+ Requires-Dist: pydantic>=2.7
22
+ Requires-Dist: ruamel-yaml>=0.18
23
+ Requires-Dist: typer>=0.12
24
+ Description-Content-Type: text/markdown
25
+
26
+ # ForgeGraph
27
+
28
+ Fast, consistent, publication-quality graphs from pandas DataFrames, useable by people and AI agents.
29
+
30
+ You describe a graph in a **GraphSpec**. ForgeGraph draws it in a house style set by a **theme** and a **format**. It checks what it drew, and records how the graph was made inside the saved file. An agent skill lets agents make and revise graphs the same way.
31
+
32
+ **<u>Key Features</u>**
33
+
34
+ - **Themes:** fixes the look of the graph (fonts, palette, lines, keys, etc.).
35
+ - **Formats:** sets the destination: figure size, base font size, file types and resolution, e.g. a slide, a journal column or a dashboard tile.
36
+ - **GraphTypes:** defines the type of graph and its parameters. E.g. `xy` (lines, markers and bars).
37
+ - **Layers:** features drawn over a graph. E.g. reference lines, notes, & error bars.
38
+ - **GraphSpecs:** specify the data, theme, format, and all customizable properties.
39
+ - **Layouts:** combine multiple graphs into a larger figure or multi-tab dashboard.
40
+ - **Scheduled renders:** re-render graphs and dashboards on a schedule set with cron, launchd, or by an agent.
41
+ - **Provenance:** every saved file contains its specifications as metadata, enabling inspection of how the graph was made and reproduction of it.
42
+ - **Packs:** collect together a set of themes and formats for different use cases. E.g. a company or lab’s standard style, journal requirements, etc.
43
+ - **Configs:** control which packs may be used, per user or folder. Used to enforce use of style pack(s) and watermark non-standard graphs.
44
+ - **Lint:** Graphs are linted on rendering, with warnings for issues including overlapping or clipped text, a key covering data, or fonts too small.
45
+
46
+ **Status:** 0.x. `xy` graph type (lines, markers, & bars), reference lines, error bars, and notes layers, initial style packs. More graph types coming soon. If there’s specific ones you want, [open an issue](https://github.com/sskaye/forgegraph/issues).
47
+
48
+ ## Install
49
+
50
+ ForgeGraph needs Python 3.12 or later.
51
+
52
+ ```bash
53
+ pip install forgegraph
54
+ ```
55
+
56
+ For the `forgegraph` command on its own, `uv tool install forgegraph` works too. To install the skill for Claude Code:
57
+
58
+ ```bash
59
+ forgegraph skill install
60
+ ```
61
+
62
+ For another agent, give the folder it reads skills from:
63
+
64
+ ```bash
65
+ forgegraph skill install --dest <skills folder>
66
+ ```
67
+
68
+ Then ask your agent for a graph: the skill takes it from your data to a finished graph, saving the GraphSpec beside it.
69
+
70
+ ## Quick start
71
+
72
+ In Python:
73
+
74
+ ```python
75
+ import pandas as pd
76
+ import forgegraph as fg
77
+
78
+ runs = pd.DataFrame({
79
+ "hours": [0, 1, 2, 3, 0, 1, 2, 3],
80
+ "voltage": [0.72, 0.71, 0.70, 0.69, 0.73, 0.73, 0.72, 0.72],
81
+ "cell": ["A", "A", "A", "A", "B", "B", "B", "B"],
82
+ })
83
+ g = fg.xy(runs, x="hours", y="voltage", color="cell", title="Cell voltage")
84
+ g.save("voltage") # voltage.png, with its GraphSpec inside
85
+ ```
86
+
87
+ From the command line, with the DataFrame saved as runs.parquet and a GraphSpec, voltage.yaml:
88
+
89
+ ```yaml
90
+ name: voltage
91
+ version: 0
92
+ description: Cell voltage over a test, one line per cell.
93
+ extends: None
94
+ fixed_parameters: None
95
+ variable_parameters:
96
+ specifications:
97
+ graph_type: xy
98
+ theme: forgegraph_base/base_theme
99
+ format: forgegraph_base/base_format
100
+ text:
101
+ title: Cell voltage
102
+ data:
103
+ file: runs.parquet
104
+ preprocessing: None
105
+ axis:
106
+ x:
107
+ data:
108
+ column: hours
109
+ y:
110
+ data:
111
+ column: voltage
112
+ encoding:
113
+ color: cell
114
+ ```
115
+
116
+ ```bash
117
+ forgegraph render voltage.yaml
118
+ ```
119
+
120
+ ## Packs and configs
121
+
122
+ Every named theme, format, GraphSpec, layout and schedule comes from a **pack**, a folder or pip package of specs, and is named `pack/name`. The initial built-in packs are `forgegraph_base` and `forgegraph_base_2`, stored in src/forgegraph/packs.
123
+
124
+ A **config** lists the packs that may be used:
125
+
126
+ - The main config, `~/.config/forgegraph/config.toml` (or the file `FORGEGRAPH_CONFIG` names), applies to all work. ForgeGraph writes it, listing the built-in packs, the first time a command reads the configs, such as `catalog` or `render`.
127
+ - A folder config, `forgegraph.toml`, applies to the files in its folder and every folder below it. A file may use only the packs it lists.
128
+ - A pack that a folder config lists but the main config doesn't still works, but it's non-standard: graphs drawn with it are watermarked, and ForgeGraph's commands say so. That way you can make and try a pack without changing an organization's main config.
129
+
130
+ ## Commands
131
+
132
+ - `forgegraph render <graphspec or layout>`: draw and save, and report lint.
133
+ - `forgegraph explain <graphspec or layout>`: every value it's drawn with, and which file set it.
134
+ - `forgegraph catalog`: the packs, graph types, layer types, themes, formats and reference notes available here.
135
+ - `forgegraph schema graphspec --graph-type <type> --theme <theme> --format <format>`: every parameter a GraphSpec can set.
136
+ - `forgegraph schema <kind>`: every parameter of a theme, format, layer, layout, schedule, pack or config.
137
+ - `forgegraph pack-notes`: the reference notes of the packs available here.
138
+ - `forgegraph load <file>`: a saved graph's record, and its GraphSpec.
139
+ - `forgegraph job run <schedule>`: render a schedule's GraphSpecs and layouts once.
140
+ - `forgegraph skill install`: install the agent skill.
141
+
142
+ Every command takes `--help`, and `--json` for agents.
143
+
144
+ ## Catalogs
145
+
146
+ Each pack in this repository has a catalog: a page with a card for each parameter, showing what changing it does.
147
+
148
+ - forgegraph_base: ForgeGraph's own pack, with its graph types and layer types.
149
+ - forgegraph_base_2: its own theme and format, and the same graph types and layer types drawn in them.
150
+
151
+ ## Your graphs are yours
152
+
153
+ ForgeGraph is [MIT-licensed](LICENSE). Graphs and other output you make with it are yours: no attribution or licence terms apply to them. See TRADEMARKS.md for use of the name.
154
+
155
+ ## Documentation
156
+
157
+ - Architecture: how ForgeGraph is designed, and why.
158
+ - Decisions: decisions that refine the architecture.
159
+ - Specifications: every spec, a folder per kind.
160
+ - [Changelog](CHANGELOG.md).
161
+ - Build plan: how ForgeGraph is being built, phase by phase.
162
+
163
+ ## Contributing
164
+
165
+ Feature requests and bug reports go to [GitHub issues](https://github.com/sskaye/forgegraph/issues); the skill can file them for you. CONTRIBUTING.md covers working on ForgeGraph itself. In short:
166
+
167
+ ```bash
168
+ uv sync && uv run pre-commit install
169
+ ```
170
+
171
+ ```bash
172
+ uv run pytest --full && uv run ruff check . && uv run pyright
173
+ ```
174
+
175
+ ## Repository map
176
+
177
+ - **src/forgegraph/**: the package.
178
+ - `graph.py`: the Python API (`fg.xy`, `fg.render`, `fg.graphspec`, `fg.load`) and the `Graph` object; `canvas.py`: the themed canvas.
179
+ - **cli/**: the `forgegraph` command.
180
+ - **spec/**: reading, checking and resolving specs, and the provenance record.
181
+ - **drawing/**: drawing, layout and lint. **layouts/**: layouts. **jobs/**: scheduled renders.
182
+ - **packs/**: packs and configs, and the built-in packs `forgegraph_base` and `forgegraph_base_2`. **fonts/**: bundled fonts and their licences.
183
+ - **graph_types/**, **layers/**: the graph type and layer type definitions. **catalog/**, **catalogs/**: the catalog builder, and each definition's catalog file.
184
+ - **skill/forgegraph/**: the agent skill.
185
+ - **catalog/**: the generated catalog pages.
186
+ - **examples/**: sample data, and `packs/acme`, an example pack in a deliberately different style.
187
+ - **evals/skill/**: the skill's eval cases, run by `scripts/run_skill_evals.py`.
188
+ - **tests/**, **scripts/**: tests, and build and maintenance scripts.
189
+ - **docs/**: the documents above. **review/**: each build phase's review pages.
190
+
@@ -0,0 +1,165 @@
1
+ # ForgeGraph
2
+
3
+ Fast, consistent, publication-quality graphs from pandas DataFrames, useable by people and AI agents.
4
+
5
+ You describe a graph in a **GraphSpec**. ForgeGraph draws it in a house style set by a **theme** and a **format**. It checks what it drew, and records how the graph was made inside the saved file. An agent skill lets agents make and revise graphs the same way.
6
+
7
+ **<u>Key Features</u>**
8
+
9
+ - **Themes:** fixes the look of the graph (fonts, palette, lines, keys, etc.).
10
+ - **Formats:** sets the destination: figure size, base font size, file types and resolution, e.g. a slide, a journal column or a dashboard tile.
11
+ - **GraphTypes:** defines the type of graph and its parameters. E.g. `xy` (lines, markers and bars).
12
+ - **Layers:** features drawn over a graph. E.g. reference lines, notes, & error bars.
13
+ - **GraphSpecs:** specify the data, theme, format, and all customizable properties.
14
+ - **Layouts:** combine multiple graphs into a larger figure or multi-tab dashboard.
15
+ - **Scheduled renders:** re-render graphs and dashboards on a schedule set with cron, launchd, or by an agent.
16
+ - **Provenance:** every saved file contains its specifications as metadata, enabling inspection of how the graph was made and reproduction of it.
17
+ - **Packs:** collect together a set of themes and formats for different use cases. E.g. a company or lab’s standard style, journal requirements, etc.
18
+ - **Configs:** control which packs may be used, per user or folder. Used to enforce use of style pack(s) and watermark non-standard graphs.
19
+ - **Lint:** Graphs are linted on rendering, with warnings for issues including overlapping or clipped text, a key covering data, or fonts too small.
20
+
21
+ **Status:** 0.x. `xy` graph type (lines, markers, & bars), reference lines, error bars, and notes layers, initial style packs. More graph types coming soon. If there’s specific ones you want, [open an issue](https://github.com/sskaye/forgegraph/issues).
22
+
23
+ ## Install
24
+
25
+ ForgeGraph needs Python 3.12 or later.
26
+
27
+ ```bash
28
+ pip install forgegraph
29
+ ```
30
+
31
+ For the `forgegraph` command on its own, `uv tool install forgegraph` works too. To install the skill for Claude Code:
32
+
33
+ ```bash
34
+ forgegraph skill install
35
+ ```
36
+
37
+ For another agent, give the folder it reads skills from:
38
+
39
+ ```bash
40
+ forgegraph skill install --dest <skills folder>
41
+ ```
42
+
43
+ Then ask your agent for a graph: the skill takes it from your data to a finished graph, saving the GraphSpec beside it.
44
+
45
+ ## Quick start
46
+
47
+ In Python:
48
+
49
+ ```python
50
+ import pandas as pd
51
+ import forgegraph as fg
52
+
53
+ runs = pd.DataFrame({
54
+ "hours": [0, 1, 2, 3, 0, 1, 2, 3],
55
+ "voltage": [0.72, 0.71, 0.70, 0.69, 0.73, 0.73, 0.72, 0.72],
56
+ "cell": ["A", "A", "A", "A", "B", "B", "B", "B"],
57
+ })
58
+ g = fg.xy(runs, x="hours", y="voltage", color="cell", title="Cell voltage")
59
+ g.save("voltage") # voltage.png, with its GraphSpec inside
60
+ ```
61
+
62
+ From the command line, with the DataFrame saved as runs.parquet and a GraphSpec, voltage.yaml:
63
+
64
+ ```yaml
65
+ name: voltage
66
+ version: 0
67
+ description: Cell voltage over a test, one line per cell.
68
+ extends: None
69
+ fixed_parameters: None
70
+ variable_parameters:
71
+ specifications:
72
+ graph_type: xy
73
+ theme: forgegraph_base/base_theme
74
+ format: forgegraph_base/base_format
75
+ text:
76
+ title: Cell voltage
77
+ data:
78
+ file: runs.parquet
79
+ preprocessing: None
80
+ axis:
81
+ x:
82
+ data:
83
+ column: hours
84
+ y:
85
+ data:
86
+ column: voltage
87
+ encoding:
88
+ color: cell
89
+ ```
90
+
91
+ ```bash
92
+ forgegraph render voltage.yaml
93
+ ```
94
+
95
+ ## Packs and configs
96
+
97
+ Every named theme, format, GraphSpec, layout and schedule comes from a **pack**, a folder or pip package of specs, and is named `pack/name`. The initial built-in packs are `forgegraph_base` and `forgegraph_base_2`, stored in src/forgegraph/packs.
98
+
99
+ A **config** lists the packs that may be used:
100
+
101
+ - The main config, `~/.config/forgegraph/config.toml` (or the file `FORGEGRAPH_CONFIG` names), applies to all work. ForgeGraph writes it, listing the built-in packs, the first time a command reads the configs, such as `catalog` or `render`.
102
+ - A folder config, `forgegraph.toml`, applies to the files in its folder and every folder below it. A file may use only the packs it lists.
103
+ - A pack that a folder config lists but the main config doesn't still works, but it's non-standard: graphs drawn with it are watermarked, and ForgeGraph's commands say so. That way you can make and try a pack without changing an organization's main config.
104
+
105
+ ## Commands
106
+
107
+ - `forgegraph render <graphspec or layout>`: draw and save, and report lint.
108
+ - `forgegraph explain <graphspec or layout>`: every value it's drawn with, and which file set it.
109
+ - `forgegraph catalog`: the packs, graph types, layer types, themes, formats and reference notes available here.
110
+ - `forgegraph schema graphspec --graph-type <type> --theme <theme> --format <format>`: every parameter a GraphSpec can set.
111
+ - `forgegraph schema <kind>`: every parameter of a theme, format, layer, layout, schedule, pack or config.
112
+ - `forgegraph pack-notes`: the reference notes of the packs available here.
113
+ - `forgegraph load <file>`: a saved graph's record, and its GraphSpec.
114
+ - `forgegraph job run <schedule>`: render a schedule's GraphSpecs and layouts once.
115
+ - `forgegraph skill install`: install the agent skill.
116
+
117
+ Every command takes `--help`, and `--json` for agents.
118
+
119
+ ## Catalogs
120
+
121
+ Each pack in this repository has a catalog: a page with a card for each parameter, showing what changing it does.
122
+
123
+ - forgegraph_base: ForgeGraph's own pack, with its graph types and layer types.
124
+ - forgegraph_base_2: its own theme and format, and the same graph types and layer types drawn in them.
125
+
126
+ ## Your graphs are yours
127
+
128
+ ForgeGraph is [MIT-licensed](LICENSE). Graphs and other output you make with it are yours: no attribution or licence terms apply to them. See TRADEMARKS.md for use of the name.
129
+
130
+ ## Documentation
131
+
132
+ - Architecture: how ForgeGraph is designed, and why.
133
+ - Decisions: decisions that refine the architecture.
134
+ - Specifications: every spec, a folder per kind.
135
+ - [Changelog](CHANGELOG.md).
136
+ - Build plan: how ForgeGraph is being built, phase by phase.
137
+
138
+ ## Contributing
139
+
140
+ Feature requests and bug reports go to [GitHub issues](https://github.com/sskaye/forgegraph/issues); the skill can file them for you. CONTRIBUTING.md covers working on ForgeGraph itself. In short:
141
+
142
+ ```bash
143
+ uv sync && uv run pre-commit install
144
+ ```
145
+
146
+ ```bash
147
+ uv run pytest --full && uv run ruff check . && uv run pyright
148
+ ```
149
+
150
+ ## Repository map
151
+
152
+ - **src/forgegraph/**: the package.
153
+ - `graph.py`: the Python API (`fg.xy`, `fg.render`, `fg.graphspec`, `fg.load`) and the `Graph` object; `canvas.py`: the themed canvas.
154
+ - **cli/**: the `forgegraph` command.
155
+ - **spec/**: reading, checking and resolving specs, and the provenance record.
156
+ - **drawing/**: drawing, layout and lint. **layouts/**: layouts. **jobs/**: scheduled renders.
157
+ - **packs/**: packs and configs, and the built-in packs `forgegraph_base` and `forgegraph_base_2`. **fonts/**: bundled fonts and their licences.
158
+ - **graph_types/**, **layers/**: the graph type and layer type definitions. **catalog/**, **catalogs/**: the catalog builder, and each definition's catalog file.
159
+ - **skill/forgegraph/**: the agent skill.
160
+ - **catalog/**: the generated catalog pages.
161
+ - **examples/**: sample data, and `packs/acme`, an example pack in a deliberately different style.
162
+ - **evals/skill/**: the skill's eval cases, run by `scripts/run_skill_evals.py`.
163
+ - **tests/**, **scripts/**: tests, and build and maintenance scripts.
164
+ - **docs/**: the documents above. **review/**: each build phase's review pages.
165
+
@@ -9,4 +9,4 @@ The code is MIT-licensed, but the licence covers the code, not the name. You are
9
9
 
10
10
  Please don't use "ForgeGraph", or a confusingly similar name, as the name of a fork, product, package or service. Give your project its own name.
11
11
 
12
- Bundled fonts carry their own licences and trademarks: "Source" is a trademark of Adobe (see `src/forgegraph/themes/fonts/OFL-SourceSans3.md`).
12
+ Bundled fonts carry their own licences and trademarks: "Source" is a trademark of Adobe (see `src/forgegraph/fonts/OFL-SourceSans3.md`), and "Plex" is a Reserved Font Name of IBM (see `src/forgegraph/fonts/OFL-IBMPlexSerif.txt`).