labnotes 0.0.133__tar.gz → 0.0.135__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 (219) hide show
  1. {labnotes-0.0.133 → labnotes-0.0.135}/PKG-INFO +1 -1
  2. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/context.md +6 -1
  3. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/execute_run.py +8 -3
  4. labnotes-0.0.135/src/labnotes/runner/run_git.py +22 -0
  5. {labnotes-0.0.133 → labnotes-0.0.135}/.gitignore +0 -0
  6. {labnotes-0.0.133 → labnotes-0.0.135}/CHANGELOG.md +0 -0
  7. {labnotes-0.0.133 → labnotes-0.0.135}/MIGRATIONS.md +0 -0
  8. {labnotes-0.0.133 → labnotes-0.0.135}/README.md +0 -0
  9. {labnotes-0.0.133 → labnotes-0.0.135}/pyproject.toml +0 -0
  10. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/__init__.py +0 -0
  11. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/__main__.py +0 -0
  12. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/asset_url.py +0 -0
  13. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/check_counts.py +0 -0
  14. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/cli.py +0 -0
  15. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/compose_experiment.py +0 -0
  16. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/context_guide.py +0 -0
  17. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/count_groups.py +0 -0
  18. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/count_runs.py +0 -0
  19. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/create_app.py +0 -0
  20. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/create_experiment.py +0 -0
  21. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/create_note.py +0 -0
  22. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/__init__.py +0 -0
  23. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/control_run.py +0 -0
  24. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/daemon_app.py +0 -0
  25. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/daemon_client.py +0 -0
  26. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/daemon_running.py +0 -0
  27. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/daemon_server.py +0 -0
  28. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/describe_status.py +0 -0
  29. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/ensure_daemon.py +0 -0
  30. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/exit_when_idle.py +0 -0
  31. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/finalize_lost_runs.py +0 -0
  32. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/last_stderr.py +0 -0
  33. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/remote_start.py +0 -0
  34. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/run_daemon.py +0 -0
  35. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/run_logs.py +0 -0
  36. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/serve_daemon.py +0 -0
  37. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/socket_path.py +0 -0
  38. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/stop_runs.py +0 -0
  39. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/watch_daemon.py +0 -0
  40. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon/watch_status.py +0 -0
  41. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/daemon_command.py +0 -0
  42. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/data_html.py +0 -0
  43. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/default_config_text.py +0 -0
  44. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/default_counts.py +0 -0
  45. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/drain_watch.py +0 -0
  46. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/experiment_notes.py +0 -0
  47. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/experiment_runs.py +0 -0
  48. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/experiments.py +0 -0
  49. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/file_changes.py +0 -0
  50. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/format_duration.py +0 -0
  51. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/format_started.py +0 -0
  52. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/format_value.py +0 -0
  53. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/get_state.py +0 -0
  54. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/grid_cell.py +0 -0
  55. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/group_runs.py +0 -0
  56. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/init.py +0 -0
  57. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/invocation_started.py +0 -0
  58. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/is_non_negative_int.py +0 -0
  59. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/is_non_negative_number.py +0 -0
  60. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/is_positive_int.py +0 -0
  61. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/list_experiments.py +0 -0
  62. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/list_runs.py +0 -0
  63. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/load_config.py +0 -0
  64. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/load_experiment.py +0 -0
  65. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/load_run.py +0 -0
  66. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/log.py +0 -0
  67. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/log_path.py +0 -0
  68. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/memory_interval.py +0 -0
  69. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/models.py +0 -0
  70. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/modes.py +0 -0
  71. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/nests_runs.py +0 -0
  72. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/note_path.py +0 -0
  73. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/notebook_kernel.py +0 -0
  74. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/output_html.py +0 -0
  75. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/parse_run_view.py +0 -0
  76. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/parse_subset.py +0 -0
  77. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/pivot_runs.py +0 -0
  78. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/print_rows.py +0 -0
  79. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/python_blocks.py +0 -0
  80. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/read_config.py +0 -0
  81. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/read_path.py +0 -0
  82. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/render_markdown.py +0 -0
  83. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/retries.py +0 -0
  84. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/run_command.py +0 -0
  85. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/run_control.py +0 -0
  86. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/run_output.py +0 -0
  87. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/run_status.py +0 -0
  88. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/__init__.py +0 -0
  89. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/cgroup_memory.py +0 -0
  90. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/check_args.py +0 -0
  91. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/check_subset.py +0 -0
  92. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/container_cgroup.py +0 -0
  93. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/container_memory.py +0 -0
  94. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/describe_event.py +0 -0
  95. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/docker_output.py +0 -0
  96. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/exit_signal.py +0 -0
  97. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/fill_dirs.py +0 -0
  98. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/fill_experiment_env.py +0 -0
  99. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/flag_name.py +0 -0
  100. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/hold_folder.py +0 -0
  101. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/hook_dirs.py +0 -0
  102. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/in_subset.py +0 -0
  103. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/invocation_hook.py +0 -0
  104. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/invocation_meta.py +0 -0
  105. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/new_param_run_id.py +0 -0
  106. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/new_run_id.py +0 -0
  107. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/new_stamped_run_id.py +0 -0
  108. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/param_args.py +0 -0
  109. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/param_grid.py +0 -0
  110. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/param_run_name.py +0 -0
  111. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/plan_runs.py +0 -0
  112. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/prepare_experiment.py +0 -0
  113. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/read_experiment_config.py +0 -0
  114. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/record_memory.py +0 -0
  115. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/run_experiment.py +0 -0
  116. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/run_folder.py +0 -0
  117. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/run_headless.py +0 -0
  118. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/runs_parent.py +0 -0
  119. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/shell_command.py +0 -0
  120. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/signal_tree.py +0 -0
  121. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/stop_then_kill.py +0 -0
  122. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/wait_for_tree.py +0 -0
  123. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runner/write_run_json.py +0 -0
  124. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/runs_view_command.py +0 -0
  125. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/save_conflict_copy.py +0 -0
  126. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/save_note.py +0 -0
  127. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/saved_outputs.py +0 -0
  128. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/serve_app.py +0 -0
  129. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/server.py +0 -0
  130. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/set_state.py +0 -0
  131. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/shared_params.py +0 -0
  132. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/sort_href.py +0 -0
  133. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/sql_quote.py +0 -0
  134. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/state_path.py +0 -0
  135. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/elapsed.js +0 -0
  136. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/experiment.js +0 -0
  137. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/labnotes.css +0 -0
  138. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/local-time.js +0 -0
  139. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/new-note.js +0 -0
  140. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/note-edit.js +0 -0
  141. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/note-editor.js +0 -0
  142. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/row-link.js +0 -0
  143. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/run-cell.js +0 -0
  144. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/run-output.js +0 -0
  145. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/static/view-toggle.js +0 -0
  146. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/summarize_config.py +0 -0
  147. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/__init__.py +0 -0
  148. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/experiment_rows.py +0 -0
  149. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/experiment_run_ids.py +0 -0
  150. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/experiment_toml.py +0 -0
  151. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/experiments_ddl.py +0 -0
  152. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/file_prefix.py +0 -0
  153. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/file_text.py +0 -0
  154. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/iso_time.py +0 -0
  155. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/list_experiment_runs.py +0 -0
  156. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/note_text.py +0 -0
  157. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/open_tables.py +0 -0
  158. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/path_glob.py +0 -0
  159. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/path_pattern.py +0 -0
  160. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/read_blocks.py +0 -0
  161. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/read_experiment.py +0 -0
  162. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/read_file.py +0 -0
  163. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/read_log.py +0 -0
  164. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/read_memory.py +0 -0
  165. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/read_run.py +0 -0
  166. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/read_run_file.py +0 -0
  167. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/runs_columns.py +0 -0
  168. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tables/summarize_experiments.py +0 -0
  169. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/templates/base.html +0 -0
  170. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/templates/editor_imports.html +0 -0
  171. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/templates/experiment.html +0 -0
  172. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/templates/index.html +0 -0
  173. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/templates/note.html +0 -0
  174. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/templates/run.html +0 -0
  175. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/__init__.py +0 -0
  176. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/browse_app.py +0 -0
  177. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/browse_tui.py +0 -0
  178. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/check_view_response.py +0 -0
  179. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/config.py +0 -0
  180. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/dim.py +0 -0
  181. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/experiment_screen.py +0 -0
  182. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/experiments_screen.py +0 -0
  183. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/fill_table.py +0 -0
  184. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/format_cell.py +0 -0
  185. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/format_elapsed.py +0 -0
  186. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/group_cells.py +0 -0
  187. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/invocation_columns.py +0 -0
  188. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/invocation_rows.py +0 -0
  189. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/leave_prompt.py +0 -0
  190. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/log_block.py +0 -0
  191. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/log_blocks.py +0 -0
  192. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/native_rows.py +0 -0
  193. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/reload_on_change.py +0 -0
  194. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/run_app.py +0 -0
  195. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/run_cells.py +0 -0
  196. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/run_output.py +0 -0
  197. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/run_screen.py +0 -0
  198. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/run_tui.py +0 -0
  199. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/runs_table.py +0 -0
  200. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/runs_view.py +0 -0
  201. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/stopped_title.py +0 -0
  202. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/view_column.py +0 -0
  203. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/tui/view_process.py +0 -0
  204. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/utils/__init__.py +0 -0
  205. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/utils/format_bytes.py +0 -0
  206. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/utils/process_alive.py +0 -0
  207. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/utils/run_usage.py +0 -0
  208. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/utils/tree_rss.py +0 -0
  209. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/utils/tree_usage.py +0 -0
  210. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/view/__init__.py +0 -0
  211. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/view/answer.py +0 -0
  212. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/view/build.py +0 -0
  213. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/view/respond.py +0 -0
  214. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/view/serve.py +0 -0
  215. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/wait_for_note.py +0 -0
  216. {labnotes-0.0.133 → labnotes-0.0.135}/src/labnotes/watch_rows.py +0 -0
  217. {labnotes-0.0.133 → labnotes-0.0.135}/testing-conventions.toml +0 -0
  218. {labnotes-0.0.133 → labnotes-0.0.135}/tests/integration/conftest.py +0 -0
  219. {labnotes-0.0.133 → labnotes-0.0.135}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: labnotes
