shotgun-sh 0.2.10.dev6__tar.gz → 0.2.10.dev8__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.

Potentially problematic release.


This version of shotgun-sh might be problematic. Click here for more details.

Files changed (158) hide show
  1. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/PKG-INFO +1 -1
  2. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/pyproject.toml +2 -1
  3. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/app.py +28 -3
  4. shotgun_sh-0.2.10.dev8/src/shotgun/tui/screens/pipx_migration.py +153 -0
  5. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/utils/update_checker.py +6 -0
  6. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/.gitignore +0 -0
  7. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/LICENSE +0 -0
  8. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/README.md +0 -0
  9. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/README_PYPI.md +0 -0
  10. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/hatch_build.py +0 -0
  11. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/__init__.py +0 -0
  12. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/__init__.py +0 -0
  13. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/agent_manager.py +0 -0
  14. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/common.py +0 -0
  15. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/config/__init__.py +0 -0
  16. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/config/constants.py +0 -0
  17. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/config/manager.py +0 -0
  18. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/config/models.py +0 -0
  19. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/config/provider.py +0 -0
  20. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/conversation_history.py +0 -0
  21. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/conversation_manager.py +0 -0
  22. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/export.py +0 -0
  23. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/__init__.py +0 -0
  24. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/compaction.py +0 -0
  25. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/constants.py +0 -0
  26. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/context_extraction.py +0 -0
  27. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/history_building.py +0 -0
  28. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/history_processors.py +0 -0
  29. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/message_utils.py +0 -0
  30. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/token_counting/__init__.py +0 -0
  31. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/token_counting/anthropic.py +0 -0
  32. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/token_counting/base.py +0 -0
  33. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/token_counting/openai.py +0 -0
  34. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/token_counting/sentencepiece_counter.py +0 -0
  35. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/token_counting/tokenizer_cache.py +0 -0
  36. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/token_counting/utils.py +0 -0
  37. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/history/token_estimation.py +0 -0
  38. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/llm.py +0 -0
  39. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/messages.py +0 -0
  40. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/models.py +0 -0
  41. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/plan.py +0 -0
  42. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/research.py +0 -0
  43. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/specify.py +0 -0
  44. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tasks.py +0 -0
  45. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/__init__.py +0 -0
  46. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/codebase/__init__.py +0 -0
  47. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/codebase/codebase_shell.py +0 -0
  48. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/codebase/directory_lister.py +0 -0
  49. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/codebase/file_read.py +0 -0
  50. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/codebase/models.py +0 -0
  51. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/codebase/query_graph.py +0 -0
  52. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/codebase/retrieve_code.py +0 -0
  53. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/file_management.py +0 -0
  54. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/web_search/__init__.py +0 -0
  55. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/web_search/anthropic.py +0 -0
  56. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/web_search/gemini.py +0 -0
  57. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/web_search/openai.py +0 -0
  58. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/tools/web_search/utils.py +0 -0
  59. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/agents/usage_manager.py +0 -0
  60. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/api_endpoints.py +0 -0
  61. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/build_constants.py +0 -0
  62. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/__init__.py +0 -0
  63. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/codebase/__init__.py +0 -0
  64. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/codebase/commands.py +0 -0
  65. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/codebase/models.py +0 -0
  66. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/config.py +0 -0
  67. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/export.py +0 -0
  68. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/feedback.py +0 -0
  69. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/models.py +0 -0
  70. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/plan.py +0 -0
  71. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/research.py +0 -0
  72. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/specify.py +0 -0
  73. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/tasks.py +0 -0
  74. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/update.py +0 -0
  75. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/cli/utils.py +0 -0
  76. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/__init__.py +0 -0
  77. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/core/__init__.py +0 -0
  78. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/core/change_detector.py +0 -0
  79. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/core/code_retrieval.py +0 -0
  80. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/core/cypher_models.py +0 -0
  81. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/core/ingestor.py +0 -0
  82. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/core/language_config.py +0 -0
  83. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/core/manager.py +0 -0
  84. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/core/nl_query.py +0 -0
  85. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/core/parser_loader.py +0 -0
  86. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/models.py +0 -0
  87. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/codebase/service.py +0 -0
  88. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/llm_proxy/__init__.py +0 -0
  89. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/llm_proxy/clients.py +0 -0
  90. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/llm_proxy/constants.py +0 -0
  91. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/logging_config.py +0 -0
  92. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/main.py +0 -0
  93. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/posthog_telemetry.py +0 -0
  94. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/__init__.py +0 -0
  95. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/__init__.py +0 -0
  96. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/export.j2 +0 -0
  97. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/partials/codebase_understanding.j2 +0 -0
  98. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/partials/common_agent_system_prompt.j2 +0 -0
  99. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/partials/content_formatting.j2 +0 -0
  100. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/partials/interactive_mode.j2 +0 -0
  101. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/plan.j2 +0 -0
  102. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/research.j2 +0 -0
  103. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/specify.j2 +0 -0
  104. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/state/codebase/codebase_graphs_available.j2 +0 -0
  105. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/state/system_state.j2 +0 -0
  106. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/agents/tasks.j2 +0 -0
  107. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/codebase/__init__.py +0 -0
  108. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/codebase/cypher_query_patterns.j2 +0 -0
  109. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/codebase/cypher_system.j2 +0 -0
  110. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/codebase/enhanced_query_context.j2 +0 -0
  111. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/codebase/partials/cypher_rules.j2 +0 -0
  112. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/codebase/partials/graph_schema.j2 +0 -0
  113. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/codebase/partials/temporal_context.j2 +0 -0
  114. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/history/__init__.py +0 -0
  115. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/history/incremental_summarization.j2 +0 -0
  116. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/history/summarization.j2 +0 -0
  117. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/loader.py +0 -0
  118. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/prompts/tools/web_search.j2 +0 -0
  119. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/py.typed +0 -0
  120. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/sdk/__init__.py +0 -0
  121. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/sdk/codebase.py +0 -0
  122. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/sdk/exceptions.py +0 -0
  123. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/sdk/models.py +0 -0
  124. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/sdk/services.py +0 -0
  125. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/sentry_telemetry.py +0 -0
  126. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/shotgun_web/__init__.py +0 -0
  127. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/shotgun_web/client.py +0 -0
  128. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/shotgun_web/constants.py +0 -0
  129. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/shotgun_web/models.py +0 -0
  130. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/telemetry.py +0 -0
  131. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/__init__.py +0 -0
  132. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/commands/__init__.py +0 -0
  133. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/components/prompt_input.py +0 -0
  134. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/components/spinner.py +0 -0
  135. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/components/splash.py +0 -0
  136. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/components/vertical_tail.py +0 -0
  137. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/filtered_codebase_service.py +0 -0
  138. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/chat.py +0 -0
  139. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/chat.tcss +0 -0
  140. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/chat_screen/__init__.py +0 -0
  141. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/chat_screen/command_providers.py +0 -0
  142. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/chat_screen/hint_message.py +0 -0
  143. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/chat_screen/history.py +0 -0
  144. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/directory_setup.py +0 -0
  145. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/feedback.py +0 -0
  146. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/model_picker.py +0 -0
  147. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/provider_config.py +0 -0
  148. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/shotgun_auth.py +0 -0
  149. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/splash.py +0 -0
  150. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/screens/welcome.py +0 -0
  151. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/styles.tcss +0 -0
  152. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/utils/__init__.py +0 -0
  153. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/tui/utils/mode_progress.py +0 -0
  154. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/utils/__init__.py +0 -0
  155. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/utils/datetime_utils.py +0 -0
  156. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/utils/env_utils.py +0 -0
  157. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/utils/file_system_utils.py +0 -0
  158. {shotgun_sh-0.2.10.dev6 → shotgun_sh-0.2.10.dev8}/src/shotgun/utils/source_detection.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shotgun-sh
