Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
36d6279
chore: scaffold empty hm-pipeline-ir crate
markovejnovic May 23, 2026
4b41b1b
refactor: move pipeline IR types to hm-pipeline-ir crate
markovejnovic May 23, 2026
b987ee7
test: add pipeline IR parsing tests to hm-pipeline-ir
markovejnovic May 23, 2026
6c4cca2
test: add pipeline IR schema snapshot test
markovejnovic May 23, 2026
eb3cee7
docs: add hm-pipeline-ir to CLAUDE.md crate listing
markovejnovic May 23, 2026
cdc1b32
Merge remote-tracking branch 'origin/main' into refactor/tear-out-pip…
markovejnovic May 23, 2026
591882b
Squashed 'dsls/harmont-py/' content from commit 2d47999
markovejnovic May 23, 2026
52f8790
Merge commit '591882b87ac04d7c9e298ba09ead0de6f51d9f4b' as 'dsls/harm…
markovejnovic May 23, 2026
240e2f9
docs: add dsls/harmont-py pointer to root CLAUDE.md
markovejnovic May 23, 2026
6d84fc3
ci: install harmont-py from local tree in examples workflow
markovejnovic May 23, 2026
0c6b011
ci: merge harmont-py lint/test into ci.yml, use local tree for integr…
markovejnovic May 23, 2026
dc203ce
ci: add PyPI publish job to release workflow
markovejnovic May 23, 2026
70f7613
docs: update RELEASING.md for monorepo workflow
markovejnovic May 23, 2026
abf766c
chore: add daggy and anyhow dependencies to hm-pipeline-ir
markovejnovic May 23, 2026
cb33ef5
feat: add daggy-backed PipelineGraph to hm-pipeline-ir
markovejnovic May 23, 2026
e741c62
test: add chain and chain_deps tests for PipelineGraph
markovejnovic May 23, 2026
dd75bec
refactor: repoint scheduler at hm-pipeline-ir PipelineGraph
markovejnovic May 23, 2026
41b378d
test: update integration tests for PipelineGraph API
markovejnovic May 23, 2026
85eacc3
chore: enable daggy serde-1 feature
markovejnovic May 23, 2026
bde8b64
feat: add Serialize/Deserialize to NodeWeight and EdgeKind
markovejnovic May 23, 2026
84cf7d4
feat: make PipelineGraph serializable as wire type
markovejnovic May 23, 2026
b953bb1
refactor: replace flat Pipeline wire format with petgraph-serde graph
markovejnovic May 23, 2026
394cce8
test: rewrite Rust test fixtures to graph wire format
markovejnovic May 23, 2026
d5faa11
refactor: rewrite Python pipeline emitter for petgraph-serde graph fo…
markovejnovic May 24, 2026
4e59ed8
test: update all Python tests for petgraph-serde graph wire format
markovejnovic May 24, 2026
df07331
refactor: move CommandStep and Cache into graph module, flatten exports
markovejnovic May 24, 2026
9dc470f
refactor: remove unused PipelineGraph::node_indices method
markovejnovic May 24, 2026
7d8b3c3
refactor: rename NodeWeight to Transition, add get_transition accesso…
markovejnovic May 24, 2026
1cfa580
cleanup
markovejnovic May 24, 2026
fc11aec
cleanup
markovejnovic May 24, 2026
1f11da6
feat: add dag() accessor to PipelineGraph
markovejnovic May 24, 2026
4c7b61e
feat: add StepOutcome type and compute_chain_info helper
markovejnovic May 24, 2026
84792dc
feat: extract execute_step from run_chain
markovejnovic May 24, 2026
06a88be
refactor: replace chain-based scheduling with topological dataflow
markovejnovic May 24, 2026
0028aa6
refactor: replace chain-based scheduling with topological dataflow
markovejnovic May 24, 2026
bdc5c3d
refactor: strip PipelineGraph to dag(), node_count(), default_image()
markovejnovic May 24, 2026
96eedf1
test: update all tests for stripped PipelineGraph API
markovejnovic May 24, 2026
a04bc15
chore: post-refactor cleanup — clippy, stale docs, const fn
markovejnovic May 24, 2026
4055c73
Merge remote-tracking branch 'origin/main' into refactor/tear-out-pip…
markovejnovic May 24, 2026
779de07
cleanup
markovejnovic May 24, 2026
2b6a005
fix: resolve ruff PERF401 and F841 in harmont-py
markovejnovic May 24, 2026
8225be5
fix: move inline use to module scope (clippy items_after_statements)
markovejnovic May 24, 2026
4bc377b
refactor: remove orchestrator/graph.rs re-export shim
markovejnovic May 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 36 additions & 27 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,59 +33,68 @@ jobs:
- name: cargo clippy (strict)
run: cargo clippy --all-targets -p harmont-cli -- -D warnings

python-lint:
name: harmont-py (pytest + ruff + mypy)
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.11", "3.12"]
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: pip

- name: Install harmont + dev extras
working-directory: dsls/harmont-py
run: pip install -e '.[dev]'

- name: ruff check
working-directory: dsls/harmont-py
run: ruff check .

- name: mypy
working-directory: dsls/harmont-py
run: mypy harmont

- name: pytest
working-directory: dsls/harmont-py
run: |
pytest -v \
--deselect tests/test_gradle.py \
--deselect tests/test_haskell.py

integration:
name: docker-gated integration test
runs-on: ubuntu-latest
# Skip the heavy job on draft PRs to save runner minutes. Push to
# main always runs it.
if: github.event_name == 'push' || (github.event_name == 'pull_request' && !github.event.pull_request.draft)
steps:
- name: Check out harmont-cli
uses: actions/checkout@v4
with:
path: harmont-cli

