kash-shell 0.3.35__tar.gz → 0.3.37__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. kash_shell-0.3.37/.claude/.gitignore +2 -0
  2. kash_shell-0.3.37/.claude/hooks/tbd-closing-reminder.sh +15 -0
  3. kash_shell-0.3.37/.claude/scripts/ensure-gh-cli.sh +88 -0
  4. kash_shell-0.3.37/.claude/scripts/tbd-session.sh +77 -0
  5. kash_shell-0.3.37/.claude/settings.json +47 -0
  6. kash_shell-0.3.37/.claude/skills/tbd/SKILL.md +254 -0
  7. {kash_shell-0.3.35 → kash_shell-0.3.37}/.copier-answers.yml +1 -1
  8. {kash_shell-0.3.35 → kash_shell-0.3.37}/.cursor/rules/general.mdc +11 -11
  9. {kash_shell-0.3.35 → kash_shell-0.3.37}/.cursor/rules/python.mdc +23 -8
  10. {kash_shell-0.3.35 → kash_shell-0.3.37}/.github/workflows/ci.yml +1 -1
  11. {kash_shell-0.3.35 → kash_shell-0.3.37}/.github/workflows/publish.yml +1 -1
  12. kash_shell-0.3.37/.tbd/.gitignore +18 -0
  13. kash_shell-0.3.37/.tbd/config.yml +89 -0
  14. {kash_shell-0.3.35 → kash_shell-0.3.37}/PKG-INFO +1 -1
  15. kash_shell-0.3.37/publishing.md +142 -0
  16. {kash_shell-0.3.35 → kash_shell-0.3.37}/pyproject.toml +0 -1
  17. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/llm_transforms.py +4 -0
  18. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/file_storage/file_store.py +4 -0
  19. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/llm_utils/llm_completion.py +115 -19
  20. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/llm_utils/llms.py +8 -7
  21. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/local_server/local_server_routes.py +2 -2
  22. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/media_base/transcription_deepgram.py +18 -24
  23. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/actions_model.py +7 -3
  24. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/assistant_response_model.py +2 -2
  25. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/items_model.py +8 -1
  26. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/params_model.py +4 -4
  27. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/file_icons/nerd_icons.py +2 -2
  28. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/output/kerm_codes.py +5 -5
  29. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/api_utils/cache_requests_limited.py +6 -6
  30. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_formats/chat_format.py +2 -2
  31. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/file_sort_filter.py +4 -4
  32. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/youtube_webpage.html.jinja +3 -2
  33. kash_shell-0.3.37/uv.lock +3672 -0
  34. kash_shell-0.3.35/publishing.md +0 -71
  35. kash_shell-0.3.35/uv.lock +0 -3120
  36. {kash_shell-0.3.35 → kash_shell-0.3.37}/.env.template +0 -0
  37. {kash_shell-0.3.35 → kash_shell-0.3.37}/.gitignore +0 -0
  38. {kash_shell-0.3.35 → kash_shell-0.3.37}/LICENSE +0 -0
  39. {kash_shell-0.3.35 → kash_shell-0.3.37}/Makefile +0 -0
  40. {kash_shell-0.3.35 → kash_shell-0.3.37}/README.md +0 -0
  41. {kash_shell-0.3.35 → kash_shell-0.3.37}/development.md +0 -0
  42. {kash_shell-0.3.35 → kash_shell-0.3.37}/devtools/generate_readme.xsh +0 -0
  43. {kash_shell-0.3.35 → kash_shell-0.3.37}/devtools/lint.py +0 -0
  44. {kash_shell-0.3.35 → kash_shell-0.3.37}/devtools/profile_main.py +0 -0
  45. {kash_shell-0.3.35 → kash_shell-0.3.37}/installation.md +0 -0
  46. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/__init__.py +0 -0
  47. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/__main__.py +0 -0
  48. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/__init__.py +0 -0
  49. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/assistant_chat.py +0 -0
  50. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/chat.py +0 -0
  51. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/combine_docs.py +0 -0
  52. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/concat_docs.py +0 -0
  53. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/format_markdown_template.py +0 -0
  54. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/markdownify_html.py +0 -0
  55. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/minify_html.py +0 -0
  56. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/readability.py +0 -0
  57. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/render_as_html.py +0 -0
  58. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/save_sidematter_meta.py +0 -0
  59. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/show_webpage.py +0 -0
  60. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/strip_html.py +0 -0
  61. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/summarize_as_bullets.py +0 -0
  62. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/tabbed_webpage_config.py +0 -0
  63. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/tabbed_webpage_generate.py +0 -0
  64. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/core/zip_sidematter.py +0 -0
  65. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/meta/write_instructions.py +0 -0
  66. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/actions/meta/write_new_action.py +0 -0
  67. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/__init__.py +0 -0
  68. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/basic_file_commands.py +0 -0
  69. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/browser_commands.py +0 -0
  70. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/debug_commands.py +0 -0
  71. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/diff_commands.py +0 -0
  72. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/files_command.py +0 -0
  73. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/general_commands.py +0 -0
  74. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/logs_commands.py +0 -0
  75. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/model_commands.py +0 -0
  76. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/reformat_command.py +0 -0
  77. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/search_command.py +0 -0
  78. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/base/show_command.py +0 -0
  79. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/extras/parse_uv_lock.py +0 -0
  80. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/extras/utils_commands.py +0 -0
  81. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/help/assistant_commands.py +0 -0
  82. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/help/doc_commands.py +0 -0
  83. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/help/help_commands.py +0 -0
  84. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/help/logo.py +0 -0
  85. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/help/welcome.py +0 -0
  86. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/workspace/selection_commands.py +0 -0
  87. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/commands/workspace/workspace_commands.py +0 -0
  88. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/__init__.py +0 -0
  89. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/capture_output.py +0 -0
  90. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/colors.py +0 -0
  91. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/env_settings.py +0 -0
  92. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/init.py +0 -0
  93. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/lazy_imports.py +0 -0
  94. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/logger.py +0 -0
  95. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/logger_basic.py +0 -0
  96. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/logo.txt +0 -0
  97. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/server_config.py +0 -0
  98. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/settings.py +0 -0
  99. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/setup.py +0 -0
  100. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/suppress_warnings.py +0 -0
  101. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/text_styles.py +0 -0
  102. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/unified_live.py +0 -0
  103. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/config/warm_slow_imports.py +0 -0
  104. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/__init__.py +0 -0
  105. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/all_docs.py +0 -0
  106. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/load_actions_info.py +0 -0
  107. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/load_api_docs.py +0 -0
  108. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/load_help_topics.py +0 -0
  109. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/load_source_code.py +0 -0
  110. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/api_docs_template.md +0 -0
  111. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/assistant_instructions_template.md +0 -0
  112. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/readme_template.md +0 -0
  113. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/topics/a1_what_is_kash.md +0 -0
  114. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/topics/a2_installation.md +0 -0
  115. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/topics/a3_getting_started.md +0 -0
  116. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/topics/a4_elements.md +0 -0
  117. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/topics/a5_tips_for_use_with_other_tools.md +0 -0
  118. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/topics/b0_philosophy_of_kash.md +0 -0
  119. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/topics/b1_kash_overview.md +0 -0
  120. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/topics/b2_workspace_and_file_formats.md +0 -0
  121. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/topics/b3_modern_shell_tool_recommendations.md +0 -0
  122. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/topics/b4_faq.md +0 -0
  123. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/warning.md +0 -0
  124. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs/markdown/welcome.md +0 -0
  125. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs_base/docs_base.py +0 -0
  126. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs_base/load_custom_command_info.py +0 -0
  127. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs_base/load_faqs.py +0 -0
  128. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs_base/load_recipe_snippets.py +0 -0
  129. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs_base/recipes/general_system_commands.sh +0 -0
  130. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs_base/recipes/python_dev_commands.sh +0 -0
  131. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/docs_base/recipes/tldr_standard_commands.sh +0 -0
  132. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/embeddings/cosine.py +0 -0
  133. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/embeddings/embeddings.py +0 -0
  134. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/embeddings/text_similarity.py +0 -0
  135. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/__init__.py +0 -0
  136. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/action_decorators.py +0 -0
  137. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/action_exec.py +0 -0
  138. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/action_registry.py +0 -0
  139. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/combiners.py +0 -0
  140. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/command_exec.py +0 -0
  141. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/command_registry.py +0 -0
  142. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/fetch_url_items.py +0 -0
  143. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/history.py +0 -0
  144. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/importing.py +0 -0
  145. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/precondition_checks.py +0 -0
  146. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/precondition_registry.py +0 -0
  147. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/preconditions.py +0 -0
  148. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/resolve_args.py +0 -0
  149. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/runtime_settings.py +0 -0
  150. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec/shell_callable_action.py +0 -0
  151. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec_model/__init__.py +0 -0
  152. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec_model/args_model.py +0 -0
  153. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec_model/commands_model.py +0 -0
  154. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec_model/script_model.py +0 -0
  155. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/exec_model/shell_model.py +0 -0
  156. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/file_storage/__init__.py +0 -0
  157. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/file_storage/item_file_format.py +0 -0
  158. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/file_storage/item_id_index.py +0 -0
  159. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/file_storage/metadata_dirs.py +0 -0
  160. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/file_storage/persisted_yaml.py +0 -0
  161. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/file_storage/store_cache_warmer.py +0 -0
  162. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/file_storage/store_filenames.py +0 -0
  163. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/__init__.py +0 -0
  164. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/assistant.py +0 -0
  165. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/assistant_instructions.py +0 -0
  166. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/assistant_output.py +0 -0
  167. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/function_param_info.py +0 -0
  168. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/help_embeddings.py +0 -0
  169. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/help_lookups.py +0 -0
  170. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/help_pages.py +0 -0
  171. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/help_printing.py +0 -0
  172. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/help_types.py +0 -0
  173. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/recommended_commands.py +0 -0
  174. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/help/tldr_help.py +0 -0
  175. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/llm_utils/__init__.py +0 -0
  176. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/llm_utils/clean_headings.py +0 -0
  177. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/llm_utils/custom_sliding_transforms.py +0 -0
  178. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/llm_utils/fuzzy_parsing.py +0 -0
  179. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/llm_utils/init_litellm.py +0 -0
  180. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/llm_utils/llm_api_keys.py +0 -0
  181. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/llm_utils/llm_messages.py +0 -0
  182. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/llm_utils/llm_names.py +0 -0
  183. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/local_server/__init__.py +0 -0
  184. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/local_server/local_server.py +0 -0
  185. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/local_server/local_server_commands.py +0 -0
  186. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/local_server/local_url_formatters.py +0 -0
  187. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/local_server/port_tools.py +0 -0
  188. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/local_server/rich_html_template.py +0 -0
  189. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/mcp/__init__.py +0 -0
  190. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/mcp/mcp_cli.py +0 -0
  191. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/mcp/mcp_main.py +0 -0
  192. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/mcp/mcp_server_commands.py +0 -0
  193. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/mcp/mcp_server_routes.py +0 -0
  194. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/mcp/mcp_server_sse.py +0 -0
  195. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/mcp/mcp_server_stdio.py +0 -0
  196. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/media_base/__init__.py +0 -0
  197. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/media_base/audio_processing.py +0 -0
  198. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/media_base/media_cache.py +0 -0
  199. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/media_base/media_services.py +0 -0
  200. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/media_base/media_tools.py +0 -0
  201. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/media_base/services/local_file_media.py +0 -0
  202. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/media_base/timestamp_citations.py +0 -0
  203. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/media_base/transcription_format.py +0 -0
  204. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/media_base/transcription_whisper.py +0 -0
  205. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/__init__.py +0 -0
  206. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/compound_actions_model.py +0 -0
  207. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/concept_model.py +0 -0
  208. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/exec_model.py +0 -0
  209. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/graph_model.py +0 -0
  210. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/language_list.py +0 -0
  211. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/llm_actions_model.py +0 -0
  212. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/media_model.py +0 -0
  213. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/operations_model.py +0 -0
  214. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/paths_model.py +0 -0
  215. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/model/preconditions_model.py +0 -0
  216. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/__init__.py +0 -0
  217. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/completions/completion_scoring.py +0 -0
  218. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/completions/completion_types.py +0 -0
  219. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/completions/shell_completions.py +0 -0
  220. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/file_icons/color_for_format.py +0 -0
  221. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/input/__init__.py +0 -0
  222. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/input/input_prompts.py +0 -0
  223. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/input/inquirer_settings.py +0 -0
  224. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/input/param_inputs.py +0 -0
  225. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/input/shell_confirm.py +0 -0
  226. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/output/__init__.py +0 -0
  227. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/output/kerm_code_utils.py +0 -0
  228. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/output/kmarkdown.py +0 -0
  229. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/output/shell_formatting.py +0 -0
  230. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/output/shell_output.py +0 -0
  231. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/shell_main.py +0 -0
  232. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/ui/__init__.py +0 -0
  233. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/ui/shell_results.py +0 -0
  234. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/ui/shell_syntax.py +0 -0
  235. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/utils/exception_printing.py +0 -0
  236. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/utils/native_utils.py +0 -0
  237. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/utils/shell_function_wrapper.py +0 -0
  238. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/shell/version.py +0 -0
  239. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/__init__.py +0 -0
  240. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/api_utils/api_retries.py +0 -0
  241. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/api_utils/gather_limited.py +0 -0
  242. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/api_utils/http_utils.py +0 -0
  243. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/api_utils/multitask_gather.py +0 -0
  244. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/api_utils/progress_protocol.py +0 -0
  245. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/__init__.py +0 -0
  246. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/format_utils.py +0 -0
  247. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/function_inspect.py +0 -0
  248. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/import_utils.py +0 -0
  249. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/lazyobject.py +0 -0
  250. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/obj_replace.py +0 -0
  251. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/parse_docstring.py +0 -0
  252. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/parse_key_vals.py +0 -0
  253. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/parse_shell_args.py +0 -0
  254. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/s3_utils.py +0 -0
  255. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/stack_traces.py +0 -0
  256. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/task_stack.py +0 -0
  257. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/testing.py +0 -0
  258. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/type_utils.py +0 -0
  259. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/uniquifier.py +0 -0
  260. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/url.py +0 -0
  261. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/common/url_slice.py +0 -0
  262. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/errors.py +0 -0
  263. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/__init__.py +0 -0
  264. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/csv_utils.py +0 -0
  265. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/dir_info.py +0 -0
  266. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/file_ext.py +0 -0
  267. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/file_formats.py +0 -0
  268. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/file_formats_model.py +0 -0
  269. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/file_walk.py +0 -0
  270. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/filename_parsing.py +0 -0
  271. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/ignore_files.py +0 -0
  272. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/mtime_cache.py +0 -0
  273. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/file_utils/path_utils.py +0 -0
  274. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/lang_utils/__init__.py +0 -0
  275. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/lang_utils/capitalization.py +0 -0
  276. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/rich_custom/__init__.py +0 -0
  277. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/rich_custom/ansi_cell_len.py +0 -0
  278. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/rich_custom/multitask_status.py +0 -0
  279. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/rich_custom/rich_char_transform.py +0 -0
  280. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/rich_custom/rich_indent.py +0 -0
  281. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/rich_custom/rich_markdown_fork.py +0 -0
  282. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/text_handling/doc_normalization.py +0 -0
  283. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/text_handling/escape_html_tags.py +0 -0
  284. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/text_handling/markdown_footnotes.py +0 -0
  285. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/text_handling/markdown_render.py +0 -0
  286. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/text_handling/markdown_utils.py +0 -0
  287. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/text_handling/markdownify_utils.py +0 -0
  288. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/utils/text_handling/unified_diffs.py +0 -0
  289. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_content/canon_url.py +0 -0
  290. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_content/dir_store.py +0 -0
  291. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_content/file_cache_utils.py +0 -0
  292. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_content/file_processing.py +0 -0
  293. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_content/local_file_cache.py +0 -0
  294. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_content/web_extract.py +0 -0
  295. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_content/web_extract_justext.py +0 -0
  296. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_content/web_extract_readabilipy.py +0 -0
  297. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_content/web_fetch.py +0 -0
  298. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_content/web_page_model.py +0 -0
  299. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/__init__.py +0 -0
  300. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/tabbed_webpage.py +0 -0
  301. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/template_render.py +0 -0
  302. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/base_styles.css.jinja +0 -0
  303. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/base_webpage.html.jinja +0 -0
  304. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/components/toc_scripts.js.jinja +0 -0
  305. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/components/toc_styles.css.jinja +0 -0
  306. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/components/tooltip_scripts.js.jinja +0 -0
  307. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/components/tooltip_styles.css.jinja +0 -0
  308. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/components/youtube_popover_scripts.js.jinja +0 -0
  309. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/components/youtube_popover_styles.css.jinja +0 -0
  310. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/content_styles.css.jinja +0 -0
  311. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/explain_view.html.jinja +0 -0
  312. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/item_view.html.jinja +0 -0
  313. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/simple_webpage.html.jinja +0 -0
  314. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/templates/tabbed_webpage.html.jinja +0 -0
  315. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/web_gen/webpage_render.py +0 -0
  316. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/workspaces/__init__.py +0 -0
  317. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/workspaces/param_state.py +0 -0
  318. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/workspaces/selections.py +0 -0
  319. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/workspaces/source_items.py +0 -0
  320. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/workspaces/workspace_dirs.py +0 -0
  321. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/workspaces/workspace_output.py +0 -0
  322. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/workspaces/workspace_registry.py +0 -0
  323. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/workspaces/workspaces.py +0 -0
  324. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/command_nl_utils.py +0 -0
  325. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/custom_shell.py +0 -0
  326. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/customize_prompt.py +0 -0
  327. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/load_into_xonsh.py +0 -0
  328. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/shell_load_commands.py +0 -0
  329. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/shell_which.py +0 -0
  330. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/xonsh_completers.py +0 -0
  331. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/xonsh_env.py +0 -0
  332. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/xonsh_keybindings.py +0 -0
  333. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/xonsh_modern_tools.py +0 -0
  334. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xonsh_custom/xonsh_ranking_completer.py +0 -0
  335. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xontrib/fnm.py +0 -0
  336. {kash_shell-0.3.35 → kash_shell-0.3.37}/src/kash/xontrib/kash_extension.py +0 -0
  337. {kash_shell-0.3.35 → kash_shell-0.3.37}/tests/file_storage/test_file_store.py +0 -0
  338. {kash_shell-0.3.35 → kash_shell-0.3.37}/tests/kash/utils/api_utils/test_gather_limited.py +0 -0
  339. {kash_shell-0.3.35 → kash_shell-0.3.37}/tests/kash/utils/file_utils/test_csv_utils.py +0 -0
  340. {kash_shell-0.3.35 → kash_shell-0.3.37}/tests/kash/utils/rich_custom/test_multitask_status.py +0 -0
  341. {kash_shell-0.3.35 → kash_shell-0.3.37}/tests/model/test_item_serialization.py +0 -0
  342. {kash_shell-0.3.35 → kash_shell-0.3.37}/tests/shell/input/interactive_input_test.py +0 -0
  343. {kash_shell-0.3.35 → kash_shell-0.3.37}/tests/test_shell.py +0 -0
  344. {kash_shell-0.3.35 → kash_shell-0.3.37}/tests/utils/text_handling/test_markdown_footnotes.py +0 -0
  345. {kash_shell-0.3.35 → kash_shell-0.3.37}/tests/web_gen/test_social_metadata.py +0 -0