3
- Version: 0.0.133
3
+ Version: 0.0.135
4
4
  Summary: Browse experiment designs, notes, and run data from a folder.
5
5
  Project-URL: Repository, https://github.com/thekevinscott/labnotes
6
6
  Author-email: Kevin Scott <me@thekevinscott.com>
@@ -80,7 +80,7 @@ Both placeholders are shell-quoted.
80
80
  Each param is appended as `--name value`, with the name as written (use
81
81
  `source-language` for a `--source-language` flag), booleans as 0 or 1, and lists
82
82
  and tables as JSON. labnotes writes `run.json` (params, `command`, created,
83
- ended, exit code, `ended_by`, `signal`), `stdout.log` and `stderr.log` to the
83
+ ended, exit code, `ended_by`, `signal`, `git`), `stdout.log` and `stderr.log` to the
84
84
  run folder. `command` is the shell command the run executed, with the placeholders
85
85
  and the params filled in, written before the run starts, so a killed run has it
86
86
  and a later edit to `experiment.toml` doesn't hide what a run did. `ended_by` is `"timeout"`, `"stop"` (labnotes stopped it),
@@ -88,6 +88,11 @@ and a later edit to `experiment.toml` doesn't hide what a run did. `ended_by` is
88
88
  `"lost"` (its process died unseen; the daemon marks these when it starts, with
89
89
  `ended` set and `exit_code` null) or null (the script exited itself). `signal` is the signal number read from the
