calkit-python 0.41.16__tar.gz → 0.41.17__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.
Files changed (354) hide show
  1. {calkit_python-0.41.16 → calkit_python-0.41.17}/PKG-INFO +52 -28
  2. {calkit_python-0.41.16 → calkit_python-0.41.17}/README.md +51 -27
  3. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/notebooks.py +74 -4
  4. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/models/core.py +23 -2
  5. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_notebooks.py +85 -0
  6. calkit_python-0.41.17/docs/acknowledgements.md +13 -0
  7. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/environments.md +38 -34
  8. calkit_python-0.41.17/docs/img/caltech.png +0 -0
  9. calkit_python-0.41.17/docs/img/pipeline.png +0 -0
  10. calkit_python-0.41.17/docs/img/schmidt-sciences.png +0 -0
  11. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/index.md +23 -27
  12. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/quickstart.md +10 -0
  13. {calkit_python-0.41.16 → calkit_python-0.41.17}/mkdocs.yml +1 -0
  14. {calkit_python-0.41.16 → calkit_python-0.41.17}/scripts/generate-docs-references.py +59 -87
  15. {calkit_python-0.41.16 → calkit_python-0.41.17}/scripts/sync-docs.py +53 -14
  16. {calkit_python-0.41.16 → calkit_python-0.41.17}/.claude-plugin/marketplace.json +0 -0
  17. {calkit_python-0.41.16 → calkit_python-0.41.17}/.gitattributes +0 -0
  18. {calkit_python-0.41.16 → calkit_python-0.41.17}/.gitignore +0 -0
  19. {calkit_python-0.41.16 → calkit_python-0.41.17}/.pre-commit-config.yaml +0 -0
  20. {calkit_python-0.41.16 → calkit_python-0.41.17}/.prettierignore +0 -0
  21. {calkit_python-0.41.16 → calkit_python-0.41.17}/.prettierrc.json +0 -0
  22. {calkit_python-0.41.16 → calkit_python-0.41.17}/.python-version +0 -0
  23. {calkit_python-0.41.16 → calkit_python-0.41.17}/.vscode/launch.json +0 -0
  24. {calkit_python-0.41.16 → calkit_python-0.41.17}/.vscode/tasks.json +0 -0
  25. {calkit_python-0.41.16 → calkit_python-0.41.17}/AGENTS.md +0 -0
  26. {calkit_python-0.41.16 → calkit_python-0.41.17}/CITATION.cff +0 -0
  27. {calkit_python-0.41.16 → calkit_python-0.41.17}/CODE_OF_CONDUCT.md +0 -0
  28. {calkit_python-0.41.16 → calkit_python-0.41.17}/CONTRIBUTING.md +0 -0
  29. {calkit_python-0.41.16 → calkit_python-0.41.17}/LICENSE +0 -0
  30. {calkit_python-0.41.16 → calkit_python-0.41.17}/Makefile +0 -0
  31. {calkit_python-0.41.16 → calkit_python-0.41.17}/agent-plugin/.claude-plugin/plugin.json +0 -0
  32. {calkit_python-0.41.16 → calkit_python-0.41.17}/agent-plugin/skills/add-pipeline-stage/SKILL.md +0 -0
  33. {calkit_python-0.41.16 → calkit_python-0.41.17}/agent-plugin/skills/conventions/SKILL.md +0 -0
  34. {calkit_python-0.41.16 → calkit_python-0.41.17}/agent-plugin/skills/create-pipeline/SKILL.md +0 -0
  35. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/__init__.py +0 -0
  36. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/__main__.py +0 -0
  37. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/calc.py +0 -0
  38. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/check.py +0 -0
  39. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/__init__.py +0 -0
  40. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/check.py +0 -0
  41. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/cloud.py +0 -0
  42. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/config.py +0 -0
  43. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/core.py +0 -0
  44. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/delete.py +0 -0
  45. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/describe.py +0 -0
  46. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/dev.py +0 -0
  47. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/import_.py +0 -0
  48. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/latex.py +0 -0
  49. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/list.py +0 -0
  50. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/main/__init__.py +0 -0
  51. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/main/core.py +0 -0
  52. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/main/xr.py +0 -0
  53. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/new.py +0 -0
  54. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/office.py +0 -0
  55. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/overleaf.py +0 -0
  56. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/scheduler.py +0 -0
  57. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cli/update.py +0 -0
  58. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/cloud.py +0 -0
  59. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/conda.py +0 -0
  60. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/config.py +0 -0
  61. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/core.py +0 -0
  62. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/datasets.py +0 -0
  63. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/dependencies.py +0 -0
  64. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/detect.py +0 -0
  65. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/docker.py +0 -0
  66. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/dvc/__init__.py +0 -0
  67. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/dvc/core.py +0 -0
  68. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/dvc/zip.py +0 -0
  69. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/environments.py +0 -0
  70. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/fs.py +0 -0
  71. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/git.py +0 -0
  72. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/github.py +0 -0
  73. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/gui.py +0 -0
  74. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/install.py +0 -0
  75. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/invenio.py +0 -0
  76. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/julia.py +0 -0
  77. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/jupyter.py +0 -0
  78. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/jupyterlab/__init__.py +0 -0
  79. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/jupyterlab/routes.py +0 -0
  80. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/package.json +0 -0
  81. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/schemas/calkit/package.json.orig +0 -0
  82. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/schemas/calkit/plugin.json +0 -0
  83. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/static/502.9a2c5772a15466e923ef.js +0 -0
  84. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/static/695.2c41003a452d43d2b358.js +0 -0
  85. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/static/867.a42a046aa5108f54f8fb.js +0 -0
  86. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/static/909.e3f9cc3408834a7fdcc3.js +0 -0
  87. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js +0 -0
  88. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/static/946.050af2abf7845cfbdbd2.js.LICENSE.txt +0 -0
  89. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/static/b2f1c3efe70cb539d121.png +0 -0
  90. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/static/remoteEntry.ac9035764d5b2adbb542.js +0 -0
  91. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/static/style.js +0 -0
  92. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/labextension/static/third-party-licenses.json +0 -0
  93. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/licenses.py +0 -0
  94. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/magics.py +0 -0
  95. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/matlab.py +0 -0
  96. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/models/__init__.py +0 -0
  97. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/models/io.py +0 -0
  98. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/models/iteration.py +0 -0
  99. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/models/pipeline.py +0 -0
  100. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/notebooks.py +0 -0
  101. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/office.py +0 -0
  102. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/ops.py +0 -0
  103. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/overleaf.py +0 -0
  104. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/pipeline.py +0 -0
  105. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/releases.py +0 -0
  106. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/server.py +0 -0
  107. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/templates/__init__.py +0 -0
  108. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/templates/core.py +0 -0
  109. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/templates/latex/__init__.py +0 -0
  110. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/templates/latex/article/paper.tex +0 -0
  111. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/templates/latex/core.py +0 -0
  112. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/templates/latex/jfm/jfm.bst +0 -0
  113. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/templates/latex/jfm/jfm.cls +0 -0
  114. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/templates/latex/jfm/lineno-FLM.sty +0 -0
  115. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/templates/latex/jfm/paper.tex +0 -0
  116. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/templates/latex/jfm/upmath.sty +0 -0
  117. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/__init__.py +0 -0
  118. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/__init__.py +0 -0
  119. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/main/__init__.py +0 -0
  120. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/main/test_core.py +0 -0
  121. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/main/test_lock.py +0 -0
  122. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/main/test_subprojects.py +0 -0
  123. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/main/test_xr.py +0 -0
  124. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_check.py +0 -0
  125. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_cloud.py +0 -0
  126. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_config.py +0 -0
  127. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_delete.py +0 -0
  128. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_import.py +0 -0
  129. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_latex.py +0 -0
  130. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_list.py +0 -0
  131. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_new.py +0 -0
  132. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_overleaf.py +0 -0
  133. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_scheduler.py +0 -0
  134. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/cli/test_update.py +0 -0
  135. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/dvc/__init__.py +0 -0
  136. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/dvc/test_core.py +0 -0
  137. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/dvc/test_zip.py +0 -0
  138. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/jupyterlab/__init__.py +0 -0
  139. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/jupyterlab/conftest.py +0 -0
  140. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/jupyterlab/test_routes.py +0 -0
  141. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/models/__init__.py +0 -0
  142. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/models/test_core.py +0 -0
  143. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/models/test_iteration.py +0 -0
  144. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/models/test_pipeline.py +0 -0
  145. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_calc.py +0 -0
  146. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_check.py +0 -0
  147. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_cloud.py +0 -0
  148. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_conda.py +0 -0
  149. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_core.py +0 -0
  150. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_dependencies.py +0 -0
  151. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_detect.py +0 -0
  152. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_docker.py +0 -0
  153. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_environments.py +0 -0
  154. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_fs.py +0 -0
  155. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_git.py +0 -0
  156. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_install.py +0 -0
  157. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_invenio.py +0 -0
  158. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_julia.py +0 -0
  159. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_jupyter.py +0 -0
  160. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_licenses.py +0 -0
  161. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_magics.py +0 -0
  162. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_matlab.py +0 -0
  163. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_notebooks.py +0 -0
  164. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_pipeline.py +0 -0
  165. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_releases.py +0 -0
  166. {calkit_python-0.41.16 → calkit_python-0.41.17}/calkit/tests/test_templates.py +0 -0
  167. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/CNAME +0 -0
  168. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/ai-tools.md +0 -0
  169. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/apps.md +0 -0
  170. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/calculations.md +0 -0
  171. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/calkit-yaml.md +0 -0
  172. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/cli-reference.md +0 -0
  173. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/cloud-integration.md +0 -0
  174. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/datasets.md +0 -0
  175. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/dependencies.md +0 -0
  176. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/examples.md +0 -0
  177. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/governance.md +0 -0
  178. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/help.md +0 -0
  179. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/hpc.md +0 -0
  180. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/c-to-the-k-white.svg +0 -0
  181. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/calkit-fragmentation-compendium.png +0 -0
  182. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/calkit-no-bg.png +0 -0
  183. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/connect-zenodo.png +0 -0
  184. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/jupyterlab/all-green.png +0 -0
  185. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/jupyterlab/collect-data-stale.png +0 -0
  186. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/jupyterlab/new-env.png +0 -0
  187. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/jupyterlab/new-notebook.png +0 -0
  188. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/jupyterlab/pipeline-badge.png +0 -0
  189. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/jupyterlab-params.png +0 -0
  190. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/plos-osi-code-2024-03.png +0 -0
  191. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/img/vscode-nb-params.png +0 -0
  192. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/installation.md +0 -0
  193. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/jupyterlab.md +0 -0
  194. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/local-server.md +0 -0
  195. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/notebooks.md +0 -0
  196. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/overleaf.md +0 -0
  197. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/pipeline/index.md +0 -0
  198. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/pipeline/manual-steps.md +0 -0
  199. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/pipeline/running-and-logging.md +0 -0
  200. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/references.md +0 -0
  201. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/releases.md +0 -0
  202. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/reproducibility.md +0 -0
  203. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/subprojects.md +0 -0
  204. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/adding-latex-pub-docker.md +0 -0
  205. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/ai-agents.md +0 -0
  206. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/conda-envs.md +0 -0
  207. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/existing-project.md +0 -0
  208. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/first-project.md +0 -0
  209. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/github-actions.md +0 -0
  210. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/actions-repo-secrets.png +0 -0
  211. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/building-codespace.png +0 -0
  212. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/codespaces-secrets-2.png +0 -0
  213. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/editor-split.png +0 -0
  214. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/go-to-linked-code.png +0 -0
  215. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/issue-from-selection.png +0 -0
  216. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/new-project.png +0 -0
  217. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/new-pub-2.png +0 -0
  218. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/new-token.png +0 -0
  219. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/paper.tex.png +0 -0
  220. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/project-home-3.png +0 -0
  221. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/push.png +0 -0
  222. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/latex-codespaces/stage.png +0 -0
  223. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/anakin-excel.jpg +0 -0
  224. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/chart-more-rows.png +0 -0
  225. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/create-project.png +0 -0
  226. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/elsevier-research-data-guidelines.png +0 -0
  227. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/excel-chart.png +0 -0
  228. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/excel-data.png +0 -0
  229. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/insert-link-to-file.png +0 -0
  230. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/needs-clone.png +0 -0
  231. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/new-stage.png +0 -0
  232. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/phd-comics-version-control.webp +0 -0
  233. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/pipeline-out-of-date.png +0 -0
  234. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/status-more-rows.png +0 -0
  235. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/uncommitted-changes.png +0 -0
  236. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/untracked-data.png +0 -0
  237. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/updated-publication.png +0 -0
  238. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/word-to-pdf-stage-2.png +0 -0
  239. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/office/workflow-page.png +0 -0
  240. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/openfoam/clone.png +0 -0
  241. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/openfoam/create-project.png +0 -0
  242. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/openfoam/datasets-page.png +0 -0
  243. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/openfoam/figure-on-website-updated.png +0 -0
  244. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/openfoam/figure-on-website.png +0 -0
  245. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/openfoam/new-token.png +0 -0
  246. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/openfoam/reclone.png +0 -0
  247. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/openfoam/status-after-import-dataset.png +0 -0
  248. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/quick-actions.png +0 -0
  249. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/run-proc.png +0 -0
  250. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/vscode-slurm-notebook/create-calkit-env.png +0 -0
  251. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/vscode-slurm-notebook/create-inner-env.png +0 -0
  252. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/vscode-slurm-notebook/create-new-calkit-env.png +0 -0
  253. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/vscode-slurm-notebook/select-calkit-env.png +0 -0
  254. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/vscode-slurm-notebook/slurm-job-running.png +0 -0
  255. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/vscode-slurm-notebook/slurm-launch-options.png +0 -0
  256. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/img/vscode-slurm-notebook/starting-slurm-job.png +0 -0
  257. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/index.md +0 -0
  258. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/jupyterlab.md +0 -0
  259. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/latex-codespaces.md +0 -0
  260. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/matlab.md +0 -0
  261. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/notebook-pipeline.md +0 -0
  262. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/office.md +0 -0
  263. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/openfoam.md +0 -0
  264. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/procedures.md +0 -0
  265. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/tutorials/vscode-slurm-notebook.md +0 -0
  266. {calkit_python-0.41.16 → calkit_python-0.41.17}/docs/version-control.md +0 -0
  267. {calkit_python-0.41.16 → calkit_python-0.41.17}/flake.lock +0 -0
  268. {calkit_python-0.41.16 → calkit_python-0.41.17}/flake.nix +0 -0
  269. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/.yarnrc.yml +0 -0
  270. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/babel.config.js +0 -0
  271. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/install.json +0 -0
  272. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/jest.config.js +0 -0
  273. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/jupyter-config/server-config/calkit.json +0 -0
  274. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/package.json +0 -0
  275. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/schema/plugin.json +0 -0
  276. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/__tests__/useQueries.spec.ts +0 -0
  277. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/calkit-config.ts +0 -0
  278. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/cell-output-marker.ts +0 -0
  279. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/components/commit-dialog.tsx +0 -0
  280. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/components/environment-editor.tsx +0 -0
  281. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/components/notebook-registration.tsx +0 -0
  282. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/components/notebook-toolbar.tsx +0 -0
  283. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/components/pipeline-status-bar.tsx +0 -0
  284. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/components/project-info-editor.tsx +0 -0
  285. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/components/sidebar-settings.tsx +0 -0
  286. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/components/sidebar.tsx +0 -0
  287. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/components/stage-editor.tsx +0 -0
  288. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/feature-flags.ts +0 -0
  289. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/file-browser-menu.ts +0 -0
  290. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/hooks/__tests__/useQueries.test.tsx +0 -0
  291. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/hooks/useQueries.ts +0 -0
  292. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/icons.ts +0 -0
  293. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/index.ts +0 -0
  294. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/io-tracker.ts +0 -0
  295. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/pipeline-state.ts +0 -0
  296. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/queryClient.ts +0 -0
  297. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/request.ts +0 -0
  298. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/src/shims-mainmenu.d.ts +0 -0
  299. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/style/base.css +0 -0
  300. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/style/cell-output-marker.css +0 -0
  301. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/style/environment-editor.css +0 -0
  302. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/style/environment-selector.css +0 -0
  303. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/style/img/calkit-no-bg.png +0 -0
  304. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/style/index.css +0 -0
  305. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/style/index.js +0 -0
  306. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/style/notebook-toolbar.css +0 -0
  307. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/style/pipeline-status-bar.css +0 -0
  308. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/style/sidebar.css +0 -0
  309. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/tsconfig.json +0 -0
  310. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/tsconfig.test.json +0 -0
  311. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/ui-tests/.gitignore +0 -0
  312. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/ui-tests/README.md +0 -0
  313. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/ui-tests/jupyter_server_test_config.py +0 -0
  314. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/ui-tests/package.json +0 -0
  315. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/ui-tests/playwright.config.js +0 -0
  316. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/ui-tests/tests/calkit.spec.ts +0 -0
  317. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/ui-tests/yarn.lock +0 -0
  318. {calkit_python-0.41.16 → calkit_python-0.41.17}/jupyterlab-ext/yarn.lock +0 -0
  319. {calkit_python-0.41.16 → calkit_python-0.41.17}/pyproject.toml +0 -0
  320. {calkit_python-0.41.16 → calkit_python-0.41.17}/scripts/install.ps1 +0 -0
  321. {calkit_python-0.41.16 → calkit_python-0.41.17}/scripts/install.sh +0 -0
  322. {calkit_python-0.41.16 → calkit_python-0.41.17}/scripts/make-calk9.sh +0 -0
  323. {calkit_python-0.41.16 → calkit_python-0.41.17}/test/dvc-md5-dir/osx-arm64.txt +0 -0
  324. {calkit_python-0.41.16 → calkit_python-0.41.17}/test/nb-julia.ipynb +0 -0
  325. {calkit_python-0.41.16 → calkit_python-0.41.17}/test/nb-params.ipynb +0 -0
  326. {calkit_python-0.41.16 → calkit_python-0.41.17}/test/nb-subdir.ipynb +0 -0
  327. {calkit_python-0.41.16 → calkit_python-0.41.17}/test/pipeline.ipynb +0 -0
  328. {calkit_python-0.41.16 → calkit_python-0.41.17}/test/script.py +0 -0
  329. {calkit_python-0.41.16 → calkit_python-0.41.17}/test/test-log.log +0 -0
  330. {calkit_python-0.41.16 → calkit_python-0.41.17}/uv.lock +0 -0
  331. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/.gitignore +0 -0
  332. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/.vscodeignore +0 -0
  333. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/CHANGELOG.md +0 -0
  334. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/LICENSE +0 -0
  335. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/README.md +0 -0
  336. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/images/calkit-icon.svg +0 -0
  337. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/images/calkit-no-bg.png +0 -0
  338. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/package-lock.json +0 -0
  339. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/package.json +0 -0
  340. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/scripts/set-proposed-api.js +0 -0
  341. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/environments.ts +0 -0
  342. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/extension.ts +0 -0
  343. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/figures/core.ts +0 -0
  344. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/figures/view.ts +0 -0
  345. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/notebooks.ts +0 -0
  346. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/pipeline/core.ts +0 -0
  347. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/sidebar.ts +0 -0
  348. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/test/environments.test.ts +0 -0
  349. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/test/figures.test.ts +0 -0
  350. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/test/kernel-selection.test.ts +0 -0
  351. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/test/notebooks.test.ts +0 -0
  352. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/test/pipeline.test.ts +0 -0
  353. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/src/types.ts +0 -0
  354. {calkit_python-0.41.16 → calkit_python-0.41.17}/vscode-ext/tsconfig.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: calkit-python
