kash-shell 0.3.8__tar.gz → 0.3.10__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.8 → kash_shell-0.3.10}/.copier-answers.yml +1 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/.github/workflows/ci.yml +2 -5
- {kash_shell-0.3.8 → kash_shell-0.3.10}/.github/workflows/publish.yml +1 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/.gitignore +2 -3
- {kash_shell-0.3.8 → kash_shell-0.3.10}/Makefile +2 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/PKG-INFO +26 -12
- {kash_shell-0.3.8 → kash_shell-0.3.10}/README.md +10 -5
- {kash_shell-0.3.8 → kash_shell-0.3.10}/development.md +12 -34
- kash_shell-0.3.10/installation.md +27 -0
- kash_shell-0.3.10/publishing.md +71 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/pyproject.toml +32 -7
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/__init__.py +4 -4
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/core/markdownify.py +5 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/core/readability.py +5 -2
- kash_shell-0.3.10/src/kash/actions/core/render_as_html.py +18 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/core/webpage_config.py +12 -4
- kash_shell-0.3.10/src/kash/commands/__init__.py +9 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/basic_file_commands.py +15 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/debug_commands.py +15 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/general_commands.py +27 -18
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/logs_commands.py +1 -4
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/model_commands.py +8 -8
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/search_command.py +3 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/show_command.py +5 -3
- kash_shell-0.3.10/src/kash/commands/extras/parse_uv_lock.py +186 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/help/doc_commands.py +2 -31
- kash_shell-0.3.10/src/kash/commands/help/welcome.py +33 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/workspace/selection_commands.py +11 -6
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/workspace/workspace_commands.py +19 -16
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/colors.py +2 -0
- kash_shell-0.3.10/src/kash/config/env_settings.py +72 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/init.py +2 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/logger.py +61 -59
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/logger_basic.py +12 -5
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/server_config.py +6 -6
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/settings.py +117 -67
- kash_shell-0.3.10/src/kash/config/setup.py +77 -0
- kash_shell-0.3.10/src/kash/config/suppress_warnings.py +45 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/text_styles.py +3 -13
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/load_api_docs.py +2 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/topics/a2_installation.md +7 -3
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/topics/a3_getting_started.md +3 -2
- kash_shell-0.3.10/src/kash/docs/markdown/warning.md +3 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/welcome.md +4 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs_base/load_recipe_snippets.py +1 -1
- kash_shell-0.3.8/src/kash/docs_base/recipes/general_system_commands.ksh → kash_shell-0.3.10/src/kash/docs_base/recipes/general_system_commands.sh +1 -1
- {kash_shell-0.3.8/src/kash/concepts → kash_shell-0.3.10/src/kash/embeddings}/cosine.py +2 -1
- kash_shell-0.3.10/src/kash/embeddings/text_similarity.py +57 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/__init__.py +20 -3
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/action_decorators.py +18 -4
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/action_exec.py +41 -23
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/action_registry.py +13 -48
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/command_registry.py +2 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/fetch_url_metadata.py +4 -6
- kash_shell-0.3.10/src/kash/exec/importing.py +56 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/llm_transforms.py +6 -6
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/precondition_registry.py +2 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/preconditions.py +16 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/shell_callable_action.py +33 -19
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/file_storage/file_store.py +23 -14
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/file_storage/item_file_format.py +13 -3
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/file_storage/metadata_dirs.py +11 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/assistant.py +2 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/assistant_instructions.py +2 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/help_embeddings.py +2 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/help_printing.py +14 -10
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/tldr_help.py +5 -3
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/llm_utils/clean_headings.py +1 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/llm_utils/llm_api_keys.py +4 -4
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/llm_utils/llm_completion.py +2 -2
- kash_shell-0.3.10/src/kash/llm_utils/llm_features.py +68 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/llm_utils/llm_messages.py +1 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/llm_utils/llm_names.py +1 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/llm_utils/llms.py +17 -12
- kash_shell-0.3.10/src/kash/local_server/__init__.py +5 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/local_server/local_server.py +56 -46
- kash_shell-0.3.10/src/kash/local_server/local_server_commands.py +58 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/local_server/local_server_routes.py +2 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/local_server/local_url_formatters.py +1 -1
- kash_shell-0.3.10/src/kash/mcp/__init__.py +5 -0
- kash_shell-0.3.10/src/kash/mcp/mcp_cli.py +124 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/mcp/mcp_server_commands.py +5 -6
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/mcp/mcp_server_routes.py +14 -11
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/mcp/mcp_server_sse.py +61 -34
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/mcp/mcp_server_stdio.py +0 -8
- kash_shell-0.3.10/src/kash/media_base/audio_processing.py +100 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/media_base/media_cache.py +18 -18
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/media_base/media_services.py +1 -1
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/media_base/media_tools.py +6 -6
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/media_base/services/local_file_media.py +2 -2
- kash_shell-0.3.8/src/kash/media_base/speech_transcription.py → kash_shell-0.3.10/src/kash/media_base/transcription_deepgram.py +25 -109
- kash_shell-0.3.10/src/kash/media_base/transcription_format.py +73 -0
- kash_shell-0.3.10/src/kash/media_base/transcription_whisper.py +38 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/__init__.py +73 -5
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/actions_model.py +38 -4
- kash_shell-0.3.10/src/kash/model/concept_model.py +30 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/items_model.py +56 -13
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/params_model.py +24 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/completions/completion_scoring.py +37 -5
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/output/kerm_codes.py +1 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/output/shell_formatting.py +14 -4
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/shell_main.py +2 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/utils/exception_printing.py +6 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/utils/native_utils.py +26 -20
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/text_handling/custom_sliding_transforms.py +12 -4
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/text_handling/doc_normalization.py +6 -2
- kash_shell-0.3.10/src/kash/text_handling/markdown_render.py +117 -0
- kash_shell-0.3.10/src/kash/text_handling/markdown_utils.py +204 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/import_utils.py +12 -3
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/type_utils.py +0 -29
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/url.py +80 -28
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/errors.py +6 -0
- kash_shell-0.3.8/src/kash/utils/file_utils/dir_size.py → kash_shell-0.3.10/src/kash/utils/file_utils/dir_info.py +25 -4
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_utils/file_ext.py +2 -3
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_utils/file_formats.py +28 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_utils/file_formats_model.py +50 -19
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_utils/filename_parsing.py +10 -4
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_content/dir_store.py +1 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_content/file_cache_utils.py +37 -10
- kash_shell-0.3.10/src/kash/web_content/file_processing.py +68 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_content/local_file_cache.py +12 -9
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_content/web_extract.py +8 -3
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_content/web_fetch.py +12 -4
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_gen/tabbed_webpage.py +5 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_gen/templates/base_styles.css.jinja +120 -14
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_gen/templates/base_webpage.html.jinja +60 -13
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_gen/templates/content_styles.css.jinja +4 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_gen/templates/item_view.html.jinja +2 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_gen/templates/tabbed_webpage.html.jinja +1 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/workspaces/__init__.py +15 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/workspaces/selections.py +18 -3
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/workspaces/source_items.py +4 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/workspaces/workspace_output.py +11 -4
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/workspaces/workspaces.py +5 -11
- kash_shell-0.3.10/src/kash/xonsh_custom/command_nl_utils.py +91 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xonsh_custom/custom_shell.py +44 -12
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xonsh_custom/customize_prompt.py +39 -21
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xonsh_custom/load_into_xonsh.py +26 -27
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xonsh_custom/shell_load_commands.py +2 -2
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xonsh_custom/xonsh_completers.py +2 -249
- kash_shell-0.3.10/src/kash/xonsh_custom/xonsh_keybindings.py +282 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xonsh_custom/xonsh_modern_tools.py +3 -3
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xontrib/kash_extension.py +5 -6
- {kash_shell-0.3.8 → kash_shell-0.3.10}/uv.lock +714 -606
- kash_shell-0.3.8/src/kash/commands/__init__.py +0 -21
- kash_shell-0.3.8/src/kash/concepts/concept_formats.py +0 -23
- kash_shell-0.3.8/src/kash/concepts/text_similarity.py +0 -112
- kash_shell-0.3.8/src/kash/config/setup.py +0 -51
- kash_shell-0.3.8/src/kash/config/suppress_warnings.py +0 -27
- kash_shell-0.3.8/src/kash/docs/markdown/warning.md +0 -8
- kash_shell-0.3.8/src/kash/local_server/__init__.py +0 -2
- kash_shell-0.3.8/src/kash/local_server/local_server_commands.py +0 -58
- kash_shell-0.3.8/src/kash/mcp/__init__.py +0 -2
- kash_shell-0.3.8/src/kash/mcp/mcp_cli.py +0 -87
- kash_shell-0.3.8/src/kash/media_base/audio_processing.py +0 -26
- kash_shell-0.3.8/src/kash/shell/clideps/api_keys.py +0 -99
- kash_shell-0.3.8/src/kash/shell/clideps/dotenv_setup.py +0 -114
- kash_shell-0.3.8/src/kash/shell/clideps/dotenv_utils.py +0 -89
- kash_shell-0.3.8/src/kash/shell/clideps/pkg_deps.py +0 -232
- kash_shell-0.3.8/src/kash/shell/clideps/platforms.py +0 -11
- kash_shell-0.3.8/src/kash/shell/clideps/terminal_features.py +0 -56
- kash_shell-0.3.8/src/kash/shell/utils/osc_utils.py +0 -95
- kash_shell-0.3.8/src/kash/shell/utils/terminal_images.py +0 -133
- kash_shell-0.3.8/src/kash/text_handling/markdown_util.py +0 -167
- kash_shell-0.3.8/src/kash/utils/common/atomic_var.py +0 -158
- kash_shell-0.3.8/src/kash/utils/common/string_replace.py +0 -93
- kash_shell-0.3.8/src/kash/utils/common/string_template.py +0 -101
- kash_shell-0.3.8/src/kash/xonsh_custom/command_nl_utils.py +0 -70
- {kash_shell-0.3.8 → kash_shell-0.3.10}/.env.template +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/LICENSE +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/devtools/generate_readme.xsh +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/devtools/lint.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/devtools/profile_main.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/__main__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/core/assistant_chat.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/core/chat.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/core/format_markdown_template.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/core/show_webpage.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/core/strip_html.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/core/summarize_as_bullets.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/core/webpage_generate.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/meta/write_instructions.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/actions/meta/write_new_action.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/browser_commands.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/diff_commands.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/files_command.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/base/reformat_command.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/extras/utils_commands.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/help/assistant_commands.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/help/help_commands.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/commands/help/logo.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/capture_output.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/lazy_imports.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/config/logo.txt +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/all_docs.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/load_actions_info.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/load_help_topics.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/load_source_code.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/api_docs_template.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/assistant_instructions_template.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/readme_template.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/topics/a1_what_is_kash.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/topics/a4_elements.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/topics/a5_tips_for_use_with_other_tools.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/topics/b0_philosophy_of_kash.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/topics/b1_kash_overview.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/topics/b2_workspace_and_file_formats.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/topics/b3_modern_shell_tool_recommendations.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs/markdown/topics/b4_faq.md +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs_base/docs_base.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs_base/load_custom_command_info.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/docs_base/load_faqs.py +0 -0
- /kash_shell-0.3.8/src/kash/docs_base/recipes/python_dev_commands.ksh → /kash_shell-0.3.10/src/kash/docs_base/recipes/python_dev_commands.sh +0 -0
- /kash_shell-0.3.8/src/kash/docs_base/recipes/tldr_standard_commands.ksh → /kash_shell-0.3.10/src/kash/docs_base/recipes/tldr_standard_commands.sh +0 -0
- {kash_shell-0.3.8/src/kash/concepts → kash_shell-0.3.10/src/kash/embeddings}/embeddings.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/combiners.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/command_exec.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/history.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/precondition_checks.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec/resolve_args.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec_model/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec_model/args_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec_model/commands_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec_model/script_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/exec_model/shell_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/file_storage/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/file_storage/persisted_yaml.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/file_storage/store_cache_warmer.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/file_storage/store_filenames.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/assistant_output.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/docstring_utils.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/function_param_info.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/help_lookups.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/help_pages.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/help_types.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/help/recommended_commands.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/llm_utils/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/llm_utils/fuzzy_parsing.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/local_server/port_tools.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/local_server/rich_html_template.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/mcp/mcp_main.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/media_base/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/media_base/timestamp_citations.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/assistant_response_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/compound_actions_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/graph_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/language_list.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/llm_actions_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/media_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/operations_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/paths_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/model/preconditions_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/completions/completion_types.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/completions/shell_completions.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/file_icons/color_for_format.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/file_icons/nerd_icons.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/input/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/input/input_prompts.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/input/inquirer_settings.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/input/param_inputs.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/input/shell_confirm.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/output/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/output/kerm_code_utils.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/output/kmarkdown.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/output/shell_output.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/ui/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/ui/shell_results.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/ui/shell_syntax.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/utils/argparse_utils.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/utils/shell_function_wrapper.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/shell/version.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/text_handling/unified_diffs.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/format_utils.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/function_inspect.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/lazyobject.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/obj_replace.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/parse_key_vals.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/parse_shell_args.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/stack_traces.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/task_stack.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/common/uniquifier.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_formats/chat_format.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_utils/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_utils/file_sort_filter.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_utils/file_walk.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_utils/ignore_files.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_utils/mtime_cache.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/file_utils/path_utils.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/lang_utils/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/lang_utils/capitalization.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/lang_utils/inflection.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/rich_custom/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/rich_custom/ansi_cell_len.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/rich_custom/rich_char_transform.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/rich_custom/rich_indent.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/utils/rich_custom/rich_markdown_fork.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_content/canon_url.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_content/web_extract_justext.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_content/web_extract_readabilipy.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_content/web_page_model.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_gen/__init__.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_gen/template_render.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/web_gen/templates/explain_view.html.jinja +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/workspaces/param_state.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/workspaces/workspace_importing.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/workspaces/workspace_registry.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xonsh_custom/shell_which.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xonsh_custom/xonsh_env.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xonsh_custom/xonsh_ranking_completer.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/src/kash/xontrib/fnm.py +0 -0
- {kash_shell-0.3.8 → kash_shell-0.3.10}/tests/test_shell.py +0 -0
|
@@ -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,22 +1,32 @@
|
|
|
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.10
|
|
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'
|
|
12
21
|
Requires-Dist: cachetools>=5.5.2
|
|
13
|
-
Requires-Dist: chopdiff>=0.1
|
|
22
|
+
Requires-Dist: chopdiff>=0.2.1
|
|
23
|
+
Requires-Dist: clideps>=0.1.1
|
|
14
24
|
Requires-Dist: colour>=0.1.5
|
|
15
25
|
Requires-Dist: cssselect>=1.2.0
|
|
16
26
|
Requires-Dist: deepgram-sdk>=3.10.1
|
|
17
27
|
Requires-Dist: dunamai>=1.23.0
|
|
18
28
|
Requires-Dist: fastapi>=0.115.11
|
|
19
|
-
Requires-Dist: flowmark>=0.
|
|
29
|
+
Requires-Dist: flowmark>=0.4.1
|
|
20
30
|
Requires-Dist: frontmatter-format>=0.2.1
|
|
21
31
|
Requires-Dist: funlog>=0.2.0
|
|
22
32
|
Requires-Dist: humanfriendly>=10.0
|
|
@@ -33,7 +43,7 @@ Requires-Dist: openai>=1.66.3
|
|
|
33
43
|
Requires-Dist: pandas>=2.2.3
|
|
34
44
|
Requires-Dist: patch-ng>=1.18.1
|
|
35
45
|
Requires-Dist: pathspec>=0.12.1
|
|
36
|
-
Requires-Dist: prettyfmt>=0.
|
|
46
|
+
Requires-Dist: prettyfmt>=0.3.0
|
|
37
47
|
Requires-Dist: prompt-toolkit>=3.0.50
|
|
38
48
|
Requires-Dist: pydantic>=2.10.6
|
|
39
49
|
Requires-Dist: pydub>=0.25.1
|
|
@@ -42,7 +52,6 @@ Requires-Dist: pyperclip>=1.9.0
|
|
|
42
52
|
Requires-Dist: python-dotenv>=1.0.1
|
|
43
53
|
Requires-Dist: python-magic-bin>=0.4.14; platform_system == 'Windows'
|
|
44
54
|
Requires-Dist: python-magic>=0.4.27; platform_system == 'Linux' or platform_system == 'Darwin'
|
|
45
|
-
Requires-Dist: python-slugify>=8.0.4
|
|
46
55
|
Requires-Dist: readabilipy>=0.3.0
|
|
47
56
|
Requires-Dist: regex>=2024.11.6
|
|
48
57
|
Requires-Dist: rich-argparse>=1.7.0
|
|
@@ -50,7 +59,7 @@ Requires-Dist: rich>=14.0.0
|
|
|
50
59
|
Requires-Dist: ripgrepy>=2.1.0
|
|
51
60
|
Requires-Dist: send2trash>=1.8.3
|
|
52
61
|
Requires-Dist: setproctitle>=1.3.5
|
|
53
|
-
Requires-Dist: strif>=
|
|
62
|
+
Requires-Dist: strif>=3.0.0-rc.1
|
|
54
63
|
Requires-Dist: tenacity>=9.0.0
|
|
55
64
|
Requires-Dist: thefuzz>=0.22.1
|
|
56
65
|
Requires-Dist: tiktoken>=0.9.0
|
|
@@ -229,15 +238,19 @@ These are for `kash-media` but you can use a `kash-shell` for a more basic setup
|
|
|
229
238
|
For macOS, you can again use brew:
|
|
230
239
|
|
|
231
240
|
```shell
|
|
232
|
-
# Install pyenv, pipx, and other tools:
|
|
233
241
|
brew update
|
|
234
|
-
brew install ripgrep bat eza hexyl imagemagick
|
|
242
|
+
brew install libmagic ffmpeg ripgrep bat eza hexyl imagemagick zoxide
|
|
235
243
|
```
|
|
236
244
|
|
|
237
245
|
For Ubuntu:
|
|
238
246
|
|
|
239
247
|
```shell
|
|
240
|
-
apt
|
|
248
|
+
sudo apt-get update
|
|
249
|
+
sudo apt-get install -y libgl1 ffmpeg libmagic-dev
|
|
250
|
+
# For the additional command-line tools, pixi is better on Ubuntu:
|
|
251
|
+
curl -fsSL https://pixi.sh/install.sh | sh
|
|
252
|
+
. ~/.bashrc
|
|
253
|
+
pixi global install ripgrep bat eza hexyl imagemagick zoxide
|
|
241
254
|
```
|
|
242
255
|
|
|
243
256
|
For Windows or other platforms, see the uv instructions.
|
|
@@ -577,8 +590,9 @@ A few of the most important commands for managing files and work are these:
|
|
|
577
590
|
browser to view it.
|
|
578
591
|
|
|
579
592
|
- `workspace` shows or selects or creates a new workspace.
|
|
580
|
-
Initially you work in the
|
|
581
|
-
create a workspace, which is a directory to hold
|
|
593
|
+
Initially you work in the default global workspace (typically at `~/Kash/workspace`)
|
|
594
|
+
but for more real work you'll want to create a workspace, which is a directory to hold
|
|
595
|
+
the files you are working with.
|
|
582
596
|
|
|
583
597
|
- `select` shows or sets selections, which are the set of files the next command will
|
|
584
598
|
run on, within the current workspace.
|
|
@@ -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.
|
|
@@ -515,8 +519,9 @@ A few of the most important commands for managing files and work are these:
|
|
|
515
519
|
browser to view it.
|
|
516
520
|
|
|
517
521
|
- `workspace` shows or selects or creates a new workspace.
|
|
518
|
-
Initially you work in the
|
|
519
|
-
create a workspace, which is a directory to hold
|
|
522
|
+
Initially you work in the default global workspace (typically at `~/Kash/workspace`)
|
|
523
|
+
but for more real work you'll want to create a workspace, which is a directory to hold
|
|
524
|
+
the files you are working with.
|
|
520
525
|
|
|
521
526
|
- `select` shows or sets selections, which are the set of files the next command will
|
|
522
527
|
run on, within the current workspace.
|
|
@@ -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,17 +16,39 @@ 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",
|
|
21
43
|
"typing-extensions>=4.12.2",
|
|
22
44
|
# My tools:
|
|
23
|
-
"strif>=
|
|
45
|
+
"strif>=3.0.0-rc.1",
|
|
24
46
|
"funlog>=0.2.0",
|
|
25
|
-
"prettyfmt>=0.
|
|
26
|
-
"flowmark>=0.
|
|
47
|
+
"prettyfmt>=0.3.0",
|
|
48
|
+
"flowmark>=0.4.1",
|
|
27
49
|
"frontmatter-format>=0.2.1",
|
|
28
|
-
"chopdiff>=0.1
|
|
50
|
+
"chopdiff>=0.2.1",
|
|
51
|
+
"clideps>=0.1.1",
|
|
29
52
|
# Shell and file essentials:
|
|
30
53
|
# python-magic is most current and works with libmagic on macOS and Linux.
|
|
31
54
|
# on Windows, python-magic-bin seems like the best option.
|
|
@@ -45,7 +68,6 @@ dependencies = [
|
|
|
45
68
|
"pyperclip>=1.9.0",
|
|
46
69
|
"colour>=0.1.5",
|
|
47
70
|
"thefuzz>=0.22.1",
|
|
48
|
-
"python-slugify>=8.0.4",
|
|
49
71
|
"tldr>=3.3.0",
|
|
50
72
|
"jinja2>=3.1.6",
|
|
51
73
|
"pygments>=2.19.1",
|
|
@@ -92,8 +114,11 @@ dev = [
|
|
|
92
114
|
|
|
93
115
|
[project.scripts]
|
|
94
116
|
kash = "kash.shell.shell_main:main"
|
|
95
|
-
|
|
117
|
+
kash-mcp = "kash.mcp.mcp_cli:main"
|
|
96
118
|
|
|
119
|
+
[tool.uv.sources]
|
|
120
|
+
# For local development:
|
|
121
|
+
# clideps = { path = "../clideps", editable = true }
|
|
97
122
|
|
|
98
123
|
# ---- Build system ----
|
|
99
124
|
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
|
|
4
|
+
from strif import AtomicVar
|
|
5
|
+
|
|
4
6
|
from kash.config.logger import get_logger
|
|
5
7
|
from kash.config.settings import APP_NAME
|
|
6
|
-
from kash.exec import
|
|
7
|
-
from kash.utils.common.atomic_var import AtomicVar
|
|
8
|
+
from kash.exec import import_and_register
|
|
8
9
|
from kash.utils.common.import_utils import import_namespace_modules
|
|
9
10
|
|
|
10
11
|
log = get_logger(__name__)
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
import_action_subdirs(["core", "meta"], __package__, Path(__file__).parent)
|
|
13
|
+
import_and_register(__package__, Path(__file__).parent, ["core", "meta"])
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
@dataclass(frozen=True)
|
|
@@ -2,6 +2,7 @@ from kash.config.logger import get_logger
|
|
|
2
2
|
from kash.exec import kash_action
|
|
3
3
|
from kash.exec.preconditions import has_html_body, is_url_item
|
|
4
4
|
from kash.model import Format, Item, ItemType
|
|
5
|
+
from kash.model.params_model import common_params
|
|
5
6
|
from kash.web_content.file_cache_utils import get_url_html
|
|
6
7
|
from kash.web_content.web_extract_readabilipy import extract_text_readabilipy
|
|
7
8
|
|
|
@@ -10,16 +11,18 @@ log = get_logger(__name__)
|
|
|
10
11
|
|
|
11
12
|
@kash_action(
|
|
12
13
|
precondition=is_url_item | has_html_body,
|
|
14
|
+
params=common_params("refetch"),
|
|
13
15
|
mcp_tool=True,
|
|
14
16
|
)
|
|
15
|
-
def markdownify(item: Item) -> Item:
|
|
17
|
+
def markdownify(item: Item, refetch: bool = False) -> Item:
|
|
16
18
|
"""
|
|
17
19
|
Converts a URL or raw HTML item to Markdown, fetching with the content
|
|
18
20
|
cache if needed. Also uses readability to clean up the HTML.
|
|
19
21
|
"""
|
|
20
22
|
from markdownify import markdownify as markdownify_convert
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
expiration_sec = 0 if refetch else None
|
|
25
|
+
url, html_content = get_url_html(item, expiration_sec=expiration_sec)
|
|
23
26
|
page_data = extract_text_readabilipy(url, html_content)
|
|
24
27
|
markdown_content = markdownify_convert(page_data.clean_html)
|
|
25
28
|
|
|
@@ -2,6 +2,7 @@ from kash.config.logger import get_logger
|
|
|
2
2
|
from kash.exec import kash_action
|
|
3
3
|
from kash.exec.preconditions import has_html_body, is_url_item
|
|
4
4
|
from kash.model import Format, Item, ItemType
|
|
5
|
+
from kash.model.params_model import common_params
|
|
5
6
|
from kash.web_content.file_cache_utils import get_url_html
|
|
6
7
|
from kash.web_content.web_extract_readabilipy import extract_text_readabilipy
|
|
7
8
|
|
|
@@ -10,14 +11,16 @@ log = get_logger(__name__)
|
|
|
10
11
|
|
|
11
12
|
@kash_action(
|
|
12
13
|
precondition=is_url_item | has_html_body,
|
|
14
|
+
params=common_params("refetch"),
|
|
13
15
|
mcp_tool=True,
|
|
14
16
|
)
|
|
15
|
-
def readability(item: Item) -> Item:
|
|
17
|
+
def readability(item: Item, refetch: bool = False) -> Item:
|
|
16
18
|
"""
|
|
17
19
|
Extracts clean HTML from a raw HTML item.
|
|
18
20
|
See `markdownify` to also convert to Markdown.
|
|
19
21
|
"""
|
|
20
|
-
|
|
22
|
+
expiration_sec = 0 if refetch else None
|
|
23
|
+
url, html_content = get_url_html(item, expiration_sec=expiration_sec)
|
|
21
24
|
page_data = extract_text_readabilipy(url, html_content)
|
|
22
25
|
|
|
23
26
|
output_item = item.derived_copy(
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from kash.actions.core.webpage_config import webpage_config
|
|
2
|
+
from kash.actions.core.webpage_generate import webpage_generate
|
|
3
|
+
from kash.exec import kash_action
|
|
4
|
+
from kash.exec.preconditions import has_text_body, is_html
|
|
5
|
+
from kash.model import ActionInput, ActionResult
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@kash_action(
|
|
9
|
+
precondition=is_html | has_text_body,
|
|
10
|
+
)
|
|
11
|
+
def render_as_html(input: ActionInput) -> ActionResult:
|
|
12
|
+
"""
|
|
13
|
+
Convert text, Markdown, or HTML to pretty, formatted HTML using the kash default
|
|
14
|
+
page template.
|
|
15
|
+
"""
|
|
16
|
+
config_result = webpage_config(input)
|
|
17
|
+
result = webpage_generate(ActionInput(items=config_result.items))
|
|
18
|
+
return result
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
from kash.config.logger import get_logger
|
|
2
2
|
from kash.exec import kash_action
|
|
3
|
-
from kash.model import ActionInput, ActionResult
|
|
3
|
+
from kash.model import ActionInput, ActionResult, Param
|
|
4
4
|
from kash.utils.errors import InvalidInput
|
|
5
5
|
from kash.web_gen import tabbed_webpage
|
|
6
6
|
|
|
7
7
|
log = get_logger(__name__)
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
@kash_action(
|
|
11
|
-
|
|
10
|
+
@kash_action(
|
|
11
|
+
params=(
|
|
12
|
+
Param(
|
|
13
|
+
name="clean_headings",
|
|
14
|
+
type=bool,
|
|
15
|
+
description="Use an LLM to clean up headings.",
|
|
16
|
+
),
|
|
17
|
+
)
|
|
18
|
+
)
|
|
19
|
+
def webpage_config(input: ActionInput, clean_headings: bool = False) -> ActionResult:
|
|
12
20
|
"""
|
|
13
21
|
Set up a web page config with optional tabs for each page of content. Uses first item as the page title.
|
|
14
22
|
"""
|
|
@@ -16,6 +24,6 @@ def webpage_config(input: ActionInput) -> ActionResult:
|
|
|
16
24
|
if not item.body:
|
|
17
25
|
raise InvalidInput(f"Item must have a body: {item}")
|
|
18
26
|
|
|
19
|
-
config_item = tabbed_webpage.webpage_config(input.items)
|
|
27
|
+
config_item = tabbed_webpage.webpage_config(input.items, clean_headings)
|
|
20
28
|
|
|
21
29
|
return ActionResult([config_item])
|
|
@@ -7,6 +7,7 @@ from strif import copyfile_atomic
|
|
|
7
7
|
from kash.config.logger import get_logger
|
|
8
8
|
from kash.config.text_styles import STYLE_EMPH
|
|
9
9
|
from kash.exec import assemble_path_args, kash_command, resolve_path_arg
|
|
10
|
+
from kash.model.paths_model import StorePath
|
|
10
11
|
from kash.shell.output.shell_output import (
|
|
11
12
|
PadStyle,
|
|
12
13
|
PrintHooks,
|
|
@@ -21,6 +22,7 @@ from kash.utils.common.format_utils import fmt_loc
|
|
|
21
22
|
from kash.utils.errors import InvalidInput
|
|
22
23
|
from kash.utils.file_utils.file_formats_model import detect_file_format
|
|
23
24
|
from kash.workspaces.workspace_output import print_file_info
|
|
25
|
+
from kash.workspaces.workspaces import current_ws
|
|
24
26
|
|
|
25
27
|
log = get_logger(__name__)
|
|
26
28
|
|
|
@@ -149,7 +151,20 @@ def trash(*paths: str) -> None:
|
|
|
149
151
|
"""
|
|
150
152
|
|
|
151
153
|
resolved_paths = assemble_path_args(*paths)
|
|
154
|
+
|
|
155
|
+
ws = current_ws()
|
|
156
|
+
affected_store_paths = [
|
|
157
|
+
p for p in resolved_paths if isinstance(p, StorePath) and (ws.base_dir / p).exists()
|
|
158
|
+
]
|
|
159
|
+
|
|
152
160
|
native_trash(*resolved_paths)
|
|
161
|
+
|
|
162
|
+
if affected_store_paths:
|
|
163
|
+
log.info(
|
|
164
|
+
"Refreshing current selection due to deleted store paths: %s", affected_store_paths
|
|
165
|
+
)
|
|
166
|
+
ws.selections.refresh_current(ws.base_dir)
|
|
167
|
+
|
|
153
168
|
print_status(f"Deleted (check trash or recycling bin to recover):\n{fmt_lines(resolved_paths)}")
|
|
154
169
|
|
|
155
170
|
|
|
@@ -179,7 +179,7 @@ def reload_system() -> None:
|
|
|
179
179
|
the local the local server. Not perfect! But sometimes useful for development.
|
|
180
180
|
"""
|
|
181
181
|
import kash
|
|
182
|
-
from kash.local_server.local_server import
|
|
182
|
+
from kash.local_server.local_server import restart_ui_server
|
|
183
183
|
from kash.utils.common.import_utils import recursive_reload
|
|
184
184
|
|
|
185
185
|
module = kash
|
|
@@ -197,7 +197,7 @@ def reload_system() -> None:
|
|
|
197
197
|
log.info("Reloaded modules: %s", ", ".join(package_names))
|
|
198
198
|
log.message("Reloaded %s modules from %s.", len(package_names), module.__name__)
|
|
199
199
|
|
|
200
|
-
|
|
200
|
+
restart_ui_server()
|
|
201
201
|
|
|
202
202
|
# TODO Re-register commands and actions.
|
|
203
203
|
|
|
@@ -213,3 +213,16 @@ def reload_commands_and_actions() -> None:
|
|
|
213
213
|
|
|
214
214
|
reload_shell_commands_and_actions()
|
|
215
215
|
log_command_action_info()
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
@kash_command
|
|
219
|
+
def debug_exception() -> None:
|
|
220
|
+
"""
|
|
221
|
+
Useful to debug exception handling/printing in xonsh.
|
|
222
|
+
"""
|
|
223
|
+
|
|
224
|
+
def raise_exception():
|
|
225
|
+
cprint("Raising an unexpected exception to test the exception handler.")
|
|
226
|
+
raise Exception("This is a test exception.")
|
|
227
|
+
|
|
228
|
+
raise_exception()
|