oxymake 0.1.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.
@@ -0,0 +1,125 @@
1
+ # Build
2
+ /target/
3
+ /target-linux/
4
+ # Nested Cargo target dirs (e.g. a crate compiled in isolation) — never track
5
+ # build artifacts anywhere in the tree. Anchored `/target/` alone misses these.
6
+ **/target/
7
+ **/*.rs.bk
8
+
9
+ # mdBook build output (docs/book/book/) — generated by `mdbook build docs/book`,
10
+ # published to Cloudflare Pages. Never tracked; rebuilt in CI on every deploy.
11
+ docs/book/book/
12
+
13
+ # IDE
14
+ .idea/
15
+ .vscode/
16
+ *.swp
17
+ *.swo
18
+ *~
19
+
20
+ # OS
21
+ .DS_Store
22
+ Thumbs.db
23
+
24
+ # OxyMake runtime (for testing)
25
+ .oxymake/
26
+
27
+ # Mutation testing
28
+ mutants.out/
29
+ mutants.out.old/
30
+
31
+ # Coverage
32
+ lcov.info
33
+ tarpaulin-report.html
34
+ .beads/
35
+ .claude/
36
+ .runtime/
37
+
38
+ # Local agent context — never commit (Gas Town/polecat playbook, operator-private)
39
+ CLAUDE.local.md
40
+
41
+ # Benchmark generated workloads and timestamped results
42
+ benchmark/perf/workloads/
43
+ benchmark/perf/results-*.md
44
+
45
+ # Head-to-head bench: transient workloads and per-run measurement data
46
+ bench/snakemake-vs-oxymake/workloads/
47
+ bench/snakemake-vs-oxymake/data/
48
+
49
+ # Benchmark generated outputs (top-level and per-benchmark)
50
+ benchmark/data/
51
+ benchmark/logs/
52
+ benchmark/results/
53
+ benchmark/*/data/
54
+ benchmark/*/logs/
55
+ benchmark/*/results/
56
+ benchmark/*/benchmarks/
57
+
58
+ # LaTeX build artifacts (keep only .tex and .pdf in docs/paper/)
59
+ *.aux
60
+ *.log
61
+ *.out
62
+ *.bbl
63
+ *.blg
64
+ *.fls
65
+ *.fdb_latexmk
66
+ *.synctex.gz
67
+ /oxymake-paper.*
68
+
69
+ # Beads / Dolt files (added by bd init)
70
+ .dolt/
71
+ *.db
72
+ .beads-credential-key
73
+ bench_output/
74
+ __pycache__/
75
+ .oxymake_warm_*.py
76
+ spec/tla/states/
77
+
78
+ # ── Confidential / author+agent residence — keep OFF the public surface ──
79
+ # These trees hold strategic/relational/inside-baseball docs that must not be
80
+ # tracked on the public surface. The surviving public artefacts are the ADRs,
81
+ # not these minutes/premortems/outreach.
82
+ CLAUDE.local.md
83
+ docs/_private/
84
+ docs/migrated-from-*/
85
+ docs/outreach/
86
+ docs/paper/premortems/
87
+ docs/decisions/
88
+ docs/cosmon-feedback/
89
+ docs/lore/
90
+
91
+ # Externalized denylist for scripts/release-checklist.sh — holds the confidential
92
+ # alternations (OXYMAKE_FORBID_PATTERN / OXYMAKE_CONF_PATHS) so the guard never
93
+ # names in clear what it forbids (scrub-oxymake-main-tree, D7). Never tracked.
94
+ scripts/.release-denylist.local
95
+
96
+ # confidential paths, kept off the public surface
97
+ docs/agent/
98
+ docs/health/
99
+
100
+ # Cross-molecule-board (CMB) correspondence — cross-galaxy inbox/outbox messages.
101
+ # Same residence class as docs/cosmon-feedback/: relational/inside-baseball notes
102
+ # (session origins, third-party names, NDA/strategy context) that must NOT reach
103
+ # the public surface. Keep OFF main; residence is the orphan narration branch.
104
+ docs/cmb/
105
+
106
+ # TLC model-checker cache (jar downloaded by spec/tla/run-tlc.sh)
107
+ spec/tla/.tlc-cache/
108
+
109
+ # ...but the archived TLC reference outputs ARE committed (H19):
110
+ # they are what makes the paper's state counts reproducible.
111
+ !spec/tla/runs/*.out
112
+
113
+ # personal submission helper + internal go/no-go audit (private residence)
114
+ docs/paper/arxiv-metadata.txt
115
+ ops/audits/prerelease-go-2026-06-14.md
116
+
117
+ # task-20260614-6d66 — confidentiality (Gate 1, public-prep).
118
+ # These two design docs use private, domain-specific methodology as their worked
119
+ # example (internal data scale, private lab paths). That is confidential IP, not
120
+ # a generic OxyMake capability — private residence (noogram/oxymake-private).
121
+ # The generic engine ideas they explore (per-module DAG nodes, in-memory
122
+ # critical path) can be re-documented neutrally on the public surface if needed.
123
+ docs/design/per-alpha-signal-splitting.md
124
+ docs/design/stage2-lab-test-plan.md
125
+ .wrangler/
oxymake-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,32 @@
1
+ Metadata-Version: 2.4
2
+ Name: oxymake
3
+ Version: 0.1.0
4
+ Summary: Content-addressable workflow engine — git checkout no longer rebuilds everything
5
+ Project-URL: Homepage, https://oxymake.dev
6
+ Project-URL: Repository, https://github.com/noogram/oxymake
7
+ Project-URL: Releases, https://github.com/noogram/oxymake/releases
8
+ Author-email: Emmanuel Sérié <emmanuel@serie.dev>
9
+ License: MIT OR Apache-2.0
10
+ Keywords: build,cache,pipeline,snakemake,workflow
11
+ Requires-Python: >=3.8
12
+ Description-Content-Type: text/markdown
13
+
14
+ # OxyMake (Python launcher)
15
+
16
+ A content-addressable workflow engine. You `git checkout` an old branch, re-run
17
+ your pipeline, and it **does not** rebuild everything — change detection is a
18
+ BLAKE3 hash of file *content*, not timestamps.
19
+
20
+ ```bash
21
+ uv tool install oxymake # or: pipx install oxymake
22
+ ox --help
23
+ ```
24
+
25
+ This package is a thin launcher: on first run it downloads the prebuilt `ox`
26
+ binary for your platform from the
27
+ [GitHub release](https://github.com/noogram/oxymake/releases/latest), verifies
28
+ its SHA-256, caches it, and execs it. No Rust toolchain required — which is the
29
+ point: bioinformatics and data-science users who live in conda/pip can try
30
+ OxyMake without a source build.
31
+
32
+ Full documentation: <https://github.com/noogram/oxymake>
@@ -0,0 +1,19 @@
1
+ # OxyMake (Python launcher)
2
+
3
+ A content-addressable workflow engine. You `git checkout` an old branch, re-run
4
+ your pipeline, and it **does not** rebuild everything — change detection is a
5
+ BLAKE3 hash of file *content*, not timestamps.
6
+
7
+ ```bash
8
+ uv tool install oxymake # or: pipx install oxymake
9
+ ox --help
10
+ ```
11
+
12
+ This package is a thin launcher: on first run it downloads the prebuilt `ox`
13
+ binary for your platform from the
14
+ [GitHub release](https://github.com/noogram/oxymake/releases/latest), verifies
15
+ its SHA-256, caches it, and execs it. No Rust toolchain required — which is the
16
+ point: bioinformatics and data-science users who live in conda/pip can try
17
+ OxyMake without a source build.
18
+
19
+ Full documentation: <https://github.com/noogram/oxymake>
@@ -0,0 +1,101 @@
1
+ """Thin launcher for the OxyMake `ox` binary.
2
+
3
+ Installed via `uv tool install oxymake` / `pipx install oxymake`, this module
4
+ exposes the `ox` and `oxymake` console scripts. On first invocation it downloads
5
+ the prebuilt binary matching the host platform from the GitHub release, verifies
6
+ its SHA-256 against the `.sha256` sidecar, caches it under the user cache dir,
7
+ and execs it. No Rust toolchain is required.
8
+
9
+ This keeps the conda/pip onboarding path open: the audience that lives in Python
10
+ never has to `cargo install` from source.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import hashlib
16
+ import os
17
+ import platform
18
+ import stat
19
+ import sys
20
+ import tarfile
21
+ import tempfile
22
+ import urllib.request
23
+ from pathlib import Path
24
+
25
+ __version__ = "0.1.0"
26
+
27
+ _REPO = "noogram/oxymake"
28
+ _BASE = f"https://github.com/{_REPO}/releases/download/v{__version__}"
29
+
30
+ # (sys.platform startswith, machine) -> release target triple
31
+ _TARGETS = {
32
+ ("darwin", "arm64"): "aarch64-apple-darwin",
33
+ ("darwin", "x86_64"): "x86_64-apple-darwin",
34
+ ("linux", "x86_64"): "x86_64-unknown-linux-gnu",
35
+ ("linux", "amd64"): "x86_64-unknown-linux-gnu",
36
+ }
37
+
38
+
39
+ def _target() -> str:
40
+ key = (sys.platform, platform.machine().lower())
41
+ target = _TARGETS.get(key)
42
+ if target is None:
43
+ raise SystemExit(
44
+ f"oxymake: no prebuilt binary for {key}. "
45
+ f"Build from source: https://github.com/{_REPO}#install"
46
+ )
47
+ return target
48
+
49
+
50
+ def _cache_dir() -> Path:
51
+ root = os.environ.get("XDG_CACHE_HOME") or str(Path.home() / ".cache")
52
+ d = Path(root) / "oxymake" / __version__
53
+ d.mkdir(parents=True, exist_ok=True)
54
+ return d
55
+
56
+
57
+ def _download(url: str, dest: Path) -> None:
58
+ with urllib.request.urlopen(url) as resp, open(dest, "wb") as fh: # noqa: S310
59
+ fh.write(resp.read())
60
+
61
+
62
+ def _verify(tarball: Path, target: str) -> None:
63
+ """Verify the tarball against its published .sha256 sidecar."""
64
+ expected = _download_text(f"{_BASE}/ox-{target}.tar.gz.sha256").split()[0].strip()
65
+ actual = hashlib.sha256(tarball.read_bytes()).hexdigest()
66
+ if actual != expected:
67
+ raise SystemExit(
68
+ f"oxymake: checksum mismatch for ox-{target}.tar.gz "
69
+ f"(expected {expected}, got {actual}). Refusing to run."
70
+ )
71
+
72
+
73
+ def _download_text(url: str) -> str:
74
+ with urllib.request.urlopen(url) as resp: # noqa: S310
75
+ return resp.read().decode()
76
+
77
+
78
+ def _ensure_binary() -> Path:
79
+ target = _target()
80
+ binary = _cache_dir() / "ox"
81
+ if binary.exists():
82
+ return binary
83
+
84
+ url = f"{_BASE}/ox-{target}.tar.gz"
85
+ with tempfile.TemporaryDirectory() as tmp:
86
+ tarball = Path(tmp) / "ox.tar.gz"
87
+ _download(url, tarball)
88
+ _verify(tarball, target)
89
+ with tarfile.open(tarball) as tf:
90
+ tf.extract("ox", _cache_dir()) # noqa: S202 - controlled, verified archive
91
+ binary.chmod(binary.stat().st_mode | stat.S_IEXEC)
92
+ return binary
93
+
94
+
95
+ def main() -> "int":
96
+ binary = _ensure_binary()
97
+ os.execv(str(binary), [str(binary), *sys.argv[1:]])
98
+
99
+
100
+ if __name__ == "__main__":
101
+ main()
@@ -0,0 +1,36 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "oxymake"
7
+ version = "0.1.0"
8
+ description = "Content-addressable workflow engine — git checkout no longer rebuilds everything"
9
+ readme = "README.md"
10
+ requires-python = ">=3.8"
11
+ license = { text = "MIT OR Apache-2.0" }
12
+ authors = [{ name = "Emmanuel Sérié", email = "emmanuel@serie.dev" }]
13
+ keywords = ["workflow", "pipeline", "snakemake", "build", "cache"]
14
+
15
+ [project.urls]
16
+ Homepage = "https://oxymake.dev"
17
+ Repository = "https://github.com/noogram/oxymake"
18
+ Releases = "https://github.com/noogram/oxymake/releases"
19
+
20
+ # This is a thin launcher: it fetches the prebuilt `ox` binary that matches the
21
+ # host platform from the GitHub release on first run, caches it, and execs it.
22
+ # It deliberately has no Rust build dependency so that `uv tool install oxymake`
23
+ # and `pipx install oxymake` work in a pure conda/pip environment.
24
+
25
+ [project.scripts]
26
+ ox = "oxymake_launcher:main"
27
+ oxymake = "oxymake_launcher:main"
28
+
29
+ # The distribution name (`oxymake`) does not match the single launcher module
30
+ # (`oxymake_launcher.py`), so hatchling cannot auto-detect what to ship in the
31
+ # wheel — it must be told explicitly, or `python -m build` fails the wheel step.
32
+ [tool.hatch.build.targets.wheel]
33
+ only-include = ["oxymake_launcher.py"]
34
+
35
+ [tool.hatch.build.targets.sdist]
36
+ include = ["oxymake_launcher.py", "README.md", "pyproject.toml"]