Skip to main content

Parallel and sequential task-tree runner with matrix expansion and effects plugins.

Project description

camas-sketch-by-jph

Camas

A task runner with parallel execution, matrix expansion, MCP, and pluggable output effects.

  • For developers: live tree view that updates in place as tasks stream
  • For CI/CD: one definition drives both local runs and CI
  • For LLMs: a closed edit→validate→run loop over structured MCP

 

demo

Example

from camas import Parallel, Sequential

ci = Sequential(
  Parallel(
    "ruff format . --check",
    "npx prettier ."
  ),
  Parallel(
    "ruff check .",
    "mypy .",
    "npx eslint src/",
    "pytest",
    "npx tsc --noEmit"
  ),
)

The animated tree above is from a live test fixture — see the walkthrough.

Install

[!TIP] Add extras with PEP 621, e.g. camas[github_checks]

pipx:

pipx install camas

uv:

uv tool install camas

Nix:

nix run github:JPHutchins/camas                     # default
nix run github:JPHutchins/camas#with-github-checks  # adds httpx for the GitHubChecks effect
nix run github:JPHutchins/camas#with-check          # adds ty for `camas --check`
nix run github:JPHutchins/camas#all                 # both extras

Then scaffold a starter tasks.py in your project root:

camas --init

The starter demonstrates leaf tasks, Sequential/Parallel composition, a matrix, a Config default task, and the optional PEP 723 standalone block — cross-platform placeholder commands ready to be swapped for your real ones.

--init also creates a gitignored .camas/ directory beside tasks.py. Camas writes run logs and a per-leaf timing cache there, so camas --list can annotate tasks with an estimated duration; delete the directory to opt out. Rename or relocate it with Config(camas_dir=...).

Why camas?

camas is not a build system. camas is for the specific job of running structured trees of shell commands.

Python task runners† just Task Mage camas
Project scope Python projects only Any Any Go projects only Any
Definition language pyproject.toml TOML or @task decorator justfile DSL YAML Go Python (typed AST)
Inline anonymous parallel groups No No No (must be a named task) No Yes
Parallel execution poe yes; Invoke / taskipy no [parallel] attr deps: (parallel) mg.Deps(...) Parallel(...)
Matrix expansion No No for: + parallel:true Go loops matrix=
CLI matrix override (e.g. --PY 3.13) No No No No Yes
Live tree output No No prefixed / group modes No Termtree (default)
Pluggable output renderers No No 3 built-ins No --effects
Type checking on task definitions Partial No Editor schema Yes (Go) mypy / pyright
First release / status 2013–2020, stable 2016, stable 2017, stable 2017, stable 2026, alpha
Ecosystem Moderate (Python) Large Large Moderate None yet

poethepoet, Invoke, taskipy — pyproject.toml-bound runners that assume a Python project.

If you need... Reach for
Reproducible, hermetic builds Nix
Incremental file-based builds (skip when inputs unchanged) Task
Simple project command menu just
Parameterized tasks (--env=staging, prompts, vars) Task
Go project, build logic in Go Mage
Inline parallel/sequential trees with a live view camas
Pluggable output effects (live tree locally, summary in CI) camas
Matrix runs across versions/platforms, overridable from the CLI camas

CI integration

The renderer is swappable, not the tree. Run the same tasks.py locally with the live Termtree and in CI with Status — one flag changes the output, the pipeline definition is unchanged.

On GitHub Actions, no flag is needed. Camas detects GITHUB_ACTIONS=true and defaults --effects to (Status(output_mode="github"),) — collapsed workflow groups, ISO timestamps with millisecond precision, ANSI colors preserved.

Under an AI coding agent, no flag is needed either. Camas detects agents (the CLAUDECODE env var, or set CAMAS_AGENT=1) and defaults to the line-oriented Status renderer instead of the live Termtree, whose cursor-redraw frames bloat captured output. Prefer the camas mcp server over the CLI from an agent; a Config default_effects always overrides the detection.

- run: uv run camas check

On other CI providers (or to opt into a specific mode), spell it out:

- run: uv run camas check --effects='(Status(output_mode="errors"),)'