3
- Version: 0.41.16
3
+ Version: 0.41.17
4
4
  Summary: Reproducibility simplified.
5
5
  Project-URL: Homepage, https://calkit.org
6
6
  Project-URL: Issues, https://github.com/calkit/calkit/issues
@@ -78,35 +78,30 @@ Description-Content-Type: text/markdown
78
78
 
79
79
  <!-- INCLUDE: docs/index.md -->
80
80
 
81
- Calkit helps you manage and automate research projects like a software
82
- engineer.
83
-
84
- Define computational environments,
85
- steps that process your data, create figures,
86
- presentations, and publications, connect to external tools,
87
- then iterate quickly and painlessly until your research questions are
88
- answered, tracking changes to all files along the way.
89
- At the end, deliver your entire project as a self-contained, self-documenting,
90
- version-controlled, and
91
- [single button reproducible](https://doi.org/10.1190/1.1822162)
92
- "calculation kit" so you and others can easily verify
93
- and build upon the results.
94
-
95
- ## Guiding principles
96
-
97
- - Quality comes from iteration. Automation reduces the time and effort
98
- needed to iterate, thereby increasing iteration and quality.
99
- - Automating a step can and should take roughly
100
- the same amount of time as doing it once manually,
101
- therefore it's almost always worth it.
102
- - Working in a "quick and dirty" way can easily become _not quick_ when
103
- the dirtiness results in mistakes and/or discourages working in small steps.
81
+ It's six months since you submitted your paper,
82
+ do you know exactly how your figures and results were generated?
83
+
84
+ You will if they're part of a Calkit project.
85
+
86
+ Calkit helps you integrate code, data, figures, results, publications,
87
+ and more into a cohesive, traceable, and portable _knowledge creation system_,
88
+ so every output can be traced back to its source and reproduced with a
89
+ single command.
90
+
91
+ With industry standard tools combined into a unified and simplified experience
92
+ tailored for research,
93
+ you can reap the rewards of reproducibility and automation
94
+ without the cognitive overhead.
95
+
96
+ <!-- https://docs.google.com/drawings/d/1XMGnbgYYNFAVUBDyUaCyLfRB7efvJdrnrKmFlNmT19o/edit -->
97
+
98
+ ![pipeline](docs/img/pipeline.png)
104
99
 
105
100
  ## Features
106
101
 
107
102
  - A simplified [version control](https://docs.calkit.org/version-control)
108
103
  interface that unifies Git and DVC (Data Version Control),
109
- so all materials can be kept in the same project repository.
104
+ so everything can be kept in the same project repository.
110
105
  This way, code doesn't need to be siloed away from other
111
106
  important artifacts like datasets, models, figures, or article PDFs,
112
107
  allowing you to work on all parts of a project without hopping around to
@@ -129,9 +124,10 @@ and build upon the results.
129
124
  - [Overleaf integration](https://docs.calkit.org/overleaf/), so
130
125
  analysis, visualization, and writing can all stay in sync
131
126
  (no more manual uploads!)
132
- - Support for running on high performance computing (HPC) systems that use
133
- [SLURM schedulers](https://docs.calkit.org/pipeline/slurm).
134
- - Support for running with [GitHub Actions](https://docs.calkit.org/tutorials/github-actions).
127
+ - Support for running on [high performance computing (HPC)](https://docs.calkit.org/hpc) systems
128
+ that use PBS or SLURM schedulers.
129
+ - Support for automated running with
130
+ [GitHub Actions](https://docs.calkit.org/tutorials/github-actions).
135
131
  - Extensions for doing all of the above graphically in
136
132
  [JupyterLab](https://docs.calkit.org/jupyterlab) and
137
133
  [VS Code](https://marketplace.visualstudio.com/items?itemName=Calkit.calkit-vscode).
@@ -373,9 +369,37 @@ To back up or save the project, call:
373
369
  calkit save -am "Run pipeline"
374
370
  ```
375
371
 
372
+ ### With an AI coding agent
373
+
374
+ Simply tell the [AI agent](https://docs.calkit.org/ai-tools):
375
+
376
+ > Turn this folder into a Calkit project
377
+
378
+ or
379
+
380
+ > Create me a new Calkit project for investigating...
381
+
376
382
  <!-- END INCLUDE -->
377
383
 
378
384
  ## Get involved
379
385
 
380
386
  We welcome all kinds of contributions!
381
387
  See [CONTRIBUTING.md](CONTRIBUTING.md) to learn how to get involved.
388
+
389
+ ## Acknowledgements
390
+
391
+ <!-- INCLUDE: docs/acknowledgements.md +1 -->
392
+
393
+ Calkit is supported by the
394
+ [Caltech Schmidt Academy of Software Engineering](https://sase.caltech.edu).
395
+
396
+ <p align="center">
397
+ <a href="https://sase.caltech.edu" target="_blank">
398
+ <img width="40%" src="docs/img/caltech.png" alt="Caltech SASE">
399
+ </a>
400
+ <a href="https://schmidtsciences.org/" target="_blank">
401
+ <img width="40%" src="docs/img/schmidt-sciences.png" alt="Schmidt Sciences">
402
+ </a>
403
+ </p>
404
+
405
+ <!-- END INCLUDE -->
@@ -19,35 +19,30 @@
19
19
 
20
20
  <!-- INCLUDE: docs/index.md -->
21
21
 
22
- Calkit helps you manage and automate research projects like a software
23
- engineer.
24
-
25
- Define computational environments,
26
- steps that process your data, create figures,
27
- presentations, and publications, connect to external tools,
28
- then iterate quickly and painlessly until your research questions are
29
- answered, tracking changes to all files along the way.
30
- At the end, deliver your entire project as a self-contained, self-documenting,
31
- version-controlled, and
32
- [single button reproducible](https://doi.org/10.1190/1.1822162)
33
- "calculation kit" so you and others can easily verify
34
- and build upon the results.
35
-
36
- ## Guiding principles
37
-
38
- - Quality comes from iteration. Automation reduces the time and effort
39
- needed to iterate, thereby increasing iteration and quality.
40
- - Automating a step can and should take roughly
41
- the same amount of time as doing it once manually,
42
- therefore it's almost always worth it.
43
- - Working in a "quick and dirty" way can easily become _not quick_ when
44
- the dirtiness results in mistakes and/or discourages working in small steps.
22
+ It's six months since you submitted your paper,
23
+ do you know exactly how your figures and results were generated?
24
+
25
+ You will if they're part of a Calkit project.
26
+
27
+ Calkit helps you integrate code, data, figures, results, publications,
28
+ and more into a cohesive, traceable, and portable _knowledge creation system_,
29
+ so every output can be traced back to its source and reproduced with a
30
+ single command.
31
+
32
+ With industry standard tools combined into a unified and simplified experience
33
+ tailored for research,
34
+ you can reap the rewards of reproducibility and automation
35
+ without the cognitive overhead.
36
+
37
+ <!-- https://docs.google.com/drawings/d/1XMGnbgYYNFAVUBDyUaCyLfRB7efvJdrnrKmFlNmT19o/edit -->
38
+
39
+ ![pipeline](docs/img/pipeline.png)
45
40
 
46
41
  ## Features
47
42
 
48
43
  - A simplified [version control](https://docs.calkit.org/version-control)
49
44
  interface that unifies Git and DVC (Data Version Control),
50
- so all materials can be kept in the same project repository.
45
+ so everything can be kept in the same project repository.
51
46
  This way, code doesn't need to be siloed away from other
52
47
  important artifacts like datasets, models, figures, or article PDFs,
53
48
  allowing you to work on all parts of a project without hopping around to
@@ -70,9 +65,10 @@ and build upon the results.
70
65
  - [Overleaf integration](https://docs.calkit.org/overleaf/), so
71
66
  analysis, visualization, and writing can all stay in sync
72
67
  (no more manual uploads!)
73
- - Support for running on high performance computing (HPC) systems that use
74
- [SLURM schedulers](https://docs.calkit.org/pipeline/slurm).
75
- - Support for running with [GitHub Actions](https://docs.calkit.org/tutorials/github-actions).
68
+ - Support for running on [high performance computing (HPC)](https://docs.calkit.org/hpc) systems
69
+ that use PBS or SLURM schedulers.
70
+ - Support for automated running with
71
+ [GitHub Actions](https://docs.calkit.org/tutorials/github-actions).
76
72
  - Extensions for doing all of the above graphically in
77
73
  [JupyterLab](https://docs.calkit.org/jupyterlab) and
78
74
  [VS Code](https://marketplace.visualstudio.com/items?itemName=Calkit.calkit-vscode).
@@ -314,9 +310,37 @@ To back up or save the project, call:
314
310
  calkit save -am "Run pipeline"
315
311
  ```
316
312
 
313
+ ### With an AI coding agent
314
+
315
+ Simply tell the [AI agent](https://docs.calkit.org/ai-tools):
316
+
317
+ > Turn this folder into a Calkit project
318
+
319
+ or
320
+
321
+ > Create me a new Calkit project for investigating...
322
+
317
323
  <!-- END INCLUDE -->
318
324
 
319
325
  ## Get involved
320
326
 
321
327
  We welcome all kinds of contributions!
322
328
  See [CONTRIBUTING.md](CONTRIBUTING.md) to learn how to get involved.
329
+
330
+ ## Acknowledgements
331
+
332
+ <!-- INCLUDE: docs/acknowledgements.md +1 -->
333
+
334
+ Calkit is supported by the
335
+ [Caltech Schmidt Academy of Software Engineering](https://sase.caltech.edu).
336
+
337
+ <p align="center">
338
+ <a href="https://sase.caltech.edu" target="_blank">
339
+ <img width="40%" src="docs/img/caltech.png" alt="Caltech SASE">
340
+ </a>
341
+ <a href="https://schmidtsciences.org/" target="_blank">
342
+ <img width="40%" src="docs/img/schmidt-sciences.png" alt="Schmidt Sciences">
343
+ </a>
344
+ </p>
345
+
346
+ <!-- END INCLUDE -->
@@ -490,7 +490,17 @@ def execute_notebook(
490
490
  typer.echo(f"Using {language} as notebook language")
491
491
  # First, ensure the specified environment has a kernel we can use
492
492
  # We need to check the environment type and create the kernel if needed
493
- if language.lower() in ["python", "julia", "r"]:
493
+ docker_env = env.get("kind") == "docker"
494
+ if docker_env:
495
+ # Docker environments run the kernel inside the container, so there is
496
+ # no host kernel to register. Use the container's own kernel (default
497
+ # 'python3', overridable with the env's 'jupyter_kernel' key) and
498
+ # execute with Papermill inside the container further below.
499
+ kernel_name = env.get("jupyter_kernel") or {"r": "ir"}.get(
500
+ language.lower(), "python3"
501
+ )
502
+ display_name = kernel_name
503
+ elif language.lower() in ["python", "julia", "r"]:
494
504
  kernel_name, display_name = check_env_kernel(
495
505
  env_name=env_name,
496
506
  no_check=no_check,
@@ -563,10 +573,70 @@ def execute_notebook(
563
573
  typer.echo(f"Using kernel: {kernel_name}")
564
574
  typer.echo(f"Running with cwd: {notebook_dir}")
565
575
  typer.echo(f"Output will be saved to: {fpath_out_exec}")
566
- # If this is a Python, Julia, or R notebook, we can use Papermill
576
+ # If this is a Python, Julia, or R notebook, we can use Papermill.
567
577
  # If it's a MATLAB notebook, we need to use the MATLAB kernel inside the
568
- # specified environment
569
- if language.lower() in ["python", "julia", "r"]:
578
+ # specified environment.
579
+ # Exception: If the environment is a Docker environment, we run Papermill
580
+ # inside the container so the kernel (which lives in the image) and
581
+ # Papermill share a process namespace---this avoids registering a host
582
+ # kernel and cross-container networking entirely
583
+ if docker_env:
584
+ # run_in_env mounts the project at the working directory and applies
585
+ # the env's user/platform/args, so we only need to invoke Papermill
586
+ # ipykernel is in the image, but Papermill may not be, so install it
587
+ # on demand (warning the user) before executing. We install into a
588
+ # writable temp dir on PYTHONPATH rather than the image's site-packages:
589
+ # run_in_env maps the host user into the container, so writing to the
590
+ # system location is typically denied, but /tmp is world-writable
591
+ pm_target = "/tmp/calkit-papermill"
592
+ pythonpath = f"PYTHONPATH={pm_target}"
593
+ pm_cmd = [
594
+ pythonpath,
595
+ "python",
596
+ "-c",
597
+ "import papermill",
598
+ "2>/dev/null",
599
+ "||",
600
+ "(",
601
+ "echo",
602
+ "papermill not found in image; installing it with pip...",
603
+ "&&",
604
+ "python",
605
+ "-m",
606
+ "pip",
607
+ "install",
608
+ "-q",
609
+ "--target",
610
+ pm_target,
611
+ "papermill",
612
+ ")",
613
+ "&&",
614
+ pythonpath,
615
+ "python",
616
+ "-m",
617
+ "papermill",
618
+ path,
619
+ fpath_out_exec,
620
+ "-k",
621
+ kernel_name,
622
+ "--log-output",
623
+ ]
624
+ if notebook_dir:
625
+ pm_cmd += ["--cwd", notebook_dir]
626
+ if parsed_params:
627
+ # JSON is valid YAML, so pass parameters as base64-encoded JSON to
628
+ # avoid shell-quoting issues across the container boundary
629
+ params_b64 = base64.b64encode(
630
+ json.dumps(parsed_params).encode()
631
+ ).decode()
632
+ pm_cmd += ["-b", params_b64]
633
+ run_in_env(
634
+ pm_cmd,
635
+ env_name=env_name,
636
+ no_check=no_check,
637
+ verbose=verbose,
638
+ )
639
+ elif language.lower() in ["python", "julia", "r"]:
570
640
  papermill.execute_notebook(
571
641
  input_path=path,
572
642
  output_path=fpath_out_exec,
@@ -96,8 +96,6 @@ class Environment(BaseModel):
96
96
  # without a spec file (e.g. Matlab/Slurm/PBS) don't carry an unused field
97
97
  # and a required ``path`` doesn't conflict with the base's optional one.
98
98
  description: str | None = None
99
- stage: str | None = None
100
- default: bool | None = None
101
99
 
102
100
 
103
101
  class CondaEnvironment(Environment):
@@ -112,6 +110,8 @@ class VenvEnvironment(Environment):
112
110
  # If unset, the prefix is resolved on the fly (defaults to .venv next to
113
111
  # the spec file, nesting under .calkit/envs/{name}/.venv on conflict)
114
112
  prefix: str | None = None
113
+ # Python version to use when creating the environment
114
+ python: str | None = None
115
115
 
116
116
 
117
117
  class UvEnvironment(Environment):
@@ -125,6 +125,8 @@ class UvVenvEnvironment(Environment):
125
125
  # If unset, the prefix is resolved on the fly (defaults to .venv next to
126
126
  # the spec file, nesting under .calkit/envs/{name}/.venv on conflict)
127
127
  prefix: str | None = None
128
+ # Python version to use when creating the environment
129
+ python: str | None = None
128
130
 
129
131
 
130
132
  class PixiEnvironment(Environment):
@@ -153,6 +155,24 @@ class DockerEnvironment(Environment):
153
155
  shell: Literal["bash", "sh"] = "sh"
154
156
  command_mode: Literal["shell", "entrypoint"] = "shell"
155
157
  platform: str | None = None
158
+ # Working directory inside the container; defaults to ``/work`` at run time
159
+ wdir: str | None = None
160
+ # User to run the container as; defaults to the host user at run time
161
+ user: str | None = None
162
+ # Files added to the container as dependencies
163
+ deps: list[str] | None = None
164
+ # Environment variables to set in the container
165
+ env_vars: dict[str, str] | None = None
166
+ # Ports to expose, e.g. ``"8080:80"``
167
+ ports: list[str] | None = None
168
+ # GPUs to make available, passed to ``docker run --gpus``
169
+ gpus: str | None = None
170
+ # Extra arguments passed to ``docker run``
171
+ args: list[str] | None = None
172
+ # Name of the Jupyter kernel inside the image, used when executing
173
+ # notebooks with ``calkit nb execute``; defaults to ``python3`` (or ``ir``
174
+ # for R images)
175
+ jupyter_kernel: str | None = None
156
176
 
157
177
 
158
178
  class REnvironment(Environment):
@@ -195,6 +215,7 @@ class SSHEnvironment(BaseModel):
195
215
  key: str | None = None
196
216
  send_paths: list[str] = ["./*"]
197
217
  get_paths: list[str] = ["*"]
218
+ description: str | None = None
198
219
 
199
220
 
200
221
  class Software(BaseModel):
@@ -10,6 +10,7 @@ import sys
10
10
  import pytest
11
11
 
12
12
  import calkit
13
+ import calkit.notebooks
13
14
 
14
15
 
15
16
  def test_clean_notebook_outputs(tmp_dir):
@@ -264,3 +265,87 @@ def test_execute_notebook_auto_env(tmp_dir):
264
265
  # TODO: Check if the notebook is saved in the project and if it
265
266
  # has an environment specified, either in the notebooks section or a
266
267
  # pipeline stage
268
+
269
+
270
+ @pytest.mark.skipif(
271
+ sys.platform == "win32",
272
+ reason="Docker Linux images are unavailable on windows-latest GHA runners",
273
+ )
274
+ def test_execute_notebook_docker(tmp_dir):
275
+ # A Docker environment runs the kernel inside the container, so we execute
276
+ # with Papermill inside the container rather than registering a host kernel
277
+ if shutil.which("docker") is None:
278
+ pytest.skip("Docker is not available")
279
+ image = "calkit-nb-docker-test:latest"
280
+ # Bake ipykernel and Papermill into the image so execution is deterministic
281
+ with open("Dockerfile", "w") as f:
282
+ f.write(
283
+ "FROM python:3.10-slim\n"
284
+ "RUN pip install --no-cache-dir ipykernel papermill\n"
285
+ "WORKDIR /work\n"
286
+ )
287
+ subprocess.check_call(["docker", "build", "-t", image, "."])
288
+ subprocess.check_call(["calkit", "init"])
289
+ ck_info = {
290
+ "environments": {
291
+ "docker-env": {"kind": "docker", "image": image, "wdir": "/work"}
292
+ }
293
+ }
294
+ with open("calkit.yaml", "w") as f:
295
+ calkit.ryaml.dump(ck_info, f)
296
+ # A notebook with a 'parameters' cell so we can verify injection
297
+ nb = {
298
+ "cells": [
299
+ {
300
+ "cell_type": "code",
301
+ "execution_count": None,
302
+ "id": "params",
303
+ "metadata": {"tags": ["parameters"]},
304
+ "outputs": [],
305
+ "source": ["a = 1\n"],
306
+ },
307
+ {
308
+ "cell_type": "code",
309
+ "execution_count": None,
310
+ "id": "compute",
311
+ "metadata": {},
312
+ "outputs": [],
313
+ "source": ["result = a * 10\n", "print('result =', result)\n"],
314
+ },
315
+ ],
316
+ "metadata": {},
317
+ "nbformat": 4,
318
+ "nbformat_minor": 5,
319
+ }
320
+ os.makedirs("notebooks")
321
+ with open(os.path.join("notebooks", "main.ipynb"), "w") as f:
322
+ json.dump(nb, f)
323
+ subprocess.check_call(
324
+ [
325
+ "calkit",
326
+ "nb",
327
+ "exec",
328
+ "-e",
329
+ "docker-env",
330
+ "--no-check",
331
+ "-p",
332
+ "a=4",
333
+ "notebooks/main.ipynb",
334
+ ]
335
+ )
336
+ # The injected parameter should have produced result = 40 in the executed
337
+ # notebook saved under .calkit/notebooks/executed
338
+ exec_path = calkit.notebooks.get_executed_notebook_path(
339
+ notebook_path="notebooks/main.ipynb",
340
+ to="notebook",
341
+ parameters={"a": 4},
342
+ )
343
+ with open(exec_path) as f:
344
+ executed = json.load(f)
345
+ text = "".join(
346
+ "".join(o.get("text", []))
347
+ for cell in executed["cells"]
348
+ for o in cell.get("outputs", [])
349
+ if o.get("name") == "stdout"
350
+ )
351
+ assert "result = 40" in text
@@ -0,0 +1,13 @@
1
+ # Acknowledgements
2
+
3
+ Calkit is supported by the
4
+ [Caltech Schmidt Academy of Software Engineering](https://sase.caltech.edu).
5
+
6
+ <p align="center">
7
+ <a href="https://sase.caltech.edu" target="_blank">
8
+ <img width="40%" src="/img/caltech.png" alt="Caltech SASE">
9
+ </a>
10
+ <a href="https://schmidtsciences.org/" target="_blank">
11
+ <img width="40%" src="/img/schmidt-sciences.png" alt="Schmidt Sciences">
12
+ </a>
13
+ </p>
@@ -626,7 +626,7 @@ Model class: `VenvEnvironment`
626
626
  | ----------- | --------------- | -------- |
627
627
  | kind | Literal['venv'] | yes |
628
628
  | path | str | yes |
629
- | prefix | str | yes |
629
+ | prefix | str | no |
630
630
  | python | str | no |
631
631
  | description | str | no |
632
632
 
@@ -638,7 +638,7 @@ Model class: `UvVenvEnvironment`
638
638
  | ----------- | ------------------ | -------- |
639
639
  | kind | Literal['uv-venv'] | yes |
640
640
  | path | str | yes |
641
- | prefix | str | yes |
641
+ | prefix | str | no |
642
642
  | python | str | no |
643
643
  | description | str | no |
644
644
 
@@ -657,32 +657,24 @@ Model class: `PixiEnvironment`
657
657
 
658
658
  Model class: `DockerEnvironment`
659
659
 
660
- | Parameter | Type | Required |
661
- | ------------ | ------------------------------ | -------- |
662
- | kind | Literal['docker'] | yes |
663
- | image | str | yes |
664
- | path | str | no |
665
- | platform | str | no |
666
- | command_mode | Literal['shell'\|'entrypoint'] | no |
667
- | shell | str | no |
668
- | deps | list[str] | no |
669
- | env_vars | dict[str, str] | no |
670
- | ports | list[str] | no |
671
- | gpus | str | no |
672
- | user | str | no |
673
- | wdir | str | no |
674
- | args | list[str] | no |
675
- | description | str | no |
676
-
677
- #### `renv`
678
-
679
- Model class: `REnvironment`
680
-
681
- | Parameter | Type | Required |
682
- | ----------- | --------------- | -------- |
683
- | kind | Literal['renv'] | yes |
684
- | path | str | yes |
685
- | description | str | no |
660
+ | Parameter | Type | Required |
661
+ | -------------- | ------------------------------ | -------- |
662
+ | kind | Literal['docker'] | yes |
663
+ | path | str | no |
664
+ | image | str | yes |
665
+ | layers | list[str] | no |
666
+ | shell | Literal['bash'\|'sh'] | no |
667
+ | command_mode | Literal['shell'\|'entrypoint'] | no |
668
+ | platform | str | no |
669
+ | wdir | str | no |
670
+ | user | str | no |
671
+ | deps | list[str] | no |
672
+ | env_vars | dict[str, str] | no |
673
+ | ports | list[str] | no |
674
+ | gpus | str | no |
675
+ | args | list[str] | no |
676
+ | jupyter_kernel | str | no |
677
+ | description | str | no |
686
678
 
687
679
  #### `julia`
688
680
 
@@ -702,6 +694,7 @@ Model class: `MatlabEnvironment`
702
694
  | Parameter | Type | Required |
703
695
  | ----------- | ----------------- | -------- |
704
696
  | kind | Literal['matlab'] | yes |
697
+ | version | str | no |
705
698
  | products | list[str] | no |
706
699
  | description | str | no |
707
700
 
@@ -709,12 +702,12 @@ Model class: `MatlabEnvironment`
709
702
 
710
703
  Model class: `NixEnvironment`
711
704
 
712
- | Parameter | Type | Required |
713
- | ----------- | ------------------------------- | -------- |
714
- | kind | Literal['nix'] | yes |
715
- | path | str (must end with 'flake.nix') | yes |
716
- | shell | str (name of devShell to enter) | no |
717
- | description | str | no |
705
+ | Parameter | Type | Required |
706
+ | ----------- | -------------- | -------- |
707
+ | kind | Literal['nix'] | yes |
708
+ | path | str | yes |
709
+ | shell | str | no |
710
+ | description | str | no |
718
711
 
719
712
  #### `slurm`
720
713
 
@@ -728,6 +721,17 @@ Model class: `SlurmEnvironment`
728
721
  | default_setup | list[str] | no |
729
722
  | description | str | no |
730
723
 
724
+ #### `renv`
725
+
726
+ Model class: `REnvironment`
727
+
728
+ | Parameter | Type | Required |
729
+ | ----------- | --------------- | -------- |
730
+ | kind | Literal['renv'] | yes |
731
+ | path | str | yes |
732
+ | prefix | str | yes |
733
+ | description | str | no |
734
+
731
735
  #### `ssh`
732
736
 
733
737
  Model class: `SSHEnvironment`