shotgun-sh 0.1.0.dev28__tar.gz → 0.1.0.dev30__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 (131) hide show
  1. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/PKG-INFO +1 -1
  2. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/pyproject.toml +1 -1
  3. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/web_search/anthropic.py +4 -7
  4. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/core/nl_query.py +3 -0
  5. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/logging_config.py +21 -0
  6. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/main.py +9 -0
  7. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/posthog_telemetry.py +4 -2
  8. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/sentry_telemetry.py +4 -2
  9. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/telemetry.py +3 -2
  10. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/screens/chat.py +2 -0
  11. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/.gitignore +0 -0
  12. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/LICENSE +0 -0
  13. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/README.md +0 -0
  14. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/hatch_build.py +0 -0
  15. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/__init__.py +0 -0
  16. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/__init__.py +0 -0
  17. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/agent_manager.py +0 -0
  18. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/common.py +0 -0
  19. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/config/__init__.py +0 -0
  20. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/config/constants.py +0 -0
  21. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/config/manager.py +0 -0
  22. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/config/models.py +0 -0
  23. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/config/provider.py +0 -0
  24. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/conversation_history.py +0 -0
  25. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/conversation_manager.py +0 -0
  26. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/export.py +0 -0
  27. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/history/__init__.py +0 -0
  28. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/history/compaction.py +0 -0
  29. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/history/constants.py +0 -0
  30. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/history/context_extraction.py +0 -0
  31. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/history/history_building.py +0 -0
  32. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/history/history_processors.py +0 -0
  33. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/history/message_utils.py +0 -0
  34. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/history/token_counting.py +0 -0
  35. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/history/token_estimation.py +0 -0
  36. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/messages.py +0 -0
  37. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/models.py +0 -0
  38. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/plan.py +0 -0
  39. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/research.py +0 -0
  40. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/specify.py +0 -0
  41. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tasks.py +0 -0
  42. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/__init__.py +0 -0
  43. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/codebase/__init__.py +0 -0
  44. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/codebase/codebase_shell.py +0 -0
  45. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/codebase/directory_lister.py +0 -0
  46. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/codebase/file_read.py +0 -0
  47. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/codebase/models.py +0 -0
  48. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/codebase/query_graph.py +0 -0
  49. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/codebase/retrieve_code.py +0 -0
  50. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/file_management.py +0 -0
  51. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/user_interaction.py +0 -0
  52. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/web_search/__init__.py +0 -0
  53. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/web_search/gemini.py +0 -0
  54. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/web_search/openai.py +0 -0
  55. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/agents/tools/web_search/utils.py +0 -0
  56. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/build_constants.py +0 -0
  57. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/__init__.py +0 -0
  58. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/codebase/__init__.py +0 -0
  59. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/codebase/commands.py +0 -0
  60. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/codebase/models.py +0 -0
  61. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/config.py +0 -0
  62. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/export.py +0 -0
  63. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/models.py +0 -0
  64. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/plan.py +0 -0
  65. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/research.py +0 -0
  66. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/specify.py +0 -0
  67. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/tasks.py +0 -0
  68. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/update.py +0 -0
  69. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/cli/utils.py +0 -0
  70. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/__init__.py +0 -0
  71. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/core/__init__.py +0 -0
  72. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/core/change_detector.py +0 -0
  73. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/core/code_retrieval.py +0 -0
  74. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/core/ingestor.py +0 -0
  75. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/core/language_config.py +0 -0
  76. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/core/manager.py +0 -0
  77. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/core/parser_loader.py +0 -0
  78. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/models.py +0 -0
  79. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/codebase/service.py +0 -0
  80. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/__init__.py +0 -0
  81. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/__init__.py +0 -0
  82. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/export.j2 +0 -0
  83. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/partials/codebase_understanding.j2 +0 -0
  84. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/partials/common_agent_system_prompt.j2 +0 -0
  85. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/partials/content_formatting.j2 +0 -0
  86. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/partials/interactive_mode.j2 +0 -0
  87. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/plan.j2 +0 -0
  88. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/research.j2 +0 -0
  89. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/specify.j2 +0 -0
  90. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/state/codebase/codebase_graphs_available.j2 +0 -0
  91. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/state/system_state.j2 +0 -0
  92. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/agents/tasks.j2 +0 -0
  93. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/codebase/__init__.py +0 -0
  94. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/codebase/cypher_query_patterns.j2 +0 -0
  95. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/codebase/cypher_system.j2 +0 -0
  96. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/codebase/enhanced_query_context.j2 +0 -0
  97. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/codebase/partials/cypher_rules.j2 +0 -0
  98. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/codebase/partials/graph_schema.j2 +0 -0
  99. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/codebase/partials/temporal_context.j2 +0 -0
  100. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/history/__init__.py +0 -0
  101. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/history/incremental_summarization.j2 +0 -0
  102. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/history/summarization.j2 +0 -0
  103. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/prompts/loader.py +0 -0
  104. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/py.typed +0 -0
  105. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/sdk/__init__.py +0 -0
  106. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/sdk/codebase.py +0 -0
  107. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/sdk/exceptions.py +0 -0
  108. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/sdk/models.py +0 -0
  109. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/sdk/services.py +0 -0
  110. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/__init__.py +0 -0
  111. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/app.py +0 -0
  112. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/commands/__init__.py +0 -0
  113. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/components/prompt_input.py +0 -0
  114. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/components/spinner.py +0 -0
  115. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/components/splash.py +0 -0
  116. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/components/vertical_tail.py +0 -0
  117. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/screens/chat.tcss +0 -0
  118. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/screens/chat_screen/__init__.py +0 -0
  119. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/screens/chat_screen/command_providers.py +0 -0
  120. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/screens/chat_screen/hint_message.py +0 -0
  121. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/screens/chat_screen/history.py +0 -0
  122. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/screens/directory_setup.py +0 -0
  123. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/screens/provider_config.py +0 -0
  124. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/screens/splash.py +0 -0
  125. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/styles.tcss +0 -0
  126. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/utils/__init__.py +0 -0
  127. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/tui/utils/mode_progress.py +0 -0
  128. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/utils/__init__.py +0 -0
  129. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/utils/env_utils.py +0 -0
  130. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/utils/file_system_utils.py +0 -0
  131. {shotgun_sh-0.1.0.dev28 → shotgun_sh-0.1.0.dev30}/src/shotgun/utils/update_checker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shotgun-sh