See the OutputMode literal and block_for doctests for the per-mode behavior. The status-modes-demo job renders one CI run per mode for visual comparison.

For per-leaf visibility in the PR Checks panel, add the GitHubChecks effect alongside Status (opt-in extra: camas[github_checks]). Each leaf task becomes its own check run, so reviewers see lint / mypy / pytest pass-or-fail individually instead of one monolithic log.

- run: |
    uv run --extra github_checks camas matrix --effects='(
      Status(output_mode="github"),
      GitHubChecks(sha="${{ github.event.pull_request.head.sha || github.sha }}"),
    )'
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

The job needs permissions: checks: write. Defaults read GITHUB_TOKEN, GITHUB_REPOSITORY, and GITHUB_SHA from the Actions env. The pull_request.head.sha override attaches checks to the PR head rather than the synthetic merge commit. See the github-checks-demo job for a working example.

When to use it. Two things it gives you:

  • SSOT between local dev and CI. Your camas matrix terminal view and the PR Checks panel show the same per-leaf shape (lint [PY=3.10], mypy [PY=3.14], …). The matrix definition lives once in tasks.py; CI doesn't re-encode it in YAML.
  • One runner instead of N. Camas-side parallel matrix on a single runner produces the same per-(cell, leaf) granularity that a GHA matrix gets across N runners — at 1/N the minutes and camas gives you efficient task parallelization pushing that runner to 100% utilization as much as possible. Worth it on paid-runner budgets.

The downside is that fork PRs get a read-only GITHUB_TOKEN from GitHub and can't write checks — usually a non-issue for Enterprise teams where contributors have push to the org repo.

When not to bother. OSS gets free runners — just GHA-matrix them in parallel for faster wall-clock time. The cost is small: you give up either SSOT (matrix definition moves into YAML) or per-leaf-UI granularity (one PR check entry per runner instead of per leaf) — pick one. What is a deal-breaker for OSS is fork PRs: external-contributor PRs return 403 from the Checks API, so per-leaf entries silently don't appear. The github-checks-demo job is marked continue-on-error so it doesn't block CI when that happens, but GitHubChecks isn't a workable OSS solution.

Config

Bind a Config in tasks.py and bare camas (no arguments) runs its default_task:

from camas import Config, Sequential, Task

lint = Task("ruff check .")
test = Task("pytest")
ci = Sequential(lint, test, name="ci")

_ = Config(default_task=ci)

Now camas runs ci, camas --dry-run previews it, and the default's matrix axes stay overridable (camas --PY 3.13). With no Config (or no default_task), bare camas prints the full help — task listing, effects, hints — and exits non-zero.

github_task is the CI counterpart, falling back to default_task when unset; it runs under GITHUB_ACTIONS=true. Paired with the automatic Status effect, one bare camas does the right thing in both places:

_ = Config(
  default_task=ci,                            # bare `camas` locally
  github_task=Sequential(ci, "pytest --cov"), # bare `camas` under GitHub Actions
)

Config is discovered by type, so the binding's name never matters — _ by convention. Defining two is an error.

Time budget (--under)

Once camas has timed a task's leaves (the .camas/ cache, surfaced by camas --list), camas --under=<duration> runs only the leaves whose estimate fits a wall-clock budget — the fast inner-loop subset, picked for you instead of by hand.

camas --under=1s            # budget the Config default task
camas --under=500ms check   # budget a named task or expression

It runs the mutating leaves first, in sequence, then the read-only rest in parallel — so formatters never race a checker over the same files. Mark a leaf that writes the workspace with mutates=True:

fix = Task("ruff check --fix .", mutates=True)
fmt = Task("ruff format .", mutates=True)
lint = Task("ruff check .")
$ camas --under=1s --dry-run
Time budget 1.00s — running 6 leaf(s) (0 unmeasured), excluded 2 over budget.
  over budget: pyright ~4.57s, coverage ~20.98s
fix → fmt → (mypy | ty | zuban | pyrefly)

