Skip to content

Commit 142d1cc

Browse files
committed
feat(ingest): conda-forge and Spack recipes to EasyBuild scaffolds
Add foreign recipe parsers (plain meta.yaml; restricted package.py) and eb-stack ingest CLI that emit parseable .eb files with input-derived name/version/source/deps and residual warnings. Frozen zlib fixtures and library+CLI integration tests drive the shipped path.
1 parent ef6039b commit 142d1cc

18 files changed

Lines changed: 1231 additions & 18 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.3.0] - 2026-07-13
11+
1012
### Added
1113

12-
- GitHub Actions CI for unit tests, known-bump regression, packaging fixtures,
13-
solve/stack-diff, and CLI smoke.
14-
- Operator guide for the annual toolchain-generation bump
15-
(`docs/orgmode/howto/run-annual-bump.org`).
16-
- CLI auto-bump regression tests for frozen maintainer pairs under
17-
`tests/repro_fixtures/`.
14+
- `eb-stack ingest`: convert conda-forge (`meta.yaml` / `recipe.yaml`) and
15+
Spack (`package.py`, restricted parse) recipes into parseable EasyBuild
16+
scaffolds (name, version, source identity, dependency names; residual
17+
warnings for toolchain/build logic and EB generation-native dep versions).
18+
- Frozen fixtures under `fixtures/foreign_ingest/` and integration tests
19+
(`tests/foreign_ingest.rs`) for library + CLI ingest paths.
20+
- In-site Rust API docs path (sphinx-rustdocgen) and public packaging hygiene
21+
from the 0.2.x docs/CI workline.
22+
23+
### Changed
24+
25+
- Project version surfaces (`Cargo.toml`, `pixi.toml`, `CITATION.cff`, docs
26+
`release`, binary `--version`) aligned at **0.3.0**.
1827

1928
## [0.2.0] - 2026-07-10
2029

@@ -28,6 +37,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2837
- Annual-bump skill and agent driver contract (`skills/annual-bump/`,
2938
`AGENTS.md`).
3039
- Frozen eOn and QMCPACK foss-2026.1 packaging fixtures.
40+
- GitHub Actions CI for unit tests, known-bump regression, packaging fixtures,
41+
solve/stack-diff, and CLI smoke.
42+
- Operator guide for the annual toolchain-generation bump
43+
(`docs/orgmode/howto/run-annual-bump.org`).
44+
- CLI auto-bump regression tests for frozen maintainer pairs under
45+
`tests/repro_fixtures/`.
3146

3247
### Changed
3348

‎CITATION.cff‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ authors:
1010
license: MIT
1111
repository-code: "https://github.com/HaoZeke/eb-stack"
1212
url: "https://eb-stack.rgoswami.me"
13-
version: 0.2.0
14-
date-released: "2026-07-10"
13+
version: 0.3.0
14+
date-released: "2026-07-13"
1515
keywords:
1616
- EasyBuild
1717
- HPC

‎CONTRIBUTING.md‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,30 @@ unless a maintainer says otherwise in the live conversation.
6262
`docs/source/conf.py` release.
6363
3. Tag `vX.Y.Z` and push the tag; CI publishes the GitHub Release when the
6464
release workflow is enabled.
65+
66+
67+
## Tag and release
68+
69+
Version source of truth: `version` in root `Cargo.toml` (currently **0.3.0**).
70+
Keep these in lockstep on every release:
71+
72+
1. `Cargo.toml` / `pixi.toml` `version`
73+
2. `CITATION.cff` `version` (+ `date-released` when cutting)
74+
3. `docs/source/conf.py` `release`
75+
4. `CHANGELOG.md` — move Unreleased notes into `## [X.Y.Z] - YYYY-MM-DD`
76+
77+
Then:
78+
79+
```bash
80+
git tag -a v0.3.0 -m "eb-stack 0.3.0"
81+
git push origin v0.3.0
82+
# GitHub Actions ci_release.yml builds linux x86_64 tarball + checksum
83+
```
84+
85+
Verify the binary surface:
86+
87+
```bash
88+
cargo build --release
89+
./target/release/eb-stack --version
90+
# → eb-stack 0.3.0
91+
```

‎Cargo.lock‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "eb_stack"
3-
version = "0.2.0"
3+
version = "0.3.0"
44
edition = "2021"
55
rust-version = "1.75"
66
description = "EasyBuild stack lock solver: parse .eb, resolvo SAT co-select, hierarchy-aware bump, planned CycloneDX SBOM"

‎README.md‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,31 @@ Optional `--sbom-out` writes a planned CycloneDX inventory. Baseline generation
7777
selection (nearest lower vs explicit) is documented in the
7878
[solve howto](docs/orgmode/howto/solve-lock.org).
7979