90
90
  exit code (negative, or 128 + N from the shell), else null.
91
+ `git` is `{"commit": "<full HEAD SHA>", "dirty": false}`, read from the command's
92
+ working directory before each run starts, including retries. `dirty` counts staged
93
+ and unstaged changes to tracked files only, ignoring untracked files. `git` is
94
+ null outside a Git repository, if Git is missing, or if lookup fails (including
95
+ a repository with no commits). Older records lack the key.
91
96
  `meta` in `experiment.toml` (or `[experiment]` in `.labnotes.toml`) is a shell
92
97
  command that prints one JSON object, such as the git commit. labnotes runs it
93
98
  once from the root when `run` starts and copies it into every run's `run.json`
@@ -10,6 +10,7 @@ import psutil
10
10
  from labnotes.log_path import LOG_ENV, RUN_ENV
11
11
  from labnotes.runner.exit_signal import exit_signal
12
12
  from labnotes.runner.record_memory import record_memory
13
+ from labnotes.runner.run_git import run_git
13
14
  from labnotes.runner.shell_command import shell_command
14
15
  from labnotes.runner.stop_then_kill import GRACE_SECONDS
15
16
  from labnotes.runner.wait_for_tree import wait_for_tree
@@ -48,6 +49,7 @@ async def execute_run(
48
49
  "error": None,
49
50
  "ended_by": None,
50
51
  "signal": None,
52
+ "git": await asyncio.to_thread(run_git, root),
51
53
  }