- name: Check out harmont-py (matching branch, with main fallback)
uses: actions/checkout@v4
with:
repository: harmont-dev/harmont-py
ref: ${{ github.head_ref || github.ref_name }}
path: harmont-py
continue-on-error: true
id: checkout-py-branch

- name: Fall back to harmont-py main
if: steps.checkout-py-branch.outcome != 'success'
uses: actions/checkout@v4
with:
repository: harmont-dev/harmont-py
ref: main
path: harmont-py
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-wasip1
- uses: Swatinem/rust-cache@v2
with:
workspaces: harmont-cli

- uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install harmont-py (editable)
working-directory: harmont-py
run: pip install -e .
run: pip install -e dsls/harmont-py

- name: cargo build --tests (with docker-integration feature)
working-directory: harmont-cli
run: cargo build -p harmont-cli --tests --features docker-integration

- name: Pre-pull python:3.12-alpine
run: docker pull python:3.12-alpine

- name: cargo test --features docker-integration -- --ignored
working-directory: harmont-cli
env:
HARMONT_PYTHON: python3
run: |
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/examples.yml
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,7 @@ jobs:
# externally-managed marker requires --break-system-packages.
- name: Install harmont-py into system Python
run: |
git clone --depth 1 https://github.com/harmont-dev/harmont-py /tmp/harmont-py
sudo /usr/bin/python3 -m pip install --break-system-packages /tmp/harmont-py
sudo /usr/bin/python3 -m pip install --break-system-packages dsls/harmont-py
/usr/bin/python3 -c "import harmont; print('harmont', harmont.__file__)"

- name: Download hm binary
Expand Down
41 changes: 41 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,44 @@ jobs:
else
cargo publish -p harmont-cli --token ${{ secrets.CRATES_IO_TOKEN }} --allow-dirty
fi

pypi-publish:
name: Publish to PyPI
runs-on: ubuntu-latest
environment:
name: release
url: https://pypi.org/project/harmont/
permissions:
id-token: write
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Set version from tag
run: |
VERSION="${GITHUB_REF_NAME#v}"
echo "VERSION=$VERSION" >> "$GITHUB_ENV"
sed -i '0,/version = "0.0.0-dev"/s//version = "'"$VERSION"'"/' dsls/harmont-py/pyproject.toml
grep -n "^version" dsls/harmont-py/pyproject.toml

- name: Install build
run: python -m pip install --upgrade build

- name: Build sdist and wheel
working-directory: dsls/harmont-py
run: python -m build

- name: Inspect dist
working-directory: dsls/harmont-py
run: |
ls -la dist/
test -f dist/harmont-${VERSION}.tar.gz
test -f dist/harmont-${VERSION}-py3-none-any.whl

- name: Publish to PyPI via Trusted Publishing
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: dsls/harmont-py/dist/
6 changes: 6 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
The `cli/` directory is a Cargo workspace.

- `crates/hm/` — the `hm` binary (today's CLI body).
- `crates/hm-pipeline-ir/` — pipeline IR schema (serde structs only, no runtime).
- `crates/hm-util/` — shared OS and filesystem utilities.
- `crates/hm-plugin-protocol/` — wire types (serde structs only).
- `crates/hm-plugin-sdk/` — authoring SDK for plugin writers.
Expand All @@ -11,3 +12,8 @@ Run `cargo build` from the workspace root. Plugin fixtures need the
`wasm32-wasip1` target; install with `rustup target add wasm32-wasip1`.

For cross-cutting doctrine see [PRINCIPLES.md](../PRINCIPLES.md).

## Python DSL

`dsls/harmont-py/` — the `harmont` Python package (pipeline DSL).
See `dsls/harmont-py/CLAUDE.md` for DSL-specific context.
47 changes: 45 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ resolver = "2"
members = [
"crates/hm",
"crates/hm-plugin-protocol",
"crates/hm-pipeline-ir",
"crates/hm-plugin-sdk",
"crates/hm-plugin-docker",
"crates/hm-plugin-output-human",
Expand All @@ -14,6 +15,7 @@ members = [
default-members = [
"crates/hm",
"crates/hm-plugin-protocol",
"crates/hm-pipeline-ir",
"crates/hm-plugin-sdk",
"crates/hm-util",
]
Expand All @@ -25,8 +27,11 @@ repository = "https://github.com/harmont-dev/harmont-cli"

[workspace.dependencies]
hm-plugin-protocol = { path = "crates/hm-plugin-protocol", version = "0.0.0-dev" }
hm-pipeline-ir = { path = "crates/hm-pipeline-ir", version = "0.0.0-dev" }
hm-plugin-sdk = { path = "crates/hm-plugin-sdk", version = "0.0.0-dev" }
hm-util = { path = "crates/hm-util", version = "0.0.0-dev" }
anyhow = "1"
daggy = { version = "0.9", features = ["serde-1"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
schemars = { version = "0.8", features = ["preserve_order", "semver", "uuid1", "chrono"] }
Expand Down
21 changes: 21 additions & 0 deletions crates/hm-pipeline-ir/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[package]
name = "hm-pipeline-ir"
version = "0.0.0-dev"
edition.workspace = true
license.workspace = true
repository.workspace = true
description = "Pipeline IR — the v0 wire-format schema consumed by hm."

[dependencies]
daggy = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
schemars = { workspace = true }

[dev-dependencies]
insta = { version = "1", features = ["json"] }
schemars = { workspace = true }
serde_json = { workspace = true }

[lints]
workspace = true
Loading
Loading