calkit-python 0.37.6__tar.gz → 0.38.1__tar.gz

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