Durations are 1s, 500ms, 2m, 1h, or a bare number of seconds. Only leaves measured to exceed the budget are excluded; a leaf with no recorded timing yet runs anyway (and is thereby measured) — skipping it would keep it forever untimed. The budget is per-leaf: a measured leaf runs when its own estimate fits, so the parallel group's wall-clock stays near the budget.

For agents, camas_run exposes the same budget as its under argument (omit task to budget the project default), and the response's budget field reports what was selected and excluded — a tight, time-boxed validate loop over structured MCP.

Path scoping (--paths)

camas <task> --paths <path>… scopes a run to changed paths instead of the whole tree. A leaf opts in by writing the {paths} placeholder in its command and declaring its scope with paths= — a directory prefix, or a (changed) -> paths callable:

py = Task("ruff format {paths}", mutates=True, paths="src")
web = Task("prettier --write {paths}", mutates=True, paths="web")
_ = Config(agent=Claude(fix=Sequential(py, web)))

--paths works on any task — camas check --paths src/a.py. Without it, every {paths} resolves to its full-run default (ruff format src); with it, each leaf runs only over the changed files it covers, and a leaf that covers none is dropped (--paths is repeatable, or comma-separated).

For the Claude Code plugin, you register the auto-fix node — whatever you named it — to Config.agent.fix; the FileChanged hook runs that node over the just-changed file, zero model tokens. Install the plugin (/plugin marketplace add JPHutchins/camas), or wire the hook by hand:

// .claude/settings.json
{ "hooks": { "FileChanged": [
  { "hooks": [{ "type": "command", "command": "camas mcp fix --paths ${file_path}" }] } ] } }