3
- Version: 0.2.10.dev6
3
+ Version: 0.2.10.dev8
4
4
  Summary: AI-powered research, planning, and task management CLI tool
5
5
  Project-URL: Homepage, https://shotgun.sh/
6
6
  Project-URL: Repository, https://github.com/shotgun-sh/shotgun
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "shotgun-sh"
3
- version = "0.2.10.dev6"
3
+ version = "0.2.10.dev8"
4
4
  description = "AI-powered research, planning, and task management CLI tool"
5
5
  readme = "README_PYPI.md"
6
6
  license = { text = "MIT" }
@@ -66,6 +66,7 @@ dev = [
66
66
 
67
67
  [project.scripts]
68
68
  shotgun = "shotgun.main:app"
69
+ shotgun-sh = "shotgun.main:app"
69
70
 
70
71
  [build-system]
71
72
  requires = ["hatchling"]
@@ -9,12 +9,16 @@ from shotgun.agents.config import ConfigManager, get_config_manager
9
9
  from shotgun.logging_config import get_logger
10
10
  from shotgun.tui.screens.splash import SplashScreen
11
11
  from shotgun.utils.file_system_utils import get_shotgun_base_path
12
- from shotgun.utils.update_checker import perform_auto_update_async
12
+ from shotgun.utils.update_checker import (
13
+ detect_installation_method,
14
+ perform_auto_update_async,
15
+ )
13
16
 
14
17
  from .screens.chat import ChatScreen
15
18
  from .screens.directory_setup import DirectorySetupScreen
16
19
  from .screens.feedback import FeedbackScreen
17
20
  from .screens.model_picker import ModelPickerScreen
21
+ from .screens.pipx_migration import PipxMigrationScreen
18
22
  from .screens.provider_config import ProviderConfigScreen
19
23
  from .screens.welcome import WelcomeScreen
20
24
 
@@ -56,14 +60,35 @@ class ShotgunApp(App[None]):
56
60
  # Track TUI startup
57
61
  from shotgun.posthog_telemetry import track_event
58
62
 
59
- track_event("tui_started", {})
63
+ track_event(
64
+ "tui_started",
65
+ {
66
+ "installation_method": detect_installation_method(),
67
+ },
68
+ )
60
69
 
61
70
  self.push_screen(
62
71
  SplashScreen(), callback=lambda _arg: self.refresh_startup_screen()
63
72
  )
64
73
 
65
- def refresh_startup_screen(self) -> None:
74
+ def refresh_startup_screen(self, skip_pipx_check: bool = False) -> None:
66
75
  """Push the appropriate screen based on configured providers."""
76
+ # Check for pipx installation and show migration modal first
77
+ if not skip_pipx_check:
78
+ installation_method = detect_installation_method()
79
+ if installation_method == "pipx":
80
+ if isinstance(self.screen, PipxMigrationScreen):
81
+ return
82
+
83
+ # Show pipx migration modal as a blocking modal screen
84
+ self.push_screen(
85
+ PipxMigrationScreen(),
86
+ callback=lambda _arg: self.refresh_startup_screen(
87
+ skip_pipx_check=True
88
+ ),
89
+ )
90
+ return
91
+
67
92
  # Show welcome screen if no providers are configured OR if user hasn't seen it yet
68
93
  config = self.config_manager.load()
69
94
  if (
@@ -0,0 +1,153 @@
1
+ """Migration notice screen for pipx users."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from textual import on
8
+ from textual.app import ComposeResult
9
+ from textual.containers import Container, Horizontal, VerticalScroll
10
+ from textual.screen import ModalScreen
11
+ from textual.widgets import Button, Markdown
12
+
13
+ if TYPE_CHECKING:
14
+ pass
15
+
16
+
17
+ class PipxMigrationScreen(ModalScreen[None]):
18
+ """Modal screen warning pipx users about migration to uvx."""
19
+
20
+ CSS = """
21
+ PipxMigrationScreen {
22
+ align: center middle;
23
+ }
24
+
25
+ #migration-container {
26
+ width: 90;
27
+ height: auto;
28
+ max-height: 90%;
29
+ border: thick $error;
30
+ background: $surface;
31
+ padding: 2;
32
+ }
33
+
34
+ #migration-content {
35
+ height: 1fr;
36
+ padding: 1 0;
37
+ }
38
+
39
+ #buttons-container {
40
+ height: auto;
41
+ padding: 2 0 1 0;
42
+ }
43
+
44
+ #action-buttons {
45
+ width: 100%;
46
+ height: auto;
47
+ align: center middle;
48
+ }
49
+
50
+ .action-button {
51
+ margin: 0 1;
52
+ min-width: 20;
53
+ }
54
+ """
55
+
56
+ BINDINGS = [
57
+ ("escape", "dismiss", "Continue Anyway"),
58
+ ("ctrl+c", "app.quit", "Quit"),
59
+ ]
60
+
61
+ def compose(self) -> ComposeResult:
62
+ """Compose the migration notice modal."""
63
+ with Container(id="migration-container"):
64
+ with VerticalScroll(id="migration-content"):
65
+ yield Markdown(
66
+ """
67
+ ## We've Switched to uvx
68
+
69
+ We've switched from `pipx` to `uvx` as the primary installation method due to critical build issues with our `kuzu` dependency.
70
+
71
+ ### The Problem
72
+ Users with pipx encounter cmake build errors during installation because pip falls back to building from source instead of using pre-built binary wheels.
73
+
74
+ ### The Solution: uvx
75
+ - ✅ **No build tools required** - Binary wheels enforced
76
+ - ✅ **10-100x faster** - Much faster than pipx
77
+ - ✅ **Better reliability** - No cmake/build errors
78
+
79
+ ### How to Migrate
80
+
81
+ **1. Uninstall shotgun-sh from pipx:**
82
+ ```bash
83
+ pipx uninstall shotgun-sh
84
+ ```
85
+
86
+ **2. Install uv:**
87
+ ```bash
88
+ curl -LsSf https://astral.sh/uv/install.sh | sh
89
+ ```
90
+ Or with Homebrew: `brew install uv`
91
+
92
+ **3. Run shotgun-sh with uvx:**
93
+ ```bash
94
+ uvx shotgun-sh
95
+ ```
96
+ Or install permanently: `uv tool install shotgun-sh`
97
+
98
+ ---
99
+
100
+ ### Need Help?
101
+
102
+ **Discord:** https://discord.gg/5RmY6J2N7s
103
+
104
+ **Full Migration Guide:** https://github.com/shotgun-sh/shotgun-sdk/blob/main/PIPX_MIGRATION.md
105
+ """
106
+ )
107
+
108
+ with Container(id="buttons-container"):
109
+ with Horizontal(id="action-buttons"):
110
+ yield Button(
111
+ "Copy Instructions to Clipboard",
112
+ variant="default",
113
+ id="copy-instructions",
114
+ classes="action-button",
115
+ )
116
+ yield Button(
117
+ "Continue Anyway",
118
+ variant="primary",
119
+ id="continue",
120
+ classes="action-button",
121
+ )
122
+
123
+ def on_mount(self) -> None:
124
+ """Focus the continue button and ensure scroll starts at top."""
125
+ self.query_one("#continue", Button).focus()
126
+ self.query_one("#migration-content", VerticalScroll).scroll_home(animate=False)
127
+
128
+ @on(Button.Pressed, "#copy-instructions")
129
+ def _copy_instructions(self) -> None:
130
+ """Copy all migration instructions to clipboard."""
131
+ instructions = """# Step 1: Uninstall from pipx
132
+ pipx uninstall shotgun-sh
133
+
134
+ # Step 2: Install uv
135
+ curl -LsSf https://astral.sh/uv/install.sh | sh
136
+
137
+ # Step 3: Run shotgun with uvx
138
+ uvx shotgun-sh"""
139
+ try:
140
+ import pyperclip # type: ignore[import-untyped] # noqa: PGH003
141
+
142
+ pyperclip.copy(instructions)
143
+ self.notify("Copied migration instructions to clipboard!")
144
+ except ImportError:
145
+ self.notify(
146
+ "Clipboard not available. See instructions above.",
147
+ severity="warning",
148
+ )
149
+
150
+ @on(Button.Pressed, "#continue")
151
+ def _continue(self) -> None:
152
+ """Dismiss the modal and continue."""
153
+ self.dismiss()
@@ -1,5 +1,6 @@
1
1
  """Simple auto-update functionality for shotgun-sh CLI."""
2
2
 
3
+ import os
3
4
  import subprocess
4
5
  import sys
5
6
  import threading
@@ -20,6 +21,11 @@ def detect_installation_method() -> str:
20
21
  Returns:
21
22
  Installation method: 'uvx', 'uv-tool', 'pipx', 'pip', 'venv', or 'unknown'.
22
23
  """
24
+ # Check for simulation environment variable (for testing)
25
+ if os.getenv("PIPX_SIMULATE", "").lower() in ("true", "1"):
26
+ logger.debug("PIPX_SIMULATE enabled, simulating pipx installation")
27
+ return "pipx"
28
+
23
29
  # Check for uvx (ephemeral execution) by looking at executable path
24
30
  # uvx runs from a temporary cache directory
25
31
  executable = Path(sys.executable)