labnotes 0.2.6__tar.gz → 0.2.7__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.
- {labnotes-0.2.6 → labnotes-0.2.7}/PKG-INFO +1 -1
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/cli.py +2 -0
- labnotes-0.2.7/src/labnotes/command_line_group.py +20 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/experiments.py +2 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/execute_run.py +6 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/first_invocation.py +2 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/run_experiment.py +2 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/start_experiment.py +2 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/.gitignore +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/CHANGELOG.md +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/MIGRATIONS.md +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/README.md +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/pyproject.toml +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/__init__.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/__main__.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/asset_url.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/check_counts.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/compose_experiment.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/context.md +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/context_guide.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/copy_experiment.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/count_groups.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/count_runs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/create_app.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/create_experiment.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/create_note.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/data_html.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/default_config_text.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/default_counts.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/drain_watch.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/experiment_definition.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/experiment_notes.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/experiment_runs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/file_changes.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/format_duration.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/format_started.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/format_value.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/get_state.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/grid_cell.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/group_runs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/init.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/invocation_started.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/is_non_negative_int.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/is_non_negative_number.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/is_positive_int.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/latest_log.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/list_experiments.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/list_runs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/load_config.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/load_experiment.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/load_run.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/log.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/log_path.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/memory_interval.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/models.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/modes.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/nests_runs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/note_path.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/notebook_kernel.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/output_html.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/parse_param_value.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/parse_params.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/parse_run_view.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/parse_subset.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/pivot_runs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/print_rows.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/python_blocks.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/read_config.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/read_path.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/render_markdown.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/retries.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/run_output.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/__init__.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/cgroup_memory.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/check_args.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/check_hook_placeholders.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/check_subset.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/claim_run.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/command_flags.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/container_cgroup.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/container_memory.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/continue_run.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/describe_event.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/docker_output.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/exit_signal.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/fill_dirs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/fill_experiment_env.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/finalize_lost_runs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/flag_name.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/group_args.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/in_subset.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/invocation_hook.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/invocation_meta.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/new_param_run_id.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/new_run_id.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/new_stamped_run_id.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/override_flags.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/param_args.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/param_grid.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/param_run_name.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/placeholders.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/plan_runs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/prepare_experiment.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/project_snapshot.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/read_experiment_config.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/record_memory.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/run_folder.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/run_git.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/run_headless.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/run_locked.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/runs_parent.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/shell_command.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/signal_tree.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/stop_then_kill.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/untracked_diff.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/wait_for_tree.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runner/write_run_json.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/runs_view_command.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/save_conflict_copy.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/save_note.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/saved_outputs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/serve_app.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/server.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/set_state.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/shared_params.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/sort_href.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/sql_quote.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/state_path.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/elapsed.js +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/experiment.js +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/labnotes.css +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/local-time.js +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/new-note.js +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/note-edit.js +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/note-editor.js +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/row-link.js +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/run-cell.js +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/run-output.js +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/static/view-toggle.js +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/summarize_config.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/__init__.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/experiment_rows.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/experiment_run_ids.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/experiment_toml.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/experiments_ddl.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/file_prefix.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/file_text.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/iso_time.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/list_experiment_runs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/list_resumable_runs.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/note_text.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/open_tables.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/path_glob.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/path_pattern.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/read_blocks.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/read_experiment.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/read_file.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/read_log.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/read_memory.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/read_run.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/read_run_file.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/runs_columns.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tables/summarize_experiments.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/templates/base.html +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/templates/editor_imports.html +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/templates/experiment.html +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/templates/index.html +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/templates/note.html +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/templates/run.html +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/__init__.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/browse_app.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/browse_tui.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/check_view_response.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/config.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/dim.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/experiment_screen.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/experiments_screen.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/fill_table.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/format_cell.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/format_elapsed.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/group_cells.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/invocation_columns.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/invocation_rows.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/leave_prompt.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/log_block.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/log_blocks.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/native_rows.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/reload_on_change.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/run_app.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/run_cells.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/run_output.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/run_screen.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/run_tui.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/runs_table.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/runs_view.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/stopped_title.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/view_column.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/tui/view_process.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/utils/__init__.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/utils/format_bytes.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/utils/process_alive.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/utils/run_usage.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/utils/tree_rss.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/utils/tree_usage.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/view/__init__.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/view/answer.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/view/build.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/view/respond.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/view/serve.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/wait_for_note.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/src/labnotes/watch_rows.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/testing-conventions.toml +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/tests/conftest.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/tests/e2e/conftest.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/tests/integration/conftest.py +0 -0
- {labnotes-0.2.6 → labnotes-0.2.7}/uv.lock +0 -0
|
@@ -2,6 +2,7 @@ from pathlib import Path
|
|
|
2
2
|
|
|
3
3
|
import click
|
|
4
4
|
|
|
5
|
+
from labnotes.command_line_group import CommandLineGroup
|
|
5
6
|
from labnotes.context_guide import context_guide
|
|
6
7
|
from labnotes.experiments import experiments
|
|
7
8
|
from labnotes.init import init
|
|
@@ -11,6 +12,7 @@ from labnotes.server import server
|
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
@click.group(
|
|
15
|
+
cls=CommandLineGroup,
|
|
14
16
|
invoke_without_command=True,
|
|
15
17
|
help="Manage experiments in a folder. `labnotes context` prints a guide for"
|
|
16
18
|
" coding agents.",
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import shlex
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import click
|
|
5
|
+
|
|
6
|
+
COMMAND_LINE = "labnotes.command_line"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class CommandLineGroup(click.Group):
|
|
10
|
+
def make_context(
|
|
11
|
+
self,
|
|
12
|
+
info_name: str | None,
|
|
13
|
+
args: list[str],
|
|
14
|
+
parent: click.Context | None = None,
|
|
15
|
+
**extra: Any,
|
|
16
|
+
) -> click.Context:
|
|
17
|
+
command_line = shlex.join(["labnotes", *args])
|
|
18
|
+
ctx = super().make_context(info_name, args, parent, **extra)
|
|
19
|
+
ctx.meta[COMMAND_LINE] = command_line
|
|
20
|
+
return ctx
|
|
@@ -4,6 +4,7 @@ from pathlib import Path
|
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
6
|
|
|
7
|
+
from labnotes.command_line_group import COMMAND_LINE
|
|
7
8
|
from labnotes.create_experiment import create_experiment
|
|
8
9
|
from labnotes.runner.start_experiment import start_experiment
|
|
9
10
|
from labnotes.utils.format_bytes import format_bytes
|
|
@@ -163,6 +164,7 @@ def experiments(
|
|
|
163
164
|
passthrough or None,
|
|
164
165
|
setup,
|
|
165
166
|
teardown,
|
|
167
|
+
ctx.meta.get(COMMAND_LINE),
|
|
166
168
|
)
|
|
167
169
|
try:
|
|
168
170
|
if sys.stdout.isatty() and sys.stderr.isatty():
|
|
@@ -5,6 +5,7 @@ import os
|
|
|
5
5
|
import time
|
|
6
6
|
from collections.abc import Callable, Sequence
|
|
7
7
|
from datetime import UTC, datetime
|
|
8
|
+
from importlib.metadata import version
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
|
|
10
11
|
import psutil
|
|
@@ -43,6 +44,7 @@ async def execute_run(
|
|
|
43
44
|
environment: dict[str, str] | None = None,
|
|
44
45
|
git_info: dict[str, str | bool] | None = None,
|
|
45
46
|
continues: bool = False,
|
|
47
|
+
command_line: str | None = None,
|
|
46
48
|
) -> dict[str, object]:
|
|
47
49
|
resolved = shell_command(command, folder, params, args)
|
|
48
50
|
git = git_info if git_info is not None else await asyncio.to_thread(run_git, root)
|
|
@@ -56,6 +58,8 @@ async def execute_run(
|
|
|
56
58
|
"ended_by": None,
|
|
57
59
|
"signal": None,
|
|
58
60
|
"git": git,
|
|
61
|
+
"labnotes_version": version("labnotes"),
|
|
62
|
+
"labnotes_command": command_line,
|
|
59
63
|
}
|
|
60
64
|
if args:
|
|
61
65
|
run["args"] = list(args)
|
|
@@ -76,6 +80,8 @@ async def execute_run(
|
|
|
76
80
|
"error": None,
|
|
77
81
|
"git": None if git is None else git["commit"],
|
|
78
82
|
"args": list(args),
|
|
83
|
+
"labnotes_version": run["labnotes_version"],
|
|
84
|
+
"labnotes_command": command_line,
|
|
79
85
|
**logs,
|
|
80
86
|
}
|
|
81
87
|
record = folder / "run.json"
|
|
@@ -8,6 +8,8 @@ def first_invocation(run: dict[str, object]) -> dict[str, object]:
|
|
|
8
8
|
"error": run.get("error"),
|
|
9
9
|
"git": git.get("commit") if isinstance(git, dict) else None,
|
|
10
10
|
"args": run.get("args", []),
|
|
11
|
+
"labnotes_version": run.get("labnotes_version"),
|
|
12
|
+
"labnotes_command": run.get("labnotes_command"),
|
|
11
13
|
"stdout": "stdout.log",
|
|
12
14
|
"stderr": "stderr.log",
|
|
13
15
|
}
|
|
@@ -53,6 +53,7 @@ async def run_experiment(
|
|
|
53
53
|
args: list[str] | None = None,
|
|
54
54
|
environment: dict[str, str] | None = None,
|
|
55
55
|
snapshot: ProjectSnapshot | None = None,
|
|
56
|
+
command_line: str | None = None,
|
|
56
57
|
) -> list[dict[str, object]]:
|
|
57
58
|
command_root = snapshot.root if snapshot is not None else config.root
|
|
58
59
|
inherited = dict(os.environ) if environment is None else environment
|
|
@@ -323,6 +324,7 @@ async def run_experiment(
|
|
|
323
324
|
else None
|
|
324
325
|
),
|
|
325
326
|
continues=experiment.continues,
|
|
327
|
+
command_line=command_line,
|
|
326
328
|
)
|
|
327
329
|
del running[run], trees[run]
|
|
328
330
|
report({"event": "ended", "run": run, **result})
|
|
@@ -17,6 +17,7 @@ def start_experiment(
|
|
|
17
17
|
args: list[str] | None,
|
|
18
18
|
setup: str | None,
|
|
19
19
|
teardown: str | None,
|
|
20
|
+
command_line: str | None = None,
|
|
20
21
|
) -> Start:
|
|
21
22
|
async def start(report: Report, listen: Listen) -> list[dict[str, object]]:
|
|
22
23
|
experiment, limit = await prepare_experiment(
|
|
@@ -35,6 +36,7 @@ def start_experiment(
|
|
|
35
36
|
only=only,
|
|
36
37
|
args=args,
|
|
37
38
|
snapshot=snapshot,
|
|
39
|
+
command_line=command_line,
|
|
38
40
|
)
|
|
39
41
|
|
|
40
42
|
return start
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|