@@ -0,0 +1,2 @@
1
+ # Backup files
2
+ *.bak
@@ -0,0 +1,15 @@
1
+ #!/bin/bash
2
+ # Remind about close protocol after git push
3
+ # Installed by: tbd setup claude
4
+
5
+ input=$(cat)
6
+ command=$(echo "$input" | jq -r '.tool_input.command // empty')
7
+
8
+ # Check if this is a git push command and .tbd exists
9
+ if [[ "$command" == git\ push* ]] || [[ "$command" == *"&& git push"* ]] || [[ "$command" == *"; git push"* ]]; then
10
+ if [ -d ".tbd" ]; then
11
+ tbd closing
12
+ fi
13
+ fi
14
+
15
+ exit 0
@@ -0,0 +1,88 @@
1
+ #!/bin/bash
2
+ # Automated GitHub CLI setup for Claude Code sessions
3
+ # This script runs on SessionStart to ensure gh CLI is available and authenticated
4
+
5
+ set -e
6
+
7
+ # Add common binary locations to PATH
8
+ export PATH="$HOME/.local/bin:$HOME/bin:/usr/local/bin:$PATH"
9
+
10
+ # Check if gh is already installed
11
+ if command -v gh &> /dev/null; then
12
+ echo "[gh] CLI found at $(which gh)"
13
+ else
14
+ echo "[gh] CLI not found, installing..."
15
+
16
+ # Detect platform
17
+ OS=$(uname -s | tr '[:upper:]' '[:lower:]')
18
+ ARCH=$(uname -m)
19
+ [ "$ARCH" = "x86_64" ] && ARCH="amd64"
20
+ [ "$ARCH" = "aarch64" ] && ARCH="arm64"
21
+
22
+ echo "[gh] Detected platform: ${OS}_${ARCH}"
23
+
24
+ # Get latest version from GitHub API (with fallback)
25
+ GH_VERSION=$(curl -fsSL https://api.github.com/repos/cli/cli/releases/latest 2>/dev/null \
26
+ | grep -o '"tag_name": *"v[^"]*"' | head -1 | sed 's/.*"v\([^"]*\)".*/\1/')
27
+
28
+ # Fallback version if API fails
29
+ GH_VERSION=${GH_VERSION:-2.83.1}
30
+
31
+ echo "[gh] Version: ${GH_VERSION}"
32
+
33
+ # Build download URL based on platform
34
+ if [ "$OS" = "darwin" ]; then
35
+ DOWNLOAD_URL="https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_macOS_${ARCH}.zip"
36
+ ARCHIVE_EXT="zip"
37
+ else
38
+ DOWNLOAD_URL="https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_${OS}_${ARCH}.tar.gz"
39
+ ARCHIVE_EXT="tar.gz"
40
+ fi
41
+
42
+ echo "[gh] Downloading from ${DOWNLOAD_URL}..."
43
+
44
+ # Download
45
+ curl -fsSL -o "/tmp/gh.${ARCHIVE_EXT}" "$DOWNLOAD_URL"
46
+
47
+ # Extract based on archive type
48
+ if [ "$ARCHIVE_EXT" = "zip" ]; then
49
+ unzip -q "/tmp/gh.zip" -d /tmp
50
+ EXTRACT_DIR="/tmp/gh_${GH_VERSION}_macOS_${ARCH}"
51
+ else
52
+ tar -xzf "/tmp/gh.tar.gz" -C /tmp
53
+ EXTRACT_DIR="/tmp/gh_${GH_VERSION}_${OS}_${ARCH}"
54
+ fi
55
+
56
+ # Install to ~/.local/bin (works in cloud and local)
57
+ mkdir -p ~/.local/bin
58
+ cp "${EXTRACT_DIR}/bin/gh" ~/.local/bin/gh
59
+ chmod +x ~/.local/bin/gh
60
+
61
+ # Clean up
62
+ rm -rf "${EXTRACT_DIR}" "/tmp/gh.${ARCHIVE_EXT}"
63
+
64
+ echo "[gh] Installed to ~/.local/bin/gh"
65
+ fi
66
+
67
+ # Verify gh is now in PATH
68
+ if ! command -v gh &> /dev/null; then
69
+ echo "[gh] ERROR: gh CLI still not found in PATH after installation"
70
+ echo "[gh] Ensure ~/.local/bin is in your PATH"
71
+ exit 1
72
+ fi
73
+
74
+ # Check authentication status
75
+ if [ -n "$GH_TOKEN" ]; then
76
+ # GH_TOKEN is set, verify it works
77
+ if gh auth status &> /dev/null; then
78
+ echo "[gh] Authenticated successfully"
79
+ else
80
+ echo "[gh] WARNING: GH_TOKEN is set but authentication check failed"
81
+ echo "[gh] Token may be invalid or expired"
82
+ fi
83
+ else
84
+ echo "[gh] NOTE: GH_TOKEN not set - some operations may require authentication"
85
+ echo "[gh] See: docs/general/agent-setup/github-cli-setup.md"
86
+ fi
87
+
88
+ exit 0
@@ -0,0 +1,77 @@
1
+ #!/bin/bash
2
+ # Ensure tbd CLI is installed and run tbd prime for Claude Code sessions
3
+ # Installed by: tbd setup --auto
4
+ # This script runs on SessionStart and PreCompact
5
+
6
+ # Get npm global bin directory (if npm is available)
7
+ NPM_GLOBAL_BIN=""
8
+ if command -v npm &> /dev/null; then
9
+ NPM_PREFIX=$(npm config get prefix 2>/dev/null)
10
+ if [ -n "$NPM_PREFIX" ] && [ -d "$NPM_PREFIX/bin" ]; then
11
+ NPM_GLOBAL_BIN="$NPM_PREFIX/bin"
12
+ fi
13
+ fi
14
+
15
+ # Add common binary locations to PATH (persists for entire script)
16
+ # Include npm global bin if found
17
+ export PATH="$NPM_GLOBAL_BIN:$HOME/.local/bin:$HOME/bin:/usr/local/bin:$PATH"
18
+
19
+ # Function to ensure tbd is available
20
+ ensure_tbd() {
21
+ # Check if tbd is already installed
22
+ if command -v tbd &> /dev/null; then
23
+ return 0
24
+ fi
25
+
26
+ echo "[tbd] CLI not found, installing..."
27
+
28
+ # Try npm first (most common for Node.js tools)
29
+ if command -v npm &> /dev/null; then
30
+ echo "[tbd] Installing via npm..."
31
+ npm install -g get-tbd 2>/dev/null || {
32
+ # If global install fails (permissions), try local install
33
+ echo "[tbd] Global npm install failed, trying user install..."
34
+ mkdir -p ~/.local/bin
35
+ npm install --prefix ~/.local get-tbd
36
+ # Create symlink if needed
37
+ if [ -f ~/.local/node_modules/.bin/tbd ]; then
38
+ ln -sf ~/.local/node_modules/.bin/tbd ~/.local/bin/tbd
39
+ fi
40
+ }
41
+ elif command -v pnpm &> /dev/null; then
42
+ echo "[tbd] Installing via pnpm..."
43
+ pnpm add -g get-tbd
44
+ elif command -v yarn &> /dev/null; then
45
+ echo "[tbd] Installing via yarn..."
46
+ yarn global add get-tbd
47
+ else
48
+ echo "[tbd] ERROR: No package manager found (npm, pnpm, or yarn required)"
49
+ echo "[tbd] Please install Node.js and npm, then run: npm install -g get-tbd"
50
+ return 1
51
+ fi
52
+
53
+ # Verify installation
54
+ if command -v tbd &> /dev/null; then
55
+ echo "[tbd] Successfully installed to $(which tbd)"
56
+ return 0
57
+ else
58
+ echo "[tbd] WARNING: tbd installed but not found in PATH"
59
+ echo "[tbd] Checking common locations..."
60
+ # Try to find and add to path (include npm global bin)
61
+ for dir in "$NPM_GLOBAL_BIN" ~/.local/bin ~/.local/node_modules/.bin /usr/local/bin; do
62
+ if [ -n "$dir" ] && [ -x "$dir/tbd" ]; then
63
+ export PATH="$dir:$PATH"
64
+ echo "[tbd] Found at $dir/tbd"
65
+ return 0
66
+ fi
67
+ done
68
+ echo "[tbd] Could not locate tbd after installation"
69
+ return 1
70
+ fi
71
+ }
72
+
73
+ # Main
74
+ ensure_tbd || exit 1
75
+
76
+ # Run tbd prime with any passed arguments (e.g., --brief for PreCompact)
77
+ tbd prime "$@"
@@ -0,0 +1,47 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "bash .claude/scripts/tbd-session.sh"
10
+ }
11
+ ]
12
+ },
13
+ {
14
+ "matcher": "",
15
+ "hooks": [
16
+ {
17
+ "type": "command",
18
+ "command": "bash .claude/scripts/ensure-gh-cli.sh",
19
+ "timeout": 120
20
+ }
21
+ ]
22
+ }
23
+ ],
24
+ "PreCompact": [
25
+ {
26
+ "matcher": "",
27
+ "hooks": [
28
+ {
29
+ "type": "command",
30
+ "command": "bash .claude/scripts/tbd-session.sh --brief"
31
+ }
32
+ ]
33
+ }
34
+ ],
35
+ "PostToolUse": [
36
+ {
37
+ "matcher": "Bash",
38
+ "hooks": [
39
+ {
40
+ "type": "command",
41
+ "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/tbd-closing-reminder.sh"
42
+ }
43
+ ]
44
+ }
45
+ ]
46
+ }
47
+ }
@@ -0,0 +1,254 @@
1
+ ---
2
+ allowed-tools: Bash(tbd:*), Read, Write
3
+ description: |-
4
+ Git-native issue tracking (beads), coding guidelines, knowledge injection, and spec-driven planning for AI agents. Drop-in replacement for bd/Beads with simpler architecture.
5
+ Use for: tracking issues/beads with dependencies, creating bugs/features/tasks, planning specs, implementing features from specs, code reviews, committing code, creating PRs, loading coding guidelines (TypeScript, Python, TDD, golden testing, Convex, monorepo patterns), code cleanup, research briefs, architecture docs, agent handoffs, and checking out third-party library source code.
6
+ Invoke when user mentions: tbd, beads, bd, shortcuts, issues, bugs, tasks, features, epics, todo, tracking, specs, planning, implementation, validation, guidelines, templates, commit, PR, pull request, code review, testing, TDD, test-driven, golden testing, snapshot testing, TypeScript, Python, Convex, monorepo, cleanup, dead code, refactor, handoff, research, architecture, labels, search, checkout library, source code review, or any workflow shortcut.
7
+ name: tbd
8
+ ---
9
+ <!-- DO NOT EDIT: Generated by tbd setup.
10
+ Run 'tbd setup' to update.
11
+ -->
12
+
13
+ ---
14
+ title: tbd Workflow
15
+ description: Full tbd workflow guide for agents
16
+ ---
17
+ **`tbd` helps humans and agents ship code with greater speed, quality, and discipline.**
18
+
19
+ 1. **Beads**: Git-native issue tracking (tasks, bugs, features).
20
+ Never lose work across sessions.
21
+ Drop-in replacement for `bd`.
22
+ 2. **Spec-Driven Workflows**: Plan features → break into beads → implement
23
+ systematically.
24
+ 3. **Knowledge Injection**: 17+ engineering guidelines (TypeScript, Python, TDD,
25
+ testing, Convex, monorepos) available on demand.
26
+ 4. **Shortcuts**: Reusable instruction templates for common workflows (code review,
27
+ commits, PRs, cleanup, handoffs).
28
+
29
+ ## Installation
30
+
31
+ ```bash
32
+ npm install -g get-tbd@latest
33
+ tbd setup --auto --prefix=<name> # Fresh project (--prefix is REQUIRED: 2-8 alphabetic chars recommended. ALWAYS ASK THE USER FOR THE PREFIX; do not guess it)
34
+ tbd setup --auto # Existing tbd project (prefix already set)
35
+ tbd setup --from-beads # Migration from .beads/ if `bd` has been used
36
+ ```
37
+
38
+ ## Routine Commands
39
+
40
+ ```bash
41
+ tbd --help # Command reference
42
+ tbd status # Status
43
+ tbd doctor # If there are problems
44
+
45
+ tbd setup --auto # Run any time to refresh setup
46
+ tbd prime # Restore full context on tbd after compaction
47
+ ```
48
+
49
+ ## CRITICAL: You Operate tbd — The User Doesn’t
50
+
51
+ **You are the tbd operator:** Users talk naturally; you translate their requests to tbd
52
+ actions. DO NOT tell users to run tbd commands.
53
+ That’s your job.
54
+
55
+ - **WRONG**: "Run `tbd create` to track this bug"
56
+
57
+ - **RIGHT**: *(you run `tbd create` yourself and tell the user it’s tracked)*
58
+
59
+ **Welcoming a user:** When users ask “what is tbd?”
60
+ or want help → run `tbd shortcut welcome-user`
61
+
62
+ ## User Request → Agent Action
63
+
64
+ | User Says | You (the Agent) Run |
65
+ | --- | --- |
66
+ | **Issues/Beads** | |
67
+ | "There's a bug where ..." | `tbd create "..." --type=bug` |
68
+ | "Create a task/feature for ..." | `tbd create "..." --type=task` or `--type=feature` |
69
+ | "Let's work on issues/beads" | `tbd ready` |
70
+ | "Show me issue X" | `tbd show <id>` |
71
+ | "Close this issue" | `tbd close <id>` |
72
+ | "Search issues for X" | `tbd search "X"` |
73
+ | "Add label X to issue" | `tbd label add <id> <label>` |
74
+ | "What issues are stale?" | `tbd stale` |
75
+ | **Planning & Specs** | |
76
+ | "Plan a new feature" / "Create a spec" | `tbd shortcut new-plan-spec` |
77
+ | "Break spec into beads" | `tbd shortcut plan-implementation-with-beads` |
78
+ | "Implement these beads" | `tbd shortcut implement-beads` |
79
+ | **Code Review & Commits** | |
80
+ | "Review this code" / "Code review" | `tbd shortcut review-code` |
81
+ | "Review this PR" | `tbd shortcut review-github-pr` |
82
+ | "Commit this" / "Use the commit shortcut" | `tbd shortcut code-review-and-commit` |
83
+ | "Create a PR" / "File a PR" | `tbd shortcut create-or-update-pr-simple` |
84
+ | "Merge main into my branch" | `tbd shortcut merge-upstream` |
85
+ | **Guidelines & Knowledge** | |
86
+ | "Use TypeScript best practices" | `tbd guidelines typescript-rules` |
87
+ | "Use Python best practices" | `tbd guidelines python-rules` |
88
+ | "Build a TypeScript CLI" | `tbd guidelines typescript-cli-tool-rules` |
89
+ | "Improve monorepo setup" | `tbd guidelines pnpm-monorepo-patterns` or `bun-monorepo-patterns` |
90
+ | "Add golden/e2e testing" | `tbd guidelines golden-testing-guidelines` |
91
+ | "Use TDD" / "Test-driven development" | `tbd guidelines general-tdd-guidelines` |
92
+ | "Convex best practices" | `tbd guidelines convex-rules` |
93
+ | **Documentation** | |
94
+ | "Research this topic" | `tbd shortcut new-research-brief` |
95
+ | "Document architecture" | `tbd shortcut new-architecture-doc` |
96
+ | **Cleanup & Maintenance** | |
97
+ | "Clean up this code" / "Remove dead code" | `tbd shortcut code-cleanup-all` |
98
+ | "Fix repository problems" | `tbd doctor --fix` |
99
+ | **Sessions & Handoffs** | |
100
+ | "Hand off to another agent" | `tbd shortcut agent-handoff` |
101
+ | "Check out this library's source" | `tbd shortcut checkout-third-party-repo` |
102
+ | *(your choice whenever appropriate)* | `tbd list`, `tbd dep add`, `tbd close`, `tbd sync`, etc. |
103
+
104
+ ## CRITICAL: Session Closing Protocol
105
+
106
+ **Before saying “done”, you MUST complete this checklist:**
107
+
108
+ ```
109
+ [ ] 1. git add + git commit
110
+ [ ] 2. git push
111
+ [ ] 3. gh pr checks <PR> --watch 2>&1 (IMPORTANT: WAIT for final summary, do NOT tell user it is done until you confirm it passes CI!)
112
+ [ ] 4. tbd close/update <id> for all beads worked on
113
+ [ ] 5. tbd sync
114
+ [ ] 6. CONFIRM CI passed (if failed: fix, run tests, re-push, restart from step 3)
115
+ ```
116
+
117
+ **Work is not done until pushed, CI passes, and tbd is synced.**
118
+
119
+ ## Bead Tracking Rules
120
+
121
+ - Track all task work not done immediately as beads (discovered work, TODOs,
122
+ multi-session work)
123
+ - When in doubt, create a bead
124
+ - Check `tbd ready` when not given specific directions
125
+ - Always close/update beads and run `tbd sync` at session end
126
+
127
+ ## Commands
128
+
129
+ ### Finding Work
130
+
131
+ | Command | Purpose |
132
+ | --- | --- |
133
+ | `tbd ready` | Beads ready to work (no blockers) |
134
+ | `tbd list --status open` | All open beads |
135
+ | `tbd list --status in_progress` | Your active work |
136
+ | `tbd show <id>` | Bead details with dependencies |
137
+
138
+ ### Creating & Updating
139
+
140
+ | Command | Purpose |
141
+ | --- | --- |
142
+ | `tbd create "title" --type task\|bug\|feature --priority=P2` | New bead (P0-P4, not "high/medium/low") |
143
+ | `tbd update <id> --status in_progress` | Claim work |
144
+ | `tbd close <id> [--reason "..."]` | Mark complete |
145
+
146
+ ### Dependencies & Sync
147
+
148
+ | Command | Purpose |
149
+ | --- | --- |
150
+ | `tbd dep add <bead> <depends-on>` | Add dependency |
151
+ | `tbd blocked` | Show blocked beads |
152
+ | `tbd sync` | Sync with git remote (run at session end) |
153
+ | `tbd stats` | Project statistics |
154
+ | `tbd doctor` | Check for problems |
155
+ | `tbd doctor --fix` | Auto-fix repository problems |
156
+
157
+ ### Labels & Search
158
+
159
+ | Command | Purpose |
160
+ | --- | --- |
161
+ | `tbd search <query>` | Search issues by text |
162
+ | `tbd label add <id> <label>` | Add label to issue |
163
+ | `tbd label remove <id> <label>` | Remove label from issue |
164
+ | `tbd label list` | List all labels in use |
165
+ | `tbd stale` | List issues not updated recently |
166
+
167
+ ### Documentation
168
+
169
+ | Command | Purpose |
170
+ | --- | --- |
171
+ | `tbd shortcut <name>` | Run a shortcut |
172
+ | `tbd shortcut --list` | List shortcuts |
173
+ | `tbd guidelines <name>` | Load coding guidelines |
174
+ | `tbd guidelines --list` | List guidelines |
175
+ | `tbd template <name>` | Output a template |
176
+
177
+ ## Quick Reference
178
+
179
+ - **Priority**: P0=critical, P1=high, P2=medium (default), P3=low, P4=backlog
180
+ - **Types**: task, bug, feature, epic
181
+ - **Status**: open, in_progress, closed
182
+ - **JSON output**: Add `--json` to any command
183
+
184
+ <!-- BEGIN SHORTCUT DIRECTORY -->
185
+ ## Available Shortcuts
186
+
187
+ Run `tbd shortcut <name>` to use any of these shortcuts:
188
+
189
+ | Name | Description |
190
+ | --- | --- |
191
+ | agent-handoff | Generate a concise handoff prompt for another coding agent to continue work |
192
+ | checkout-third-party-repo | Get source code for libraries and third-party repos using git. Essential for reliable source code review. Prefer this to web searches or fetching of web pages from github.com as it is far more effective (github.com blocks web scraping from main website). |
193
+ | code-cleanup-all | Full cleanup cycle including duplicate removal, dead code, and code quality improvements |
194
+ | code-cleanup-docstrings | Review and add concise docstrings to major functions and types |
195
+ | code-cleanup-tests | Review and remove tests that do not add meaningful coverage |
196
+ | code-review-and-commit | Run pre-commit checks, review changes, and commit code |
197
+ | coding-spike | Prototype to validate a spec through hands-on implementation |
198
+ | create-or-update-pr-simple | Create or update a pull request with a concise summary |
199
+ | create-or-update-pr-with-validation-plan | Create or update a pull request with a detailed test/validation plan |
200
+ | implement-beads | Implement beads from a spec, following TDD and project rules |
201
+ | merge-upstream | Merge origin/main into current branch with conflict resolution |
202
+ | new-architecture-doc | Create an architecture document for a system or component design |
203
+ | new-guideline | Create a new coding guideline document for tbd |
204
+ | new-plan-spec | Create a new feature planning specification document |
205
+ | new-research-brief | Create a research document for investigating a topic or technology |
206
+ | new-shortcut | Create a new shortcut (reusable instruction template) for tbd |
207
+ | new-validation-plan | Create a validation/test plan showing what's tested and what remains |
208
+ | plan-implementation-with-beads | Create implementation beads from a feature planning spec |
209
+ | precommit-process | Full pre-commit checklist including spec sync, code review, and testing |
210
+ | review-code | Comprehensive code review for uncommitted changes, branch work, or GitHub PRs |
211
+ | review-code-python | Python-focused code review (language-specific rules only) |
212
+ | review-code-typescript | TypeScript-focused code review (language-specific rules only) |
213
+ | review-github-pr | Review a GitHub pull request with follow-up actions (comment, fix, CI check) |
214
+ | revise-all-architecture-docs | Comprehensive revision of all current architecture documents |
215
+ | revise-architecture-doc | Update an architecture document to reflect current codebase state |
216
+ | setup-github-cli | Ensure GitHub CLI (gh) is installed and working |
217
+ | sync-failure-recovery | Handle tbd sync failures by saving to workspace and recovering later |
218
+ | update-specs-status | Review active specs and sync their status with tbd issues |
219
+ | welcome-user | Welcome message for users after tbd installation or setup |
220
+
221
+ ## Available Guidelines
222
+
223
+ Run `tbd guidelines <name>` to apply any of these guidelines:
224
+
225
+ | Name | Description |
226
+ | --- | --- |
227
+ | backward-compatibility-rules | Guidelines for maintaining backward compatibility across code, APIs, file formats, and database schemas |
228
+ | bun-monorepo-patterns | Modern patterns for Bun-based TypeScript monorepo architecture |
229
+ | cli-agent-skill-patterns | Best practices for building TypeScript CLIs that function as agent skills in Claude Code and other AI coding agents |
230
+ | commit-conventions | Conventional Commits format with extensions for agentic workflows |
231
+ | convex-limits-best-practices | Comprehensive reference for Convex platform limits, workarounds, and performance best practices |
232
+ | convex-rules | Guidelines and best practices for building Convex projects, including database schema design, queries, mutations, and real-world examples |
233
+ | electron-app-development-patterns | Guidelines for Electron development ecosystems including npm, pnpm, and Bun, with security baselines and framework comparisons |
234
+ | error-handling-rules | Rules for handling errors, failures, and exceptional conditions |
235
+ | general-coding-rules | Rules for constants, magic numbers, and general coding practices |
236
+ | general-comment-rules | Language-agnostic rules for writing clean, maintainable comments |
237
+ | general-eng-assistant-rules | Rules for AI assistants acting as senior engineers, including objectivity and communication guidelines |
238
+ | general-style-rules | Style guidelines for auto-formatting, emoji usage, and output formatting |
239
+ | general-tdd-guidelines | Test-Driven Development methodology and best practices |
240
+ | general-testing-rules | Rules for writing minimal, effective tests with maximum coverage |
241
+ | golden-testing-guidelines | Guidelines for implementing golden/snapshot testing for complex systems |
242
+ | pnpm-monorepo-patterns | Modern patterns for pnpm-based TypeScript monorepo architecture |
243
+ | python-cli-patterns | Modern patterns for Python CLI application architecture |
244
+ | python-modern-guidelines | Guidelines for modern Python projects using uv, with a few more opinionated practices |
245
+ | python-rules | General Python coding rules and best practices |
246
+ | release-notes-guidelines | Guidelines for writing clear, accurate release notes |
247
+ | tbd-sync-troubleshooting | Common issues and solutions for tbd sync and workspace operations |
248
+ | typescript-cli-tool-rules | Rules for building CLI tools with Commander.js, picocolors, and TypeScript |
249
+ | typescript-code-coverage | Best practices for code coverage in TypeScript with Vitest and v8 provider |
250
+ | typescript-rules | TypeScript coding rules and best practices |
251
+ | typescript-sorting-patterns | Deterministic sorting patterns and comparison chains for TypeScript |
252
+ | typescript-yaml-handling-rules | Best practices for parsing and serializing YAML in TypeScript |
253
+
254
+ <!-- END SHORTCUT DIRECTORY -->
@@ -1,5 +1,5 @@
1
1
  # Changes here will be overwritten by Copier. Do not edit manually.