80+
81+
## Ingest foreign recipes (conda-forge / Spack)
82+
83+
Scaffold a parseable EasyBuild `.eb` from a frozen foreign recipe (name,
84+
version, source identity, dependency **names**; build logic and EB generation
85+
versions remain residual):
86+
87+
```bash
88+
./target/release/eb-stack ingest \
89+
--source fixtures/foreign_ingest/conda_zlib/meta.yaml \
90+
--toolchain-name foss --toolchain-version 2024a \
91+
--out /tmp/zlib-from-conda.eb
92+
93+
./target/release/eb-stack ingest \
94+
--source fixtures/foreign_ingest/spack_zlib/package.py \
95+
--format spack \
96+
--out /tmp/zlib-from-spack.eb
97+
```
98+
99+
## Version
100+
101+
```bash
102+
eb-stack --version # crate version (Cargo.toml); tag releases as vX.Y.Z
103+
```
104+
80105
## Documentation
81106

82107
| Kind | Where |

‎docs/orgmode/changelog.org‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ The full Keep a Changelog history lives in
55
[[https://github.com/HaoZeke/eb-stack/blob/main/CHANGELOG.md][CHANGELOG.md]]
66
at the repository root. Highlights for the documentation site:
77

8+
* 0.3.0
9+
10+
- ~eb-stack ingest~: conda-forge ~meta.yaml~ / Spack ~package.py~ → EB scaffold
11+
- Version surfaces aligned at 0.3.0; tag path ~vX.Y.Z~ documented in CONTRIBUTING
12+
813
* 0.2.0
914

1015
- Hierarchy-aware ~bump --easyconfigs~ with loud fail on unresolved deps

‎docs/orgmode/index.org‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ eb-stack --version
175175
Cite the repository and version (or the [[https://github.com/HaoZeke/eb-stack/blob/main/CITATION.cff][CITATION.cff]] metadata):
176176

177177
#+begin_src text
178-
Rohit Goswami, eb-stack (version 0.2.0), https://github.com/HaoZeke/eb-stack
178+
Rohit Goswami, eb-stack (version 0.3.0), https://github.com/HaoZeke/eb-stack
179179
#+end_src
180180

181181
* License

‎docs/orgmode/reference/cli.org‎

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Top-level usage
55

66
#+begin_src text
7-
eb-stack {solve|parse|check-recipe|solve-json|sbom|bump|mcp} [subcommand options]
7+
eb-stack {solve|parse|check-recipe|solve-json|sbom|bump|mcp|ingest} [subcommand options]
88
#+end_src
99

1010
Built on [[https://docs.rs/clap][clap]]'s derive API. Every subcommand accepts
@@ -22,6 +22,7 @@ Subcommands at a glance:
2222
| ~sbom~ | CycloneDX from an existing lock |
2323
| ~bump~ | Next-generation easyconfig rewrite (hierarchy-aware auto deps) |
2424
| ~mcp~ | Stdio MCP server (~eb_check_recipe~ / ~eb_bump~ / ~eb_solve~) |
25+
| ~ingest~ | Foreign conda-forge / Spack recipe → EB scaffold |
2526

2627
* solve
2728

@@ -300,3 +301,31 @@ errors, per the MCP tools/call contract. Library entry point:
300301
|------+-------------------------------------------------------------------|
301302
| 0 | Success |
302303
| 1 | Error: parse failure, unsatisfiable policy, missing dep, packaging gate failure, missing file, or rewrite failure. The message names real package/version/field data, not internal solver identifiers. |
304+
305+
* ingest
306+
307+
Convert a foreign package recipe into a parseable EasyBuild scaffold.
308+
309+
#+begin_src text
310+
eb-stack ingest
311+
--source PATH
312+
[--format auto|conda-forge|spack]
313+
[--toolchain-name foss]
314+
[--toolchain-version 2024a]
315+
[--out PATH | --out-dir DIR]
316+
#+end_src
317+
318+
- ~--source~ :: ~meta.yaml~ / ~recipe.yaml~ (conda-forge) or ~package.py~
319+
(Spack). Required.
320+
- ~--format~ :: ~auto~ (default, from filename), ~conda-forge~, or ~spack~.
321+
- ~--toolchain-name~ / ~--toolchain-version~ :: scaffold toolchain identity
322+
(operator-supplied generation; not invented from the foreign recipe).
323+
- ~--out~ / ~--out-dir~ :: output path or letter/name layout directory.
324+
325+
The emit path is honest: name, version, source URL/filename, sha256 when
326+
present, and dependency *names* come from the foreign input. Easyblock,
327+
build steps, and EB generation-native dependency versions are residual
328+
(header warnings). Re-parse the result with ~check-recipe~ (robot completeness
329+
may still fail until companions and pins are filled).
330+
331+
Fixtures: ~fixtures/foreign_ingest/~.

‎docs/source/conf.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
project = "eb-stack"
55
copyright = "2026, Rohit Goswami"
66
author = "Rohit Goswami"
7-
release = "0.2.0"
7+
release = "0.3.0"
88

99
# -- General configuration ---------------------------------------------------
1010
extensions = [

0 commit comments

Comments
 (0)