camas mcp fix runs the registered Config.agent.fix node (not a task named fix — that's just camas fix, your own task); with no fix registered it is a clean no-op, so the hook is harmless without it.

Effects plugins

Define an Effect in your tasks.py and it's discovered automatically — usable by name from --effects and listed under camas --effects. See examples/effect-plugin/ for a typed Tail effect that streams per-task output as it arrives.

Versioning

The public API is published through versioned namespacescamas.v0 today, camas.v1 and beyond later. Import from a generation to pin the API shape: a name a generation exports is never removed or changed within that generation. The scheme tracks semver — v0 pairs with camas 0.x and is as loose as semver says 0.x is (the surface prefers to grow; breaking changes stay possible until 1.0, made deliberately and noted in releases). At 1.0 a generation freezes: a breaking change forces the next camas.vN, and published generations keep shipping, so a tasks.py or effect plugin pinned to one keeps working across upgrades.

The top-level camas namespace is the unversioned alias for the latest generation: from camas import Task, Sequential, Parallel, Effect, Config re-exports that generation's five headline definers and is kept 1:1 with its package surface. The rest of the public API for a generation — TaskNode, the TaskEvent stream, LeafState, Completion — lives in that generation's submodules, e.g. from camas.v0.task_event import TaskEvent. Everything under camas.core / camas.main is internal — it consumes whatever generations are installed and carries no stability promise.

To pin a minimum camas feature level, use your dependency declaration (camas>=0.x in pyproject.toml, or PEP 723 inline metadata) — the import path covers API shape; the package pin covers feature availability.

Standalone tasks.py (PEP 723)

For a non-Python project that wants a single-file task runner — no pyproject.toml, no venv to manage — give tasks.py a PEP 723 header and a run_cli(globals()) entry point, then run it with any PEP 723-aware tool:

# /// script
# requires-python = ">=3.11"
# dependencies = ["camas>=0.1.8"]
# ///
"""Build tasks for my project."""

from camas import Parallel, Task, run_cli

lint = Task("ruff check .")
test = Task("pytest")
check = Parallel(lint, test)

if __name__ == "__main__":
    run_cli(globals())
uv run tasks.py check     # uv reads the header, builds an ephemeral env, runs
uv run tasks.py --list    # every camas flag still works
pipx run tasks.py test

run_cli(globals()) introspects the module for Task / Sequential / Parallel and Effect bindings — exactly what camas does when it auto-discovers a tasks.py — so the standalone file behaves identically to a discovered one: camas <task> --help, --dry-run, matrix overrides, and --check all work and cite the file. run_cli is part of the stable surface (from camas import run_cli, or from camas.v0 import run_cli to pin the generation); it's imported lazily, so a plain from camas import Task doesn't pull it in.

The header owns version pinning (dependencies = ["camas>=0.1.8"]) and the interpreter floor (requires-python); it's inert to camas --check and to auto-discovery, which read the module the same way with or without it.

Reference

  • examples/ — full project layouts under test coverage. The canonical reference for how to structure tasks.py, use [tool.camas.tasks] in pyproject.toml, drive a matrix from .python-version, or scope a 2-axis matrix from the CLI.
  • src/camas/ — typed Python with thorough docstrings. camas --help and camas <task> --help link back here.
  • camas with no args runs the Config default task (or prints the full help when none is defined); camas <task> --help shows the expanded tree, matrix axes, and override flags.

Walkthrough

The animated tree at the top is generated from this tasks.py:

examples/tauri-app/tasks.py — Rust + TypeScript + Python in one tree
from pathlib import Path

from camas import Config, Parallel, Sequential, Task

src_tauri = Path("src-tauri")
python_sdk = Path("python-sdk")
node = Path("node_modules/.bin")

frontend = Sequential(
    f"{node}/prettier --write .",
    Parallel(
        f"{node}/eslint src/",
        f"{node}/tsc --noEmit",
        f"{node}/vitest run",
    ),
)

backend = Sequential(
    Task("cargo fmt --all", cwd=src_tauri),
    Parallel(
        Task("cargo clippy --all-targets --locked -- -D warnings", cwd=src_tauri),
        Task("cargo test --all-targets --locked", cwd=src_tauri),
    ),
)

sdk = Sequential(
    Task("uv run ruff check --fix .", cwd=python_sdk),
    Task("uv run ruff format .", cwd=python_sdk),
    Parallel(
        Task("uv run mypy .", cwd=python_sdk),
        Task("uv run pytest", cwd=python_sdk),
    ),
)

all = Parallel(frontend, backend, sdk)

fix = Parallel(
    f"{node}/prettier --write .",
    Task("cargo fmt --all", cwd=src_tauri),
    Sequential(
        Task("uv run ruff check --fix .", cwd=python_sdk),
        Task("uv run ruff format .", cwd=python_sdk),
    ),
)

build = Parallel(
    Task("npm run tauri build {FLAG}"),
    matrix={"FLAG": ("-- --debug", "")},
    help="Debug and release builds (FLAG='-- --debug' debug, FLAG='' release)",
)

_ = Config(default_task=all)
$ cd examples/tauri-app

List the tasks

$ camas --list
output
Available tasks from .../tauri-app/tasks.py:
  all       frontend | backend | sdk
  backend   cargo fmt --all, cargo clippy --all-targets --locked -- -D warnings | cargo test --all-targets --locked
  build     Debug and release builds (FLAG='-- --debug' debug, FLAG='' release)  [matrix: FLAG×2 (-- --debug..)]
  fix       node_modules/.bin/prettier --write . | cargo fmt --all | (uv run ruff check --fix ., uv run ruff format .)
  frontend  node_modules/.bin/prettier --write ., node_modules/.bin/eslint src/ | node_modules/.bin/tsc --noEmit | node_modules/.bin/vitest run
  sdk       uv run ruff check --fix ., uv run ruff format ., uv run mypy . | uv run pytest

Preview what all would run

$ camas --dry-run all
output
all ∥
┃ frontend →
┃ ├─ node_modules/.bin/prettier --write .
┃ └─ node_modules/.bin/eslint src/ | node_modules/.bin/tsc --noEmit | node_modules/.bin/vitest run
┃   ┃ node_modules/.bin/eslint src/
┃   ┃ node_modules/.bin/tsc --noEmit
┃   ┃ node_modules/.bin/vitest run
┃ backend →
┃ ├─ cargo fmt --all  (cwd: src-tauri)
┃ └─ cargo clippy --all-targets --locked -- -D warnings | cargo test --all-targets --locked
┃   ┃ cargo clippy --all-targets --locked -- -D warnings  (cwd: src-tauri)
┃   ┃ cargo test --all-targets --locked  (cwd: src-tauri)
┃ sdk →
┃ ├─ uv run ruff check --fix .  (cwd: python-sdk)
┃ ├─ uv run ruff format .  (cwd: python-sdk)
┃ └─ uv run mypy . | uv run pytest
┃   ┃ uv run mypy .  (cwd: python-sdk)
┃   ┃ uv run pytest  (cwd: python-sdk)

Tree-symbol key: ends a Parallel header, ends a Sequential. Children hang off (parallel siblings, run concurrently) or ├─ / └─ (sequential steps, short-circuit on first failure).

Discover a task's matrix axes and override flags

$ camas build --help
output
usage: camas build [-h] [--dry-run] [--effects EFFECTS] [--FLAG VAL[,VAL...]]

Debug and release builds (FLAG='-- --debug' debug, FLAG='' release)

runs the 'build' task:
build ∥
┃ npm run tauri build -- --debug [FLAG=-- --debug]: npm run tauri build -- --debug  FLAG=-- --debug
┃ npm run tauri build  [FLAG=]: npm run tauri build   FLAG=

Matrix axes (override with --AXIS VAL[,VAL...]):
  --FLAG  -- --debug,

Pin the matrix from the CLI

$ camas build --dry-run --FLAG '-- --debug'
output
build ∥
┃ npm run tauri build -- --debug [FLAG=-- --debug]: npm run tauri build -- --debug  FLAG=-- --debug

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

camas-0.1.15.tar.gz (117.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

camas-0.1.15-cp314-cp314-win_amd64.whl (506.4 kB view details)

Uploaded CPython 3.14Windows x86-64

camas-0.1.15-cp314-cp314-musllinux_1_2_x86_64.whl (937.6 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

camas-0.1.15-cp314-cp314-musllinux_1_2_aarch64.whl (921.8 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

camas-0.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (942.8 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

camas-0.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (909.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

camas-0.1.15-cp314-cp314-macosx_11_0_arm64.whl (618.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

camas-0.1.15-cp313-cp313-win_amd64.whl (499.0 kB view details)

Uploaded CPython 3.13Windows x86-64

camas-0.1.15-cp313-cp313-musllinux_1_2_x86_64.whl (931.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

camas-0.1.15-cp313-cp313-musllinux_1_2_aarch64.whl (912.8 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

camas-0.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (938.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

camas-0.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (901.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

camas-0.1.15-cp313-cp313-macosx_11_0_arm64.whl (617.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

camas-0.1.15-cp312-cp312-win_amd64.whl (499.2 kB view details)

Uploaded CPython 3.12Windows x86-64

camas-0.1.15-cp312-cp312-musllinux_1_2_x86_64.whl (937.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

camas-0.1.15-cp312-cp312-musllinux_1_2_aarch64.whl (918.9 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

camas-0.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (943.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

camas-0.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (907.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

camas-0.1.15-cp312-cp312-macosx_11_0_arm64.whl (619.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

camas-0.1.15-cp311-cp311-win_amd64.whl (496.7 kB view details)

Uploaded CPython 3.11Windows x86-64

camas-0.1.15-cp311-cp311-musllinux_1_2_x86_64.whl (890.8 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

camas-0.1.15-cp311-cp311-musllinux_1_2_aarch64.whl (881.2 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

camas-0.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (898.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

camas-0.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (868.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

camas-0.1.15-cp311-cp311-macosx_11_0_arm64.whl (619.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file camas-0.1.15.tar.gz.

File metadata

  • Download URL: camas-0.1.15.tar.gz
  • Upload date:
  • Size: 117.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for camas-0.1.15.tar.gz
Algorithm Hash digest
SHA256 fbf15bdb745f034de0fbdaf0c3291879abc0693b1e69fb203ee512892a38e379
MD5 a01897dce8ef94a80644b3285b24f303
BLAKE2b-256 b86bf1014542c458a7870c9193afd5ec491bb04483cfe21fad50cafa40d2bb49

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15.tar.gz:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.15-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 506.4 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for camas-0.1.15-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 89796ed427b86268a45c9860c98749c9a077a1249958b15238e8e6f32edb3f31
MD5 dbf098a90612fa23d0825a7597be4937
BLAKE2b-256 a0a540eb217633e2e91cd52d0c0a922a7bb483323c16c3fc68b17adfc6a75465

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp314-cp314-win_amd64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a9b53434de0b53d6c6351b46b2b572ffd6c90293dc3c252a8ca47aaa169b80d2
MD5 4b0fee15f7d9043e6fa3bf929f1dd19b
BLAKE2b-256 c7a0353cff48ad5f0f0fd89a6b949ec688441cb64a4cbf30d63167beea1d6f49

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp314-cp314-musllinux_1_2_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9110fda4b7e6e12e8f8f8f1a37abe4415a70169e1fffaa79806194039b0c1c29
MD5 7617454ad12d05ab01330be0d165a9fe
BLAKE2b-256 2ef1e6d050d9da9f73033f59c23af5379b723c2edc0abe00a9352145834b4d37

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp314-cp314-musllinux_1_2_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 123733f6d83d0ccc707cbae592bca0d077607e315c793dc99e03f687429df167
MD5 077a2bd63961dff83f3e9edc7b3715a3
BLAKE2b-256 68dacf15a872cbeec021e80d36ac065833ef8d9cae383ea81a4abafd4043d861

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f54210d8cb8429c75a81c19966aecdfc1918d7da7cfb91da22b2ffd0601fa9a8
MD5 68ef8bf7824edae3d52196f5d7e5c121
BLAKE2b-256 d0919f5a39d63b7d929d8d8d40bca60f38f634e16de17e79eb2b1129c4844b74

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7b8c6e0ccec55ac302aabb65c3be3e935e4f7efbfeac8c06b1da1e7333f2c262
MD5 ef9c84b5ad44a05cf6429c580c40d174
BLAKE2b-256 c316889529aa900555cb119ae0e04f12357d1f1b470791c354db05018ecdf554

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.15-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 499.0 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for camas-0.1.15-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 c5769e6c9821ce8aee20ec886b40e885eb43cfa19b6068dc4bf2c997d2d38656
MD5 dd22c2deee029c46af6d1a0790e4fbd5
BLAKE2b-256 01599ff017f052654f6548d07a734e5ad495315ef16b796fe236b866e9561e31

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp313-cp313-win_amd64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c1dbb5e0c05f714ff8e798eb64e33add71a4e45e0623dd2db681f53ce59a88ba
MD5 8b9fdd24239168183c930660f693293c
BLAKE2b-256 1943dbb4702d72bdeb40c39fa848931b18afdb95ba08ef7ea46e9eb6b16ab3b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8106ceb435339e96ea3dbc58ff83bad2417255316807eb6f17e3b0612774733f
MD5 c9c8231b6603c9fa1b3d162dcefde4d4
BLAKE2b-256 09f137cdd46cf4fe120189939684b85c1ec563e6755525a54a6a21f40d89d85f

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp313-cp313-musllinux_1_2_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4b243ac9ca91ad8dc922ca654f54d871dc7e1a160aa88b26b45438ce0daaa4ab
MD5 31b369e4be220fb5f6668ccca9d24be7
BLAKE2b-256 cfc43f007f9f9256e4929ef2a32e83944081f4f8abc8a686148130731ce462c2

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1fa5af8dfb3cf6b1583e335f03d1935c47e085e7ba9d3438e236e8a86f8fd8b3
MD5 68183d99ec5655052b00ecec66bbe5a1
BLAKE2b-256 e65f35210183ed3be6a736d5ae25df23cf1213201f28e534ec9d5d1b0088ab5f

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f0d707d376e86b8554a6248bd69e1fef3dd1cc520468cac9f8a878e3be0bcf73
MD5 cf7ae51c89e045c3721282426f792701
BLAKE2b-256 98159d0896718d783835d5273e786b51213635fb74b1d2c1400154fc73dc45b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.15-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 499.2 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for camas-0.1.15-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 5afad8b492bf9c6afea88b9b3cb7c754972db56f4dc7627b0d03e850e20fe396
MD5 6198c9e0bac3025cb93206ae2293c0b0
BLAKE2b-256 90a5198b0d07570676f46245042e7cd3e86c572e2863fdf7de263d7e3d62f3a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp312-cp312-win_amd64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ee6796cd7f28ead9afadb3a1a53b6de957ad2af45161b6ee1274d64066d2c1c9
MD5 eb61491cc4bfc8c0766d20010b5d5a44
BLAKE2b-256 9761fba1e4018b75e8d5c721c24365b00a4618a7a6241076e2e700b2ec936267

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4baa7616687e0faa207b8a5fbd71d31a4c0db7ff3b3e0de5c02712104c53facb
MD5 46fe23e2b2a5adbaefee908c414d9133
BLAKE2b-256 2ed0bcb3709e2cd912ab886b487b155850a796b0adbc929d6e8b2927f43cfc18

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp312-cp312-musllinux_1_2_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6945c4045ddd8b4043b346d7ec6cd3d2b84ce5ee2f76e0e31e88db47818506d9
MD5 41fdb6e6a8c048acc6b50110b1eca648
BLAKE2b-256 dcb06141fa3f6ce737747dac1783913a378f19ebf6cede7b406cd41adfe8f233

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6db2f79c8e82164f18aa6aff3fe3c08eac2f0731b40a38ff6b4119eccf21aa38
MD5 5aa44c70411afa2450d3f4476e33eb05
BLAKE2b-256 9c5b8b42b20f35e68aee11bf27f0733e628a96d114b32908cc3b036ad640ec49

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0d7d838dfb99b0e059425ead700552c9a1b31b8ec4a9022456970204b30c3a0b
MD5 21a439301df4a3cd0e57808fecb8825c
BLAKE2b-256 804265cde76c9c57c672bf799fb61d361e44c65f6d7eed9803b064f3504c9c27

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.15-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 496.7 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for camas-0.1.15-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7e4e8260ebc4801189f5d87a2efe6d8fc8b83c2eca9c56258020a8cc813ed786
MD5 c16a747849ded3f367ab1a4cb042ef61
BLAKE2b-256 1495e68a3c64b6364280fecf74039b76bcef47242dcd12d46d2fc3a8bede6fb2

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp311-cp311-win_amd64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c5904faf235ab833fa0c294054820f9d51f2d451f8f1e95a4fefa954cbe3e4a6
MD5 183ddee610f8d22816dca304ac376008
BLAKE2b-256 b29531552e2c7cd636eeef5e6021d9f79c53117f95661d2abd7ccccc1102d9f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d6d41dac2a9414c18ccdf37cf1b22554472ad245de196a10a154cd1f5e2132bd
MD5 67b0147e2e67548a4c2dd99ba092c6ae
BLAKE2b-256 827bdefaba5eeb928f5bae63a33b730960eaf0c0b8947b3b1f6b69893926dbe8

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp311-cp311-musllinux_1_2_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 476891a0aba6602b3dbe23dc7597bc1cc6f47c9eae2edb1a6643bfe698311aad
MD5 0d613eba703131ce64bb09f7e7319dec
BLAKE2b-256 1548054a54566796380869ef4e4fbd3e16f9a8ad079a367554f5b72288d205e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a05ccaaccb805eb8e29cbd88f48a6524cf246f9351f2935557fae9a850df3819
MD5 33e24f40366f83feccfec8372f18e9fd
BLAKE2b-256 33c1d76a52f1b250cd61665a17c6ef2c514cf5ff89ba765f6d0c8f64ffea5915

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file camas-0.1.15-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.15-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a184a413a087bd3d8031447b3cfa09c76b263b1d6046d3b665a4aaa20f0d1be9
MD5 3a6bb5fb6cb2d6740e344bd6112f3bf6
BLAKE2b-256 2584487d74f20428b6b2b8652f9f7cbae83e4438491ac6207552b42cb926832e

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.15-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: ci.yaml on JPHutchins/camas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page