calkit-python 0.38.1__tar.gz → 0.38.2__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 → calkit_python-0.38.2}/AGENTS.md +2 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/PKG-INFO +1 -1
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/dvc/zip.py +17 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/releases.py +39 -2
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_releases.py +24 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/governance.md +20 -6
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/src/environments.ts +11 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/src/extension.ts +8 -3
- calkit_python-0.38.2/vscode-ext/src/test/kernel-selection.test.ts +88 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/.claude-plugin/marketplace.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/.gitignore +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/.pre-commit-config.yaml +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/.prettierignore +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/.python-version +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/.vscode/launch.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/.vscode/tasks.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/.yarnrc.yml +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/CITATION.cff +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/CODE_OF_CONDUCT.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/CONTRIBUTING.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/LICENSE +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/Makefile +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/README.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/agent-plugin/.claude-plugin/plugin.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/agent-plugin/skills/add-pipeline-stage/SKILL.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/agent-plugin/skills/conventions/SKILL.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/agent-plugin/skills/create-pipeline/SKILL.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/babel.config.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/__main__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/calc.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/check.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/check.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/cloud.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/config.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/core.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/describe.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/dev.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/import_.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/latex.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/list.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/main/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/main/core.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/main/xr.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/new.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/notebooks.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/office.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/overleaf.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/slurm.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cli/update.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/cloud.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/conda.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/config.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/core.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/datasets.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/detect.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/docker.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/dvc/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/dvc/core.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/environments.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/fs.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/git.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/github.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/gui.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/invenio.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/julia.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/jupyter.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/jupyterlab/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/jupyterlab/routes.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/package.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/schemas/calkit/plugin.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/remoteEntry.65469af996e7a96aa983.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/style.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/third-party-licenses.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/licenses.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/magics.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/matlab.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/models/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/models/core.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/models/io.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/models/iteration.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/models/pipeline.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/notebooks.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/office.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/ops.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/overleaf.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/pipeline.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/server.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/templates/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/templates/core.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/templates/latex/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/templates/latex/article/paper.tex +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/templates/latex/core.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/templates/latex/jfm/jfm.bst +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/templates/latex/jfm/jfm.cls +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/templates/latex/jfm/paper.tex +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/templates/latex/jfm/upmath.sty +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/main/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/main/test_core.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/main/test_xr.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/test_check.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/test_cloud.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/test_config.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/test_import.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/test_latex.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/test_list.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/test_new.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/test_notebooks.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/test_overleaf.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/cli/test_update.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/dvc/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/dvc/test_core.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/dvc/test_zip.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/jupyterlab/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/jupyterlab/test_routes.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/models/__init__.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/models/test_iteration.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/models/test_pipeline.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_calc.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_check.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_cloud.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_conda.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_core.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_detect.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_docker.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_environments.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_fs.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_git.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_invenio.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_julia.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_jupyter.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_magics.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_matlab.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_notebooks.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_pipeline.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/tests/test_templates.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/conftest.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/CNAME +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/ai-tools.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/apps.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/calculations.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/calkit-yaml.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/cli-reference.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/cloud-integration.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/datasets.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/dependencies.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/environments.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/examples.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/help.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/c-to-the-k-white.svg +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/calkit-fragmentation-compendium.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/calkit-no-bg.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/connect-zenodo.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/jupyterlab/all-green.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/jupyterlab/collect-data-stale.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/jupyterlab/new-env.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/jupyterlab/new-notebook.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/jupyterlab/pipeline-badge.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/jupyterlab-params.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/plos-osi-code-2024-03.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/img/vscode-nb-params.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/index.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/installation.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/jupyterlab.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/local-server.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/notebooks.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/overleaf.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/pipeline/index.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/pipeline/manual-steps.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/pipeline/running-and-logging.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/pipeline/slurm.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/quickstart.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/references.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/releases.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/reproducibility.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/adding-latex-pub-docker.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/conda-envs.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/existing-project.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/first-project.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/github-actions.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/actions-repo-secrets.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/push.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/chart-more-rows.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/create-project.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/excel-chart.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/excel-data.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/needs-clone.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/new-stage.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/status-more-rows.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/untracked-data.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/updated-publication.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/office/workflow-page.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/openfoam/clone.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/openfoam/create-project.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/openfoam/new-token.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/openfoam/reclone.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/quick-actions.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/run-proc.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/index.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/jupyterlab.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/latex-codespaces.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/matlab.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/notebook-pipeline.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/office.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/openfoam.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/procedures.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/tutorials/vscode-slurm-notebook.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/docs/version-control.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/install.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/jest.config.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/jupyter-config/server-config/calkit.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/mkdocs.yml +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/package.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/pyproject.toml +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/schema/plugin.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/scripts/generate-docs-references.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/scripts/install.ps1 +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/scripts/install.sh +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/scripts/make-calk9.sh +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/scripts/sync-docs.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/__tests__/useQueries.spec.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/calkit-config.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/cell-output-marker.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/components/commit-dialog.tsx +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/components/environment-editor.tsx +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/components/notebook-registration.tsx +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/components/notebook-toolbar.tsx +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/components/pipeline-status-bar.tsx +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/components/project-info-editor.tsx +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/components/sidebar-settings.tsx +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/components/sidebar.tsx +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/components/stage-editor.tsx +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/feature-flags.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/file-browser-menu.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/hooks/__tests__/useQueries.test.tsx +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/hooks/useQueries.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/icons.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/index.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/io-tracker.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/pipeline-state.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/queryClient.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/request.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/src/shims-mainmenu.d.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/style/base.css +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/style/cell-output-marker.css +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/style/environment-editor.css +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/style/environment-selector.css +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/style/img/calkit-no-bg.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/style/index.css +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/style/index.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/style/notebook-toolbar.css +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/style/pipeline-status-bar.css +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/style/sidebar.css +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/test/dvc-md5-dir/osx-arm64.txt +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/test/nb-julia.ipynb +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/test/nb-params.ipynb +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/test/nb-subdir.ipynb +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/test/pipeline.ipynb +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/test/script.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/test/test-log.log +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/tsconfig.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/tsconfig.test.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/ui-tests/.gitignore +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/ui-tests/README.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/ui-tests/jupyter_server_test_config.py +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/ui-tests/package.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/ui-tests/playwright.config.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/ui-tests/tests/calkit.spec.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/ui-tests/yarn.lock +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/uv.lock +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/.gitignore +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/.vscodeignore +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/CHANGELOG.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/LICENSE +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/README.md +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/images/calkit-no-bg.png +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/package-lock.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/package.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/scripts/set-proposed-api.js +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/src/notebooks.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/src/test/environments.test.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/src/test/notebooks.test.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/src/types.ts +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/vscode-ext/tsconfig.json +0 -0
- {calkit_python-0.38.1 → calkit_python-0.38.2}/yarn.lock +0 -0
|
@@ -10,6 +10,7 @@ efficient.
|
|
|
10
10
|
import json
|
|
11
11
|
import os
|
|
12
12
|
import shutil
|
|
13
|
+
import stat
|
|
13
14
|
import subprocess
|
|
14
15
|
import zipfile
|
|
15
16
|
from pathlib import Path
|
|
@@ -376,9 +377,25 @@ def unzip(workspace_path: str, zip_path: str):
|
|
|
376
377
|
"System unzip failed; falling back to Python zipfile.",
|
|
377
378
|
err=True,
|
|
378
379
|
)
|
|
380
|
+
workspace_abs = os.path.realpath(workspace_path)
|
|
379
381
|
with ZipFile(zip_path, "r") as zip_file:
|
|
380
382
|
members = zip_file.infolist()
|
|
381
383
|
for member in tqdm(members, desc="Unzipping", unit="file"):
|
|
384
|
+
target = os.path.normpath(
|
|
385
|
+
os.path.join(workspace_abs, member.filename)
|
|
386
|
+
)
|
|
387
|
+
if not os.path.realpath(target).startswith(workspace_abs + os.sep):
|
|
388
|
+
raise ValueError(
|
|
389
|
+
f"Zip entry {member.filename!r} would extract outside "
|
|
390
|
+
"the workspace directory"
|
|
391
|
+
)
|
|
392
|
+
if os.path.isfile(target) and not os.access(target, os.W_OK):
|
|
393
|
+
# File may be read-only (e.g. created by Docker as root or by
|
|
394
|
+
# DVC). Try chmod first; if that fails, remove and re-extract.
|
|
395
|
+
try:
|
|
396
|
+
os.chmod(target, stat.S_IWRITE | stat.S_IREAD)
|
|
397
|
+
except OSError:
|
|
398
|
+
os.remove(target)
|
|
382
399
|
zip_file.extract(member, workspace_path)
|
|
383
400
|
|
|
384
401
|
|
|
@@ -10,11 +10,13 @@ import subprocess
|
|
|
10
10
|
import sys
|
|
11
11
|
import tempfile
|
|
12
12
|
import zipfile
|
|
13
|
+
from pathlib import Path
|
|
13
14
|
from typing import Literal
|
|
14
15
|
|
|
15
16
|
import git
|
|
16
17
|
|
|
17
18
|
import calkit
|
|
19
|
+
import calkit.dvc.zip
|
|
18
20
|
|
|
19
21
|
SERVICES = {
|
|
20
22
|
"caltechdata": {"name": "CaltechDATA", "url": "https://data.caltech.edu"},
|
|
@@ -165,7 +167,42 @@ def ls_files() -> list[str]:
|
|
|
165
167
|
fpath = os.path.join(root, filename)
|
|
166
168
|
if os.path.isfile(fpath):
|
|
167
169
|
cache_files.append(fpath)
|
|
168
|
-
|
|
170
|
+
# Include files from unzipped dvc-zip workspace folders, which are
|
|
171
|
+
# ignored by both Git and DVC and would otherwise be missing from the
|
|
172
|
+
# release archive
|
|
173
|
+
dvc_zip_files: list[str] = []
|
|
174
|
+
repo_root = Path(repo.working_dir).resolve()
|
|
175
|
+
zip_path_map = calkit.dvc.zip.get_zip_path_map()
|
|
176
|
+
for workspace_path in zip_path_map:
|
|
177
|
+
abs_workspace = (repo_root / workspace_path).resolve()
|
|
178
|
+
if not abs_workspace.is_relative_to(repo_root):
|
|
179
|
+
raise ValueError(
|
|
180
|
+
f"dvc-zip workspace path {workspace_path!r} is not within "
|
|
181
|
+
"the repository root; this may indicate a bug or tampering "
|
|
182
|
+
"with .calkit/zip/paths.json"
|
|
183
|
+
)
|
|
184
|
+
if abs_workspace.is_dir():
|
|
185
|
+
for root, _, files in os.walk(abs_workspace):
|
|
186
|
+
for filename in files:
|
|
187
|
+
abs_fpath = Path(root) / filename
|
|
188
|
+
if abs_fpath.is_file():
|
|
189
|
+
dvc_zip_files.append(
|
|
190
|
+
str(abs_fpath.relative_to(repo_root))
|
|
191
|
+
)
|
|
192
|
+
elif abs_workspace.exists():
|
|
193
|
+
raise ValueError(
|
|
194
|
+
f"dvc-zip workspace path {workspace_path!r} exists but is "
|
|
195
|
+
"not a directory; this may indicate a bug or tampering with "
|
|
196
|
+
".calkit/zip/paths.json"
|
|
197
|
+
)
|
|
198
|
+
zip_files = {Path(p).as_posix() for p in zip_path_map.values()}
|
|
199
|
+
return [
|
|
200
|
+
f
|
|
201
|
+
for f in dict.fromkeys(
|
|
202
|
+
git_files + dvc_files + cache_files + dvc_zip_files
|
|
203
|
+
)
|
|
204
|
+
if Path(f).as_posix() not in zip_files
|
|
205
|
+
]
|
|
169
206
|
|
|
170
207
|
|
|
171
208
|
def make_dvc_md5s(
|
|
@@ -205,7 +242,7 @@ def populate_dvc_cache():
|
|
|
205
242
|
"""Populate DVC cache from releases."""
|
|
206
243
|
ck_info = calkit.load_calkit_info()
|
|
207
244
|
releases = ck_info.get("releases", {})
|
|
208
|
-
for name,
|
|
245
|
+
for name, _ in releases.items():
|
|
209
246
|
md5s_fpath = f".calkit/releases/{name}/dvc-md5s.yaml"
|
|
210
247
|
with open(md5s_fpath) as f:
|
|
211
248
|
md5s = calkit.ryaml.load(f)
|
|
@@ -9,6 +9,7 @@ import bibtexparser
|
|
|
9
9
|
import git
|
|
10
10
|
import pytest
|
|
11
11
|
|
|
12
|
+
from calkit.dvc.zip import write_zip_path_map
|
|
12
13
|
from calkit.releases import (
|
|
13
14
|
check_project_release_archive,
|
|
14
15
|
create_bibtex,
|
|
@@ -66,6 +67,29 @@ def test_ls_files(tmp_dir):
|
|
|
66
67
|
assert ".dvc/cache/aa/legacy" in files
|
|
67
68
|
assert ".dvc/cache/files/md5/bb/modern" in files
|
|
68
69
|
assert ".dvc/cache/runs/cc/hash/run" in files
|
|
70
|
+
# Ensure files from unzipped dvc-zip workspace folders are included;
|
|
71
|
+
# these folders are ignored by both Git and DVC
|
|
72
|
+
(tmp_dir / "my-zip-workspace" / "sub").mkdir(parents=True, exist_ok=True)
|
|
73
|
+
(tmp_dir / "my-zip-workspace" / "data.txt").write_text("data")
|
|
74
|
+
(tmp_dir / "my-zip-workspace" / "sub" / "nested.txt").write_text("nested")
|
|
75
|
+
# Create the zip file and DVC-track it so the exclusion filter is exercised
|
|
76
|
+
zip_dir = tmp_dir / ".calkit" / "zip" / "files"
|
|
77
|
+
zip_dir.mkdir(parents=True, exist_ok=True)
|
|
78
|
+
zip_fpath = zip_dir / "my-zip-workspace.zip"
|
|
79
|
+
with zipfile.ZipFile(zip_fpath, "w") as zf:
|
|
80
|
+
zf.writestr("data.txt", "data")
|
|
81
|
+
zf.writestr("sub/nested.txt", "nested")
|
|
82
|
+
subprocess.run(
|
|
83
|
+
["calkit", "dvc", "add", str(zip_fpath.relative_to(tmp_dir))],
|
|
84
|
+
check=True,
|
|
85
|
+
)
|
|
86
|
+
write_zip_path_map(
|
|
87
|
+
{"my-zip-workspace": ".calkit/zip/files/my-zip-workspace.zip"}
|
|
88
|
+
)
|
|
89
|
+
files = ls_files()
|
|
90
|
+
assert "my-zip-workspace/data.txt" in files
|
|
91
|
+
assert "my-zip-workspace/sub/nested.txt" in files
|
|
92
|
+
assert ".calkit/zip/files/my-zip-workspace.zip" not in files
|
|
69
93
|
|
|
70
94
|
|
|
71
95
|
def test_check_project_release_archive_passes_when_pipeline_is_current(
|
|
@@ -16,7 +16,9 @@ and our code of conduct can be found
|
|
|
16
16
|
|
|
17
17
|
## Vision
|
|
18
18
|
|
|
19
|
-
We envision a future where
|
|
19
|
+
We envision a future where reliable and impactful knowledge is created
|
|
20
|
+
10x faster than it is today.
|
|
21
|
+
In this future nearly every research article is delivered as part
|
|
20
22
|
of a [single-button](https://petebachant.me/single-button/)
|
|
21
23
|
reproducible
|
|
22
24
|
[compendium](https://book.the-turing-way.org/reproducible-research/compendia/)
|
|
@@ -46,6 +48,10 @@ by enabling faster:
|
|
|
46
48
|
making it easier to find something similar to a desired workflow to start
|
|
47
49
|
from and adapt to new questions.
|
|
48
50
|
|
|
51
|
+
Most importantly,
|
|
52
|
+
full automation speeds up iteration cycle time,
|
|
53
|
+
and more iterations means greater likelihood of success.
|
|
54
|
+
|
|
49
55
|
### The status quo
|
|
50
56
|
|
|
51
57
|
The figure below from the PLOS Open Science Indicators dataset
|
|
@@ -63,10 +69,15 @@ Code sharing rates from
|
|
|
63
69
|
|
|
64
70
|
## Strategy
|
|
65
71
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
and
|
|
72
|
+
Telling researchers they need to work reproducibly is like telling them
|
|
73
|
+
they need to eat their vegetables.
|
|
74
|
+
In other words, reproducibility needs to be a side effect of a process
|
|
75
|
+
that is more productive and more enjoyable than the status quo.
|
|
76
|
+
|
|
77
|
+
The current "gold standard"
|
|
78
|
+
requires researchers to become de facto software engineers,
|
|
79
|
+
choosing and integrating multiple tools,
|
|
80
|
+
designing bespoke project layouts and workflows.
|
|
70
81
|
We want to provide a vertically-integrated, purpose-built,
|
|
71
82
|
and user-friendly project format and toolset that reduces the required
|
|
72
83
|
expertise and decision fatigue.
|
|
@@ -75,7 +86,7 @@ solution—they certainly are—but we are focused on improving
|
|
|
75
86
|
tooling and infrastructure.
|
|
76
87
|
|
|
77
88
|
- **Path of least resistance:**
|
|
78
|
-
Make it faster to work in a clean,
|
|
89
|
+
Make it faster to work in a clean, automated,
|
|
79
90
|
reproducible way than it is to work in an ad-hoc, disorganized way.
|
|
80
91
|
- **Intuitive tooling:**
|
|
81
92
|
Simplify the "hard parts" of modern scientific computing:
|
|
@@ -88,6 +99,9 @@ tooling and infrastructure.
|
|
|
88
99
|
- **Builder's pride:**
|
|
89
100
|
Enable researchers to take pride in what they create so
|
|
90
101
|
they will be more likely to share their projects openly.
|
|
102
|
+
- **Continuous delivery:** Continuous delivery (CD) practices have greatly
|
|
103
|
+
enhanced the quality and speed at which software products are created.
|
|
104
|
+
These same principles can be applied to research.
|
|
91
105
|
|
|
92
106
|
## Objective and key results (OKRs)
|
|
93
107
|
|
|
@@ -223,3 +223,14 @@ export function findCalkitEnvKernelSourceCandidate(
|
|
|
223
223
|
(candidate) => candidate.environmentName === environmentName,
|
|
224
224
|
);
|
|
225
225
|
}
|
|
226
|
+
|
|
227
|
+
// Environment kinds that can have their Jupyter kernel registered and selected
|
|
228
|
+
// natively in VS Code — no Jupyter server launch required.
|
|
229
|
+
export const kernelRegistrationKinds: ReadonlySet<EnvKind> = new Set<EnvKind>([
|
|
230
|
+
"uv",
|
|
231
|
+
"uv-venv",
|
|
232
|
+
"venv",
|
|
233
|
+
"conda",
|
|
234
|
+
"pixi",
|
|
235
|
+
"julia",
|
|
236
|
+
]);
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
compactSlurmOptions,
|
|
11
11
|
findCalkitEnvKernelSourceCandidate,
|
|
12
12
|
getDefaultSlurmOptions,
|
|
13
|
+
kernelRegistrationKinds,
|
|
13
14
|
makeCalkitEnvKernelSourceCandidates,
|
|
14
15
|
slurmOptionsToOptionList,
|
|
15
16
|
type CalkitEnvNotebookKernelSource,
|
|
@@ -440,6 +441,7 @@ async function selectCalkitEnvironment(
|
|
|
440
441
|
picked.innerEnvironment,
|
|
441
442
|
"-e",
|
|
442
443
|
targetNotebookUri,
|
|
444
|
+
picked.innerKind,
|
|
443
445
|
);
|
|
444
446
|
await refreshNotebookToolbarContext(context);
|
|
445
447
|
return kernelId;
|
|
@@ -472,7 +474,7 @@ async function selectCalkitEnvironment(
|
|
|
472
474
|
slurmAutoStartSuppressedThisSession.delete(targetNotebookUri);
|
|
473
475
|
}
|
|
474
476
|
|
|
475
|
-
// For
|
|
477
|
+
// For local/non-nested environments, only register/check the kernel and
|
|
476
478
|
// then select it in VS Code. No server launch is needed here.
|
|
477
479
|
if (
|
|
478
480
|
!picked.outerSlurmEnvironment &&
|
|
@@ -483,6 +485,7 @@ async function selectCalkitEnvironment(
|
|
|
483
485
|
picked.innerEnvironment,
|
|
484
486
|
"-e",
|
|
485
487
|
targetNotebookUri,
|
|
488
|
+
picked.innerKind,
|
|
486
489
|
);
|
|
487
490
|
await refreshNotebookToolbarContext(context);
|
|
488
491
|
return kernelId;
|
|
@@ -1870,6 +1873,7 @@ async function autoSelectEnvironmentForActiveNotebook(
|
|
|
1870
1873
|
configuredCandidate.innerEnvironment,
|
|
1871
1874
|
"-e",
|
|
1872
1875
|
notebookUri,
|
|
1876
|
+
configuredCandidate.innerKind,
|
|
1873
1877
|
);
|
|
1874
1878
|
if (kernelId) {
|
|
1875
1879
|
log(
|
|
@@ -2225,7 +2229,7 @@ function buildDockerRunCommand(
|
|
|
2225
2229
|
}
|
|
2226
2230
|
|
|
2227
2231
|
function needsKernelRegistration(kind: EnvKind): boolean {
|
|
2228
|
-
return kind
|
|
2232
|
+
return kernelRegistrationKinds.has(kind);
|
|
2229
2233
|
}
|
|
2230
2234
|
|
|
2231
2235
|
function createServerToken(): string {
|
|
@@ -2389,8 +2393,9 @@ async function registerAndSelectKernel(
|
|
|
2389
2393
|
envName: string,
|
|
2390
2394
|
envFlag: "-n" | "-e",
|
|
2391
2395
|
expectedNotebookUri?: string,
|
|
2396
|
+
kind?: EnvKind,
|
|
2392
2397
|
): Promise<string | undefined> {
|
|
2393
|
-
log(`Registering and selecting kernel for env: ${envName}`);
|
|
2398
|
+
log(`Registering and selecting kernel for env: ${envName} (kind=${kind})`);
|
|
2394
2399
|
|
|
2395
2400
|
return await withKernelProgress(
|
|
2396
2401
|
"Checking environment and setting kernel...",
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
import {
|
|
4
|
+
kernelRegistrationKinds,
|
|
5
|
+
makeCalkitEnvKernelSourceCandidates,
|
|
6
|
+
type EnvKind,
|
|
7
|
+
} from "../environments";
|
|
8
|
+
|
|
9
|
+
const REGISTRATION_KINDS: EnvKind[] = [
|
|
10
|
+
"uv",
|
|
11
|
+
"uv-venv",
|
|
12
|
+
"venv",
|
|
13
|
+
"conda",
|
|
14
|
+
"pixi",
|
|
15
|
+
"julia",
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
const SERVER_KINDS: EnvKind[] = ["docker", "slurm", "ssh", "_system"];
|
|
19
|
+
|
|
20
|
+
test("kernelRegistrationKinds includes all local env types", () => {
|
|
21
|
+
for (const kind of REGISTRATION_KINDS) {
|
|
22
|
+
assert.ok(
|
|
23
|
+
kernelRegistrationKinds.has(kind),
|
|
24
|
+
`expected '${kind}' to be in kernelRegistrationKinds`,
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("kernelRegistrationKinds excludes server-launch env types", () => {
|
|
30
|
+
for (const kind of SERVER_KINDS) {
|
|
31
|
+
assert.ok(
|
|
32
|
+
!kernelRegistrationKinds.has(kind),
|
|
33
|
+
`expected '${kind}' to NOT be in kernelRegistrationKinds`,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("non-nested local env candidate has no outerSlurmEnvironment", () => {
|
|
39
|
+
// A standalone uv-venv env should produce a candidate with no outer
|
|
40
|
+
// SLURM environment, which is the signal that no server launch is needed.
|
|
41
|
+
const candidates = makeCalkitEnvKernelSourceCandidates({
|
|
42
|
+
main: { kind: "uv-venv", path: "pyproject.toml" },
|
|
43
|
+
});
|
|
44
|
+
assert.equal(candidates.length, 1);
|
|
45
|
+
assert.equal(candidates[0].innerKind, "uv-venv");
|
|
46
|
+
assert.equal(candidates[0].outerSlurmEnvironment, undefined);
|
|
47
|
+
assert.ok(kernelRegistrationKinds.has(candidates[0].innerKind));
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("nested slurm+uv-venv candidate has outerSlurmEnvironment set", () => {
|
|
51
|
+
// A SLURM-wrapped uv-venv env must still launch a server — the outer
|
|
52
|
+
// SLURM environment is what triggers that path. The guard in extension.ts
|
|
53
|
+
// is: !outerSlurmEnvironment && needsKernelRegistration(innerKind)
|
|
54
|
+
const candidates = makeCalkitEnvKernelSourceCandidates({
|
|
55
|
+
cluster: { kind: "slurm", host: "cluster.example.edu" },
|
|
56
|
+
main: { kind: "uv-venv", path: "pyproject.toml" },
|
|
57
|
+
});
|
|
58
|
+
const nested = candidates.find((c) => c.outerSlurmEnvironment === "cluster");
|
|
59
|
+
assert.ok(nested, "expected a nested slurm:uv-venv candidate");
|
|
60
|
+
assert.equal(nested.innerKind, "uv-venv");
|
|
61
|
+
assert.equal(nested.outerSlurmEnvironment, "cluster");
|
|
62
|
+
assert.ok(kernelRegistrationKinds.has(nested.innerKind));
|
|
63
|
+
assert.ok(nested.outerSlurmEnvironment !== undefined);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("nested slurm+docker candidate has outerSlurmEnvironment set and docker does not use kernel registration", () => {
|
|
67
|
+
const candidates = makeCalkitEnvKernelSourceCandidates({
|
|
68
|
+
cluster: { kind: "slurm", host: "cluster.example.edu" },
|
|
69
|
+
myContainer: { kind: "docker", image: "jupyter/minimal-notebook:latest" },
|
|
70
|
+
});
|
|
71
|
+
const nested = candidates.find((c) => c.outerSlurmEnvironment === "cluster");
|
|
72
|
+
assert.ok(nested);
|
|
73
|
+
assert.equal(nested.innerKind, "docker");
|
|
74
|
+
assert.ok(!kernelRegistrationKinds.has(nested.innerKind));
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("all standalone registration-kind envs produce candidates with no outer env", () => {
|
|
78
|
+
const envs: Record<string, { kind: EnvKind }> = {};
|
|
79
|
+
for (const kind of REGISTRATION_KINDS) {
|
|
80
|
+
envs[kind] = { kind };
|
|
81
|
+
}
|
|
82
|
+
const candidates = makeCalkitEnvKernelSourceCandidates(envs);
|
|
83
|
+
for (const kind of REGISTRATION_KINDS) {
|
|
84
|
+
const c = candidates.find((x) => x.environmentName === kind);
|
|
85
|
+
assert.ok(c, `expected standalone candidate for kind '${kind}'`);
|
|
86
|
+
assert.equal(c.outerSlurmEnvironment, undefined);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{calkit_python-0.38.1 → calkit_python-0.38.2}/agent-plugin/skills/add-pipeline-stage/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/schemas/calkit/package.json.orig
RENAMED
|
File without changes
|
{calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/schemas/calkit/plugin.json
RENAMED
|
File without changes
|
{calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/502.9a2c5772a15466e923ef.js
RENAMED
|
File without changes
|
{calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/695.2c41003a452d43d2b358.js
RENAMED
|
File without changes
|
{calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js
RENAMED
|
File without changes
|
{calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js
RENAMED
|
File without changes
|
{calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js
RENAMED
|
File without changes
|
|
File without changes
|
{calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/b2f1c3efe70cb539d121.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{calkit_python-0.38.1 → calkit_python-0.38.2}/calkit/labextension/static/third-party-licenses.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|