kash-shell 0.3.28__tar.gz → 0.3.33__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.28 → kash_shell-0.3.33}/PKG-INFO +35 -26
- {kash_shell-0.3.28 → kash_shell-0.3.33}/README.md +28 -20
- {kash_shell-0.3.28 → kash_shell-0.3.33}/pyproject.toml +11 -7
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/chat.py +1 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/markdownify_html.py +4 -5
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/minify_html.py +4 -5
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/readability.py +1 -4
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/render_as_html.py +10 -7
- kash_shell-0.3.33/src/kash/actions/core/save_sidematter_meta.py +47 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/show_webpage.py +2 -0
- kash_shell-0.3.33/src/kash/actions/core/zip_sidematter.py +47 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/basic_file_commands.py +7 -4
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/diff_commands.py +6 -4
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/files_command.py +31 -30
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/general_commands.py +3 -2
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/logs_commands.py +6 -4
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/reformat_command.py +3 -2
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/search_command.py +4 -3
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/show_command.py +9 -7
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/help/assistant_commands.py +6 -4
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/help/help_commands.py +7 -4
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/workspace/selection_commands.py +18 -16
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/workspace/workspace_commands.py +39 -26
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/logger.py +1 -1
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/setup.py +2 -27
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/text_styles.py +1 -1
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/topics/a1_what_is_kash.md +26 -18
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/topics/a2_installation.md +3 -2
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/action_decorators.py +7 -5
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/action_exec.py +104 -53
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/fetch_url_items.py +40 -11
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/llm_transforms.py +14 -5
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/preconditions.py +2 -2
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/resolve_args.py +4 -1
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/runtime_settings.py +3 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/file_storage/file_store.py +108 -114
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/file_storage/item_file_format.py +91 -26
- kash_shell-0.3.33/src/kash/file_storage/item_id_index.py +128 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/help_types.py +1 -1
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/llm_utils/llms.py +6 -1
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/local_server/local_server_commands.py +2 -1
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/mcp/mcp_server_commands.py +3 -2
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/mcp/mcp_server_routes.py +42 -12
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/actions_model.py +44 -32
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/compound_actions_model.py +4 -3
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/exec_model.py +33 -3
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/items_model.py +150 -60
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/params_model.py +4 -4
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/output/shell_output.py +1 -2
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/api_utils/gather_limited.py +2 -0
- kash_shell-0.3.33/src/kash/utils/api_utils/multitask_gather.py +74 -0
- kash_shell-0.3.33/src/kash/utils/common/s3_utils.py +108 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/url.py +16 -4
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_formats/chat_format.py +7 -4
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/file_ext.py +1 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/file_formats.py +4 -2
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/file_formats_model.py +12 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/text_handling/doc_normalization.py +1 -1
- kash_shell-0.3.33/src/kash/utils/text_handling/markdown_footnotes.py +224 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/text_handling/markdown_utils.py +532 -41
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/text_handling/markdownify_utils.py +2 -1
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_content/web_fetch.py +2 -1
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/components/tooltip_scripts.js.jinja +186 -1
- kash_shell-0.3.33/src/kash/web_gen/templates/components/youtube_popover_scripts.js.jinja +223 -0
- kash_shell-0.3.33/src/kash/web_gen/templates/components/youtube_popover_styles.css.jinja +150 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/content_styles.css.jinja +53 -1
- kash_shell-0.3.33/src/kash/web_gen/templates/youtube_webpage.html.jinja +47 -0
- kash_shell-0.3.33/src/kash/web_gen/webpage_render.py +103 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/workspaces/workspaces.py +0 -5
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/custom_shell.py +4 -3
- kash_shell-0.3.33/tests/file_storage/test_file_store.py +560 -0
- kash_shell-0.3.33/tests/model/test_item_serialization.py +112 -0
- kash_shell-0.3.33/tests/shell/input/interactive_input_test.py +386 -0
- kash_shell-0.3.33/tests/utils/text_handling/test_markdown_footnotes.py +361 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/uv.lock +426 -365
- kash_shell-0.3.28/src/kash/llm_utils/llm_features.py +0 -72
- kash_shell-0.3.28/src/kash/web_gen/simple_webpage.py +0 -55
- {kash_shell-0.3.28 → kash_shell-0.3.33}/.copier-answers.yml +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/.cursor/rules/general.mdc +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/.cursor/rules/python.mdc +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/.env.template +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/.github/workflows/ci.yml +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/.github/workflows/publish.yml +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/.gitignore +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/LICENSE +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/Makefile +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/development.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/devtools/generate_readme.xsh +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/devtools/lint.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/devtools/profile_main.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/installation.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/publishing.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/__main__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/assistant_chat.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/combine_docs.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/concat_docs.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/format_markdown_template.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/strip_html.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/summarize_as_bullets.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/tabbed_webpage_config.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/core/tabbed_webpage_generate.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/meta/write_instructions.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/actions/meta/write_new_action.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/browser_commands.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/debug_commands.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/base/model_commands.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/extras/parse_uv_lock.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/extras/utils_commands.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/help/doc_commands.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/help/logo.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/commands/help/welcome.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/capture_output.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/colors.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/env_settings.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/init.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/lazy_imports.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/logger_basic.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/logo.txt +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/server_config.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/settings.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/suppress_warnings.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/config/unified_live.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/all_docs.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/load_actions_info.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/load_api_docs.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/load_help_topics.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/load_source_code.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/api_docs_template.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/assistant_instructions_template.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/readme_template.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/topics/a3_getting_started.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/topics/a4_elements.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/topics/a5_tips_for_use_with_other_tools.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/topics/b0_philosophy_of_kash.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/topics/b1_kash_overview.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/topics/b2_workspace_and_file_formats.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/topics/b3_modern_shell_tool_recommendations.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/topics/b4_faq.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/warning.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs/markdown/welcome.md +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs_base/docs_base.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs_base/load_custom_command_info.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs_base/load_faqs.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs_base/load_recipe_snippets.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs_base/recipes/general_system_commands.sh +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs_base/recipes/python_dev_commands.sh +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/docs_base/recipes/tldr_standard_commands.sh +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/embeddings/cosine.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/embeddings/embeddings.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/embeddings/text_similarity.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/action_registry.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/combiners.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/command_exec.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/command_registry.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/history.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/importing.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/precondition_checks.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/precondition_registry.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec/shell_callable_action.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec_model/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec_model/args_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec_model/commands_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec_model/script_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/exec_model/shell_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/file_storage/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/file_storage/metadata_dirs.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/file_storage/persisted_yaml.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/file_storage/store_cache_warmer.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/file_storage/store_filenames.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/assistant.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/assistant_instructions.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/assistant_output.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/function_param_info.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/help_embeddings.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/help_lookups.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/help_pages.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/help_printing.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/recommended_commands.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/help/tldr_help.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/llm_utils/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/llm_utils/clean_headings.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/llm_utils/custom_sliding_transforms.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/llm_utils/fuzzy_parsing.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/llm_utils/init_litellm.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/llm_utils/llm_api_keys.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/llm_utils/llm_completion.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/llm_utils/llm_messages.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/llm_utils/llm_names.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/local_server/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/local_server/local_server.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/local_server/local_server_routes.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/local_server/local_url_formatters.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/local_server/port_tools.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/local_server/rich_html_template.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/mcp/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/mcp/mcp_cli.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/mcp/mcp_main.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/mcp/mcp_server_sse.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/mcp/mcp_server_stdio.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/media_base/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/media_base/audio_processing.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/media_base/media_cache.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/media_base/media_services.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/media_base/media_tools.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/media_base/services/local_file_media.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/media_base/timestamp_citations.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/media_base/transcription_deepgram.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/media_base/transcription_format.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/media_base/transcription_whisper.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/assistant_response_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/concept_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/graph_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/language_list.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/llm_actions_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/media_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/operations_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/paths_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/model/preconditions_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/completions/completion_scoring.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/completions/completion_types.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/completions/shell_completions.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/file_icons/color_for_format.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/file_icons/nerd_icons.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/input/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/input/input_prompts.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/input/inquirer_settings.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/input/param_inputs.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/input/shell_confirm.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/output/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/output/kerm_code_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/output/kerm_codes.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/output/kmarkdown.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/output/shell_formatting.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/shell_main.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/ui/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/ui/shell_results.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/ui/shell_syntax.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/utils/exception_printing.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/utils/native_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/utils/shell_function_wrapper.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/shell/version.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/api_utils/api_retries.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/api_utils/cache_requests_limited.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/api_utils/http_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/api_utils/progress_protocol.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/format_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/function_inspect.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/import_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/lazyobject.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/obj_replace.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/parse_docstring.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/parse_key_vals.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/parse_shell_args.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/stack_traces.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/task_stack.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/testing.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/type_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/uniquifier.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/common/url_slice.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/errors.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/csv_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/dir_info.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/file_sort_filter.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/file_walk.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/filename_parsing.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/ignore_files.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/mtime_cache.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/file_utils/path_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/lang_utils/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/lang_utils/capitalization.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/rich_custom/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/rich_custom/ansi_cell_len.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/rich_custom/multitask_status.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/rich_custom/rich_char_transform.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/rich_custom/rich_indent.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/rich_custom/rich_markdown_fork.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/text_handling/escape_html_tags.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/text_handling/markdown_render.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/utils/text_handling/unified_diffs.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_content/canon_url.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_content/dir_store.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_content/file_cache_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_content/file_processing.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_content/local_file_cache.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_content/web_extract.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_content/web_extract_justext.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_content/web_extract_readabilipy.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_content/web_page_model.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/tabbed_webpage.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/template_render.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/base_styles.css.jinja +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/base_webpage.html.jinja +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/components/toc_scripts.js.jinja +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/components/toc_styles.css.jinja +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/components/tooltip_styles.css.jinja +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/explain_view.html.jinja +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/item_view.html.jinja +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/simple_webpage.html.jinja +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/web_gen/templates/tabbed_webpage.html.jinja +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/workspaces/__init__.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/workspaces/param_state.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/workspaces/selections.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/workspaces/source_items.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/workspaces/workspace_dirs.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/workspaces/workspace_output.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/workspaces/workspace_registry.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/command_nl_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/customize_prompt.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/load_into_xonsh.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/shell_load_commands.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/shell_which.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/xonsh_completers.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/xonsh_env.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/xonsh_keybindings.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/xonsh_modern_tools.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xonsh_custom/xonsh_ranking_completer.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xontrib/fnm.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/src/kash/xontrib/kash_extension.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/tests/kash/utils/api_utils/test_gather_limited.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/tests/kash/utils/file_utils/test_csv_utils.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/tests/kash/utils/rich_custom/test_multitask_status.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/tests/test_shell.py +0 -0
- {kash_shell-0.3.28 → kash_shell-0.3.33}/tests/web_gen/test_social_metadata.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kash-shell
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.33
|
|
4
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>
|
|
@@ -20,7 +20,7 @@ Requires-Dist: aiolimiter>=1.2.1
|
|
|
20
20
|
Requires-Dist: anyio>=4.8.0
|
|
21
21
|
Requires-Dist: audioop-lts>=0.2.1; python_version >= '3.13'
|
|
22
22
|
Requires-Dist: cachetools>=5.5.2
|
|
23
|
-
Requires-Dist: chopdiff>=0.2.
|
|
23
|
+
Requires-Dist: chopdiff>=0.2.5
|
|
24
24
|
Requires-Dist: clideps>=0.1.4
|
|
25
25
|
Requires-Dist: colour>=0.1.5
|
|
26
26
|
Requires-Dist: cssselect>=1.2.0
|
|
@@ -28,8 +28,8 @@ Requires-Dist: curl-cffi>=0.11.4
|
|
|
28
28
|
Requires-Dist: deepgram-sdk>=3.10.1
|
|
29
29
|
Requires-Dist: dunamai>=1.23.0
|
|
30
30
|
Requires-Dist: fastapi>=0.115.11
|
|
31
|
-
Requires-Dist: flowmark>=0.5.
|
|
32
|
-
Requires-Dist: frontmatter-format>=0.2.
|
|
31
|
+
Requires-Dist: flowmark>=0.5.3
|
|
32
|
+
Requires-Dist: frontmatter-format>=0.2.3
|
|
33
33
|
Requires-Dist: funlog>=0.2.0
|
|
34
34
|
Requires-Dist: httpx[brotli]>=0.28.1
|
|
35
35
|
Requires-Dist: humanfriendly>=10.0
|
|
@@ -46,7 +46,7 @@ Requires-Dist: pandas>=2.2.3
|
|
|
46
46
|
Requires-Dist: patch-ng>=1.18.1
|
|
47
47
|
Requires-Dist: pathspec>=0.12.1
|
|
48
48
|
Requires-Dist: pluralizer>=1.2.0
|
|
49
|
-
Requires-Dist: prettyfmt>=0.
|
|
49
|
+
Requires-Dist: prettyfmt>=0.4.1
|
|
50
50
|
Requires-Dist: prompt-toolkit>=3.0.50
|
|
51
51
|
Requires-Dist: pydantic>=2.10.6
|
|
52
52
|
Requires-Dist: pydub>=0.25.1
|
|
@@ -62,9 +62,10 @@ Requires-Dist: regex>=2024.11.6
|
|
|
62
62
|
Requires-Dist: rich-argparse>=1.7.0
|
|
63
63
|
Requires-Dist: rich>=14.0.0
|
|
64
64
|
Requires-Dist: ripgrepy>=2.1.0
|
|
65
|
+
Requires-Dist: selectolax>=0.3.32
|
|
65
66
|
Requires-Dist: send2trash>=1.8.3
|
|
66
67
|
Requires-Dist: setproctitle>=1.3.5
|
|
67
|
-
Requires-Dist: sidematter-format>=0.0.
|
|
68
|
+
Requires-Dist: sidematter-format>=0.0.5
|
|
68
69
|
Requires-Dist: strif>=3.0.1
|
|
69
70
|
Requires-Dist: tenacity>=9.0.0
|
|
70
71
|
Requires-Dist: thefuzz>=0.22.1
|
|
@@ -85,6 +86,19 @@ src="https://github.com/user-attachments/assets/a5d62ae4-17e6-46bb-a9cb-3b6ec8d8
|
|
|
85
86
|
|
|
86
87
|
</div>
|
|
87
88
|
|
|
89
|
+
## Hello!
|
|
90
|
+
|
|
91
|
+
If you’re seeing this, you there’s a good chance I shared it with you for feedback.
|
|
92
|
+
Thank you for checking out Kash.
|
|
93
|
+
|
|
94
|
+
It’s new, the result of some experimentation over the past few months.
|
|
95
|
+
I like a lot of things about it but it isn’t mature and I’d love your help to make it
|
|
96
|
+
more usable. If you try it please **let me know** what works and what doesn’t work.
|
|
97
|
+
Or if you just don’t get it, where you lost interest or got stuck.
|
|
98
|
+
My contact info is at [github.com/jlevy](https://github.com/jlevy) or [follow or DM
|
|
99
|
+
me](https://x.com/ojoshe) (I’m fastest on Twitter DMs).
|
|
100
|
+
Thank you. :)
|
|
101
|
+
|
|
88
102
|
## What is Kash?
|
|
89
103
|
|
|
90
104
|
> “*Simple should be simple.
|
|
@@ -99,9 +113,15 @@ It operates on “items” such as URLs, files, or Markdown notes within a works
|
|
|
99
113
|
directory.
|
|
100
114
|
|
|
101
115
|
You can use Kash as an **interactive, AI-native command-line** shell for practical
|
|
102
|
-
knowledge tasks.
|
|
103
|
-
|
|
104
|
-
|
|
116
|
+
knowledge tasks.
|
|
117
|
+
|
|
118
|
+
But it’s actually not just a shell, and you can skip the shell entirely.
|
|
119
|
+
It’s really simply **a Python library** that lets you convert a simple Python function
|
|
120
|
+
into “actions” that work in a clean way on plain files in a workspace.
|
|
121
|
+
An action is also an MCP tool, so it integrates with other tools like Anthropic Desktop
|
|
122
|
+
or Cursor.
|
|
123
|
+
|
|
124
|
+
So basically, it gives a unified way to use the shell, Python functions, and MCP tools.
|
|
105
125
|
|
|
106
126
|
It’s new and still has some rough edges, but it’s now working well enough it is feeling
|
|
107
127
|
quite powerful. It now serves as a replacement for my usual shell (previously bash or
|
|
@@ -160,10 +180,10 @@ quick to install via uv.
|
|
|
160
180
|
- **Support for any API:** Kash is tool agnostic and runs locally, on file inputs in
|
|
161
181
|
simple formats, so you own and manage your data and workspaces however you like.
|
|
162
182
|
You can use it with any models or APIs you like, and is already set up to use the APIs
|
|
163
|
-
of **OpenAI GPT-
|
|
164
|
-
Grok**, **Mistral**, **Groq (Llama, Qwen, Deepseek)** (via
|
|
165
|
-
**Perplexity**, **Firecrawl**, **Exa**, and any Python
|
|
166
|
-
There is also some experimental support for **LlamaIndex** and **ChromaDB**.
|
|
183
|
+
of **OpenAI** (GPT-5 is now the default model), **Anthropic Claude**, **Google
|
|
184
|
+
Gemini**, **xAI Grok**, **Mistral**, **Groq (Llama, Qwen, Deepseek)** (via
|
|
185
|
+
**LiteLLM**), **Deepgram**, **Perplexity**, **Firecrawl**, **Exa**, and any Python
|
|
186
|
+
libraries. There is also some experimental support for **LlamaIndex** and **ChromaDB**.
|
|
167
187
|
|
|
168
188
|
- **MCP support:** Finally, an action is also an **MCP tool server** so you can use it
|
|
169
189
|
in any MCP client, like Anthropic Desktop or Cursor.
|
|
@@ -198,17 +218,6 @@ I’ve separately built a new desktop terminal app, Kerm, which adds support for
|
|
|
198
218
|
the terminal. Because Kash supports these codes, as this develops you will get the
|
|
199
219
|
visuals of a web app layered on the flexibility of a text-based terminal.
|
|
200
220
|
|
|
201
|
-
### Is Kash Mature?
|
|
202
|
-
|
|
203
|
-
It’s the result of a couple months of coding and experimentation, and it’s still in
|
|
204
|
-
progress and has rough edges.
|
|
205
|
-
Please help me make it better by sharing your ideas and feedback!
|
|
206
|
-
It’s easiest to DM me at [twitter.com/ojoshe](https://x.com/ojoshe).
|
|
207
|
-
My contact info is at [github.com/jlevy](https://github.com/jlevy).
|
|
208
|
-
|
|
209
|
-
[**Please follow or DM me**](https://x.com/ojoshe) for future updates or if you have
|
|
210
|
-
ideas, feedback, or use cases for Kash!
|
|
211
|
-
|
|
212
221
|
## Installation
|
|
213
222
|
|
|
214
223
|
### Running the Kash Shell
|
|
@@ -271,8 +280,8 @@ These are for `kash-media` but you can use a `kash-shell` for a more basic setup
|
|
|
271
280
|
|
|
272
281
|
```shell
|
|
273
282
|
sudo apt-get update
|
|
274
|
-
sudo apt-get install -y libgl1 ffmpeg libmagic-dev
|
|
275
|
-
#
|
|
283
|
+
sudo apt-get install -y libgl1 ffmpeg libmagic-dev imagemagick bat ripgrep hexyl
|
|
284
|
+
# Or for more additional command-line tools, pixi is better on Ubuntu:
|
|
276
285
|
curl -fsSL https://pixi.sh/install.sh | sh
|
|
277
286
|
. ~/.bashrc
|
|
278
287
|
pixi global install ripgrep bat eza hexyl imagemagick zoxide
|
|
@@ -7,6 +7,19 @@ src="https://github.com/user-attachments/assets/a5d62ae4-17e6-46bb-a9cb-3b6ec8d8
|
|
|
7
7
|
|
|
8
8
|
</div>
|
|
9
9
|
|
|
10
|
+
## Hello!
|
|
11
|
+
|
|
12
|
+
If you’re seeing this, you there’s a good chance I shared it with you for feedback.
|
|
13
|
+
Thank you for checking out Kash.
|
|
14
|
+
|
|
15
|
+
It’s new, the result of some experimentation over the past few months.
|
|
16
|
+
I like a lot of things about it but it isn’t mature and I’d love your help to make it
|
|
17
|
+
more usable. If you try it please **let me know** what works and what doesn’t work.
|
|
18
|
+
Or if you just don’t get it, where you lost interest or got stuck.
|
|
19
|
+
My contact info is at [github.com/jlevy](https://github.com/jlevy) or [follow or DM
|
|
20
|
+
me](https://x.com/ojoshe) (I’m fastest on Twitter DMs).
|
|
21
|
+
Thank you. :)
|
|
22
|
+
|
|
10
23
|
## What is Kash?
|
|
11
24
|
|
|
12
25
|
> “*Simple should be simple.
|
|
@@ -21,9 +34,15 @@ It operates on “items” such as URLs, files, or Markdown notes within a works
|
|
|
21
34
|
directory.
|
|
22
35
|
|
|
23
36
|
You can use Kash as an **interactive, AI-native command-line** shell for practical
|
|
24
|
-
knowledge tasks.
|
|
25
|
-
|
|
26
|
-
|
|
37
|
+
knowledge tasks.
|
|
38
|
+
|
|
39
|
+
But it’s actually not just a shell, and you can skip the shell entirely.
|
|
40
|
+
It’s really simply **a Python library** that lets you convert a simple Python function
|
|
41
|
+
into “actions” that work in a clean way on plain files in a workspace.
|
|
42
|
+
An action is also an MCP tool, so it integrates with other tools like Anthropic Desktop
|
|
43
|
+
or Cursor.
|
|
44
|
+
|
|
45
|
+
So basically, it gives a unified way to use the shell, Python functions, and MCP tools.
|
|
27
46
|
|
|
28
47
|
It’s new and still has some rough edges, but it’s now working well enough it is feeling
|
|
29
48
|
quite powerful. It now serves as a replacement for my usual shell (previously bash or
|
|
@@ -82,10 +101,10 @@ quick to install via uv.
|
|
|
82
101
|
- **Support for any API:** Kash is tool agnostic and runs locally, on file inputs in
|
|
83
102
|
simple formats, so you own and manage your data and workspaces however you like.
|
|
84
103
|
You can use it with any models or APIs you like, and is already set up to use the APIs
|
|
85
|
-
of **OpenAI GPT-
|
|
86
|
-
Grok**, **Mistral**, **Groq (Llama, Qwen, Deepseek)** (via
|
|
87
|
-
**Perplexity**, **Firecrawl**, **Exa**, and any Python
|
|
88
|
-
There is also some experimental support for **LlamaIndex** and **ChromaDB**.
|
|
104
|
+
of **OpenAI** (GPT-5 is now the default model), **Anthropic Claude**, **Google
|
|
105
|
+
Gemini**, **xAI Grok**, **Mistral**, **Groq (Llama, Qwen, Deepseek)** (via
|
|
106
|
+
**LiteLLM**), **Deepgram**, **Perplexity**, **Firecrawl**, **Exa**, and any Python
|
|
107
|
+
libraries. There is also some experimental support for **LlamaIndex** and **ChromaDB**.
|
|
89
108
|
|
|
90
109
|
- **MCP support:** Finally, an action is also an **MCP tool server** so you can use it
|
|
91
110
|
in any MCP client, like Anthropic Desktop or Cursor.
|
|
@@ -120,17 +139,6 @@ I’ve separately built a new desktop terminal app, Kerm, which adds support for
|
|
|
120
139
|
the terminal. Because Kash supports these codes, as this develops you will get the
|
|
121
140
|
visuals of a web app layered on the flexibility of a text-based terminal.
|
|
122
141
|
|
|
123
|
-
### Is Kash Mature?
|
|
124
|
-
|
|
125
|
-
It’s the result of a couple months of coding and experimentation, and it’s still in
|
|
126
|
-
progress and has rough edges.
|
|
127
|
-
Please help me make it better by sharing your ideas and feedback!
|
|
128
|
-
It’s easiest to DM me at [twitter.com/ojoshe](https://x.com/ojoshe).
|
|
129
|
-
My contact info is at [github.com/jlevy](https://github.com/jlevy).
|
|
130
|
-
|
|
131
|
-
[**Please follow or DM me**](https://x.com/ojoshe) for future updates or if you have
|
|
132
|
-
ideas, feedback, or use cases for Kash!
|
|
133
|
-
|
|
134
142
|
## Installation
|
|
135
143
|
|
|
136
144
|
### Running the Kash Shell
|
|
@@ -193,8 +201,8 @@ These are for `kash-media` but you can use a `kash-shell` for a more basic setup
|
|
|
193
201
|
|
|
194
202
|
```shell
|
|
195
203
|
sudo apt-get update
|
|
196
|
-
sudo apt-get install -y libgl1 ffmpeg libmagic-dev
|
|
197
|
-
#
|
|
204
|
+
sudo apt-get install -y libgl1 ffmpeg libmagic-dev imagemagick bat ripgrep hexyl
|
|
205
|
+
# Or for more additional command-line tools, pixi is better on Ubuntu:
|
|
198
206
|
curl -fsSL https://pixi.sh/install.sh | sh
|
|
199
207
|
. ~/.bashrc
|
|
200
208
|
pixi global install ripgrep bat eza hexyl imagemagick zoxide
|
|
@@ -44,11 +44,11 @@ dependencies = [
|
|
|
44
44
|
# My tools:
|
|
45
45
|
"strif>=3.0.1",
|
|
46
46
|
"funlog>=0.2.0",
|
|
47
|
-
"prettyfmt>=0.
|
|
48
|
-
"flowmark>=0.5.
|
|
49
|
-
"frontmatter-format>=0.2.
|
|
50
|
-
"sidematter-format>=0.0.
|
|
51
|
-
"chopdiff>=0.2.
|
|
47
|
+
"prettyfmt>=0.4.1",
|
|
48
|
+
"flowmark>=0.5.3",
|
|
49
|
+
"frontmatter-format>=0.2.3",
|
|
50
|
+
"sidematter-format>=0.0.5",
|
|
51
|
+
"chopdiff>=0.2.5",
|
|
52
52
|
"clideps>=0.1.4",
|
|
53
53
|
"tminify>=0.1.6",
|
|
54
54
|
# Shell and file essentials:
|
|
@@ -89,6 +89,7 @@ dependencies = [
|
|
|
89
89
|
"pyrate-limiter>=3.7.0",
|
|
90
90
|
"aiolimiter>=1.2.1",
|
|
91
91
|
# Basic text handling and web scraping:
|
|
92
|
+
"selectolax>=0.3.32",
|
|
92
93
|
"readabilipy>=0.3.0",
|
|
93
94
|
"markdownify>=0.13.1",
|
|
94
95
|
"justext>=3.0.2",
|
|
@@ -130,7 +131,10 @@ kash-mcp = "kash.mcp.mcp_cli:main"
|
|
|
130
131
|
[tool.uv.sources]
|
|
131
132
|
# For local development:
|
|
132
133
|
# clideps = { path = "../clideps", editable = true }
|
|
133
|
-
# tminify = { path = "
|
|
134
|
+
# tminify = { path = "../tminify", editable = true }
|
|
135
|
+
# chopdiff = { path = "../chopdiff", editable = true }
|
|
136
|
+
# sidematter-format = { path = "../sidematter-format", editable = true }
|
|
137
|
+
# frontmatter-format = { path = "../frontmatter-format", editable = true }
|
|
134
138
|
|
|
135
139
|
# ---- Build system ----
|
|
136
140
|
|
|
@@ -150,7 +154,7 @@ source = "uv-dynamic-versioning"
|
|
|
150
154
|
[tool.uv-dynamic-versioning]
|
|
151
155
|
vcs = "git"
|
|
152
156
|
style = "pep440"
|
|
153
|
-
bump =
|
|
157
|
+
bump = true
|
|
154
158
|
|
|
155
159
|
# Explicitly configure top-level namespace for hatch.
|
|
156
160
|
[tool.hatch.build.targets.wheel]
|
|
@@ -5,7 +5,6 @@ from kash.exec import kash_action
|
|
|
5
5
|
from kash.exec.preconditions import has_html_body, is_url_resource
|
|
6
6
|
from kash.exec.runtime_settings import current_runtime_settings
|
|
7
7
|
from kash.model import Format, Item
|
|
8
|
-
from kash.model.items_model import ItemType
|
|
9
8
|
from kash.utils.text_handling.markdown_utils import first_heading
|
|
10
9
|
from kash.utils.text_handling.markdownify_utils import markdownify_custom
|
|
11
10
|
from kash.web_content.file_cache_utils import get_url_html
|
|
@@ -14,7 +13,9 @@ from kash.web_content.web_extract_readabilipy import extract_text_readabilipy
|
|
|
14
13
|
log = get_logger(__name__)
|
|
15
14
|
|
|
16
15
|
|
|
17
|
-
@kash_action(
|
|
16
|
+
@kash_action(
|
|
17
|
+
precondition=is_url_resource | has_html_body, output_format=Format.markdown, mcp_tool=True
|
|
18
|
+
)
|
|
18
19
|
def markdownify_html(item: Item) -> Item:
|
|
19
20
|
"""
|
|
20
21
|
Converts raw HTML or the URL of an HTML page to Markdown, fetching with the content
|
|
@@ -36,7 +37,5 @@ def markdownify_html(item: Item) -> Item:
|
|
|
36
37
|
# Insert a h1 at the top of the document
|
|
37
38
|
markdown_content = f"# {title}\n\n{markdown_content}"
|
|
38
39
|
|
|
39
|
-
output_item = item.derived_copy(
|
|
40
|
-
type=ItemType.doc, format=Format.markdown, body=markdown_content
|
|
41
|
-
)
|
|
40
|
+
output_item = item.derived_copy(format=Format.markdown, body=markdown_content)
|
|
42
41
|
return output_item
|
|
@@ -14,13 +14,12 @@ from kash.workspaces.workspaces import current_ws
|
|
|
14
14
|
)
|
|
15
15
|
def minify_html(item: Item) -> Item:
|
|
16
16
|
"""
|
|
17
|
-
Minify an HTML item's content using [
|
|
18
|
-
|
|
17
|
+
Minify an HTML item's content using [tminify](https://github.com/jlevy/tminify).
|
|
19
18
|
Also supports Tailwind CSS v4 compilation and inlining, if any Tailwind
|
|
20
19
|
CSS v4 CDN script tags are found.
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
[minify-html](https://github.com/wilsonzlin/minify-html).
|
|
21
|
+
Tminify uses [html-minifier-terser](https://github.com/terser/html-minifier-terser).
|
|
22
|
+
This is a bit slower but more robust than [minify-html](https://github.com/wilsonzlin/minify-html).
|
|
24
23
|
"""
|
|
25
24
|
from tminify.main import tminify
|
|
26
25
|
|
|
@@ -31,7 +30,7 @@ def minify_html(item: Item) -> Item:
|
|
|
31
30
|
input_path = ws.base_dir / item.store_path
|
|
32
31
|
|
|
33
32
|
output_item = item.derived_copy(format=Format.html, body=None)
|
|
34
|
-
output_path = ws.
|
|
33
|
+
output_path = ws.assign_store_path(output_item)
|
|
35
34
|
|
|
36
35
|
tminify(input_path, output_path)
|
|
37
36
|
|
|
@@ -9,10 +9,7 @@ from kash.web_content.web_extract_readabilipy import extract_text_readabilipy
|
|
|
9
9
|
log = get_logger(__name__)
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
@kash_action(
|
|
13
|
-
precondition=is_url_resource | has_html_body,
|
|
14
|
-
mcp_tool=True,
|
|
15
|
-
)
|
|
12
|
+
@kash_action(precondition=is_url_resource | has_html_body, output_format=Format.html)
|
|
16
13
|
def readability(item: Item) -> Item:
|
|
17
14
|
"""
|
|
18
15
|
Extracts clean HTML from a raw HTML item.
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
from kash.actions.core.tabbed_webpage_config import tabbed_webpage_config
|
|
2
2
|
from kash.actions.core.tabbed_webpage_generate import tabbed_webpage_generate
|
|
3
|
+
from kash.config.logger import get_logger
|
|
3
4
|
from kash.exec import kash_action
|
|
4
5
|
from kash.exec.preconditions import has_fullpage_html_body, has_html_body, has_simple_text_body
|
|
5
6
|
from kash.exec_model.args_model import ONE_OR_MORE_ARGS
|
|
6
7
|
from kash.model import ActionInput, ActionResult, Param
|
|
7
8
|
from kash.model.items_model import ItemType
|
|
8
9
|
from kash.utils.file_utils.file_formats_model import Format
|
|
9
|
-
from kash.web_gen.
|
|
10
|
+
from kash.web_gen.webpage_render import render_item_as_html
|
|
11
|
+
|
|
12
|
+
log = get_logger(__name__)
|
|
10
13
|
|
|
11
14
|
|
|
12
15
|
@kash_action(
|
|
13
16
|
expected_args=ONE_OR_MORE_ARGS,
|
|
14
17
|
precondition=(has_html_body | has_simple_text_body) & ~has_fullpage_html_body,
|
|
18
|
+
output_format=Format.html,
|
|
15
19
|
params=(Param("no_title", "Don't add a title to the page body.", type=bool),),
|
|
16
20
|
)
|
|
17
21
|
def render_as_html(input: ActionInput, no_title: bool = False) -> ActionResult:
|
|
@@ -27,12 +31,11 @@ def render_as_html(input: ActionInput, no_title: bool = False) -> ActionResult:
|
|
|
27
31
|
"""
|
|
28
32
|
if len(input.items) == 1:
|
|
29
33
|
input_item = input.items[0]
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
result_item = input_item
|
|
34
|
-
|
|
35
|
-
)
|
|
34
|
+
|
|
35
|
+
result_item = input_item.derived_copy(type=ItemType.export, format=Format.html)
|
|
36
|
+
|
|
37
|
+
result_item = render_item_as_html(input_item, result_item, add_title_h1=not no_title)
|
|
38
|
+
|
|
36
39
|
return ActionResult([result_item])
|
|
37
40
|
else:
|
|
38
41
|
config_result = tabbed_webpage_config(input)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from prettyfmt import fmt_lines
|
|
2
|
+
from sidematter_format import Sidematter
|
|
3
|
+
|
|
4
|
+
from kash.config.logger import get_logger
|
|
5
|
+
from kash.exec import kash_action
|
|
6
|
+
from kash.exec_model.args_model import ONE_OR_MORE_ARGS
|
|
7
|
+
from kash.model.actions_model import ActionInput, ActionResult
|
|
8
|
+
from kash.workspaces.workspaces import current_ws
|
|
9
|
+
|
|
10
|
+
log = get_logger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@kash_action(expected_args=ONE_OR_MORE_ARGS)
|
|
14
|
+
def save_sidematter_meta(input: ActionInput) -> ActionResult:
|
|
15
|
+
"""
|
|
16
|
+
Write the item's metadata as a [sidematter format](https://github.com/jlevy/sidematter-format)
|
|
17
|
+
as `.meta.yml` and `.meta.json` files.
|
|
18
|
+
|
|
19
|
+
If additional data items are provided, their data is merged into the primary item's metadata.
|
|
20
|
+
This is useful for link data etc.
|
|
21
|
+
"""
|
|
22
|
+
items = input.items
|
|
23
|
+
assert items
|
|
24
|
+
|
|
25
|
+
primary = items[0]
|
|
26
|
+
assert primary.store_path
|
|
27
|
+
|
|
28
|
+
ws = current_ws()
|
|
29
|
+
sm = Sidematter(ws.base_dir / primary.store_path)
|
|
30
|
+
|
|
31
|
+
metadata_dict = primary.metadata()
|
|
32
|
+
|
|
33
|
+
for item in items[1:]:
|
|
34
|
+
assert item.store_path
|
|
35
|
+
metadata_dict = metadata_dict | item.read_as_data()
|
|
36
|
+
|
|
37
|
+
# Write both JSON and YAML sidematter metadata
|
|
38
|
+
sm.write_meta(metadata_dict, formats="all", make_parents=True)
|
|
39
|
+
|
|
40
|
+
log.message(
|
|
41
|
+
"Wrote sidematter metadata:\n%s",
|
|
42
|
+
fmt_lines(
|
|
43
|
+
[sm.meta_json_path.relative_to(ws.base_dir), sm.meta_yaml_path.relative_to(ws.base_dir)]
|
|
44
|
+
),
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
return ActionResult(items=[primary])
|
|
@@ -6,11 +6,13 @@ from kash.exec_model.args_model import ONE_OR_MORE_ARGS
|
|
|
6
6
|
from kash.exec_model.commands_model import Command
|
|
7
7
|
from kash.exec_model.shell_model import ShellResult
|
|
8
8
|
from kash.model import ActionInput, ActionResult
|
|
9
|
+
from kash.utils.file_utils.file_formats_model import Format
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
@kash_action(
|
|
12
13
|
expected_args=ONE_OR_MORE_ARGS,
|
|
13
14
|
precondition=(has_html_body | has_simple_text_body) & ~has_fullpage_html_body,
|
|
15
|
+
output_format=Format.html,
|
|
14
16
|
)
|
|
15
17
|
def show_webpage(input: ActionInput) -> ActionResult:
|
|
16
18
|
"""
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import zipfile
|
|
2
|
+
|
|
3
|
+
from sidematter_format import Sidematter
|
|
4
|
+
|
|
5
|
+
from kash.config.logger import get_logger
|
|
6
|
+
from kash.exec import kash_action
|
|
7
|
+
from kash.model.items_model import Item, ItemType
|
|
8
|
+
from kash.utils.file_utils.file_formats_model import Format
|
|
9
|
+
from kash.workspaces.workspaces import current_ws
|
|
10
|
+
|
|
11
|
+
log = get_logger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@kash_action()
|
|
15
|
+
def zip_sidematter(item: Item) -> Item:
|
|
16
|
+
"""
|
|
17
|
+
Zip all contents of the item, its sidematter metadata and items.
|
|
18
|
+
"""
|
|
19
|
+
assert item.store_path
|
|
20
|
+
ws = current_ws()
|
|
21
|
+
sm = Sidematter(ws.base_dir / item.store_path)
|
|
22
|
+
|
|
23
|
+
base_dir = sm.primary.parent
|
|
24
|
+
|
|
25
|
+
# Collect all files to include; store paths relative to the primary's directory
|
|
26
|
+
files_to_zip: list[tuple] = []
|
|
27
|
+
|
|
28
|
+
files_to_zip.append((sm.primary, sm.primary.relative_to(base_dir)))
|
|
29
|
+
if sm.meta_json_path.exists():
|
|
30
|
+
files_to_zip.append((sm.meta_json_path, sm.meta_json_path.relative_to(base_dir)))
|
|
31
|
+
if sm.meta_yaml_path.exists():
|
|
32
|
+
files_to_zip.append((sm.meta_yaml_path, sm.meta_yaml_path.relative_to(base_dir)))
|
|
33
|
+
if sm.assets_dir.exists():
|
|
34
|
+
for p in sm.assets_dir.rglob("*"):
|
|
35
|
+
if p.is_file():
|
|
36
|
+
files_to_zip.append((p, p.relative_to(base_dir)))
|
|
37
|
+
|
|
38
|
+
output_item = item.derived_copy(type=ItemType.export, format=Format.zip)
|
|
39
|
+
target = ws.assign_store_path(output_item)
|
|
40
|
+
|
|
41
|
+
with zipfile.ZipFile(
|
|
42
|
+
target, mode="w", compression=zipfile.ZIP_DEFLATED, compresslevel=9
|
|
43
|
+
) as zipf:
|
|
44
|
+
for path, arcname in files_to_zip:
|
|
45
|
+
zipf.write(path, arcname)
|
|
46
|
+
|
|
47
|
+
return output_item
|
|
@@ -33,7 +33,8 @@ def clipboard_copy(path: str | None = None, raw: bool = False) -> None:
|
|
|
33
33
|
Copy the contents of a file (or the first file in the selection) to the OS-native
|
|
34
34
|
clipboard. Similar to `pbcopy` on macOS.
|
|
35
35
|
|
|
36
|
-
:
|
|
36
|
+
Args:
|
|
37
|
+
raw: Copy the full exact contents of the file. Otherwise frontmatter is omitted.
|
|
37
38
|
"""
|
|
38
39
|
# TODO: Get this to work for images!
|
|
39
40
|
import pyperclip
|
|
@@ -95,7 +96,8 @@ def edit(path: str | None = None, all: bool = False) -> None:
|
|
|
95
96
|
"""
|
|
96
97
|
Edit the contents of a file using the user's default editor (or defaulting to nano).
|
|
97
98
|
|
|
98
|
-
:
|
|
99
|
+
Args:
|
|
100
|
+
all: Normally edits only the first file given. This passes all files to the editor.
|
|
99
101
|
"""
|
|
100
102
|
input_paths = assemble_path_args(path)
|
|
101
103
|
if not all:
|
|
@@ -111,8 +113,9 @@ def file_info(*paths: str, size_summary: bool = False, format: bool = False) ->
|
|
|
111
113
|
structure of the items at the given paths (for text documents) and the detected
|
|
112
114
|
mime type.
|
|
113
115
|
|
|
114
|
-
:
|
|
115
|
-
|
|
116
|
+
Args:
|
|
117
|
+
size_summary: Only show size summary (words, sentences, paragraphs for a text document).
|
|
118
|
+
format: Only show detected file format.
|
|
116
119
|
"""
|
|
117
120
|
if not size_summary and not format:
|
|
118
121
|
size_summary = format = True
|
|
@@ -57,8 +57,9 @@ def diff_items(*paths: str, force: bool = False) -> ShellResult:
|
|
|
57
57
|
as items themselves, so this works on items. Items are imported as usual into the
|
|
58
58
|
global workspace if they are not already in the store.
|
|
59
59
|
|
|
60
|
-
:
|
|
61
|
-
|
|
60
|
+
Args:
|
|
61
|
+
stat: Only show the diffstat summary.
|
|
62
|
+
force: If true, will run the diff even if the items are of different formats.
|
|
62
63
|
"""
|
|
63
64
|
ws = current_ws()
|
|
64
65
|
if len(paths) == 2:
|
|
@@ -90,8 +91,9 @@ def diff_files(*paths: str, diffstat: bool = False, save: bool = False) -> Shell
|
|
|
90
91
|
Show the unified diff between the given files. This works on any files, not
|
|
91
92
|
just items, so helpful for quick analysis without importing the files.
|
|
92
93
|
|
|
93
|
-
:
|
|
94
|
-
|
|
94
|
+
Args:
|
|
95
|
+
diffstat: Only show the diffstat summary.
|
|
96
|
+
save: Save the diff as an item in the store.
|
|
95
97
|
"""
|
|
96
98
|
if len(paths) == 2:
|
|
97
99
|
[path1, path2] = paths
|
|
@@ -111,36 +111,37 @@ def files(
|
|
|
111
111
|
with limited depth and breadth, and more control over recursion, sorting,
|
|
112
112
|
and grouping.
|
|
113
113
|
|
|
114
|
-
:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
114
|
+
Args:
|
|
115
|
+
overview: Recurse a couple levels and show files, but not too many.
|
|
116
|
+
Same as `--groupby=parent --depth=2 --max_per_group=100 --omit_dirs`
|
|
117
|
+
except also scales down `max_per_group` to 25 or 50 if there are many files.
|
|
118
|
+
recent: Only shows the most recently modified files in each directory.
|
|
119
|
+
Same as `--sort=modified --reverse --groupby=parent --max_per_group=100`
|
|
120
|
+
except also scales down `max_per_group` to 25 or 50 if there are many files.
|
|
121
|
+
recursive: List all files recursively. Same as `--depth=-1`.
|
|
122
|
+
flat: Show files in a flat list, rather than grouped by parent directory.
|
|
123
|
+
Same as `--groupby=flat`.
|
|
124
|
+
omit_dirs: Normally directories are included. This option omits them,
|
|
125
|
+
which is useful when recursing into subdirectories.
|
|
126
|
+
depth: Maximum depth to recurse into directories. -1 means no limit.
|
|
127
|
+
max_files: Maximum number of files to yield per input path.
|
|
128
|
+
-1 means no limit.
|
|
129
|
+
max_per_subdir: Maximum number of files to yield per subdirectory
|
|
130
|
+
(not including the top level). -1 means no limit.
|
|
131
|
+
max_per_group: Limit the first number of items displayed per group
|
|
132
|
+
(if groupby is used) or in total. 0 means show all.
|
|
133
|
+
no_max: Disable limits on depth and number of files. Same as
|
|
134
|
+
`--depth=-1 --max_files=-1 --max_per_subdir=-1 --max_per_group=-1`.
|
|
135
|
+
no_ignore: Disable ignoring hidden files.
|
|
136
|
+
all: Same as `--no_ignore --no_max`. Does not change `--depth`.
|
|
137
|
+
save: Save the listing as a CSV file item.
|
|
138
|
+
sort: Sort by `filename`, `size`, `accessed`, `created`, or `modified`.
|
|
139
|
+
reverse: Reverse the sorting order.
|
|
140
|
+
since: Filter files modified since a given time (e.g., '1 day', '2 hours').
|
|
141
|
+
groupby: Group results. Can be `flat` (no grouping, and by default implies
|
|
142
|
+
recursive), `parent`, or `suffix`. Defaults to 'parent'.
|
|
143
|
+
iso_time: Show time in ISO format (default is human-readable age).
|
|
144
|
+
pager: Use the pager when displaying the output.
|
|
144
145
|
"""
|
|
145
146
|
if global_settings().use_nerd_icons:
|
|
146
147
|
from kash.shell.file_icons.nerd_icons import icon_for_file
|
|
@@ -160,8 +160,9 @@ def check_system_tools(warn_only: bool = False, brief: bool = False) -> None:
|
|
|
160
160
|
"""
|
|
161
161
|
Check that all tools are installed.
|
|
162
162
|
|
|
163
|
-
:
|
|
164
|
-
|
|
163
|
+
Args:
|
|
164
|
+
warn_only: Only warn if tools are missing.
|
|
165
|
+
brief: Print summary as a single line.
|
|
165
166
|
"""
|
|
166
167
|
if warn_only:
|
|
167
168
|
pkg_check().warn_if_missing()
|