calkit-python 0.37.6__tar.gz → 0.38.1__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.
- calkit_python-0.38.1/.claude-plugin/marketplace.json +15 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/.gitignore +1 -0
- calkit_python-0.38.1/AGENTS.md +18 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/PKG-INFO +10 -2
- {calkit_python-0.37.6 → calkit_python-0.38.1}/README.md +9 -1
- calkit_python-0.38.1/agent-plugin/.claude-plugin/plugin.json +5 -0
- calkit_python-0.38.1/agent-plugin/skills/add-pipeline-stage/SKILL.md +122 -0
- calkit_python-0.38.1/agent-plugin/skills/conventions/SKILL.md +306 -0
- calkit_python-0.38.1/agent-plugin/skills/create-pipeline/SKILL.md +189 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/check.py +4 -4
- calkit_python-0.38.1/calkit/cli/cloud.py +125 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/config.py +13 -8
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/import_.py +13 -1
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/main/core.py +12 -16
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/update.py +73 -0
- calkit_python-0.38.1/calkit/cloud.py +232 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/config.py +2 -2
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/core.py +11 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/dvc/core.py +55 -14
- calkit_python-0.38.1/calkit/tests/cli/test_cloud.py +170 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/test_config.py +7 -7
- calkit_python-0.38.1/calkit/tests/cli/test_update.py +94 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/dvc/test_core.py +90 -3
- calkit_python-0.38.1/calkit/tests/test_cloud.py +266 -0
- calkit_python-0.38.1/docs/ai-tools.md +130 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/cli-reference.md +61 -14
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/cloud-integration.md +5 -5
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/environments.md +10 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/installation.md +9 -1
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/reproducibility.md +26 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/mkdocs.yml +2 -1
- {calkit_python-0.37.6 → calkit_python-0.38.1}/pyproject.toml +3 -0
- calkit_python-0.37.6/calkit/cli/cloud.py +0 -24
- calkit_python-0.37.6/calkit/cloud.py +0 -126
- calkit_python-0.37.6/calkit/tests/cli/test_update.py +0 -22
- {calkit_python-0.37.6 → calkit_python-0.38.1}/.pre-commit-config.yaml +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/.prettierignore +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/.python-version +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/.vscode/launch.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/.vscode/tasks.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/.yarnrc.yml +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/CITATION.cff +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/CODE_OF_CONDUCT.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/CONTRIBUTING.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/LICENSE +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/Makefile +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/babel.config.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/__main__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/calc.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/check.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/core.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/describe.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/dev.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/latex.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/list.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/main/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/main/xr.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/new.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/notebooks.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/office.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/overleaf.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/cli/slurm.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/conda.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/datasets.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/detect.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/docker.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/dvc/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/dvc/zip.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/environments.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/fs.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/git.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/github.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/gui.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/invenio.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/julia.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/jupyter.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/jupyterlab/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/jupyterlab/routes.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/package.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/schemas/calkit/plugin.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/static/remoteEntry.65469af996e7a96aa983.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/static/style.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/labextension/static/third-party-licenses.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/licenses.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/magics.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/matlab.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/models/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/models/core.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/models/io.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/models/iteration.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/models/pipeline.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/notebooks.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/office.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/ops.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/overleaf.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/pipeline.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/releases.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/server.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/templates/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/templates/core.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/templates/latex/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/templates/latex/article/paper.tex +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/templates/latex/core.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/templates/latex/jfm/jfm.bst +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/templates/latex/jfm/jfm.cls +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/templates/latex/jfm/paper.tex +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/templates/latex/jfm/upmath.sty +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/main/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/main/test_core.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/main/test_xr.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/test_check.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/test_import.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/test_latex.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/test_list.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/test_new.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/test_notebooks.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/cli/test_overleaf.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/dvc/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/dvc/test_zip.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/jupyterlab/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/jupyterlab/test_routes.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/models/__init__.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/models/test_iteration.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/models/test_pipeline.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_calc.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_check.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_conda.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_core.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_detect.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_docker.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_environments.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_fs.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_git.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_invenio.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_julia.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_jupyter.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_magics.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_matlab.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_notebooks.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_pipeline.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_releases.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/calkit/tests/test_templates.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/conftest.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/CNAME +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/apps.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/calculations.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/calkit-yaml.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/datasets.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/dependencies.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/examples.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/governance.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/help.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/c-to-the-k-white.svg +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/calkit-fragmentation-compendium.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/calkit-no-bg.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/connect-zenodo.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/jupyterlab/all-green.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/jupyterlab/collect-data-stale.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/jupyterlab/new-env.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/jupyterlab/new-notebook.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/jupyterlab/pipeline-badge.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/jupyterlab-params.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/plos-osi-code-2024-03.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/img/vscode-nb-params.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/index.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/jupyterlab.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/local-server.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/notebooks.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/overleaf.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/pipeline/index.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/pipeline/manual-steps.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/pipeline/running-and-logging.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/pipeline/slurm.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/quickstart.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/references.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/releases.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/adding-latex-pub-docker.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/conda-envs.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/existing-project.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/first-project.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/github-actions.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/actions-repo-secrets.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/push.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/chart-more-rows.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/create-project.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/excel-chart.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/excel-data.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/needs-clone.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/new-stage.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/status-more-rows.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/untracked-data.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/updated-publication.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/office/workflow-page.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/openfoam/clone.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/openfoam/create-project.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/openfoam/new-token.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/openfoam/reclone.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/quick-actions.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/run-proc.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/index.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/jupyterlab.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/latex-codespaces.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/matlab.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/notebook-pipeline.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/office.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/openfoam.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/procedures.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/tutorials/vscode-slurm-notebook.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/docs/version-control.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/install.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/jest.config.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/jupyter-config/server-config/calkit.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/package.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/schema/plugin.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/scripts/generate-docs-references.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/scripts/install.ps1 +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/scripts/install.sh +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/scripts/make-calk9.sh +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/scripts/sync-docs.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/__tests__/useQueries.spec.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/calkit-config.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/cell-output-marker.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/components/commit-dialog.tsx +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/components/environment-editor.tsx +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/components/notebook-registration.tsx +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/components/notebook-toolbar.tsx +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/components/pipeline-status-bar.tsx +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/components/project-info-editor.tsx +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/components/sidebar-settings.tsx +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/components/sidebar.tsx +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/components/stage-editor.tsx +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/feature-flags.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/file-browser-menu.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/hooks/__tests__/useQueries.test.tsx +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/hooks/useQueries.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/icons.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/index.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/io-tracker.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/pipeline-state.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/queryClient.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/request.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/src/shims-mainmenu.d.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/style/base.css +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/style/cell-output-marker.css +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/style/environment-editor.css +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/style/environment-selector.css +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/style/img/calkit-no-bg.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/style/index.css +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/style/index.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/style/notebook-toolbar.css +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/style/pipeline-status-bar.css +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/style/sidebar.css +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/test/dvc-md5-dir/osx-arm64.txt +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/test/nb-julia.ipynb +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/test/nb-params.ipynb +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/test/nb-subdir.ipynb +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/test/pipeline.ipynb +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/test/script.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/test/test-log.log +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/tsconfig.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/tsconfig.test.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/ui-tests/.gitignore +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/ui-tests/README.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/ui-tests/jupyter_server_test_config.py +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/ui-tests/package.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/ui-tests/playwright.config.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/ui-tests/tests/calkit.spec.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/ui-tests/yarn.lock +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/uv.lock +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/.gitignore +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/.vscodeignore +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/CHANGELOG.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/LICENSE +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/README.md +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/images/calkit-no-bg.png +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/package-lock.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/package.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/scripts/set-proposed-api.js +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/src/environments.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/src/extension.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/src/notebooks.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/src/test/environments.test.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/src/test/notebooks.test.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/src/types.ts +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/vscode-ext/tsconfig.json +0 -0
- {calkit_python-0.37.6 → calkit_python-0.38.1}/yarn.lock +0 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "calkit",
|
|
3
|
+
"owner": { "name": "Calkit" },
|
|
4
|
+
"plugins": [
|
|
5
|
+
{
|
|
6
|
+
"name": "calkit",
|
|
7
|
+
"description": "Skills for working with Calkit projects.",
|
|
8
|
+
"source": {
|
|
9
|
+
"source": "git-subdir",
|
|
10
|
+
"url": "https://github.com/calkit/calkit.git",
|
|
11
|
+
"path": "agent-plugin"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Agent instructions for working on Calkit
|
|
2
|
+
|
|
3
|
+
## Repo structure
|
|
4
|
+
|
|
5
|
+
- The main Python package/CLI lives in `calkit`
|
|
6
|
+
- The JupyterLab extension lives in `src`
|
|
7
|
+
- The VS Code extension lives in `vscode-ext`
|
|
8
|
+
|
|
9
|
+
## Working
|
|
10
|
+
|
|
11
|
+
See `CONTRIBUTING.md` for tool usage, style guidelines, etc.
|
|
12
|
+
|
|
13
|
+
To run tests, use `uv run pytest`.
|
|
14
|
+
|
|
15
|
+
To sync the docs and format all the code, run `make format`.
|
|
16
|
+
|
|
17
|
+
Wrap prose at natural breakpoints in phrases or punctuation to keep max
|
|
18
|
+
line length below 80 characters.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: calkit-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.38.1
|
|
4
4
|
Summary: Reproducibility simplified.
|
|
5
5
|
Project-URL: Homepage, https://calkit.org
|
|
6
6
|
Project-URL: Issues, https://github.com/calkit/calkit/issues
|
|
@@ -174,7 +174,15 @@ You may also want to install [Docker](https://docker.com),
|
|
|
174
174
|
since that is the default method by which LaTeX environments are created.
|
|
175
175
|
If you want to use the [Calkit Cloud](https://calkit.io)
|
|
176
176
|
for collaboration and backup as a DVC remote,
|
|
177
|
-
you can [set up cloud integration](https://docs.calkit.org/cloud-integration)
|
|
177
|
+
you can [set up cloud integration](https://docs.calkit.org/cloud-integration) with:
|
|
178
|
+
|
|
179
|
+
```sh
|
|
180
|
+
calkit cloud login
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
If you use AI agents like Claude, Copilot, or Codex,
|
|
184
|
+
see [AI tools](https://docs.calkit.org/ai-tools)
|
|
185
|
+
to learn how to install agent skills for working with Calkit.
|
|
178
186
|
|
|
179
187
|
### Use without installing
|
|
180
188
|
|
|
@@ -115,7 +115,15 @@ You may also want to install [Docker](https://docker.com),
|
|
|
115
115
|
since that is the default method by which LaTeX environments are created.
|
|
116
116
|
If you want to use the [Calkit Cloud](https://calkit.io)
|
|
117
117
|
for collaboration and backup as a DVC remote,
|
|
118
|
-
you can [set up cloud integration](https://docs.calkit.org/cloud-integration)
|
|
118
|
+
you can [set up cloud integration](https://docs.calkit.org/cloud-integration) with:
|
|
119
|
+
|
|
120
|
+
```sh
|
|
121
|
+
calkit cloud login
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
If you use AI agents like Claude, Copilot, or Codex,
|
|
125
|
+
see [AI tools](https://docs.calkit.org/ai-tools)
|
|
126
|
+
to learn how to install agent skills for working with Calkit.
|
|
119
127
|
|
|
120
128
|
### Use without installing
|
|
121
129
|
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: add-pipeline-stage
|
|
3
|
+
description: Add a single new stage to an existing Calkit pipeline. Use when
|
|
4
|
+
the user invokes `/calkit:add-pipeline-stage` or asks to add a script,
|
|
5
|
+
notebook, or command to the pipeline.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Add a pipeline stage
|
|
9
|
+
|
|
10
|
+
Add a single new stage to an existing Calkit pipeline—wiring up the right
|
|
11
|
+
environment, inputs, outputs, and storage mode.
|
|
12
|
+
|
|
13
|
+
## Before you start
|
|
14
|
+
|
|
15
|
+
Read `calkit.yaml` to understand what environments are already defined (you
|
|
16
|
+
will reuse one if it fits) and what stages already exist and what they output
|
|
17
|
+
(your new stage may depend on them).
|
|
18
|
+
|
|
19
|
+
## Option A: Add with `calkit xr`
|
|
20
|
+
|
|
21
|
+
Use `xr` when the stage is a script or notebook file (`.py`, `.ipynb`, `.R`,
|
|
22
|
+
`.jl`, `.m`, `.sh`, `.tex`) and you want auto-detection of I/O and
|
|
23
|
+
environment.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
calkit xr scripts/new-stage.py --dry-run # preview first
|
|
27
|
+
calkit xr scripts/new-stage.py # run for real
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Override detected I/O or environment if needed:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
calkit xr scripts/new-stage.py \
|
|
34
|
+
--input data/processed.csv \
|
|
35
|
+
--input config/params.yaml \
|
|
36
|
+
--output results/output.csv \
|
|
37
|
+
--environment main
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
After running, inspect the new stage in `calkit.yaml` to confirm I/O is
|
|
41
|
+
correct.
|
|
42
|
+
|
|
43
|
+
## Option B: Write the stage manually
|
|
44
|
+
|
|
45
|
+
Write YAML directly when the stage is a shell command, or when you need
|
|
46
|
+
`iterate_over`, specific storage modes, or other fine-grained control.
|
|
47
|
+
|
|
48
|
+
| File type | Stage kind |
|
|
49
|
+
| ---------------- | ---------------------------- |
|
|
50
|
+
| `.py` | `python-script` |
|
|
51
|
+
| `.ipynb` | `jupyter-notebook` |
|
|
52
|
+
| `.sh` | `shell-script` |
|
|
53
|
+
| Inline command | `shell-command` or `command` |
|
|
54
|
+
| `.tex` | `latex` |
|
|
55
|
+
| `.R` | `r-script` |
|
|
56
|
+
| `.jl` | `julia-script` |
|
|
57
|
+
| `.m` | `matlab-script` |
|
|
58
|
+
| `docker run ...` | `docker-command` |
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
pipeline:
|
|
62
|
+
stages:
|
|
63
|
+
# ... existing stages ...
|
|
64
|
+
|
|
65
|
+
new-stage-name:
|
|
66
|
+
kind: python-script
|
|
67
|
+
script_path: scripts/new-stage.py
|
|
68
|
+
environment: main # must match a key in environments:
|
|
69
|
+
inputs:
|
|
70
|
+
- data/processed.csv
|
|
71
|
+
outputs:
|
|
72
|
+
- results/output.csv
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Wiring dependencies
|
|
76
|
+
|
|
77
|
+
If the new stage reads files produced by an existing stage, declare them as
|
|
78
|
+
inputs. List files explicitly, or depend on all outputs of a prior stage:
|
|
79
|
+
|
|
80
|
+
```yaml
|
|
81
|
+
inputs:
|
|
82
|
+
- data/processed.csv # explicit file
|
|
83
|
+
- from_stage_outputs: process-data # all outputs of that stage
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
If an existing stage reads files your new stage now produces, update that
|
|
87
|
+
stage's inputs too.
|
|
88
|
+
|
|
89
|
+
## Output storage
|
|
90
|
+
|
|
91
|
+
- `git`—small or text files collaborators should see without `calkit pull`
|
|
92
|
+
(PDFs, summary CSVs, HTML reports)
|
|
93
|
+
- `dvc` (default)—large or binary files
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
outputs:
|
|
97
|
+
- results/large-matrix.npy # DVC (default)
|
|
98
|
+
- path: results/summary.csv
|
|
99
|
+
storage: git
|
|
100
|
+
- path: results/report.html
|
|
101
|
+
storage: git
|
|
102
|
+
delete_before_run: false # keep old version if stage is skipped
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## After adding the stage
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
calkit run # run full pipeline
|
|
109
|
+
calkit run new-stage-name # run only this stage
|
|
110
|
+
calkit status # check what's stale
|
|
111
|
+
calkit commit -am "Add new-stage-name stage"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Common mistakes
|
|
115
|
+
|
|
116
|
+
- **Wrong environment name**: Must exactly match a key in `environments`. Run
|
|
117
|
+
`calkit check env --name <env>` to verify.
|
|
118
|
+
- **Two stages claiming the same output**: Each file can only be the output of
|
|
119
|
+
one stage.
|
|
120
|
+
- **Missing inputs**: If a stage reads a file but doesn't declare it, DVC
|
|
121
|
+
won't re-run the stage when that file changes.
|
|
122
|
+
- **Editing `dvc.yaml`**: Don't—it's auto-generated from `calkit.yaml`.
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conventions
|
|
3
|
+
description: Calkit conventions and foundational context. Load whenever working
|
|
4
|
+
in a Calkit project—defines calkit.yaml structure, environments, pipeline
|
|
5
|
+
stages, CLI commands, and version control conventions.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Calkit conventions
|
|
9
|
+
|
|
10
|
+
Calkit is a tool for research project management focused on automation and
|
|
11
|
+
reproducibility—enabling continuous delivery for research.
|
|
12
|
+
It provides a unified
|
|
13
|
+
interface over Git (source control) and DVC (data versioning), and adds
|
|
14
|
+
environment management and pipeline orchestration on top. The central artifact
|
|
15
|
+
is `calkit.yaml`, the project's metadata database.
|
|
16
|
+
|
|
17
|
+
## The `calkit.yaml` file
|
|
18
|
+
|
|
19
|
+
`calkit.yaml` lives at the repo root and contains:
|
|
20
|
+
|
|
21
|
+
- `environments`—computational environments (Python venvs, Conda, Docker,
|
|
22
|
+
R, Julia, MATLAB, etc.)
|
|
23
|
+
- `pipeline.stages`—the reproducible pipeline
|
|
24
|
+
- `notebooks`—registered Jupyter notebooks
|
|
25
|
+
- `datasets`, `figures`, `publications`—versioned project outputs
|
|
26
|
+
- `procedures`, `calculations`, `references`—supporting metadata
|
|
27
|
+
- `showcase`—elements shown on the project's Calkit Cloud homepage
|
|
28
|
+
|
|
29
|
+
A minimal example:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
environments:
|
|
33
|
+
main:
|
|
34
|
+
kind: uv-venv
|
|
35
|
+
path: requirements.txt
|
|
36
|
+
python: "3.13"
|
|
37
|
+
|
|
38
|
+
pipeline:
|
|
39
|
+
stages:
|
|
40
|
+
process-data:
|
|
41
|
+
kind: python-script
|
|
42
|
+
script_path: scripts/process.py
|
|
43
|
+
environment: main
|
|
44
|
+
inputs:
|
|
45
|
+
- data/raw.csv
|
|
46
|
+
outputs:
|
|
47
|
+
- data/processed.csv
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Environments
|
|
51
|
+
|
|
52
|
+
Every pipeline stage must reference a named environment defined in
|
|
53
|
+
`environments`. Calkit enforces this to ensure reproducibility. Supported
|
|
54
|
+
kinds:
|
|
55
|
+
|
|
56
|
+
| Kind | Spec file |
|
|
57
|
+
| --------- | --------------------------------------- |
|
|
58
|
+
| `uv-venv` | `requirements.txt` or `pyproject.toml` |
|
|
59
|
+
| `venv` | `requirements.txt` |
|
|
60
|
+
| `conda` | `environment.yml` |
|
|
61
|
+
| `pixi` | `pixi.toml` |
|
|
62
|
+
| `docker` | (image name, no local spec file needed) |
|
|
63
|
+
| `renv` | `renv.lock` |
|
|
64
|
+
| `julia` | `Project.toml` |
|
|
65
|
+
| `matlab` | (no spec file) |
|
|
66
|
+
| `ssh` | (remote host config) |
|
|
67
|
+
| `slurm` | (HPC cluster config) |
|
|
68
|
+
|
|
69
|
+
Example environment definitions:
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
environments:
|
|
73
|
+
main:
|
|
74
|
+
kind: uv-venv
|
|
75
|
+
path: requirements.txt
|
|
76
|
+
python: "3.13"
|
|
77
|
+
|
|
78
|
+
texlive:
|
|
79
|
+
kind: docker
|
|
80
|
+
image: texlive/texlive:latest-full
|
|
81
|
+
|
|
82
|
+
r-env:
|
|
83
|
+
kind: renv
|
|
84
|
+
path: renv.lock
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Calkit generates a lock file for each environment under `.calkit/env-locks/`
|
|
88
|
+
and uses it as a DVC dependency. If the environment changes, affected stages
|
|
89
|
+
are automatically flagged for re-run.
|
|
90
|
+
|
|
91
|
+
## Pipeline stages
|
|
92
|
+
|
|
93
|
+
Stages live under `pipeline.stages` in `calkit.yaml`. Every stage requires
|
|
94
|
+
`kind` and `environment`. Most stages also declare `inputs` and `outputs`.
|
|
95
|
+
|
|
96
|
+
### Common parameters (all stage kinds)
|
|
97
|
+
|
|
98
|
+
| Parameter | Type | Notes |
|
|
99
|
+
| -------------- | ------ | ----------------------------------------------- |
|
|
100
|
+
| `kind` | string | Required. See stage kinds below. |
|
|
101
|
+
| `environment` | string | Required. Must match a key in `environments`. |
|
|
102
|
+
| `inputs` | list | Files this stage reads. Changes trigger re-run. |
|
|
103
|
+
| `outputs` | list | Files this stage writes. Stored in Git or DVC. |
|
|
104
|
+
| `wdir` | string | Working directory (relative to repo root). |
|
|
105
|
+
| `always_run` | bool | Force re-run even if nothing changed. |
|
|
106
|
+
| `iterate_over` | list | Parameterize the stage over a list of values. |
|
|
107
|
+
| `description` | string | Human-readable description. |
|
|
108
|
+
|
|
109
|
+
### Stage kinds and their required fields
|
|
110
|
+
|
|
111
|
+
**`python-script`**: Run a Python script
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
kind: python-script
|
|
115
|
+
script_path: scripts/run.py
|
|
116
|
+
args: ["--flag", "value"] # optional
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**`jupyter-notebook`**: Execute a Jupyter notebook
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
kind: jupyter-notebook
|
|
123
|
+
notebook_path: notebooks/analysis.ipynb
|
|
124
|
+
html_storage: git # optional, default: dvc
|
|
125
|
+
executed_ipynb_storage: git # optional, default: dvc
|
|
126
|
+
parameters: { key: value } # optional, papermill parameters
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**`shell-command`**: Run an arbitrary shell command
|
|
130
|
+
|
|
131
|
+
```yaml
|
|
132
|
+
kind: shell-command
|
|
133
|
+
command: "python -m mymodule --arg val"
|
|
134
|
+
shell: bash # optional, default: bash
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**`shell-script`**: Run a shell script file
|
|
138
|
+
|
|
139
|
+
```yaml
|
|
140
|
+
kind: shell-script
|
|
141
|
+
script_path: scripts/run.sh
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**`latex`**: Compile a LaTeX document to PDF
|
|
145
|
+
|
|
146
|
+
```yaml
|
|
147
|
+
kind: latex
|
|
148
|
+
target_path: paper/paper.tex
|
|
149
|
+
pdf_storage: git # optional, default: dvc
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**`r-script`**: Run an R script
|
|
153
|
+
|
|
154
|
+
```yaml
|
|
155
|
+
kind: r-script
|
|
156
|
+
script_path: scripts/analysis.R
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**`julia-script`** / **`julia-command`**: Run Julia code
|
|
160
|
+
|
|
161
|
+
```yaml
|
|
162
|
+
kind: julia-script
|
|
163
|
+
script_path: scripts/run.jl
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**`matlab-script`** / **`matlab-command`**: Run MATLAB code
|
|
167
|
+
|
|
168
|
+
```yaml
|
|
169
|
+
kind: matlab-script
|
|
170
|
+
script_path: scripts/run.m
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**`docker-command`**: Run a command inside a Docker container
|
|
174
|
+
|
|
175
|
+
```yaml
|
|
176
|
+
kind: docker-command
|
|
177
|
+
command: "docker run --rm myimage mycommand"
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**`command`**: Generic command (for tools that don't fit other kinds)
|
|
181
|
+
|
|
182
|
+
```yaml
|
|
183
|
+
kind: command
|
|
184
|
+
command: "mytool --input data/raw.csv --output data/out.csv"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Outputs: Git vs. DVC storage
|
|
188
|
+
|
|
189
|
+
By default, outputs are stored with DVC (large file storage). Use
|
|
190
|
+
`storage: git` for small files that belong in version control:
|
|
191
|
+
|
|
192
|
+
```yaml
|
|
193
|
+
outputs:
|
|
194
|
+
- data/processed.csv # DVC (default)
|
|
195
|
+
- path: data/meta.json
|
|
196
|
+
storage: git # committed to Git
|
|
197
|
+
- path: results/summary.txt
|
|
198
|
+
storage: git
|
|
199
|
+
delete_before_run: false # don't delete before re-running
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Declaring dependencies between stages
|
|
203
|
+
|
|
204
|
+
Use `from_stage_outputs` to declare that a stage depends on another stage's
|
|
205
|
+
outputs rather than listing individual files:
|
|
206
|
+
|
|
207
|
+
```yaml
|
|
208
|
+
stages:
|
|
209
|
+
collect-data:
|
|
210
|
+
kind: python-script
|
|
211
|
+
script_path: scripts/collect.py
|
|
212
|
+
environment: main
|
|
213
|
+
outputs:
|
|
214
|
+
- data/raw.csv
|
|
215
|
+
|
|
216
|
+
process-data:
|
|
217
|
+
kind: python-script
|
|
218
|
+
script_path: scripts/process.py
|
|
219
|
+
environment: main
|
|
220
|
+
inputs:
|
|
221
|
+
- from_stage_outputs: collect-data
|
|
222
|
+
outputs:
|
|
223
|
+
- data/processed.csv
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Iterating over parameters
|
|
227
|
+
|
|
228
|
+
```yaml
|
|
229
|
+
stages:
|
|
230
|
+
train-model:
|
|
231
|
+
kind: python-script
|
|
232
|
+
script_path: scripts/train.py
|
|
233
|
+
environment: main
|
|
234
|
+
args:
|
|
235
|
+
- "--model={model}"
|
|
236
|
+
iterate_over:
|
|
237
|
+
- arg_name: model
|
|
238
|
+
values:
|
|
239
|
+
- linear-regression
|
|
240
|
+
- random-forest
|
|
241
|
+
inputs:
|
|
242
|
+
- data/processed.csv
|
|
243
|
+
outputs:
|
|
244
|
+
- models/{model}.pkl
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Relationship to DVC
|
|
248
|
+
|
|
249
|
+
Calkit compiles `calkit.yaml` into `dvc.yaml` when `calkit run` is called.
|
|
250
|
+
Do not edit `dvc.yaml` directly—it is a generated file. The authoritative
|
|
251
|
+
pipeline definition is always `calkit.yaml`.
|
|
252
|
+
|
|
253
|
+
DVC handles:
|
|
254
|
+
|
|
255
|
+
- Caching: stages that haven't changed since last run are skipped
|
|
256
|
+
- Remote storage: large files pushed/pulled with `calkit push` / `calkit pull`
|
|
257
|
+
- Dependency graph: run order is computed from declared inputs/outputs
|
|
258
|
+
|
|
259
|
+
## Key CLI commands
|
|
260
|
+
|
|
261
|
+
| Command | What it does |
|
|
262
|
+
| ------------------------------- | ---------------------------------------------------- |
|
|
263
|
+
| `calkit run` | Run the pipeline (skips unchanged stages) |
|
|
264
|
+
| `calkit run --force` | Force re-run all stages |
|
|
265
|
+
| `calkit status` | Show which stages are stale |
|
|
266
|
+
| `calkit xr <file>` | Auto-detect stage type, env, I/O, add to pipeline |
|
|
267
|
+
| `calkit xenv -n <env> -- <cmd>` | Run a command in a named environment |
|
|
268
|
+
| `calkit push` | Push Git commits and DVC-tracked files to remotes |
|
|
269
|
+
| `calkit pull` | Pull latest code and data |
|
|
270
|
+
| `calkit save` | Auto-add, commit, and push (Git + DVC) |
|
|
271
|
+
| `calkit commit -m "msg"` | Commit all tracked changes (Git + DVC) |
|
|
272
|
+
| `calkit add <file>` | Add a file to version control |
|
|
273
|
+
| `calkit check env --name <env>` | Verify an environment matches its spec |
|
|
274
|
+
| `calkit new` | Create new project objects (notebook, dataset, etc.) |
|
|
275
|
+
|
|
276
|
+
## `calkit xr`: The fastest path to a reproducible stage
|
|
277
|
+
|
|
278
|
+
`xr` ("execute and record") is the recommended way to add scripts and
|
|
279
|
+
notebooks to the pipeline for the first time. It:
|
|
280
|
+
|
|
281
|
+
1. Detects the stage kind from the file extension (`.py`, `.ipynb`, `.R`,
|
|
282
|
+
`.jl`, `.m`, `.sh`, `.tex`)
|
|
283
|
+
2. Detects or creates the right environment
|
|
284
|
+
3. Heuristically detects inputs and outputs from the script's file I/O calls
|
|
285
|
+
4. Adds the stage to `calkit.yaml` and `dvc.yaml`
|
|
286
|
+
5. Runs the stage
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
calkit xr scripts/run.py # Python script
|
|
290
|
+
calkit xr notebooks/analysis.ipynb # Jupyter notebook
|
|
291
|
+
calkit xr paper/paper.tex # LaTeX document
|
|
292
|
+
calkit xr scripts/run.R # R script
|
|
293
|
+
|
|
294
|
+
calkit xr scripts/run.py --input data/raw.csv --output results/out.csv
|
|
295
|
+
calkit xr scripts/run.py --environment main
|
|
296
|
+
calkit xr scripts/run.py --dry-run # see what would happen without running
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
## Version control conventions
|
|
300
|
+
|
|
301
|
+
- Source code and small outputs: tracked with Git
|
|
302
|
+
- Large binary files, datasets, model weights: tracked with DVC
|
|
303
|
+
- Lock files (`.calkit/env-locks/`): committed to Git, act as DVC dependencies
|
|
304
|
+
- `dvc.yaml`: generated by Calkit—don't edit manually
|
|
305
|
+
- `.calkit/`: Calkit's internal directory—commit its contents unless they
|
|
306
|
+
are large generated files
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-pipeline
|
|
3
|
+
description: Convert an existing repo with ad hoc scripts into a fully
|
|
4
|
+
reproducible Calkit pipeline. Use when the user invokes
|
|
5
|
+
`/calkit:create-pipeline` or asks to make a project reproducible end-to-end.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Create a Calkit pipeline
|
|
9
|
+
|
|
10
|
+
Convert an existing repo with ad hoc scripts and manual steps into a fully
|
|
11
|
+
reproducible Calkit pipeline. When complete, `calkit run` should reproduce all
|
|
12
|
+
important outputs from scratch.
|
|
13
|
+
|
|
14
|
+
## Step 1: Understand the existing repo
|
|
15
|
+
|
|
16
|
+
Before writing any YAML, map out what's already there.
|
|
17
|
+
Start with the README. Users will typically write manual environment
|
|
18
|
+
creation steps, and lists of script and commands to run in order.
|
|
19
|
+
This is like a manual pipeline.
|
|
20
|
+
Next:
|
|
21
|
+
|
|
22
|
+
1. List all scripts and notebooks: look in `scripts/`, `notebooks/`, `src/`,
|
|
23
|
+
and the repo root for `.py`, `.R`, `.jl`, `.m`, `.ipynb` files.
|
|
24
|
+
2. Read each script to understand what it reads and writes.
|
|
25
|
+
3. Identify the dependency order: which outputs of script A become inputs to
|
|
26
|
+
script B?
|
|
27
|
+
4. Note which environment each script needs (Python version, packages, R,
|
|
28
|
+
Julia, MATLAB, Docker, etc.).
|
|
29
|
+
|
|
30
|
+
Ask the user if the order or dependencies are unclear. Do not guess at data
|
|
31
|
+
flow.
|
|
32
|
+
|
|
33
|
+
## Step 2: Initialize the project
|
|
34
|
+
|
|
35
|
+
If there is no `calkit.yaml`, run:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
calkit init
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
This sets up Git (if needed) and DVC. If `calkit.yaml` already exists but has
|
|
42
|
+
no `pipeline` section, skip this—you will add one.
|
|
43
|
+
|
|
44
|
+
## Step 3: Define environments
|
|
45
|
+
|
|
46
|
+
Every stage must reference a named environment. Identify what's needed:
|
|
47
|
+
|
|
48
|
+
- **Python**: `requirements.txt` or `pyproject.toml` → `uv-venv`;
|
|
49
|
+
`environment.yml` → `conda`
|
|
50
|
+
- **R**: `renv.lock` → `renv`
|
|
51
|
+
- **Julia**: `Project.toml` → `julia`
|
|
52
|
+
- **LaTeX**: `docker` with `texlive/texlive:latest-full`
|
|
53
|
+
- **MATLAB**: `matlab`
|
|
54
|
+
|
|
55
|
+
Add environments to `calkit.yaml`:
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
environments:
|
|
59
|
+
main:
|
|
60
|
+
kind: uv-venv
|
|
61
|
+
path: requirements.txt
|
|
62
|
+
python: "3.13"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Name a single Python environment `main`. With multiple environments, use
|
|
66
|
+
descriptive names (e.g., `analysis`, `paper`).
|
|
67
|
+
|
|
68
|
+
## Step 4: Try `calkit xr` first
|
|
69
|
+
|
|
70
|
+
For each script or notebook, try `xr` before writing YAML by hand. It
|
|
71
|
+
auto-detects stage kind, environment, and I/O:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
calkit xr scripts/collect-data.py --dry-run # preview first
|
|
75
|
+
calkit xr scripts/collect-data.py # run for real
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Work through scripts in dependency order. After each call, verify the new
|
|
79
|
+
stage in `calkit.yaml`. Override detected I/O if needed:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
calkit xr scripts/train.py \
|
|
83
|
+
--input data/processed.csv \
|
|
84
|
+
--input config/params.yaml \
|
|
85
|
+
--output models/model.pkl
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
`xr` is not magic—sometimes it won't get everything right. But it handles
|
|
89
|
+
most of the boilerplate, so you can focus on verifying correctness and filling
|
|
90
|
+
in gaps. Scan through scripts for missing inputs, outputs, environment
|
|
91
|
+
dependencies, etc., and add those manually in `calkit.yaml` as needed.
|
|
92
|
+
|
|
93
|
+
## Step 5: Write stages manually when `xr` isn't suitable
|
|
94
|
+
|
|
95
|
+
Write stages directly in `calkit.yaml` when:
|
|
96
|
+
|
|
97
|
+
- You need fine control over `always_run`, `iterate_over`, storage modes, etc.
|
|
98
|
+
- `xr` does not support the stage kind
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
pipeline:
|
|
102
|
+
stages:
|
|
103
|
+
collect-data:
|
|
104
|
+
kind: python-script
|
|
105
|
+
script_path: scripts/collect-data.py
|
|
106
|
+
environment: main
|
|
107
|
+
outputs:
|
|
108
|
+
- data/raw.csv
|
|
109
|
+
|
|
110
|
+
process-data:
|
|
111
|
+
kind: jupyter-notebook
|
|
112
|
+
notebook_path: notebooks/process.ipynb
|
|
113
|
+
environment: main
|
|
114
|
+
inputs:
|
|
115
|
+
- data/raw.csv
|
|
116
|
+
outputs:
|
|
117
|
+
- data/processed.csv
|
|
118
|
+
- figures/fig1.png
|
|
119
|
+
|
|
120
|
+
build-paper:
|
|
121
|
+
kind: latex
|
|
122
|
+
target_path: paper/paper.tex
|
|
123
|
+
environment: texlive
|
|
124
|
+
inputs:
|
|
125
|
+
- figures/fig1.png
|
|
126
|
+
- references.bib
|
|
127
|
+
outputs: []
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Rules:
|
|
131
|
+
|
|
132
|
+
- Stage names should be short, lowercase, hyphenated.
|
|
133
|
+
- Every file one stage writes and another reads must be declared as both an
|
|
134
|
+
output and an input—otherwise stages may run out of order or miss re-runs.
|
|
135
|
+
- Use `from_stage_outputs: stage-name` when a stage consumes all outputs of a
|
|
136
|
+
prior stage.
|
|
137
|
+
|
|
138
|
+
## Step 6: Choose output storage
|
|
139
|
+
|
|
140
|
+
For each output:
|
|
141
|
+
|
|
142
|
+
- **Git**: small, text-based files (summary CSVs, JSON metadata, PDFs, HTML
|
|
143
|
+
reports)
|
|
144
|
+
- **DVC** (default): large or binary files (raw data, model weights, matrices)
|
|
145
|
+
|
|
146
|
+
```yaml
|
|
147
|
+
outputs:
|
|
148
|
+
- data/raw.csv # DVC (default)
|
|
149
|
+
- path: data/meta.json
|
|
150
|
+
storage: git
|
|
151
|
+
- path: paper/paper.pdf
|
|
152
|
+
storage: git
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
When in doubt, ask the user. Storage mode affects whether collaborators can
|
|
156
|
+
see the file without `calkit pull`.
|
|
157
|
+
|
|
158
|
+
## Step 7: Run and verify
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
calkit run
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Common errors:
|
|
165
|
+
|
|
166
|
+
- **Missing inputs**: a stage lists an input that no earlier stage produces
|
|
167
|
+
- **Environment errors**: run `calkit check env --name <env>` to diagnose
|
|
168
|
+
- **Script errors**: fix the script, then re-run
|
|
169
|
+
|
|
170
|
+
Run a single stage: `calkit run <stage-name>`
|
|
171
|
+
Force re-run everything: `calkit run --force`
|
|
172
|
+
|
|
173
|
+
## Step 8: Commit
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
calkit commit -m "Add reproducible pipeline"
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Common mistakes
|
|
180
|
+
|
|
181
|
+
- **Missing intermediate files**: if `process.py` reads `data/raw.csv` but
|
|
182
|
+
that file isn't declared as an output of `collect-data`, DVC won't track the
|
|
183
|
+
dependency.
|
|
184
|
+
- **Absolute paths in scripts**: use paths relative to the repo root (or
|
|
185
|
+
`wdir` if set).
|
|
186
|
+
- **Editing `dvc.yaml` directly**: always edit `calkit.yaml`—`dvc.yaml` is
|
|
187
|
+
regenerated by Calkit.
|
|
188
|
+
- **Missing `environment`**: every stage needs one. Use `_system` for stages
|
|
189
|
+
that only use system tools.
|