2
- _commit: v0.2.14
2
+ _commit: v0.2.19
3
3
  _src_path: gh:jlevy/simple-modern-uv
4
4
  package_author_email: joshua@cal.berkeley.edu
5
5
  package_author_name: Joshua Levy
@@ -7,7 +7,7 @@ alwaysApply: true
7
7
 
8
8
  **Your fundamental responsibility:** Remember you are a senior engineer and have a
9
9
  serious responsibility to be clear, factual, think step by step and be systematic,
10
- express expert opinion, and make use of the user's attention wisely.
10
+ express expert opinion, and make use of the users attention wisely.
11
11
 
12
12
  **Rules must be followed:** It is your responsibility to carefully read these rules as
13
13
  well as Python or other language-specific rules included here.
@@ -22,19 +22,19 @@ Therefore:
22
22
  confirmation.
23
23
 
24
24
  - If you can think of a much better approach that the user requests, be sure to mention
25
- it. It's your responsibility to suggest approaches that lead to better, simpler
25
+ it. Its your responsibility to suggest approaches that lead to better, simpler
26
26
  solutions.
27
27
 
28
- - Give thoughtful opinions on better/worse approaches, but NEVER say "great idea!"
29
- or "good job" or other compliments, encouragement, or non-essential banter.
28
+ - Give thoughtful opinions on better/worse approaches, but NEVER say great idea!”
29
+ or good job or other compliments, encouragement, or non-essential banter.
30
30
  Your job is to give expert opinions and to solve problems, not to motivate the user.
