shotgun-sh 0.2.9.dev1__py3-none-any.whl → 0.2.10.dev2__py3-none-any.whl

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.

@@ -142,7 +142,7 @@ class ConfigManager:
142
142
  # Find default model for this provider
143
143
  provider_models = {
144
144
  ProviderType.OPENAI: ModelName.GPT_5,
145
- ProviderType.ANTHROPIC: ModelName.CLAUDE_SONNET_4_5,
145
+ ProviderType.ANTHROPIC: ModelName.CLAUDE_HAIKU_4_5,
146
146
  ProviderType.GOOGLE: ModelName.GEMINI_2_5_PRO,
147
147
  }
148
148
 
@@ -243,7 +243,7 @@ class ConfigManager:
243
243
 
244
244
  provider_models = {
245
245
  ProviderType.OPENAI: ModelName.GPT_5,
246
- ProviderType.ANTHROPIC: ModelName.CLAUDE_SONNET_4_5,
246
+ ProviderType.ANTHROPIC: ModelName.CLAUDE_HAIKU_4_5,
247
247
  ProviderType.GOOGLE: ModelName.GEMINI_2_5_PRO,
248
248
  }
249
249
  if provider_enum in provider_models:
@@ -28,6 +28,7 @@ class ModelName(StrEnum):
28
28
  GPT_5_MINI = "gpt-5-mini"
29
29
  CLAUDE_OPUS_4_1 = "claude-opus-4-1"
30
30
  CLAUDE_SONNET_4_5 = "claude-sonnet-4-5"
31
+ CLAUDE_HAIKU_4_5 = "claude-haiku-4-5"
31
32
  GEMINI_2_5_PRO = "gemini-2.5-pro"
32
33
  GEMINI_2_5_FLASH = "gemini-2.5-flash"
33
34
 
@@ -110,6 +111,13 @@ MODEL_SPECS: dict[ModelName, ModelSpec] = {
110
111
  max_output_tokens=16_000,
111
112
  litellm_proxy_model_name="anthropic/claude-sonnet-4-5",
112
113
  ),
