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.
- {forgegraph-0.0.1 → forgegraph-0.2.0}/.gitignore +1 -0
- {forgegraph-0.0.1 → forgegraph-0.2.0}/.pre-commit-config.yaml +3 -2
- forgegraph-0.2.0/CHANGELOG.md +48 -0
- forgegraph-0.2.0/CONTRIBUTING.md +39 -0
- forgegraph-0.2.0/PKG-INFO +190 -0
- forgegraph-0.2.0/README.md +165 -0
- {forgegraph-0.0.1 → forgegraph-0.2.0}/TRADEMARKS.md +1 -1
- forgegraph-0.2.0/docs/architecture.md +613 -0
- {forgegraph-0.0.1 → forgegraph-0.2.0}/docs/build-plan.md +80 -104
- forgegraph-0.2.0/docs/decisions.md +222 -0
- forgegraph-0.2.0/docs/forgemark-repro-reattach.md +80 -0
- forgegraph-0.2.0/docs/forgemark-request.md +56 -0
- forgegraph-0.2.0/docs/specs/catalog/base_format.md +22 -0
- forgegraph-0.2.0/docs/specs/catalog/base_theme.md +222 -0
- forgegraph-0.2.0/docs/specs/catalog/graph_type_xy.md +202 -0
- forgegraph-0.2.0/docs/specs/catalog/layer_error_bar.md +26 -0
- forgegraph-0.2.0/docs/specs/catalog/layer_note.md +20 -0
- forgegraph-0.2.0/docs/specs/catalog/layer_reference_line.md +36 -0
- forgegraph-0.2.0/docs/specs/config/config.md +5 -0
- forgegraph-0.2.0/docs/specs/format/base_format.md +22 -0
- forgegraph-0.2.0/docs/specs/format/base_layout_format.md +14 -0
- forgegraph-0.2.0/docs/specs/graph_type/xy.md +90 -0
- forgegraph-0.2.0/docs/specs/graphspec/polarization.md +142 -0
- forgegraph-0.2.0/docs/specs/layer/error_bar.md +16 -0
- forgegraph-0.2.0/docs/specs/layer/note.md +12 -0
- forgegraph-0.2.0/docs/specs/layer/reference_line.md +19 -0
- forgegraph-0.2.0/docs/specs/layout/base_layout.md +30 -0
- forgegraph-0.2.0/docs/specs/pack/acme/formats/slide.md +16 -0
- forgegraph-0.2.0/docs/specs/pack/acme/graphspecs/polarization-curve.md +35 -0
- forgegraph-0.2.0/docs/specs/pack/acme/layouts/dashboard.md +18 -0
- forgegraph-0.2.0/docs/specs/pack/acme/pack.md +9 -0
- forgegraph-0.2.0/docs/specs/pack/acme/schedules/workday.md +17 -0
- forgegraph-0.2.0/docs/specs/pack/acme/themes/acme.md +28 -0
- forgegraph-0.2.0/docs/specs/pack/forgegraph_base.md +9 -0
- forgegraph-0.2.0/docs/specs/provenance/provenance.md +27 -0
- forgegraph-0.2.0/docs/specs/schedule/base_schedule.md +30 -0
- forgegraph-0.2.0/docs/specs/theme/base_theme.md +161 -0
- forgegraph-0.2.0/examples/packs/acme/formats/slide.yaml +12 -0
- forgegraph-0.2.0/examples/packs/acme/graphspecs/polarization-curve.yaml +31 -0
- forgegraph-0.2.0/examples/packs/acme/layouts/dashboard.yaml +14 -0
- forgegraph-0.2.0/examples/packs/acme/pack.yaml +5 -0
- forgegraph-0.2.0/examples/packs/acme/references/house.md +10 -0
- forgegraph-0.2.0/examples/packs/acme/schedules/workday.yaml +13 -0
- forgegraph-0.2.0/examples/packs/acme/themes/acme.yaml +24 -0
- forgegraph-0.2.0/examples/sample-data/README.md +38 -0
- forgegraph-0.2.0/examples/sample-data/air_passengers.csv +145 -0
- forgegraph-0.2.0/examples/sample-data/air_passengers_by_month.csv +13 -0
- forgegraph-0.2.0/examples/sample-data/anscombe.csv +45 -0
- forgegraph-0.2.0/examples/sample-data/assay_summary.csv +31 -0
- forgegraph-0.2.0/examples/sample-data/cell_durability.csv +299 -0
- forgegraph-0.2.0/examples/sample-data/cell_polarization.csv +100 -0
- forgegraph-0.2.0/examples/sample-data/co2_monthly.csv +803 -0
- forgegraph-0.2.0/examples/sample-data/diamonds.csv +15001 -0
- forgegraph-0.2.0/examples/sample-data/dose_response.csv +91 -0
- forgegraph-0.2.0/examples/sample-data/economics.csv +577 -0
- forgegraph-0.2.0/examples/sample-data/enzyme_kinetics.csv +25 -0
- forgegraph-0.2.0/examples/sample-data/fmri.csv +1065 -0
- forgegraph-0.2.0/examples/sample-data/gapminder.csv +661 -0
- forgegraph-0.2.0/examples/sample-data/geyser.csv +273 -0
- forgegraph-0.2.0/examples/sample-data/growth.csv +545 -0
- forgegraph-0.2.0/examples/sample-data/iris.csv +151 -0
- forgegraph-0.2.0/examples/sample-data/lab_export.xlsx +0 -0
- forgegraph-0.2.0/examples/sample-data/lab_runs.xlsx +0 -0
- forgegraph-0.2.0/examples/sample-data/penguins.csv +345 -0
- forgegraph-0.2.0/examples/sample-data/seaice.csv +1827 -0
- forgegraph-0.2.0/examples/sample-data/sensor_log_eu.csv +49 -0
- forgegraph-0.2.0/examples/sample-data/stocks.csv +561 -0
- forgegraph-0.2.0/examples/sample-data/tips.csv +245 -0
- forgegraph-0.2.0/examples/sample-data/weather.xlsx +0 -0
- {forgegraph-0.0.1 → forgegraph-0.2.0}/pyproject.toml +21 -11
- forgegraph-0.2.0/scripts/build_api_notebook.py +196 -0
- forgegraph-0.2.0/scripts/build_bundled_skill.py +48 -0
- forgegraph-0.2.0/scripts/build_example_data.py +102 -0
- forgegraph-0.2.0/scripts/build_recreations.py +125 -0
- forgegraph-0.2.0/scripts/build_sample_data.py +567 -0
- {forgegraph-0.0.1 → forgegraph-0.2.0}/scripts/check_denylist.py +10 -1
- forgegraph-0.2.0/scripts/forgemark.py +13 -0
- forgegraph-0.2.0/scripts/mirror_specs.py +23 -0
- forgegraph-0.2.0/scripts/report_skill_evals.py +129 -0
- forgegraph-0.2.0/scripts/run_skill_evals.py +941 -0
- forgegraph-0.2.0/scripts/smoke_installed.py +103 -0
- forgegraph-0.2.0/scripts/visual_changelog.py +134 -0
- forgegraph-0.2.0/src/forgegraph/__init__.py +58 -0
- forgegraph-0.2.0/src/forgegraph/__main__.py +5 -0
- forgegraph-0.2.0/src/forgegraph/canvas.py +147 -0
- forgegraph-0.2.0/src/forgegraph/catalog/build.py +362 -0
- forgegraph-0.2.0/src/forgegraph/catalog/examples.py +120 -0
- forgegraph-0.2.0/src/forgegraph/catalog/files.py +224 -0
- forgegraph-0.2.0/src/forgegraph/catalog/forgemark.py +59 -0
- forgegraph-0.2.0/src/forgegraph/catalog/page.py +276 -0
- forgegraph-0.2.0/src/forgegraph/catalogs/graph_types/xy.yaml +198 -0
- forgegraph-0.2.0/src/forgegraph/catalogs/layers/error_bar.yaml +22 -0
- forgegraph-0.2.0/src/forgegraph/catalogs/layers/note.yaml +16 -0
- forgegraph-0.2.0/src/forgegraph/catalogs/layers/reference_line.yaml +32 -0
- forgegraph-0.2.0/src/forgegraph/cli/__init__.py +740 -0
- forgegraph-0.2.0/src/forgegraph/drawing/axes.py +681 -0
- forgegraph-0.2.0/src/forgegraph/drawing/colorbar.py +99 -0
- forgegraph-0.2.0/src/forgegraph/drawing/export.py +134 -0
- forgegraph-0.2.0/src/forgegraph/drawing/figure.py +319 -0
- forgegraph-0.2.0/src/forgegraph/drawing/key.py +277 -0
- forgegraph-0.2.0/src/forgegraph/drawing/labels.py +312 -0
- forgegraph-0.2.0/src/forgegraph/drawing/layers.py +560 -0
- forgegraph-0.2.0/src/forgegraph/drawing/lint.py +290 -0
- forgegraph-0.2.0/src/forgegraph/drawing/marks.py +636 -0
- forgegraph-0.2.0/src/forgegraph/drawing/markup.py +42 -0
- forgegraph-0.2.0/src/forgegraph/drawing/page.py +219 -0
- forgegraph-0.2.0/src/forgegraph/drawing/spacing.py +173 -0
- forgegraph-0.2.0/src/forgegraph/drawing/style.py +186 -0
- forgegraph-0.2.0/src/forgegraph/drawing/text.py +187 -0
- forgegraph-0.2.0/src/forgegraph/drawing/ticks.py +482 -0
- forgegraph-0.2.0/src/forgegraph/drawing/xy.py +852 -0
- forgegraph-0.2.0/src/forgegraph/fonts/IBMPlexSerif-Bold.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/IBMPlexSerif-Light.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/IBMPlexSerif-Medium.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/IBMPlexSerif-Regular.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/IBMPlexSerif-SemiBold.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/OFL-IBMPlexSerif.txt +93 -0
- forgegraph-0.2.0/src/forgegraph/fonts/OFL-Roboto.txt +93 -0
- forgegraph-0.2.0/src/forgegraph/fonts/Roboto-Bold.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/Roboto-Italic.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/Roboto-Light.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/Roboto-Medium.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/Roboto-Regular.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/Roboto-SemiBold.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/SourceSans3-Light.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/SourceSans3-Medium.ttf +0 -0
- forgegraph-0.2.0/src/forgegraph/fonts/__init__.py +61 -0
- forgegraph-0.2.0/src/forgegraph/graph.py +563 -0
- forgegraph-0.2.0/src/forgegraph/graph_types/__init__.py +1 -0
- forgegraph-0.2.0/src/forgegraph/graph_types/xy.yaml +85 -0
- forgegraph-0.2.0/src/forgegraph/jobs/__init__.py +9 -0
- forgegraph-0.2.0/src/forgegraph/jobs/run.py +413 -0
- forgegraph-0.2.0/src/forgegraph/jobs/status.py +82 -0
- forgegraph-0.2.0/src/forgegraph/layers/error_bar.yaml +12 -0
- forgegraph-0.2.0/src/forgegraph/layers/note.yaml +8 -0
- forgegraph-0.2.0/src/forgegraph/layers/reference_line.yaml +15 -0
- forgegraph-0.2.0/src/forgegraph/layouts/__init__.py +639 -0
- forgegraph-0.2.0/src/forgegraph/layouts/arrange.py +403 -0
- forgegraph-0.2.0/src/forgegraph/packs/__init__.py +270 -0
- forgegraph-0.2.0/src/forgegraph/packs/config.toml +1 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/catalogs/formats/base_format.yaml +18 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/catalogs/formats/base_layout_format.yaml +9 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/catalogs/themes/base_theme.yaml +218 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/formats/base_format.yaml +18 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/formats/base_layout_format.yaml +10 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/graphspecs/dated.parquet +0 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/graphspecs/fanned.parquet +0 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/graphspecs/polarization.parquet +0 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/graphspecs/polarization.yaml +138 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/graphspecs/reinforced.parquet +0 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/layouts/base_layout.yaml +26 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/pack.yaml +5 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/schedules/base_schedule.yaml +26 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base/themes/base_theme.yaml +157 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/catalogs/formats/compact_format.yaml +9 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/catalogs/themes/base_theme.yaml +26 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/formats/compact_format.yaml +13 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/graphspecs/dated.parquet +0 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/graphspecs/example.yaml +13 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/graphspecs/fanned.parquet +0 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/graphspecs/polarization.parquet +0 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/graphspecs/reinforced.parquet +0 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/pack.yaml +5 -0
- forgegraph-0.2.0/src/forgegraph/packs/forgegraph_base_2/themes/base_theme.yaml +72 -0
- forgegraph-0.2.0/src/forgegraph/skill/__init__.py +82 -0
- forgegraph-0.2.0/src/forgegraph/skill/forgegraph/SKILL.md +50 -0
- forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/bars.yaml +35 -0
- forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/figure.layout.yaml +16 -0
- forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/figure.schedule.yaml +11 -0
- forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/layers.yaml +37 -0
- forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/xy.parquet +0 -0
- forgegraph-0.2.0/src/forgegraph/skill/forgegraph/examples/xy.yaml +25 -0
- forgegraph-0.2.0/src/forgegraph/skill/forgegraph/references/requests.md +7 -0
- forgegraph-0.2.0/src/forgegraph/skill/forgegraph/references/themes_formats_configs.md +44 -0
- forgegraph-0.2.0/src/forgegraph/spec/__init__.py +9 -0
- forgegraph-0.2.0/src/forgegraph/spec/common.py +11 -0
- forgegraph-0.2.0/src/forgegraph/spec/documents.py +874 -0
- forgegraph-0.2.0/src/forgegraph/spec/layout.py +288 -0
- forgegraph-0.2.0/src/forgegraph/spec/parameters.py +468 -0
- forgegraph-0.2.0/src/forgegraph/spec/provenance.py +63 -0
- forgegraph-0.2.0/src/forgegraph/spec/provenance.yaml +23 -0
- forgegraph-0.2.0/src/forgegraph/spec/schedule.py +227 -0
- forgegraph-0.2.0/tests/baselines/crowded_runs.png +0 -0
- forgegraph-0.2.0/tests/baselines/flow_sweep_wide.png +0 -0
- forgegraph-0.2.0/tests/baselines/fuel_by_size.png +0 -0
- forgegraph-0.2.0/tests/baselines/layout_anode_layers.png +0 -0
- forgegraph-0.2.0/tests/baselines/layout_screening_and_rate.png +0 -0
- forgegraph-0.2.0/tests/baselines/polarization.png +0 -0
- forgegraph-0.2.0/tests/baselines/polarization_narrow.png +0 -0
- forgegraph-0.2.0/tests/baselines/precipitation_loglog.png +0 -0
- forgegraph-0.2.0/tests/baselines/replicates.png +0 -0
- forgegraph-0.2.0/tests/baselines/screening_scatter.png +0 -0
- forgegraph-0.2.0/tests/baselines/separator_colorbar.png +0 -0
- forgegraph-0.2.0/tests/conftest.py +30 -0
- forgegraph-0.2.0/tests/fixtures/catalog_comments.html +130 -0
- forgegraph-0.2.0/tests/pack_helpers.py +25 -0
- forgegraph-0.2.0/tests/recreations.py +483 -0
- forgegraph-0.2.0/tests/render_helpers.py +96 -0
- forgegraph-0.2.0/tests/spec_mirror.py +221 -0
- forgegraph-0.2.0/tests/test_axes.py +439 -0
- forgegraph-0.2.0/tests/test_blank.py +56 -0
- forgegraph-0.2.0/tests/test_catalog.py +290 -0
- forgegraph-0.2.0/tests/test_cli.py +364 -0
- {forgegraph-0.0.1 → forgegraph-0.2.0}/tests/test_denylist.py +8 -0
- forgegraph-0.2.0/tests/test_jobs.py +286 -0
- forgegraph-0.2.0/tests/test_key_position.py +77 -0
- forgegraph-0.2.0/tests/test_layers.py +513 -0
- forgegraph-0.2.0/tests/test_layout.py +642 -0
- forgegraph-0.2.0/tests/test_lint.py +105 -0
- forgegraph-0.2.0/tests/test_marks.py +350 -0
- forgegraph-0.2.0/tests/test_markup.py +31 -0
- forgegraph-0.2.0/tests/test_packs.py +404 -0
- forgegraph-0.2.0/tests/test_perturbation.py +48 -0
- forgegraph-0.2.0/tests/test_regression.py +42 -0
- forgegraph-0.2.0/tests/test_render.py +779 -0
- forgegraph-0.2.0/tests/test_schedule.py +85 -0
- {forgegraph-0.0.1 → forgegraph-0.2.0}/tests/test_smoke.py +3 -2
- forgegraph-0.2.0/tests/test_spec_mirrors.py +14 -0
- forgegraph-0.2.0/tests/test_specs.py +542 -0
- forgegraph-0.2.0/tests/test_text.py +140 -0
- {forgegraph-0.0.1 → forgegraph-0.2.0}/uv.lock +76 -159
- forgegraph-0.0.1/.github/workflows/ci.yml +0 -63
- forgegraph-0.0.1/.github/workflows/publish.yml +0 -17
- forgegraph-0.0.1/CONTRIBUTING.md +0 -15
- forgegraph-0.0.1/PKG-INFO +0 -42
- forgegraph-0.0.1/README.md +0 -13
- forgegraph-0.0.1/docs/architecture.md +0 -640
- forgegraph-0.0.1/docs/decisions.md +0 -7
- forgegraph-0.0.1/src/forgegraph/__init__.py +0 -10
- forgegraph-0.0.1/src/forgegraph/charts/__init__.py +0 -1
- forgegraph-0.0.1/src/forgegraph/cli/__init__.py +0 -22
- forgegraph-0.0.1/src/forgegraph/data/__init__.py +0 -1
- forgegraph-0.0.1/src/forgegraph/formats/__init__.py +0 -1
- forgegraph-0.0.1/src/forgegraph/jobs/__init__.py +0 -1
- forgegraph-0.0.1/src/forgegraph/layers/__init__.py +0 -1
- forgegraph-0.0.1/src/forgegraph/layout/__init__.py +0 -1
- forgegraph-0.0.1/src/forgegraph/packs/__init__.py +0 -1
- forgegraph-0.0.1/src/forgegraph/skill/__init__.py +0 -1
- forgegraph-0.0.1/src/forgegraph/spec/__init__.py +0 -3
- forgegraph-0.0.1/src/forgegraph/themes/__init__.py +0 -21
- {forgegraph-0.0.1 → forgegraph-0.2.0}/LICENSE +0 -0
- {forgegraph-0.0.1 → forgegraph-0.2.0}/docs/initial specification.md +0 -0
- {forgegraph-0.0.1 → forgegraph-0.2.0}/src/forgegraph/catalog/__init__.py +0 -0
- {forgegraph-0.0.1/src/forgegraph/render → forgegraph-0.2.0/src/forgegraph/drawing}/__init__.py +0 -0
- {forgegraph-0.0.1/src/forgegraph/themes → forgegraph-0.2.0/src/forgegraph}/fonts/OFL-SourceSans3.md +0 -0
- {forgegraph-0.0.1/src/forgegraph/themes → forgegraph-0.2.0/src/forgegraph}/fonts/SourceSans3-Bold.ttf +0 -0
- {forgegraph-0.0.1/src/forgegraph/themes → forgegraph-0.2.0/src/forgegraph}/fonts/SourceSans3-It.ttf +0 -0
- {forgegraph-0.0.1/src/forgegraph/themes → forgegraph-0.2.0/src/forgegraph}/fonts/SourceSans3-Regular.ttf +0 -0
- {forgegraph-0.0.1/src/forgegraph/themes → forgegraph-0.2.0/src/forgegraph}/fonts/SourceSans3-Semibold.ttf +0 -0
|
@@ -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/
|
|
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`).
|