3
- Version: 0.1.0.dev28
3
+ Version: 0.1.0.dev30
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.1.0.dev28"
3
+ version = "0.1.0.dev30"
4
4
  description = "AI-powered research, planning, and task management CLI tool"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -90,16 +90,13 @@ def anthropic_web_search_tool(query: str) -> str:
90
90
 
91
91
  def main() -> None:
92
92
  """Main function for testing the Anthropic web search tool."""
93
- import logging
94
93
  import os
95
94
  import sys
96
95
 
97
- # Set up basic console logging for testing
98
- logging.basicConfig(
99
- level=logging.DEBUG,
100
- format="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s",
101
- stream=sys.stdout,
102
- )
96
+ from shotgun.logging_config import setup_logger
97
+
98
+ # Use project's logging configuration instead of basicConfig
99
+ setup_logger(__name__)
103
100
 
104
101
  if len(sys.argv) < 2:
105
102
  print(
@@ -36,6 +36,8 @@ async def llm_cypher_prompt(system_prompt: str, user_prompt: str) -> str:
36
36
  """
37
37
  model_config = get_provider_model()
38
38
  # Use shotgun wrapper to maximize response quality for codebase queries
39
+ # Limit max_tokens to 2000 for Cypher queries (they're typically 50-200 tokens)
40
+ # This prevents Anthropic SDK from requiring streaming for longer token limits
39
41
  query_cypher_response = await shotgun_model_request(
40
42
  model_config=model_config,
41
43
  messages=[
@@ -46,6 +48,7 @@ async def llm_cypher_prompt(system_prompt: str, user_prompt: str) -> str:
46
48
  ]
47
49
  ),
48
50
  ],
51
+ max_tokens=2000, # Cypher queries are short, 2000 tokens is plenty
49
52
  )
50
53
 
51
54
  if not query_cypher_response.parts or not query_cypher_response.parts[0]:
@@ -158,6 +158,27 @@ def setup_logger(
158
158
  return logger
159
159
 
160
160
 
161
+ def get_early_logger(name: str) -> logging.Logger:
162
+ """Get a logger with NullHandler for early initialization.
163
+
164
+ Use this for loggers created at module import time, before
165
+ configure_root_logger() is called. The NullHandler prevents
166
+ Python from automatically adding a StreamHandler when WARNING
167
+ or ERROR messages are logged.
168
+
169
+ Args:
170
+ name: Logger name (typically __name__)
171
+
172
+ Returns:
173
+ Logger with NullHandler attached
174
+ """
175
+ logger = logging.getLogger(name)
176
+ # Only add NullHandler if no handlers exist
177
+ if not logger.handlers:
178
+ logger.addHandler(logging.NullHandler())
179
+ return logger
180
+
181
+
161
182
  def get_logger(name: str) -> logging.Logger:
162
183
  """Get a logger instance with default configuration.
163
184
 
@@ -1,5 +1,14 @@
1
1
  """Main CLI application for shotgun."""
2
2
 
3
+ import logging
4
+
5
+ # CRITICAL: Add NullHandler to root logger before ANY other imports.
6
+ # This prevents Python from automatically adding a StreamHandler when
7
+ # WARNING/ERROR messages are logged by modules during import.
8
+ # DO NOT MOVE THIS BELOW OTHER IMPORTS.
9
+ logging.getLogger().addHandler(logging.NullHandler())
10
+
11
+ # ruff: noqa: E402 (module import not at top - intentionally after NullHandler setup)
3
12
  from typing import Annotated
4
13
 
5
14
  import typer
@@ -1,10 +1,12 @@
1
1
  """PostHog analytics setup for Shotgun."""
2
2
 
3
- import logging
4
3
  import os
5
4
  from typing import Any
6
5
 
7
- logger = logging.getLogger(__name__)
6
+ from shotgun.logging_config import get_early_logger
7
+
8
+ # Use early logger to prevent automatic StreamHandler creation
9
+ logger = get_early_logger(__name__)
8
10
 
9
11
  # Global PostHog client instance
10
12
  _posthog_client = None
@@ -1,9 +1,11 @@
1
1
  """Sentry observability setup for Shotgun."""
2
2
 
3
- import logging
4
3
  import os
5
4
 
6
- logger = logging.getLogger(__name__)
5
+ from shotgun.logging_config import get_early_logger
6
+
7
+ # Use early logger to prevent automatic StreamHandler creation
8
+ logger = get_early_logger(__name__)
7
9
 
8
10
 
9
11
  def setup_sentry_observability() -> bool:
@@ -1,11 +1,12 @@
1
1
  """Observability setup for Logfire."""
2
2
 
3
- import logging
4
3
  import os
5
4
 
5
+ from shotgun.logging_config import get_early_logger
6
6
  from shotgun.utils.env_utils import is_falsy, is_truthy
7
7
 
8
- logger = logging.getLogger(__name__)
8
+ # Use early logger to prevent automatic StreamHandler creation
9
+ logger = get_early_logger(__name__)
9
10
 
10
11
 
11
12
  def setup_logfire_observability() -> bool:
@@ -760,6 +760,7 @@ def codebase_indexed_hint(codebase_name: str) -> str:
760
760
 
761
761
  def help_text_with_codebase() -> str:
762
762
  return (
763
+ "Howdy! Welcome to Shotgun - the context tool for software engineering. \n\nYou can research, build specs, plan, create tasks, and export context to your favorite code-gen agents.\n\n"
763
764
  "I can help with:\n\n"
764
765
  "- Speccing out a new feature\n"
765
766
  "- Onboarding you onto this project\n"
@@ -770,6 +771,7 @@ def help_text_with_codebase() -> str:
770
771
 
771
772
  def help_text_empty_dir() -> str:
772
773
  return (
774
+ "Howdy! Welcome to Shotgun - the context tool for software engineering.\n\nYou can research, build specs, plan, create tasks, and export context to your favorite code-gen agents.\n\n"
773
775
  "What would you like to build? Here are some examples:\n\n"
774
776
  "- Research FastAPI vs Django\n"
775
777
  "- Plan my new web app using React\n"