31
31
 
32
32
  - Avoid gratuitous enthusiasm or generalizations.
33
- Use thoughtful comparisons like saying which code is "cleaner" but don't congratulate
33
+ Use thoughtful comparisons like saying which code is cleaner but dont congratulate
34
34
  yourself. Avoid subjective descriptions.
35
- For example, don't say "I've meticulously improved the code and it is in great shape!"
35
+ For example, dont say Ive meticulously improved the code and it is in great shape!”
36
36
  That is useless generalization.
37
- Instead, specifically say what you've done, e.g., "I've added types, including
37
+ Instead, specifically say what youve done, e.g., "Ive added types, including
38
38
  generics, to all the methods in `Foo` and fixed all linter errors."
39
39
 
40
40
  # General Coding Guidelines
@@ -49,17 +49,17 @@ Therefore:
49
49
  - DO NOT repeat in comments what is obvious from the names of functions or variables or
50
50
  types.
51
51
 
52
- - DO NOT include comments that reflect what you did, such as "Added this function" as
52
+ - DO NOT include comments that reflect what you did, such as Added this function as
53
53
  this is meaningless to anyone reading the code later.
54
54
  (Instead, describe in your message to the user any other contextual information.)
55
55
 
56
- - DO NOT use fancy or needlessly decorated headings like "===== MIGRATION TOOLS ====="
56
+ - DO NOT use fancy or needlessly decorated headings like “===== MIGRATION TOOLS =====”
57
57
  in comments