52
54
  if args:
53
55
  run["args"] = list(args)
@@ -56,6 +58,10 @@ async def execute_run(
56
58
  if meta is not None:
57
59
  run["meta"] = meta
58
60
  write_run_json(folder, run)
61
+ run_environment = os.environ if environment is None else environment
62
+ botbox_labels = f"labnotes.run={folder.resolve()}"
63
+ if existing_labels := run_environment.get("BOTBOX_LABELS"):
64
+ botbox_labels = f"{existing_labels}\n{botbox_labels}"
59
65
  with (
60
66
  (folder / "stdout.log").open("wb") as stdout,
61
67
  (folder / "stderr.log").open("wb") as stderr,
@@ -69,13 +75,12 @@ async def execute_run(
69
75
  "CLICOLOR_FORCE": "1",
70
76
  **{
71
77
  key: value
72
- for key, value in (
73
- os.environ if environment is None else environment
74
- ).items()
78
+ for key, value in run_environment.items()
75
79
  if not key.startswith("LABNOTES_")
76
80
  },
77
81
  LOG_ENV: str(folder / "log.jsonl"),
78
82
  RUN_ENV: str(folder.resolve()),
83
+ "BOTBOX_LABELS": botbox_labels,
79
84
  RUN_STATE_ENV: str(state_file),
80
85
  },
81
86
  stdout=stdout,
@@ -0,0 +1,22 @@
1
+ import subprocess
2
+ from pathlib import Path
3
+
4
+
5
+ def run_git(root: Path) -> dict[str, str | bool] | None:
6
+ try:
7
+ commit = subprocess.check_output(
8
+ ["git", "rev-parse", "HEAD"],
9
+ cwd=root,
10
+ stderr=subprocess.DEVNULL,
11
+ timeout=3,
12
+ )
13
+ status = subprocess.check_output(
14
+ ["git", "status", "--porcelain", "--untracked-files=no"],
15
+ cwd=root,
16
+ stderr=subprocess.DEVNULL,
17
+ timeout=3,
18
+ )
19
+ return {"commit": commit.decode("ascii").strip(), "dirty": bool(status)}
20
+ except (OSError, subprocess.SubprocessError, UnicodeError):
21
+ # Git metadata is optional; a failed lookup must not prevent the run.
22
+ return None
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes