kash-shell 0.3.7__tar.gz → 0.3.9__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.
- {kash_shell-0.3.7 → kash_shell-0.3.9}/.copier-answers.yml +1 -1
- {kash_shell-0.3.7 → kash_shell-0.3.9}/.env.template +1 -8
- {kash_shell-0.3.7 → kash_shell-0.3.9}/.github/workflows/ci.yml +2 -5
- {kash_shell-0.3.7 → kash_shell-0.3.9}/.github/workflows/publish.yml +1 -1
- {kash_shell-0.3.7 → kash_shell-0.3.9}/.gitignore +2 -3
- {kash_shell-0.3.7 → kash_shell-0.3.9}/Makefile +2 -1
- {kash_shell-0.3.7 → kash_shell-0.3.9}/PKG-INFO +19 -7
- {kash_shell-0.3.7 → kash_shell-0.3.9}/README.md +7 -3
- {kash_shell-0.3.7 → kash_shell-0.3.9}/development.md +12 -34
- kash_shell-0.3.9/installation.md +27 -0
- kash_shell-0.3.9/publishing.md +71 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/pyproject.toml +25 -4
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/debug_commands.py +4 -3
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/general_commands.py +33 -41
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/logs_commands.py +4 -8
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/model_commands.py +16 -14
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/search_command.py +2 -2
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/workspace/workspace_commands.py +2 -3
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/concepts/cosine.py +2 -1
- kash_shell-0.3.9/src/kash/concepts/text_similarity.py +57 -0
- kash_shell-0.3.9/src/kash/config/env_settings.py +59 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/logger.py +46 -38
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/logger_basic.py +10 -2
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/server_config.py +6 -6
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/settings.py +42 -47
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/setup.py +14 -4
- kash_shell-0.3.9/src/kash/config/suppress_warnings.py +45 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/topics/a2_installation.md +7 -3
- kash_shell-0.3.9/src/kash/docs/markdown/warning.md +3 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/welcome.md +4 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs_base/load_recipe_snippets.py +1 -1
- kash_shell-0.3.7/src/kash/docs_base/recipes/general_system_commands.ksh → kash_shell-0.3.9/src/kash/docs_base/recipes/general_system_commands.sh +1 -1
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/llm_transforms.py +3 -2
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/file_storage/file_store.py +0 -4
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/file_storage/item_file_format.py +8 -1
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/file_storage/metadata_dirs.py +2 -2
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/assistant.py +1 -1
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/help_pages.py +1 -1
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/help_printing.py +16 -9
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/tldr_help.py +5 -3
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/llm_utils/__init__.py +1 -0
- kash_shell-0.3.9/src/kash/llm_utils/llm_api_keys.py +39 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/llm_utils/llm_completion.py +2 -2
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/local_server/local_server.py +50 -43
- kash_shell-0.3.9/src/kash/local_server/local_server_commands.py +58 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/local_server/local_server_routes.py +2 -2
- kash_shell-0.3.9/src/kash/mcp/mcp_cli.py +124 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/mcp/mcp_server_commands.py +10 -6
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/mcp/mcp_server_routes.py +9 -6
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/mcp/mcp_server_sse.py +59 -34
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/mcp/mcp_server_stdio.py +0 -8
- kash_shell-0.3.9/src/kash/media_base/audio_processing.py +100 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/media_base/media_cache.py +10 -10
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/media_base/services/local_file_media.py +2 -2
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/media_base/speech_transcription.py +3 -2
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/items_model.py +12 -6
- kash_shell-0.3.9/src/kash/shell/clideps/api_keys.py +100 -0
- kash_shell-0.3.7/src/kash/shell/input/collect_dotenv.py → kash_shell-0.3.9/src/kash/shell/clideps/dotenv_setup.py +41 -6
- {kash_shell-0.3.7/src/kash/config → kash_shell-0.3.9/src/kash/shell/clideps}/dotenv_utils.py +16 -6
- kash_shell-0.3.7/src/kash/shell/utils/sys_tool_deps.py → kash_shell-0.3.9/src/kash/shell/clideps/pkg_deps.py +63 -99
- kash_shell-0.3.9/src/kash/shell/clideps/platforms.py +11 -0
- kash_shell-0.3.9/src/kash/shell/clideps/terminal_features.py +56 -0
- kash_shell-0.3.9/src/kash/shell/output/shell_formatting.py +106 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/output/shell_output.py +1 -94
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/utils/native_utils.py +11 -10
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/atomic_var.py +16 -3
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/url.py +53 -25
- kash_shell-0.3.7/src/kash/utils/file_utils/dir_size.py → kash_shell-0.3.9/src/kash/utils/file_utils/dir_info.py +25 -4
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_utils/file_ext.py +2 -3
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_utils/file_formats.py +28 -2
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_utils/file_formats_model.py +47 -19
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_utils/filename_parsing.py +10 -4
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/workspaces/source_items.py +4 -1
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/workspaces/workspace_output.py +13 -5
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/workspaces/workspaces.py +9 -10
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xonsh_custom/custom_shell.py +1 -1
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xonsh_custom/load_into_xonsh.py +7 -5
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xonsh_custom/xonsh_modern_tools.py +5 -5
- kash_shell-0.3.9/src/kash_shell/py.typed +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/uv.lock +352 -335
- kash_shell-0.3.7/src/kash/concepts/text_similarity.py +0 -112
- kash_shell-0.3.7/src/kash/config/api_keys.py +0 -109
- kash_shell-0.3.7/src/kash/config/suppress_warnings.py +0 -27
- kash_shell-0.3.7/src/kash/docs/markdown/warning.md +0 -8
- kash_shell-0.3.7/src/kash/local_server/local_server_commands.py +0 -58
- kash_shell-0.3.7/src/kash/mcp/mcp_cli.py +0 -87
- kash_shell-0.3.7/src/kash/media_base/audio_processing.py +0 -26
- {kash_shell-0.3.7 → kash_shell-0.3.9}/LICENSE +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/devtools/generate_readme.xsh +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/devtools/lint.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/devtools/profile_main.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/__main__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/core/assistant_chat.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/core/chat.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/core/format_markdown_template.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/core/markdownify.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/core/readability.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/core/show_webpage.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/core/strip_html.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/core/summarize_as_bullets.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/core/webpage_config.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/core/webpage_generate.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/meta/write_instructions.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/actions/meta/write_new_action.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/basic_file_commands.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/browser_commands.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/diff_commands.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/files_command.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/reformat_command.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/base/show_command.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/extras/utils_commands.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/help/assistant_commands.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/help/doc_commands.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/help/help_commands.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/help/logo.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/commands/workspace/selection_commands.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/concepts/concept_formats.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/concepts/embeddings.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/capture_output.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/colors.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/init.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/lazy_imports.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/logo.txt +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/config/text_styles.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/all_docs.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/load_actions_info.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/load_api_docs.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/load_help_topics.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/load_source_code.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/api_docs_template.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/assistant_instructions_template.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/readme_template.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/topics/a1_what_is_kash.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/topics/a3_getting_started.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/topics/a4_elements.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/topics/a5_tips_for_use_with_other_tools.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/topics/b0_philosophy_of_kash.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/topics/b1_kash_overview.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/topics/b2_workspace_and_file_formats.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/topics/b3_modern_shell_tool_recommendations.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs/markdown/topics/b4_faq.md +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs_base/docs_base.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs_base/load_custom_command_info.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/docs_base/load_faqs.py +0 -0
- kash_shell-0.3.7/src/kash/docs_base/recipes/python_dev_commands.ksh → kash_shell-0.3.9/src/kash/docs_base/recipes/python_dev_commands.sh +0 -0
- kash_shell-0.3.7/src/kash/docs_base/recipes/tldr_standard_commands.ksh → kash_shell-0.3.9/src/kash/docs_base/recipes/tldr_standard_commands.sh +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/action_decorators.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/action_exec.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/action_registry.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/combiners.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/command_exec.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/command_registry.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/fetch_url_metadata.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/history.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/precondition_checks.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/precondition_registry.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/preconditions.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/resolve_args.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec/shell_callable_action.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec_model/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec_model/args_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec_model/commands_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec_model/script_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/exec_model/shell_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/file_storage/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/file_storage/persisted_yaml.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/file_storage/store_cache_warmer.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/file_storage/store_filenames.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/assistant_instructions.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/assistant_output.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/docstring_utils.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/function_param_info.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/help_embeddings.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/help_lookups.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/help_types.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/help/recommended_commands.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/llm_utils/clean_headings.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/llm_utils/fuzzy_parsing.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/llm_utils/llm_messages.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/llm_utils/llm_names.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/llm_utils/llms.py +9 -9
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/local_server/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/local_server/local_url_formatters.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/local_server/port_tools.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/local_server/rich_html_template.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/mcp/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/mcp/mcp_main.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/media_base/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/media_base/media_services.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/media_base/media_tools.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/media_base/timestamp_citations.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/actions_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/assistant_response_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/compound_actions_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/graph_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/language_list.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/llm_actions_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/media_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/operations_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/params_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/paths_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/model/preconditions_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/completions/completion_scoring.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/completions/completion_types.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/completions/shell_completions.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/file_icons/color_for_format.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/file_icons/nerd_icons.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/input/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/input/input_prompts.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/input/inquirer_settings.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/input/param_inputs.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/input/shell_confirm.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/output/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/output/kerm_code_utils.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/output/kerm_codes.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/output/kmarkdown.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/shell_main.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/ui/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/ui/shell_results.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/ui/shell_syntax.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/utils/argparse_utils.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/utils/exception_printing.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/utils/osc_utils.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/utils/shell_function_wrapper.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/utils/terminal_images.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/shell/version.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/text_handling/custom_sliding_transforms.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/text_handling/doc_normalization.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/text_handling/markdown_util.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/text_handling/unified_diffs.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/format_utils.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/function_inspect.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/import_utils.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/lazyobject.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/obj_replace.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/parse_key_vals.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/parse_shell_args.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/stack_traces.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/string_replace.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/string_template.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/task_stack.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/type_utils.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/common/uniquifier.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/errors.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_formats/chat_format.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_utils/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_utils/file_sort_filter.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_utils/file_walk.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_utils/ignore_files.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_utils/mtime_cache.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/file_utils/path_utils.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/lang_utils/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/lang_utils/capitalization.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/lang_utils/inflection.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/rich_custom/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/rich_custom/ansi_cell_len.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/rich_custom/rich_char_transform.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/rich_custom/rich_indent.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/utils/rich_custom/rich_markdown_fork.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_content/canon_url.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_content/dir_store.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_content/file_cache_utils.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_content/local_file_cache.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_content/web_extract.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_content/web_extract_justext.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_content/web_extract_readabilipy.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_content/web_fetch.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_content/web_page_model.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_gen/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_gen/tabbed_webpage.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_gen/template_render.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_gen/templates/base_styles.css.jinja +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_gen/templates/base_webpage.html.jinja +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_gen/templates/content_styles.css.jinja +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_gen/templates/explain_view.html.jinja +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_gen/templates/item_view.html.jinja +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/web_gen/templates/tabbed_webpage.html.jinja +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/workspaces/__init__.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/workspaces/param_state.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/workspaces/selections.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/workspaces/workspace_importing.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/workspaces/workspace_registry.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xonsh_custom/command_nl_utils.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xonsh_custom/customize_prompt.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xonsh_custom/shell_load_commands.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xonsh_custom/shell_which.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xonsh_custom/xonsh_completers.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xonsh_custom/xonsh_env.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xonsh_custom/xonsh_ranking_completer.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xontrib/fnm.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/src/kash/xontrib/kash_extension.py +0 -0
- {kash_shell-0.3.7 → kash_shell-0.3.9}/tests/test_shell.py +0 -0
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
# Copy this template file to ~/.env or another parent directory and set these
|
|
2
2
|
# values and any other environment variables you need.
|
|
3
3
|
|
|
4
|
-
#
|
|
5
|
-
# you are working, or an absolute path to ensure the default location
|
|
6
|
-
# for a new workspace is the same place.
|
|
7
|
-
# KASH_WS_ROOT="."
|
|
8
|
-
KASH_WS_ROOT="~/Documents/kash"
|
|
9
|
-
|
|
10
|
-
# Location of the kash default "global" workspace.
|
|
11
|
-
KASH_GLOBAL_WS="~/Documents/kash/global"
|
|
4
|
+
# See settings.py for optional KASH_* environment variables.
|
|
12
5
|
|
|
13
6
|
# API Keys:
|
|
14
7
|
|
|
@@ -41,7 +41,8 @@ jobs:
|
|
|
41
41
|
- name: Install uv (official Astral action)
|
|
42
42
|
uses: astral-sh/setup-uv@v5
|
|
43
43
|
with:
|
|
44
|
-
|
|
44
|
+
# Update this as needed:
|
|
45
|
+
version: "0.6.14"
|
|
45
46
|
enable-cache: true
|
|
46
47
|
python-version: ${{ matrix.python-version }}
|
|
47
48
|
|
|
@@ -56,10 +57,6 @@ jobs:
|
|
|
56
57
|
|
|
57
58
|
- name: Install all dependencies
|
|
58
59
|
run: uv sync --all-extras --dev
|
|
59
|
-
env:
|
|
60
|
-
# TODO: Unclear why this should be needed since we already have a newer CMake,
|
|
61
|
-
# but it seems to be needed when building cydifflib.
|
|
62
|
-
CMAKE_ARGS: "-DCMAKE_POLICY_VERSION_MINIMUM=3.5"
|
|
63
60
|
|
|
64
61
|
- name: Run linting
|
|
65
62
|
run: uv run python devtools/lint.py
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kash-shell
|
|
3
|
-
Version: 0.3.
|
|
4
|
-
Summary: The knowledge agent shell
|
|
3
|
+
Version: 0.3.9
|
|
4
|
+
Summary: The knowledge agent shell (core)
|
|
5
5
|
Project-URL: Repository, https://github.com/jlevy/kash-shell
|
|
6
6
|
Author-email: Joshua Levy <joshua@cal.berkeley.edu>
|
|
7
7
|
License-Expression: AGPL-3.0-or-later
|
|
8
8
|
License-File: LICENSE
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Typing :: Typed
|
|
9
18
|
Requires-Python: <4.0,>=3.11
|
|
10
19
|
Requires-Dist: anyio>=4.8.0
|
|
11
20
|
Requires-Dist: audioop-lts>=0.2.1; python_version >= '3.13'
|
|
@@ -33,7 +42,7 @@ Requires-Dist: openai>=1.66.3
|
|
|
33
42
|
Requires-Dist: pandas>=2.2.3
|
|
34
43
|
Requires-Dist: patch-ng>=1.18.1
|
|
35
44
|
Requires-Dist: pathspec>=0.12.1
|
|
36
|
-
Requires-Dist: prettyfmt>=0.
|
|
45
|
+
Requires-Dist: prettyfmt>=0.3.0
|
|
37
46
|
Requires-Dist: prompt-toolkit>=3.0.50
|
|
38
47
|
Requires-Dist: pydantic>=2.10.6
|
|
39
48
|
Requires-Dist: pydub>=0.25.1
|
|
@@ -42,7 +51,6 @@ Requires-Dist: pyperclip>=1.9.0
|
|
|
42
51
|
Requires-Dist: python-dotenv>=1.0.1
|
|
43
52
|
Requires-Dist: python-magic-bin>=0.4.14; platform_system == 'Windows'
|
|
44
53
|
Requires-Dist: python-magic>=0.4.27; platform_system == 'Linux' or platform_system == 'Darwin'
|
|
45
|
-
Requires-Dist: python-slugify>=8.0.4
|
|
46
54
|
Requires-Dist: readabilipy>=0.3.0
|
|
47
55
|
Requires-Dist: regex>=2024.11.6
|
|
48
56
|
Requires-Dist: rich-argparse>=1.7.0
|
|
@@ -229,15 +237,19 @@ These are for `kash-media` but you can use a `kash-shell` for a more basic setup
|
|
|
229
237
|
For macOS, you can again use brew:
|
|
230
238
|
|
|
231
239
|
```shell
|
|
232
|
-
# Install pyenv, pipx, and other tools:
|
|
233
240
|
brew update
|
|
234
|
-
brew install ripgrep bat eza hexyl imagemagick
|
|
241
|
+
brew install libmagic ffmpeg ripgrep bat eza hexyl imagemagick zoxide
|
|
235
242
|
```
|
|
236
243
|
|
|
237
244
|
For Ubuntu:
|
|
238
245
|
|
|
239
246
|
```shell
|
|
240
|
-
apt
|
|
247
|
+
sudo apt-get update
|
|
248
|
+
sudo apt-get install -y libgl1 ffmpeg libmagic-dev
|
|
249
|
+
# For the additional command-line tools, pixi is better on Ubuntu:
|
|
250
|
+
curl -fsSL https://pixi.sh/install.sh | sh
|
|
251
|
+
. ~/.bashrc
|
|
252
|
+
pixi global install ripgrep bat eza hexyl imagemagick zoxide
|
|
241
253
|
```
|
|
242
254
|
|
|
243
255
|
For Windows or other platforms, see the uv instructions.
|
|
@@ -167,15 +167,19 @@ These are for `kash-media` but you can use a `kash-shell` for a more basic setup
|
|
|
167
167
|
For macOS, you can again use brew:
|
|
168
168
|
|
|
169
169
|
```shell
|
|
170
|
-
# Install pyenv, pipx, and other tools:
|
|
171
170
|
brew update
|
|
172
|
-
brew install ripgrep bat eza hexyl imagemagick
|
|
171
|
+
brew install libmagic ffmpeg ripgrep bat eza hexyl imagemagick zoxide
|
|
173
172
|
```
|
|
174
173
|
|
|
175
174
|
For Ubuntu:
|
|
176
175
|
|
|
177
176
|
```shell
|
|
178
|
-
apt
|
|
177
|
+
sudo apt-get update
|
|
178
|
+
sudo apt-get install -y libgl1 ffmpeg libmagic-dev
|
|
179
|
+
# For the additional command-line tools, pixi is better on Ubuntu:
|
|
180
|
+
curl -fsSL https://pixi.sh/install.sh | sh
|
|
181
|
+
. ~/.bashrc
|
|
182
|
+
pixi global install ripgrep bat eza hexyl imagemagick zoxide
|
|
179
183
|
```
|
|
180
184
|
|
|
181
185
|
For Windows or other platforms, see the uv instructions.
|
|
@@ -6,8 +6,8 @@ This project is set up to use [uv](https://docs.astral.sh/uv/) to manage Python
|
|
|
6
6
|
dependencies. First, be sure you
|
|
7
7
|
[have uv installed](https://docs.astral.sh/uv/getting-started/installation/).
|
|
8
8
|
|
|
9
|
-
Then [fork](https://github.com/jlevy/kash-shell/fork)
|
|
10
|
-
will make it easier to contribute) and
|
|
9
|
+
Then [fork the jlevy/kash-shell repo](https://github.com/jlevy/kash-shell/fork) (having
|
|
10
|
+
your own fork will make it easier to contribute) and
|
|
11
11
|
[clone it](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository).
|
|
12
12
|
|
|
13
13
|
## Basic Developer Workflows
|
|
@@ -66,44 +66,22 @@ source .venv/bin/activate
|
|
|
66
66
|
|
|
67
67
|
See [uv docs](https://docs.astral.sh/uv/) for details.
|
|
68
68
|
|
|
69
|
-
##
|
|
69
|
+
## IDE setup
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
source devtools/update_common_deps.xsh
|
|
74
|
-
|
|
75
|
-
# Update this README:
|
|
76
|
-
source devtools/generate_readme.xsh
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
A few debugging tips when finding issues:
|
|
71
|
+
If you use VSCode or a fork like Cursor or Windsurf, you can install the following
|
|
72
|
+
extensions:
|
|
80
73
|
|
|
81
|
-
|
|
82
|
-
# To see tracebacks if xonsh does not show them:
|
|
83
|
-
$XONSH_SHOW_TRACEBACK=1
|
|
84
|
-
|
|
85
|
-
# To set verbose logging:
|
|
86
|
-
$KASH_LOG_LEVEL=info
|
|
87
|
-
|
|
88
|
-
# To dump Python stack traces of all threads (from another terminal):
|
|
89
|
-
pkill -USR1 kash
|
|
90
|
-
```
|
|
74
|
+
- [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)
|
|
91
75
|
|
|
92
|
-
|
|
76
|
+
- [Based Pyright](https://marketplace.visualstudio.com/items?itemName=detachhead.basedpyright)
|
|
77
|
+
for type checking. Note that this extension works with non-Microsoft VSCode forks like
|
|
78
|
+
Cursor.
|
|
93
79
|
|
|
94
|
-
|
|
80
|
+
## Documentation
|
|
95
81
|
|
|
96
|
-
|
|
97
|
-
plugin](https://github.com/ninoseki/uv-dynamic-versioning/) and the
|
|
98
|
-
[`publish.yml` workflow](.github/workflows/publish.yml), you can simply create tagged
|
|
99
|
-
releases (using standard format for the tag name, e.g. `v0.1.0`) on GitHub and the tag
|
|
100
|
-
will trigger a release build, which then uploads it to PyPI.
|
|
82
|
+
- [uv docs](https://docs.astral.sh/uv/)
|
|
101
83
|
|
|
102
|
-
|
|
103
|
-
publish to PyPI. The simplest way to do that is on [the publishing settings
|
|
104
|
-
page](https://pypi.org/manage/account/publishing/). Configure "Trusted Publisher
|
|
105
|
-
Management" and register your GitHub repo as a new "pending" trusted publisher, entering
|
|
106
|
-
the project name, repo owner, repo name, and `publish.yml` as the workflow name.
|
|
84
|
+
- [basedpyright docs](https://docs.basedpyright.com/latest/)
|
|
107
85
|
|
|
108
86
|
* * *
|
|
109
87
|
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
## Installing uv and Python
|
|
2
|
+
|
|
3
|
+
This project is set up to use [**uv**](https://docs.astral.sh/uv/), the new package
|
|
4
|
+
manager for Python. `uv` replaces traditional use of `pyenv`, `pipx`, `poetry`, `pip`,
|
|
5
|
+
etc. This is a quick cheat sheet on that:
|
|
6
|
+
|
|
7
|
+
On macOS or Linux, if you don't have `uv` installed, a quick way to install it:
|
|
8
|
+
|
|
9
|
+
```shell
|
|
10
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
For macOS, you prefer [brew](https://brew.sh/) you can install or upgrade uv with:
|
|
14
|
+
|
|
15
|
+
```shell
|
|
16
|
+
brew update
|
|
17
|
+
brew install uv
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
See [uv's docs](https://docs.astral.sh/uv/getting-started/installation/) for more
|
|
21
|
+
installation methods and platforms.
|
|
22
|
+
|
|
23
|
+
Now you can use uv to install a current Python environment:
|
|
24
|
+
|
|
25
|
+
```shell
|
|
26
|
+
uv python install 3.13 # Or pick another version.
|
|
27
|
+
```
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
## Publishing Releases
|
|
2
|
+
|
|
3
|
+
This is how to publish a Python package to [**PyPI**](https://pypi.org/) from GitHub
|
|
4
|
+
Actions, when using the
|
|
5
|
+
[**simple-modern-uv**](https://github.com/jlevy/simple-modern-uv) template.
|
|
6
|
+
|
|
7
|
+
Thanks to [the dynamic versioning
|
|
8
|
+
plugin](https://github.com/ninoseki/uv-dynamic-versioning/) and the
|
|
9
|
+
[`publish.yml` workflow](https://github.com/jlevy/simple-modern-uv/blob/main/template/.github/workflows/publish.yml),
|
|
10
|
+
you can simply create tagged releases (using standard format for the tag name, e.g.
|
|
11
|
+
`v0.1.0`) on GitHub and the tag will trigger a release build, which then uploads it to
|
|
12
|
+
PyPI.
|
|
13
|
+
|
|
14
|
+
### How to Publish the First Time
|
|
15
|
+
|
|
16
|
+
This part is a little confusing the first time.
|
|
17
|
+
Here is the simplest way to do it.
|
|
18
|
+
For the purposes of this example replace OWNER and PROJECT with the right values.
|
|
19
|
+
|
|
20
|
+
1. **Get a PyPI account** at [pypi.org](https://pypi.org/) and sign in.
|
|
21
|
+
|
|
22
|
+
2. **Pick a name for the project** that isn't already taken.
|
|
23
|
+
|
|
24
|
+
- Go to `https://pypi.org/project/PROJECT` to see if another project with that name
|
|
25
|
+
already exits.
|
|
26
|
+
|
|
27
|
+
- If needed, update your `pyproject.yml` with the correct name.
|
|
28
|
+
|
|
29
|
+
3. **Authorize** your repository to publish to PyPI:
|
|
30
|
+
|
|
31
|
+
- Go to [the publishing settings page](https://pypi.org/manage/account/publishing/).
|
|
32
|
+
|
|
33
|
+
- Find "Trusted Publisher Management" and register your GitHub repo as a new
|
|
34
|
+
"pending" trusted publisher
|
|
35
|
+
|
|
36
|
+
- Enter the project name, repo owner, repo name, and `publish.yml` as the workflow
|
|
37
|
+
name. (You can leave the "environment name" field blank.)
|
|
38
|
+
|
|
39
|
+
4. **Create a release** on GitHub:
|
|
40
|
+
|
|
41
|
+
- Commit code and make sure it's running correctly.
|
|
42
|
+
|
|
43
|
+
- Go to your GitHub project page, then click on Actions tab.
|
|
44
|
+
|
|
45
|
+
- Confirm all tests are passing in the last CI workflow.
|
|
46
|
+
(If you want, you can even publish this template when it's empty as just a stub
|
|
47
|
+
project, to try all this out.)
|
|
48
|
+
|
|
49
|
+
- Go to your GitHub project page, click on Releases.
|
|
50
|
+
|
|
51
|
+
- Fill in the tag and the release name.
|
|
52
|
+
Select to create a new tag, and pick a version.
|
|
53
|
+
A good option is `v0.1.0`. (It's wise to have it start with a `v`.)
|
|
54
|
+
|
|
55
|
+
- Submit to create the release.
|
|
56
|
+
|
|
57
|
+
5. **Confirm it publishes to PyPI**
|
|
58
|
+
|
|
59
|
+
- Watch for the release workflow in the GitHub Actions tab.
|
|
60
|
+
|
|
61
|
+
- If it succeeds, you should see it appear at `https://pypi.org/project/PROJECT`.
|
|
62
|
+
|
|
63
|
+
### How to Publish Subsequent Releases
|
|
64
|
+
|
|
65
|
+
Just create a new release!
|
|
66
|
+
Everything is the same as the last two steps above.
|
|
67
|
+
|
|
68
|
+
* * *
|
|
69
|
+
|
|
70
|
+
*This file was built with
|
|
71
|
+
[simple-modern-uv](https://github.com/jlevy/simple-modern-uv).*
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
[project.urls]
|
|
4
4
|
Repository = "https://github.com/jlevy/kash-shell"
|
|
5
5
|
# Homepage = "https://..."
|
|
6
|
+
# Documentation = "https://..."
|
|
6
7
|
|
|
7
8
|
[project]
|
|
8
9
|
name = "kash-shell"
|
|
9
|
-
description = "The knowledge agent shell"
|
|
10
|
+
description = "The knowledge agent shell (core)"
|
|
10
11
|
authors = [
|
|
11
12
|
{ name="Joshua Levy", email="joshua@cal.berkeley.edu" },
|
|
12
13
|
]
|
|
@@ -15,6 +16,27 @@ license = "AGPL-3.0-or-later"
|
|
|
15
16
|
requires-python = ">=3.11,<4.0"
|
|
16
17
|
dynamic = ["version"]
|
|
17
18
|
|
|
19
|
+
# https://pypi.org/classifiers/
|
|
20
|
+
# Adjust as needed:
|
|
21
|
+
classifiers = [
|
|
22
|
+
# Adjust as needed:
|
|
23
|
+
"Development Status :: 4 - Beta",
|
|
24
|
+
# "Development Status :: 5 - Production/Stable",
|
|
25
|
+
"Intended Audience :: Developers",
|
|
26
|
+
"Operating System :: OS Independent",
|
|
27
|
+
"Programming Language :: Python",
|
|
28
|
+
"Programming Language :: Python :: 3",
|
|
29
|
+
"Programming Language :: Python :: 3.11",
|
|
30
|
+
"Programming Language :: Python :: 3.12",
|
|
31
|
+
"Programming Language :: Python :: 3.13",
|
|
32
|
+
"Typing :: Typed",
|
|
33
|
+
# Include this to avoid accidentally publishing to PyPI:
|
|
34
|
+
# "Private :: Do Not Upload",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# ---- Main dependencies ----
|
|
39
|
+
|
|
18
40
|
dependencies = [
|
|
19
41
|
"dunamai>=1.23.0",
|
|
20
42
|
"pydantic>=2.10.6",
|
|
@@ -22,7 +44,7 @@ dependencies = [
|
|
|
22
44
|
# My tools:
|
|
23
45
|
"strif>=2.1.0",
|
|
24
46
|
"funlog>=0.2.0",
|
|
25
|
-
"prettyfmt>=0.
|
|
47
|
+
"prettyfmt>=0.3.0",
|
|
26
48
|
"flowmark>=0.3.1",
|
|
27
49
|
"frontmatter-format>=0.2.1",
|
|
28
50
|
"chopdiff>=0.1.3",
|
|
@@ -45,7 +67,6 @@ dependencies = [
|
|
|
45
67
|
"pyperclip>=1.9.0",
|
|
46
68
|
"colour>=0.1.5",
|
|
47
69
|
"thefuzz>=0.22.1",
|
|
48
|
-
"python-slugify>=8.0.4",
|
|
49
70
|
"tldr>=3.3.0",
|
|
50
71
|
"jinja2>=3.1.6",
|
|
51
72
|
"pygments>=2.19.1",
|
|
@@ -92,7 +113,7 @@ dev = [
|
|
|
92
113
|
|
|
93
114
|
[project.scripts]
|
|
94
115
|
kash = "kash.shell.shell_main:main"
|
|
95
|
-
|
|
116
|
+
kash-mcp = "kash.mcp.mcp_cli:main"
|
|
96
117
|
|
|
97
118
|
|
|
98
119
|
# ---- Build system ----
|
|
@@ -12,7 +12,8 @@ from kash.help.function_param_info import annotate_param_info
|
|
|
12
12
|
from kash.help.recommended_commands import RECOMMENDED_TLDR_COMMANDS
|
|
13
13
|
from kash.model.params_model import Param
|
|
14
14
|
from kash.shell.output.kerm_codes import IframePopover, TextTooltip
|
|
15
|
-
from kash.shell.output.
|
|
15
|
+
from kash.shell.output.shell_formatting import format_name_and_value
|
|
16
|
+
from kash.shell.output.shell_output import PrintHooks, console_pager, cprint
|
|
16
17
|
from kash.utils.errors import InvalidInput
|
|
17
18
|
|
|
18
19
|
log = get_logger(__name__)
|
|
@@ -178,7 +179,7 @@ def reload_system() -> None:
|
|
|
178
179
|
the local the local server. Not perfect! But sometimes useful for development.
|
|
179
180
|
"""
|
|
180
181
|
import kash
|
|
181
|
-
from kash.local_server.local_server import
|
|
182
|
+
from kash.local_server.local_server import restart_ui_server
|
|
182
183
|
from kash.utils.common.import_utils import recursive_reload
|
|
183
184
|
|
|
184
185
|
module = kash
|
|
@@ -196,7 +197,7 @@ def reload_system() -> None:
|
|
|
196
197
|
log.info("Reloaded modules: %s", ", ".join(package_names))
|
|
197
198
|
log.message("Reloaded %s modules from %s.", len(package_names), module.__name__)
|
|
198
199
|
|
|
199
|
-
|
|
200
|
+
restart_ui_server()
|
|
200
201
|
|
|
201
202
|
# TODO Re-register commands and actions.
|
|
202
203
|
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
+
from flowmark import Wrap
|
|
2
|
+
|
|
1
3
|
from kash.commands.base.model_commands import list_apis, list_models
|
|
2
4
|
from kash.commands.workspace.workspace_commands import list_params
|
|
3
|
-
from kash.config.api_keys import (
|
|
4
|
-
RECOMMENDED_APIS,
|
|
5
|
-
Api,
|
|
6
|
-
get_all_configured_models,
|
|
7
|
-
load_dotenv_paths,
|
|
8
|
-
print_api_key_setup,
|
|
9
|
-
)
|
|
10
|
-
from kash.config.dotenv_utils import env_var_is_set
|
|
11
5
|
from kash.config.logger import get_logger
|
|
6
|
+
from kash.config.settings import RECOMMENDED_API_KEYS, get_system_config_dir
|
|
12
7
|
from kash.docs.all_docs import all_docs
|
|
13
8
|
from kash.exec import kash_command
|
|
14
9
|
from kash.help.tldr_help import tldr_refresh_cache
|
|
10
|
+
from kash.llm_utils.llm_api_keys import get_all_configured_models
|
|
15
11
|
from kash.model.params_model import (
|
|
16
12
|
DEFAULT_CAREFUL_LLM,
|
|
17
13
|
DEFAULT_FAST_LLM,
|
|
18
14
|
DEFAULT_STANDARD_LLM,
|
|
19
15
|
DEFAULT_STRUCTURED_LLM,
|
|
20
16
|
)
|
|
21
|
-
from kash.shell.
|
|
17
|
+
from kash.shell.clideps.api_keys import (
|
|
18
|
+
ApiEnvKey,
|
|
19
|
+
load_dotenv_paths,
|
|
20
|
+
print_api_key_setup,
|
|
21
|
+
)
|
|
22
|
+
from kash.shell.clideps.dotenv_setup import interactive_dotenv_setup
|
|
23
|
+
from kash.shell.clideps.pkg_deps import pkg_check
|
|
24
|
+
from kash.shell.clideps.terminal_features import terminal_check
|
|
22
25
|
from kash.shell.input.input_prompts import input_choice
|
|
26
|
+
from kash.shell.output.shell_formatting import format_name_and_value
|
|
23
27
|
from kash.shell.output.shell_output import (
|
|
24
28
|
PrintHooks,
|
|
25
29
|
cprint,
|
|
26
|
-
format_failure,
|
|
27
|
-
format_name_and_value,
|
|
28
|
-
format_success,
|
|
29
30
|
print_h2,
|
|
30
31
|
)
|
|
31
|
-
from kash.shell.utils.sys_tool_deps import sys_tool_check, terminal_feature_check
|
|
32
32
|
from kash.shell.version import get_full_version_name
|
|
33
33
|
from kash.utils.errors import InvalidState
|
|
34
34
|
from kash.workspaces.workspaces import current_ws
|
|
@@ -50,8 +50,8 @@ def self_check(brief: bool = False) -> None:
|
|
|
50
50
|
Self-check kash setup, including termal settings, tools, and API keys.
|
|
51
51
|
"""
|
|
52
52
|
if brief:
|
|
53
|
-
|
|
54
|
-
print_api_key_setup(once=False)
|
|
53
|
+
terminal_check().print_term_info()
|
|
54
|
+
print_api_key_setup(recommended_keys=RECOMMENDED_API_KEYS, once=False)
|
|
55
55
|
check_system_tools(brief=brief)
|
|
56
56
|
tldr_refresh_cache()
|
|
57
57
|
try:
|
|
@@ -63,7 +63,7 @@ def self_check(brief: bool = False) -> None:
|
|
|
63
63
|
else:
|
|
64
64
|
version()
|
|
65
65
|
cprint()
|
|
66
|
-
|
|
66
|
+
terminal_check().print_term_info()
|
|
67
67
|
cprint()
|
|
68
68
|
list_apis()
|
|
69
69
|
cprint()
|
|
@@ -86,28 +86,18 @@ def self_check(brief: bool = False) -> None:
|
|
|
86
86
|
@kash_command
|
|
87
87
|
def self_configure(all: bool = False, update: bool = False) -> None:
|
|
88
88
|
"""
|
|
89
|
-
Interactively configure
|
|
90
|
-
|
|
91
|
-
:param all: Configure all known API keys (instead of just recommended ones).
|
|
92
|
-
:param update: Update values even if they are already set.
|
|
89
|
+
Interactively configure API keys and preferred models.
|
|
93
90
|
"""
|
|
94
91
|
|
|
92
|
+
if all:
|
|
93
|
+
api_keys = [key.value for key in ApiEnvKey]
|
|
94
|
+
else:
|
|
95
|
+
api_keys = RECOMMENDED_API_KEYS
|
|
95
96
|
# Show APIs before starting.
|
|
96
97
|
list_apis()
|
|
97
98
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if not update:
|
|
101
|
-
keys = [key for key in keys if not env_var_is_set(key)]
|
|
102
|
-
|
|
103
|
-
cprint()
|
|
104
|
-
print_h2("Configuring .env file")
|
|
105
|
-
if keys:
|
|
106
|
-
cprint(format_failure(f"API keys needed: {', '.join(keys)}"))
|
|
107
|
-
fill_missing_dotenv(keys)
|
|
108
|
-
reload_env()
|
|
109
|
-
else:
|
|
110
|
-
cprint(format_success("All requested API keys are set!"))
|
|
99
|
+
interactive_dotenv_setup(api_keys, update=update)
|
|
100
|
+
reload_env()
|
|
111
101
|
|
|
112
102
|
cprint()
|
|
113
103
|
ws = current_ws()
|
|
@@ -170,15 +160,15 @@ def check_system_tools(warn_only: bool = False, brief: bool = False) -> None:
|
|
|
170
160
|
:param brief: Print summary as a single line.
|
|
171
161
|
"""
|
|
172
162
|
if warn_only:
|
|
173
|
-
|
|
163
|
+
pkg_check().warn_if_missing()
|
|
174
164
|
else:
|
|
175
165
|
if brief:
|
|
176
|
-
cprint(
|
|
166
|
+
cprint(pkg_check().status())
|
|
177
167
|
else:
|
|
178
168
|
print_h2("Installed System Tools")
|
|
179
|
-
cprint(
|
|
169
|
+
cprint(pkg_check().formatted())
|
|
180
170
|
cprint()
|
|
181
|
-
|
|
171
|
+
pkg_check().warn_if_missing()
|
|
182
172
|
|
|
183
173
|
|
|
184
174
|
@kash_command
|
|
@@ -187,10 +177,10 @@ def reload_env() -> None:
|
|
|
187
177
|
Reload the environment variables from the .env file.
|
|
188
178
|
"""
|
|
189
179
|
|
|
190
|
-
env_paths = load_dotenv_paths()
|
|
180
|
+
env_paths = load_dotenv_paths(True, True, get_system_config_dir())
|
|
191
181
|
if env_paths:
|
|
192
182
|
cprint("Reloaded environment variables")
|
|
193
|
-
print_api_key_setup()
|
|
183
|
+
print_api_key_setup(RECOMMENDED_API_KEYS)
|
|
194
184
|
else:
|
|
195
185
|
raise InvalidState("No .env file found")
|
|
196
186
|
|
|
@@ -209,7 +199,9 @@ def kits() -> None:
|
|
|
209
199
|
else:
|
|
210
200
|
cprint("Currently imported kits:")
|
|
211
201
|
for kit in get_loaded_kits().values():
|
|
212
|
-
cprint(
|
|
202
|
+
cprint(
|
|
203
|
+
format_name_and_value(f"{kit.name} kit", str(kit.path or ""), text_wrap=Wrap.NONE)
|
|
204
|
+
)
|
|
213
205
|
|
|
214
206
|
|
|
215
207
|
@kash_command
|
|
@@ -222,5 +214,5 @@ def settings() -> None:
|
|
|
222
214
|
settings = global_settings()
|
|
223
215
|
print_h2("Global Settings")
|
|
224
216
|
for field, value in settings.__dict__.items():
|
|
225
|
-
cprint(format_name_and_value(field, str(value)))
|
|
217
|
+
cprint(format_name_and_value(field, str(value), text_wrap=Wrap.NONE))
|
|
226
218
|
PrintHooks.spacer()
|
|
@@ -7,11 +7,11 @@ from kash.config.logger import get_log_settings, get_logger, reload_rich_logging
|
|
|
7
7
|
from kash.config.settings import (
|
|
8
8
|
LogLevel,
|
|
9
9
|
atomic_global_settings,
|
|
10
|
-
|
|
11
|
-
server_log_file_path,
|
|
10
|
+
local_server_log_path,
|
|
12
11
|
)
|
|
13
12
|
from kash.exec import kash_command
|
|
14
|
-
from kash.shell.output.
|
|
13
|
+
from kash.shell.output.shell_formatting import format_name_and_value
|
|
14
|
+
from kash.shell.output.shell_output import cprint, print_status
|
|
15
15
|
from kash.shell.utils.native_utils import tail_file
|
|
16
16
|
from kash.utils.common.format_utils import fmt_loc
|
|
17
17
|
|
|
@@ -85,8 +85,4 @@ def log_settings() -> None:
|
|
|
85
85
|
cprint(format_name_and_value("log_objects_dir", str(settings.log_objects_dir)))
|
|
86
86
|
cprint(format_name_and_value("log_file_level", settings.log_file_level.name))
|
|
87
87
|
cprint(format_name_and_value("log_console_level", settings.log_console_level.name))
|
|
88
|
-
cprint(
|
|
89
|
-
format_name_and_value(
|
|
90
|
-
"server_log_file", str(server_log_file_path(global_settings().local_server_port))
|
|
91
|
-
)
|
|
92
|
-
)
|
|
88
|
+
cprint(format_name_and_value("server_log_file_path", str(local_server_log_path())))
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
from flowmark import Wrap
|
|
2
2
|
from rich.text import Text
|
|
3
3
|
|
|
4
|
-
from kash.config.api_keys import Api
|
|
5
|
-
from kash.config.dotenv_utils import env_var_is_set
|
|
6
|
-
from kash.config.text_styles import format_success_emoji
|
|
7
4
|
from kash.exec.command_registry import kash_command
|
|
8
|
-
from kash.llm_utils import LLM
|
|
9
|
-
from kash.shell.
|
|
10
|
-
|
|
5
|
+
from kash.llm_utils import LLM, api_for_model
|
|
6
|
+
from kash.shell.clideps.api_keys import ApiEnvKey
|
|
7
|
+
from kash.shell.clideps.dotenv_utils import env_var_is_set
|
|
8
|
+
from kash.shell.output.shell_formatting import (
|
|
11
9
|
format_failure,
|
|
12
10
|
format_name_and_value,
|
|
13
11
|
format_success,
|
|
12
|
+
format_success_emoji,
|
|
14
13
|
format_success_or_failure,
|
|
14
|
+
)
|
|
15
|
+
from kash.shell.output.shell_output import (
|
|
16
|
+
cprint,
|
|
15
17
|
print_h2,
|
|
16
18
|
)
|
|
17
19
|
|
|
@@ -23,11 +25,11 @@ def list_models() -> None:
|
|
|
23
25
|
"""
|
|
24
26
|
print_h2("Models")
|
|
25
27
|
for model in LLM.all_names():
|
|
26
|
-
api =
|
|
27
|
-
have_key = bool(api and env_var_is_set(api.
|
|
28
|
+
api = api_for_model(model)
|
|
29
|
+
have_key = bool(api and env_var_is_set(api.value))
|
|
28
30
|
if api:
|
|
29
31
|
provider_msg = format_success(f"provider {api.name}")
|
|
30
|
-
key_message = format_success_or_failure(have_key, f"{api.
|
|
32
|
+
key_message = format_success_or_failure(have_key, f"{api.value}")
|
|
31
33
|
else:
|
|
32
34
|
provider_msg = format_failure("provider not recognized")
|
|
33
35
|
key_message = format_failure("unknown API key")
|
|
@@ -46,11 +48,11 @@ def list_apis() -> None:
|
|
|
46
48
|
List and check configuration for all APIs.
|
|
47
49
|
"""
|
|
48
50
|
print_h2("API keys")
|
|
49
|
-
for api in
|
|
50
|
-
emoji = format_success_emoji(env_var_is_set(api.
|
|
51
|
+
for api in ApiEnvKey:
|
|
52
|
+
emoji = format_success_emoji(env_var_is_set(api.value))
|
|
51
53
|
message = (
|
|
52
|
-
f"API key {api.
|
|
53
|
-
if env_var_is_set(api.
|
|
54
|
-
else f"API key {api.
|
|
54
|
+
f"API key {api.value} found"
|
|
55
|
+
if env_var_is_set(api.value)
|
|
56
|
+
else f"API key {api.value} not found"
|
|
55
57
|
)
|
|
56
58
|
cprint(Text.assemble(emoji, format_name_and_value(api.name, message)))
|