58
58
 
59
59
  - DO NOT number steps in comments.
60
60
  These are hard to maintain if the code changes.
61
- NEVER DO THIS: "// Step 3: Fetch the data from the cache"\
62
- This is fine: "// Now fetch the data from the cache"
61
+ NEVER DO THIS: “// Step 3: Fetch the data from the cache”\
62
+ This is fine: “// Now fetch the data from the cache
63
63
 
64
64
  - DO NOT use emojis or special unicode characters like ① or • or – or — in comments.
65
65
 
@@ -87,7 +87,7 @@ Always use full type annotations, generics, and other modern practices.
87
87
  - Use pathlib `Path` instead of strings.
88
88
  Use `Path(filename).read_text()` instead of two-line `with open(...)` blocks.
89
89
 
90
- - Use strif's `atomic_output_file` context manager when writing files to ensure output
90
+ - Use strifs `atomic_output_file` context manager when writing files to ensure output
91
91
  files are written atomically.
92
92
 
93
93
  ## Use Modern Python Practices
@@ -112,7 +112,7 @@ Always use full type annotations, generics, and other modern practices.
112
112
 
113
113
  - You can run such individual tests with `uv run pytest -s src/.../path/to/test`
114
114
 
115
- - Don't add docs to assertions unless it's not obvious what they're checking - the
115
+ - Dont add docs to assertions unless its not obvious what theyre checking - the
116
116
  assertion appears in the stack trace.