114
+ ModelName.CLAUDE_HAIKU_4_5: ModelSpec(
115
+ name=ModelName.CLAUDE_HAIKU_4_5,
116
+ provider=ProviderType.ANTHROPIC,
117
+ max_input_tokens=200_000,
118
+ max_output_tokens=64_000,
119
+ litellm_proxy_model_name="anthropic/claude-haiku-4-5",
120
+ ),
113
121
  ModelName.GEMINI_2_5_PRO: ModelSpec(
114
122
  name=ModelName.GEMINI_2_5_PRO,
115
123
  provider=ProviderType.GOOGLE,
@@ -172,7 +172,7 @@ def get_provider_model(
172
172
  model_name = provider_or_model
173
173
  else:
174
174
  # No specific model requested - use selected or default
175
- model_name = config.selected_model or ModelName.CLAUDE_SONNET_4_5
175
+ model_name = config.selected_model or ModelName.CLAUDE_HAIKU_4_5
176
176
 
177
177
  if model_name not in MODEL_SPECS:
178
178
  raise ValueError(f"Model '{model_name.value}' not found")
@@ -247,8 +247,8 @@ def get_provider_model(
247
247
  if not api_key:
248
248
  raise ValueError("Anthropic API key not configured. Set via config.")
249
249
 
250
- # Use requested model or default to claude-sonnet-4-5
251
- model_name = requested_model if requested_model else ModelName.CLAUDE_SONNET_4_5
250
+ # Use requested model or default to claude-haiku-4-5
251
+ model_name = requested_model if requested_model else ModelName.CLAUDE_HAIKU_4_5
252
252
  if model_name not in MODEL_SPECS:
253
253
  raise ValueError(f"Model '{model_name.value}' not found")
254
254
  spec = MODEL_SPECS[model_name]
shotgun/api_endpoints.py CHANGED
@@ -1,10 +1,16 @@
1
1
  """Shotgun backend service API endpoints and URLs."""
2
2
 
3
+ import os
4
+
3
5
  # Shotgun Web API base URL (for authentication/subscription)
4
6
  # Can be overridden with environment variable
5
- SHOTGUN_WEB_BASE_URL = "https://api-219702594231.us-east4.run.app"
7
+ SHOTGUN_WEB_BASE_URL = os.getenv(
8
+ "SHOTGUN_WEB_BASE_URL", "https://api-219702594231.us-east4.run.app"
9
+ )
6
10
  # Shotgun's LiteLLM proxy base URL (for AI model requests)
7
- LITELLM_PROXY_BASE_URL = "https://litellm-219702594231.us-east4.run.app"
11
+ LITELLM_PROXY_BASE_URL = os.getenv(
12
+ "SHOTGUN_ACCOUNT_LLM_BASE_URL", "https://litellm-219702594231.us-east4.run.app"
13
+ )
8
14
 
9
15
  # Provider-specific LiteLLM proxy endpoints
10
16
  LITELLM_PROXY_ANTHROPIC_BASE = f"{LITELLM_PROXY_BASE_URL}/anthropic"
shotgun/main.py CHANGED
@@ -125,6 +125,41 @@ def main(
125
125
  help="Continue previous TUI conversation",
126
126
  ),
127
127
  ] = False,
128
+ web: Annotated[
129
+ bool,
130
+ typer.Option(
131
+ "--web",
132
+ help="Serve TUI as web application",
133
+ ),
134
+ ] = False,
135
+ port: Annotated[
136
+ int,
137
+ typer.Option(
138
+ "--port",
139
+ help="Port for web server (only used with --web)",
140
+ ),
141
+ ] = 8000,
142
+ host: Annotated[
143
+ str,
144
+ typer.Option(
145
+ "--host",
146
+ help="Host address for web server (only used with --web)",
147
+ ),
148
+ ] = "localhost",
149
+ public_url: Annotated[
150
+ str | None,
151
+ typer.Option(
152
+ "--public-url",
153
+ help="Public URL if behind proxy (only used with --web)",
154
+ ),
155
+ ] = None,
156
+ force_reindex: Annotated[
157
+ bool,
158
+ typer.Option(
159
+ "--force-reindex",
160
+ help="Force re-indexing of codebase (ignores existing index)",
161
+ ),
162
+ ] = False,
128
163
  ) -> None:
129
164
  """Shotgun - AI-powered CLI tool."""
130
165
  logger.debug("Starting shotgun CLI application")
@@ -134,16 +169,35 @@ def main(
134
169
  perform_auto_update_async(no_update_check=no_update_check)
135
170
 
136
171
  if ctx.invoked_subcommand is None and not ctx.resilient_parsing:
137
- logger.debug("Launching shotgun TUI application")
138
- try:
139
- tui_app.run(
140
- no_update_check=no_update_check, continue_session=continue_session
141
- )
142
- finally:
143
- # Ensure PostHog is shut down cleanly even if TUI exits unexpectedly
144
- from shotgun.posthog_telemetry import shutdown
145
-
146
- shutdown()
172
+ if web:
173
+ logger.debug("Launching shotgun TUI as web application")
174
+ try:
175
+ tui_app.serve(
176
+ host=host,
177
+ port=port,
178
+ public_url=public_url,
179
+ no_update_check=no_update_check,
180
+ continue_session=continue_session,
181
+ force_reindex=force_reindex,
182
+ )
183
+ finally:
184
+ # Ensure PostHog is shut down cleanly even if server exits unexpectedly
185
+ from shotgun.posthog_telemetry import shutdown
186
+
187
+ shutdown()
188
+ else:
189
+ logger.debug("Launching shotgun TUI application")
190
+ try:
191
+ tui_app.run(
192
+ no_update_check=no_update_check,
193
+ continue_session=continue_session,
194
+ force_reindex=force_reindex,
195
+ )
196
+ finally:
197
+ # Ensure PostHog is shut down cleanly even if TUI exits unexpectedly
198
+ from shotgun.posthog_telemetry import shutdown
199
+
200
+ shutdown()
147
201
  raise typer.Exit()
148
202
 
149
203
  # For CLI commands, register PostHog shutdown handler
shotgun/tui/app.py CHANGED
@@ -36,12 +36,16 @@ class ShotgunApp(App[None]):
36
36
  CSS_PATH = "styles.tcss"
37
37
 
38
38
  def __init__(
39
- self, no_update_check: bool = False, continue_session: bool = False
39
+ self,
40
+ no_update_check: bool = False,
41
+ continue_session: bool = False,
42
+ force_reindex: bool = False,
40
43
  ) -> None:
41
44
  super().__init__()
42
45
  self.config_manager: ConfigManager = get_config_manager()
43
46
  self.no_update_check = no_update_check
44
47
  self.continue_session = continue_session
48
+ self.force_reindex = force_reindex
45
49
 
46
50
  # Start async update check and install
47
51
  if not no_update_check:
@@ -87,8 +91,12 @@ class ShotgunApp(App[None]):
87
91
 
88
92
  if isinstance(self.screen, ChatScreen):
89
93
  return
90
- # Pass continue_session flag to ChatScreen
91
- self.push_screen(ChatScreen(continue_session=self.continue_session))
94
+ # Pass continue_session and force_reindex flags to ChatScreen
95
+ self.push_screen(
96
+ ChatScreen(
97
+ continue_session=self.continue_session, force_reindex=self.force_reindex
98
+ )
99
+ )
92
100
 
93
101
  def check_local_shotgun_directory_exists(self) -> bool:
94
102
  shotgun_dir = get_shotgun_base_path()
@@ -121,12 +129,17 @@ class ShotgunApp(App[None]):
121
129
  self.push_screen(FeedbackScreen(), callback=handle_feedback)
122
130
 
123
131
 
124
- def run(no_update_check: bool = False, continue_session: bool = False) -> None:
132
+ def run(
133
+ no_update_check: bool = False,
134
+ continue_session: bool = False,
135
+ force_reindex: bool = False,
136
+ ) -> None:
125
137
  """Run the TUI application.
126
138
 
127
139
  Args:
128
140
  no_update_check: If True, disable automatic update checks.
129
141
  continue_session: If True, continue from previous conversation.
142
+ force_reindex: If True, force re-indexing of codebase (ignores existing index).
130
143
  """
131
144
  # Clean up any corrupted databases BEFORE starting the TUI
132
145
  # This prevents crashes from corrupted databases during initialization
@@ -148,9 +161,133 @@ def run(no_update_check: bool = False, continue_session: bool = False) -> None:
148
161
  logger.error(f"Failed to cleanup corrupted databases: {e}")
149
162
  # Continue anyway - the TUI can still function
150
163
 
151
- app = ShotgunApp(no_update_check=no_update_check, continue_session=continue_session)
164
+ app = ShotgunApp(
165
+ no_update_check=no_update_check,
166
+ continue_session=continue_session,
167
+ force_reindex=force_reindex,
168
+ )
152
169
  app.run(inline_no_clear=True)
153
170
 
154
171
 
172
+ def serve(
173
+ host: str = "localhost",
174
+ port: int = 8000,
175
+ public_url: str | None = None,
176
+ no_update_check: bool = False,
177
+ continue_session: bool = False,
178
+ force_reindex: bool = False,
179
+ ) -> None:
180
+ """Serve the TUI application as a web application.
181
+
182
+ Args:
183
+ host: Host address for the web server.
184
+ port: Port number for the web server.
185
+ public_url: Public URL if behind a proxy.
186
+ no_update_check: If True, disable automatic update checks.
187
+ continue_session: If True, continue from previous conversation.
188
+ force_reindex: If True, force re-indexing of codebase (ignores existing index).
189
+ """
190
+ # Clean up any corrupted databases BEFORE starting the TUI
191
+ # This prevents crashes from corrupted databases during initialization
192
+ import asyncio
193
+
194
+ from textual_serve.server import Server
195
+
196
+ from shotgun.codebase.core.manager import CodebaseGraphManager
197
+ from shotgun.utils import get_shotgun_home
198
+
199
+ storage_dir = get_shotgun_home() / "codebases"
200
+ manager = CodebaseGraphManager(storage_dir)
201
+
202
+ try:
203
+ removed = asyncio.run(manager.cleanup_corrupted_databases())
204
+ if removed:
205
+ logger.info(
206
+ f"Cleaned up {len(removed)} corrupted database(s) before TUI startup"
207
+ )
208
+ except Exception as e:
209
+ logger.error(f"Failed to cleanup corrupted databases: {e}")
210
+ # Continue anyway - the TUI can still function
211
+
212
+ # Create a new event loop after asyncio.run() closes the previous one
213
+ # This is needed for the Server.serve() method
214
+ loop = asyncio.new_event_loop()
215
+ asyncio.set_event_loop(loop)
216
+
217
+ # Build the command string based on flags
218
+ command = "shotgun"
219
+ if no_update_check:
220
+ command += " --no-update-check"
221
+ if continue_session:
222
+ command += " --continue"
223
+ if force_reindex:
224
+ command += " --force-reindex"
225
+
226
+ # Create and start the server with hardcoded title and debug=False
227
+ server = Server(
228
+ command=command,
229
+ host=host,
230
+ port=port,
231
+ title="The Shotgun",
232
+ public_url=public_url,
233
+ )
234
+
235
+ # Set up graceful shutdown on SIGTERM/SIGINT
236
+ import signal
237
+ import sys
238
+
239
+ def signal_handler(_signum: int, _frame: Any) -> None:
240
+ """Handle shutdown signals gracefully."""
241
+ from shotgun.posthog_telemetry import shutdown
242
+
243
+ logger.info("Received shutdown signal, cleaning up...")
244
+ # Restore stdout/stderr before shutting down
245
+ sys.stdout = original_stdout
246
+ sys.stderr = original_stderr
247
+ shutdown()
248
+ sys.exit(0)
249
+
250
+ signal.signal(signal.SIGTERM, signal_handler)
251
+ signal.signal(signal.SIGINT, signal_handler)
252
+
253
+ # Suppress the textual-serve banner by redirecting stdout/stderr
254
+ import io
255
+
256
+ # Capture and suppress the banner, but show the actual serving URL
257
+ original_stdout = sys.stdout
258
+ original_stderr = sys.stderr
259
+
260
+ captured_output = io.StringIO()
261
+ sys.stdout = captured_output
262
+ sys.stderr = captured_output
263
+
264
+ try:
265
+ # This will print the banner to our captured output
266
+ import logging
267
+
268
+ # Temporarily set logging to ERROR level to suppress INFO messages
269
+ textual_serve_logger = logging.getLogger("textual_serve")
270
+ original_level = textual_serve_logger.level
271
+ textual_serve_logger.setLevel(logging.ERROR)
272
+
273
+ # Print our own message to the original stdout
274
+ sys.stdout = original_stdout
275
+ sys.stderr = original_stderr
276
+ print(f"Serving Shotgun TUI at http://{host}:{port}")
277
+ print("Press Ctrl+C to quit")
278
+
279
+ # Now suppress output again for the serve call
280
+ sys.stdout = captured_output
281
+ sys.stderr = captured_output
282
+
283
+ server.serve(debug=False)
284
+ finally:
285
+ # Restore original stdout/stderr
286
+ sys.stdout = original_stdout
287
+ sys.stderr = original_stderr
288
+ if "textual_serve_logger" in locals():
289
+ textual_serve_logger.setLevel(original_level)
290
+
291
+
155
292
  if __name__ == "__main__":
156
293
  run()
@@ -291,7 +291,9 @@ class ChatScreen(Screen[None]):
291
291
  qa_current_index = reactive(0)
292
292
  qa_answers: list[str] = []
293
293
 
294
- def __init__(self, continue_session: bool = False) -> None:
294
+ def __init__(
295
+ self, continue_session: bool = False, force_reindex: bool = False
296
+ ) -> None:
295
297
  super().__init__()
296
298
  # Get the model configuration and services
297
299
  model_config = get_provider_model()
@@ -319,6 +321,7 @@ class ChatScreen(Screen[None]):
319
321
  self.placeholder_hints = PlaceholderHints()
320
322
  self.conversation_manager = ConversationManager()
321
323
  self.continue_session = continue_session
324
+ self.force_reindex = force_reindex
322
325
 
323
326
  def on_mount(self) -> None:
324
327
  self.query_one(PromptInput).focus(scroll_visible=True)
@@ -378,6 +381,22 @@ class ChatScreen(Screen[None]):
378
381
  if is_empty or self.continue_session:
379
382
  return
380
383
 
384
+ # If force_reindex is True, delete any existing graphs for this directory
385
+ if self.force_reindex:
386
+ accessible_graphs = (
387
+ await self.codebase_sdk.list_codebases_for_directory()
388
+ ).graphs
389
+ for graph in accessible_graphs:
390
+ try:
391
+ await self.codebase_sdk.delete_codebase(graph.graph_id)
392
+ logger.info(
393
+ f"Deleted existing graph {graph.graph_id} due to --force-reindex"
394
+ )
395
+ except Exception as e:
396
+ logger.warning(
397
+ f"Failed to delete graph {graph.graph_id} during force reindex: {e}"
398
+ )
399
+
381
400
  # Check if the current directory has any accessible codebases
382
401
  accessible_graphs = (
383
402
  await self.codebase_sdk.list_codebases_for_directory()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shotgun-sh
3
- Version: 0.2.9.dev1
3
+ Version: 0.2.10.dev2
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
@@ -36,6 +36,7 @@ Requires-Dist: sentencepiece>=0.2.0
36
36
  Requires-Dist: sentry-sdk[pure-eval]>=2.0.0
37
37
  Requires-Dist: tenacity>=8.0.0
38
38
  Requires-Dist: textual-dev>=1.7.0
39
+ Requires-Dist: textual-serve>=0.1.0
39
40
  Requires-Dist: textual>=6.1.0
40
41
  Requires-Dist: tiktoken>=0.7.0
41
42
  Requires-Dist: tree-sitter-go>=0.23.0
@@ -1,8 +1,8 @@
1
1
  shotgun/__init__.py,sha256=P40K0fnIsb7SKcQrFnXZ4aREjpWchVDhvM1HxI4cyIQ,104
2
- shotgun/api_endpoints.py,sha256=TvxuJyMrZLy6KZTrR6lrdkG8OBtb3TJ48qaw3pWitO0,526
2
+ shotgun/api_endpoints.py,sha256=fBMTAQDyDXFY622MSrya5i_0ur_KYrCNg6wMf7QJVb4,627
3
3
  shotgun/build_constants.py,sha256=RXNxMz46HaB5jucgMVpw8a2yCJqjbhTOh0PddyEVMN8,713
4
4
  shotgun/logging_config.py,sha256=UKenihvgH8OA3W0b8ZFcItYaFJVe9MlsMYlcevyW1HY,7440
5
- shotgun/main.py,sha256=RA3q1xPfqxCu43UmgI2ryZpA-IxPhJb_MJrbLqp9c_g,5140
5
+ shotgun/main.py,sha256=4HLlnSmkVdm97yFCsXpY7d598xkOL7jtJLTq5sHPzrs,6762
6
6
  shotgun/posthog_telemetry.py,sha256=TOiyBtLg21SttHGWKc4-e-PQgpbq6Uz_4OzlvlxMcZ0,6099
7
7
  shotgun/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  shotgun/sentry_telemetry.py,sha256=VD8es-tREfgtRKhDsEVvqpo0_kM_ab6iVm2lkOEmTlI,2950
@@ -23,9 +23,9 @@ shotgun/agents/tasks.py,sha256=AuriwtDn6uZz2G0eKfqBHYQrxYfJlbiAd-fcsw9lU3I,2949
23
23
  shotgun/agents/usage_manager.py,sha256=5d9JC4_cthXwhTSytMfMExMDAUYp8_nkPepTJZXk13w,5017
24
24
  shotgun/agents/config/__init__.py,sha256=Fl8K_81zBpm-OfOW27M_WWLSFdaHHek6lWz95iDREjQ,318
25
25
  shotgun/agents/config/constants.py,sha256=JNuLpeBUKikEsxGSjwX3RVWUQpbCKnDKstF2NczuDqk,932
26
- shotgun/agents/config/manager.py,sha256=WO3TOwXCSOa7e3s_rmvH74jGw7xTqA_OaGhNaUsZ0a4,18922
27
- shotgun/agents/config/models.py,sha256=ohLXt9niCy4uFfFP1E6WSBZtxh7aZ16gTA2S3pHYkmc,5431
28
- shotgun/agents/config/provider.py,sha256=K2uW7DkdAhZfoDJcWV7NxOrSoEq1rQzArtZnxIgEe3E,12496
26
+ shotgun/agents/config/manager.py,sha256=Z8EQoWPQM7uj3MyklmxHQ1GR6va1uv9BjT5DDvAv3pY,18920
27
+ shotgun/agents/config/models.py,sha256=tM0JnMf-hWWzJCmOsJBA6tIiwrdFTQI_4B0zYFNg6CU,5736
28
+ shotgun/agents/config/provider.py,sha256=tqxcVGCOy7j1fakL9M994TE0v4dCG1OuySrGkbUnSQI,12493
29
29
  shotgun/agents/history/__init__.py,sha256=XFQj2a6fxDqVg0Q3juvN9RjV_RJbgvFZtQOCOjVJyp4,147
30
30
  shotgun/agents/history/compaction.py,sha256=9RMpG0aY_7L4TecbgwHSOkGtbd9W5XZTg-MbzZmNl00,3515
31
31
  shotgun/agents/history/constants.py,sha256=yWY8rrTZarLA3flCCMB_hS2NMvUDRDTwP4D4j7MIh1w,446
@@ -119,7 +119,7 @@ shotgun/shotgun_web/client.py,sha256=n5DDuVfSa6VPZjhSsfSxQlSFOnhgDHyidRnB8Hv9XF4
119
119
  shotgun/shotgun_web/constants.py,sha256=eNvtjlu81bAVQaCwZXOVjSpDopUm9pf34XuZEvuMiko,661
120
120
  shotgun/shotgun_web/models.py,sha256=Ie9VfqKZM2tIJhIjentU9qLoNaMZvnUJaIu-xg9kQsA,1391
121
121
  shotgun/tui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
- shotgun/tui/app.py,sha256=B2tKbXeGhWBIVec1jJHGAuBcP1SMbO_6xol2OaBpw2Y,5374
122
+ shotgun/tui/app.py,sha256=DwHBJO4PI5qykOb-nmiU3WJRxCeu1e80qPVE_GHn4Fo,9759
123
123
  shotgun/tui/filtered_codebase_service.py,sha256=lJ8gTMhIveTatmvmGLP299msWWTkVYKwvY_2FhuL2s4,1687
124
124
  shotgun/tui/styles.tcss,sha256=ETyyw1bpMBOqTi5RLcAJUScdPWTvAWEqE9YcT0kVs_E,121
125
125
  shotgun/tui/commands/__init__.py,sha256=8D5lvtpqMW5-fF7Bg3oJtUzU75cKOv6aUaHYYszydU8,2518
@@ -127,7 +127,7 @@ shotgun/tui/components/prompt_input.py,sha256=Ss-htqraHZAPaehGE4x86ij0veMjc4Ugad
127
127
  shotgun/tui/components/spinner.py,sha256=ovTDeaJ6FD6chZx_Aepia6R3UkPOVJ77EKHfRmn39MY,2427
128
128
  shotgun/tui/components/splash.py,sha256=vppy9vEIEvywuUKRXn2y11HwXSRkQZHLYoVjhDVdJeU,1267
129
129
  shotgun/tui/components/vertical_tail.py,sha256=kROwTaRjUwVB7H35dtmNcUVPQqNYvvfq7K2tXBKEb6c,638
130
- shotgun/tui/screens/chat.py,sha256=D_HKVSOjT1ex3AHRtE41hTmDKiiUmmHY7BIbHvTyj-w,38747
130
+ shotgun/tui/screens/chat.py,sha256=iBiTxbQw2wvnyRe5-H_hUYUvIAxMnh8IM0bTgqAkQW4,39549
131
131
  shotgun/tui/screens/chat.tcss,sha256=2Yq3E23jxsySYsgZf4G1AYrYVcpX0UDW6kNNI0tDmtM,437
132
132
  shotgun/tui/screens/directory_setup.py,sha256=lIZ1J4A6g5Q2ZBX8epW7BhR96Dmdcg22CyiM5S-I5WU,3237
133
133
  shotgun/tui/screens/feedback.py,sha256=VxpW0PVxMp22ZvSfQkTtgixNrpEOlfWtekjqlVfYEjA,5708
@@ -148,8 +148,8 @@ shotgun/utils/env_utils.py,sha256=ulM3BRi9ZhS7uC-zorGeDQm4SHvsyFuuU9BtVPqdrHY,14
148
148
  shotgun/utils/file_system_utils.py,sha256=l-0p1bEHF34OU19MahnRFdClHufThfGAjQ431teAIp0,1004
149
149
  shotgun/utils/source_detection.py,sha256=Co6Q03R3fT771TF3RzB-70stfjNP2S4F_ArZKibwzm8,454
150
150
  shotgun/utils/update_checker.py,sha256=IgzPHRhS1ETH7PnJR_dIx6lxgr1qHpCkMTgzUxvGjhI,7586
151
- shotgun_sh-0.2.9.dev1.dist-info/METADATA,sha256=pwboOMILOv47b9GxLmWiURNBJuJkKdEt8NnpQerH6kQ,4299
152
- shotgun_sh-0.2.9.dev1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
153
- shotgun_sh-0.2.9.dev1.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
154
- shotgun_sh-0.2.9.dev1.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
155
- shotgun_sh-0.2.9.dev1.dist-info/RECORD,,
151
+ shotgun_sh-0.2.10.dev2.dist-info/METADATA,sha256=cCqrLxd2oGkzMJmBJ0IHdEU9LsYOmrri7mfvYu_Z9SU,4336
152
+ shotgun_sh-0.2.10.dev2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
153
+ shotgun_sh-0.2.10.dev2.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
154
+ shotgun_sh-0.2.10.dev2.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
155
+ shotgun_sh-0.2.10.dev2.dist-info/RECORD,,