117
117
  Do NOT write `assert x == 5, "x should be 5"`. Do NOT write `assert x == 5 # Check if
118
118
  x is 5`. That is redundant.
@@ -122,7 +122,7 @@ Always use full type annotations, generics, and other modern practices.
122
122
  assertions that confirm the value of a constant setting.
123
123
 
124
124
  - NEVER write `assert False`. If a test reaches an unexpected branch and must fail
125
- explicitly, `raise AssertionError("Explanation")` instead.
125
+ explicitly, `raise AssertionError("Some explanation")` instead.
126
126
  This is best typical best practice in Python since assertions can be removed with
127
127
  optimization.
128
128
 
@@ -132,6 +132,21 @@ Always use full type annotations, generics, and other modern practices.
132
132
  This is also preferable because then simple tests have no explicit pytest dependencies
133
133
  and can be placed in code anywhere.
134
134
 
135
+ - DO NOT write trivial tests that test something we know already works, like
136
+ instantiating a Pydantic object.
137
+
138
+ ```python
139
+ class Link(BaseModel):
140
+ url: str
141
+ title: str = None
142
+
143
+ # DO NOT write tests like this. They are trivial and only create clutter!
144
+ def test_link_model():
145
+ link = Link(url="https://example.com", title="Example")
146
+ assert link.url == "https://example.com"
147
+ assert link.title == "Example"
148
+ ```
149
+
135
150
  ## Types and Type Annotations
136
151
 
137
152
  - Use modern union syntax: `str | None` instead of `Optional[str]`, `dict[str]` instead
@@ -142,7 +157,7 @@ Always use full type annotations, generics, and other modern practices.
142
157
  - Use modern enums like `StrEnum` if appropriate.
143
158
 
144
159
  - One exception to common practice on enums: If an enum has many values that are
145
- strings, and they have a literal value as a string (like in a JSON protocol), it's
160
+ strings, and they have a literal value as a string (like in a JSON protocol), its
146
161
  fine to use lower_snake_case for enum values to match the actual value.
147
162
  This is more readable than LONG_ALL_CAPS_VALUES, and you can simply set the value to
148
163
  be the same as the name for each.
@@ -228,7 +243,7 @@ Always use full type annotations, generics, and other modern practices.
228
243
  - For classes with many methods, use a concise docstring on the class that explains all
229
244
  the common information, and avoid repeating the same information on every method.
230
245
 
231
- - Docstrings should provide context or as concisely as possible explain "why", not
246
+ - Docstrings should provide context or as concisely as possible explain why”, not
232
247
  obvious details evident from the class names, function names, parameter names, and
233
248
  type annotations.
234
249
 
@@ -240,10 +255,10 @@ Always use full type annotations, generics, and other modern practices.
240
255
  name, variable name, or types.
241
256
  That is silly and obvious and makes the code longer for no reason.
242
257
 
243
- - Do NOT list args and return values if they're obvious.
258
+ - Do NOT list args and return values if theyre obvious.
244
259
  In the above examples, you do not need and `Arguments:` or `Returns:` section, since
245
- their meaning as obvious from context.
246
- do list these if there are many arguments and their meaning isn't clear.
260
+ sections as it is obvious from context.
261
+ do list these if there are many arguments and their meaning isnt clear.
247
262
  If it returns a less obvious type like a tuple, do explain in the pydoc.
248
263
 
249
264
  - Exported/public variables, functions, or methods SHOULD have concise docstrings.
@@ -42,7 +42,7 @@ jobs:
42
42
  uses: astral-sh/setup-uv@v5
43
43
  with:
44
44
  # Update this as needed:
45
- version: "0.7.13"
45
+ version: "0.9.5"
46
46
  enable-cache: true
47
47
  python-version: ${{ matrix.python-version }}
48
48
 
@@ -25,7 +25,7 @@ jobs:
25
25
  - name: Install uv (official Astral action)
26
26
  uses: astral-sh/setup-uv@v5
27
27
  with:
28
- version: "0.7.13"
28
+ version: "0.9.5"
29
29
  enable-cache: true
30
30
  python-version: "3.12"
31
31