shotgun-sh 0.1.14.dev1__py3-none-any.whl → 0.1.15__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.

@@ -12,8 +12,8 @@ POSTHOG_API_KEY = ''
12
12
  POSTHOG_PROJECT_ID = '191396'
13
13
 
14
14
  # Logfire configuration embedded at build time (only for dev builds)
15
- LOGFIRE_ENABLED = 'true'
16
- LOGFIRE_TOKEN = 'pylf_v1_us_KZ5NM1pP3NwgJkbBJt6Ftdzk8mMhmrXcGJHQQgDJ1LfK'
15
+ LOGFIRE_ENABLED = ''
16
+ LOGFIRE_TOKEN = ''
17
17
 
18
18
  # Build metadata
19
19
  BUILD_TIME_ENV = "production" if SENTRY_DSN else "development"
@@ -0,0 +1,46 @@
1
+ """Configuration management CLI commands."""
2
+
3
+ from typing import Annotated
4
+
5
+ import typer
6
+ from rich.console import Console
7
+
8
+ from shotgun.agents.config import get_config_manager
9
+ from shotgun.logging_config import get_logger
10
+ from shotgun.posthog_telemetry import Feedback, FeedbackKind, submit_feedback_survey
11
+
12
+ logger = get_logger(__name__)
13
+ console = Console()
14
+
15
+ app = typer.Typer(
16
+ name="feedback",
17
+ help="Send us feedback",
18
+ no_args_is_help=True,
19
+ )
20
+
21
+
22
+ @app.callback(invoke_without_command=True)
23
+ def send_feedback(
24
+ description: Annotated[str, typer.Argument(help="Description of the feedback")],
25
+ kind: Annotated[
26
+ FeedbackKind,
27
+ typer.Option("--type", "-t", help="Feedback type"),
28
+ ],
29
+ ) -> None:
30
+ """Initialize Shotgun configuration."""
31
+ config_manager = get_config_manager()
32
+ config_manager.load()
33
+ user_id = config_manager.get_user_id()
34
+
35
+ if not description:
36
+ console.print(
37
+ '❌ Please add your feedback (shotgun feedback "<your feedback>").',
38
+ style="red",
39
+ )
40
+ raise typer.Exit(1)
41
+
42
+ feedback = Feedback(kind=kind, description=description, user_id=user_id)
43
+
44
+ submit_feedback_survey(feedback)
45
+
46
+ console.print("Feedback sent. Thank you!")
@@ -1221,26 +1221,11 @@ class CodebaseGraphManager:
1221
1221
 
1222
1222
  removed_graphs = []
1223
1223
 
1224
- # Find all .kuzu files (can be files or directories)
1224
+ # Find all .kuzu databases (files in v0.11.2, directories in newer versions)
1225
1225
  for path in self.storage_dir.glob("*.kuzu"):
1226
1226
  graph_id = path.stem
1227
1227
 
1228
- # If it's a plain file (not a directory), it's corrupted
1229
- # Valid Kuzu databases are always directories
1230
- if path.is_file():
1231
- logger.warning(
1232
- f"Detected corrupted database file (should be directory) at {path}, removing it"
1233
- )
1234
- try:
1235
- await anyio.to_thread.run_sync(path.unlink)
1236
- removed_graphs.append(graph_id)
1237
- logger.info(f"Removed corrupted database file: {graph_id}")
1238
- except Exception as e:
1239
- logger.error(
1240
- f"Failed to remove corrupted database file {graph_id}: {e}"
1241
- )
1242
- continue
1243
-
1228
+ # Try to open and validate the database
1244
1229
  try:
1245
1230
  # Try to open the database with a timeout to prevent hanging
1246
1231
  async def try_open_database(
@@ -1346,7 +1331,7 @@ class CodebaseGraphManager:
1346
1331
  """
1347
1332
  graphs = []
1348
1333
 
1349
- # Find all .kuzu files
1334
+ # Find all .kuzu database files (Kuzu v0.11.2 creates files, not directories)
1350
1335
  for path in self.storage_dir.glob("*.kuzu"):
1351
1336
  if path.is_file():
1352
1337
  graph_id = path.stem
@@ -1439,6 +1424,8 @@ class CodebaseGraphManager:
1439
1424
  Args:
1440
1425
  graph_id: Graph to delete
1441
1426
  """
1427
+ import shutil
1428
+
1442
1429
  # Stop watcher if running
1443
1430
  if graph_id in self._watchers:
1444
1431
  await self.stop_watcher(graph_id)
@@ -1453,11 +1440,14 @@ class CodebaseGraphManager:
1453
1440
  self._databases[graph_id].close()
1454
1441
  del self._databases[graph_id]
1455
1442
 
1456
- # Delete files
1443
+ # Delete database (files in v0.11.2, directories in newer versions)
1457
1444
  graph_path = self.storage_dir / f"{graph_id}.kuzu"
1458
1445
  if graph_path.exists():
1459
- # Delete the database file
1460
- await anyio.to_thread.run_sync(graph_path.unlink)
1446
+ if graph_path.is_dir():
1447
+ await anyio.to_thread.run_sync(shutil.rmtree, graph_path)
1448
+ else:
1449
+ # File-based database (Kuzu v0.11.2)
1450
+ await anyio.to_thread.run_sync(graph_path.unlink)
1461
1451
 
1462
1452
  # Also delete the WAL file if it exists
1463
1453
  wal_path = self.storage_dir / f"{graph_id}.kuzu.wal"
shotgun/main.py CHANGED
@@ -16,7 +16,17 @@ from dotenv import load_dotenv
16
16
 
17
17
  from shotgun import __version__
18
18
  from shotgun.agents.config import get_config_manager
19
- from shotgun.cli import codebase, config, export, plan, research, specify, tasks, update
19
+ from shotgun.cli import (
20
+ codebase,
21
+ config,
22
+ export,
23
+ feedback,
24
+ plan,
25
+ research,
26
+ specify,
27
+ tasks,
28
+ update,
29
+ )
20
30
  from shotgun.logging_config import configure_root_logger, get_logger
21
31
  from shotgun.posthog_telemetry import setup_posthog_observability
22
32
  from shotgun.sentry_telemetry import setup_sentry_observability
@@ -68,6 +78,7 @@ app.add_typer(specify.app, name="specify", help="Generate comprehensive specific
68
78
  app.add_typer(tasks.app, name="tasks", help="Generate task lists with agentic approach")
69
79
  app.add_typer(export.app, name="export", help="Export artifacts to various formats")
70
80
  app.add_typer(update.app, name="update", help="Check for and install updates")
81
+ app.add_typer(feedback.app, name="feedback", help="Send us feedback")
71
82
 
72
83
 
73
84
  def version_callback(value: bool) -> None:
@@ -1,11 +1,14 @@
1
1
  """PostHog analytics setup for Shotgun."""
2
2
 
3
+ from enum import Enum
3
4
  from typing import Any
4
5
 
5
6
  import posthog
7
+ from pydantic import BaseModel
6
8
 
7
9
  from shotgun import __version__
8
10
  from shotgun.agents.config import get_config_manager
11
+ from shotgun.agents.conversation_manager import ConversationManager
9
12
  from shotgun.logging_config import get_early_logger
10
13
 
11
14
  # Use early logger to prevent automatic StreamHandler creation
@@ -132,3 +135,51 @@ def shutdown() -> None:
132
135
  logger.warning("Error shutting down PostHog: %s", e)
133
136
  finally:
134
137
  _posthog_client = None
138
+
139
+
140
+ class FeedbackKind(str, Enum):
141
+ BUG = "bug"
142
+ FEATURE = "feature"
143
+ OTHER = "other"
144
+
145
+
146
+ class Feedback(BaseModel):
147
+ kind: FeedbackKind
148
+ description: str
149
+ user_id: str
150
+
151
+
152
+ SURVEY_ID = "01999f81-9486-0000-4fa6-9632959f92f3"
153
+ Q_KIND_ID = "aaa5fcc3-88ba-4c24-bcf5-1481fd5efc2b"
154
+ Q_DESCRIPTION_ID = "a0ed6283-5d4b-452c-9160-6768d879db8a"
155
+
156
+
157
+ def submit_feedback_survey(feedback: Feedback) -> None:
158
+ global _posthog_client
159
+ if _posthog_client is None:
160
+ logger.debug("PostHog not initialized, skipping feedback survey")
161
+ return
162
+
163
+ config_manager = get_config_manager()
164
+ config = config_manager.load()
165
+ conversation_manager = ConversationManager()
166
+ conversation = conversation_manager.load()
167
+ last_10_messages = []
168
+ if conversation is not None:
169
+ last_10_messages = conversation.get_agent_messages()[:10]
170
+
171
+ track_event(
172
+ "survey sent",
173
+ properties={
174
+ "$survey_id": SURVEY_ID,
175
+ "$survey_questions": [
176
+ {"id": Q_KIND_ID, "question": "Feedback type"},
177
+ {"id": Q_DESCRIPTION_ID, "question": "Feedback description"},
178
+ ],
179
+ f"$survey_response_{Q_KIND_ID}": feedback.kind,
180
+ f"$survey_response_{Q_DESCRIPTION_ID}": feedback.description,
181
+ "provider": config.default_provider.value,
182
+ "config_version": config.config_version,
183
+ "last_10_messages": last_10_messages, # last 10 messages
184
+ },
185
+ )
shotgun/tui/app.py CHANGED
@@ -13,6 +13,7 @@ from shotgun.utils.update_checker import perform_auto_update_async
13
13
 
14
14
  from .screens.chat import ChatScreen
15
15
  from .screens.directory_setup import DirectorySetupScreen
16
+ from .screens.feedback import FeedbackScreen
16
17
  from .screens.provider_config import ProviderConfigScreen
17
18
 
18
19
  logger = get_logger(__name__)
@@ -23,10 +24,12 @@ class ShotgunApp(App[None]):
23
24
  "chat": ChatScreen,
24
25
  "provider_config": ProviderConfigScreen,
25
26
  "directory_setup": DirectorySetupScreen,
27
+ "feedback": FeedbackScreen,
26
28
  }
27
29
  BINDINGS = [
28
30
  Binding("ctrl+c", "quit", "Quit the app"),
29
31
  ]
32
+
30
33
  CSS_PATH = "styles.tcss"
31
34
 
32
35
  def __init__(
@@ -90,7 +93,22 @@ class ShotgunApp(App[None]):
90
93
  self.exit()
91
94
 
92
95
  def get_system_commands(self, screen: Screen[Any]) -> Iterable[SystemCommand]:
93
- return [] # we don't want any system commands
96
+ return [
97
+ SystemCommand(
98
+ "Feedback", "Send us feedback or report a bug", self.action_feedback
99
+ )
100
+ ] # we don't want any system commands
101
+
102
+ def action_feedback(self) -> None:
103
+ """Open feedback screen and submit feedback."""
104
+ from shotgun.posthog_telemetry import Feedback, submit_feedback_survey
105
+
106
+ def handle_feedback(feedback: Feedback | None) -> None:
107
+ if feedback is not None:
108
+ submit_feedback_survey(feedback)
109
+ self.notify("Feedback sent. Thank you!")
110
+
111
+ self.push_screen("feedback", callback=handle_feedback)
94
112
 
95
113
 
96
114
  def run(no_update_check: bool = False, continue_session: bool = False) -> None:
@@ -0,0 +1,193 @@
1
+ """Screen for submitting user feedback."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, cast
6
+
7
+ from textual import on
8
+ from textual.app import ComposeResult
9
+ from textual.containers import Horizontal, Vertical
10
+ from textual.reactive import reactive
11
+ from textual.screen import Screen
12
+ from textual.widgets import Button, Label, ListItem, ListView, Static, TextArea
13
+
14
+ from shotgun.posthog_telemetry import Feedback, FeedbackKind
15
+
16
+ if TYPE_CHECKING:
17
+ from ..app import ShotgunApp
18
+
19
+
20
+ class FeedbackScreen(Screen[Feedback | None]):
21
+ """Collect feedback from users."""
22
+
23
+ CSS = """
24
+ FeedbackScreen {
25
+ layout: vertical;
26
+ }
27
+
28
+ FeedbackScreen > * {
29
+ height: auto;
30
+ }
31
+
32
+ Label {
33
+ padding: 0 1;
34
+ }
35
+
36
+ #titlebox {
37
+ height: auto;
38
+ margin: 2 0;
39
+ padding: 1;
40
+ border: hkey $border;
41
+ content-align: center middle;
42
+
43
+ & > * {
44
+ text-align: center;
45
+ }
46
+ }
47
+
48
+ #feedback-title {
49
+ padding: 1 0;
50
+ margin-bottom: 2;
51
+ text-style: bold;
52
+ color: $text-accent;
53
+ }
54
+
55
+ #feedback-type-list {
56
+ height: auto;
57
+ & > * {
58
+ padding: 1 0;
59
+ }
60
+ }
61
+
62
+ #feedback-description {
63
+ margin: 1 0;
64
+ height: 10;
65
+ border: solid $border;
66
+ }
67
+
68
+ #feedback-actions {
69
+ padding: 1;
70
+ }
71
+
72
+ #feedback-actions > * {
73
+ margin-right: 2;
74
+ }
75
+
76
+ #feedback-type-list {
77
+ padding: 1;
78
+ }
79
+ """
80
+
81
+ BINDINGS = [
82
+ ("escape", "cancel", "Cancel"),
83
+ ]
84
+
85
+ selected_kind: reactive[FeedbackKind] = reactive(FeedbackKind.BUG)
86
+
87
+ def compose(self) -> ComposeResult:
88
+ with Vertical(id="titlebox"):
89
+ yield Static("Send us feedback", id="feedback-title")
90
+ yield Static(
91
+ "Select the type of feedback and provide details below.",
92
+ id="feedback-summary",
93
+ )
94
+ yield ListView(*self._build_feedback_type_items(), id="feedback-type-list")
95
+ yield TextArea(
96
+ "",
97
+ id="feedback-description",
98
+ )
99
+ with Horizontal(id="feedback-actions"):
100
+ yield Button("Submit", variant="primary", id="submit")
101
+ yield Button("Cancel \\[ESC]", id="cancel")
102
+
103
+ def on_mount(self) -> None:
104
+ list_view = self.query_one(ListView)
105
+ if list_view.children:
106
+ list_view.index = 0
107
+ self.selected_kind = FeedbackKind.BUG
108
+ text_area = self.query_one("#feedback-description", TextArea)
109
+ text_area.focus()
110
+
111
+ def action_cancel(self) -> None:
112
+ self.dismiss(None)
113
+
114
+ @on(ListView.Highlighted)
115
+ def _on_kind_highlighted(self, event: ListView.Highlighted) -> None:
116
+ kind = self._kind_from_item(event.item)
117
+ if kind:
118
+ self.selected_kind = kind
119
+
120
+ @on(ListView.Selected)
121
+ def _on_kind_selected(self, event: ListView.Selected) -> None:
122
+ kind = self._kind_from_item(event.item)
123
+ if kind:
124
+ self.selected_kind = kind
125
+ self.set_focus(self.query_one("#feedback-description", TextArea))
126
+
127
+ @on(Button.Pressed, "#submit")
128
+ def _on_submit_pressed(self) -> None:
129
+ self._submit_feedback()
130
+
131
+ @on(Button.Pressed, "#cancel")
132
+ def _on_cancel_pressed(self) -> None:
133
+ self.action_cancel()
134
+
135
+ def watch_selected_kind(self, kind: FeedbackKind) -> None:
136
+ if not self.is_mounted:
137
+ return
138
+ # Update the placeholder in text area based on selected kind
139
+ text_area = self.query_one("#feedback-description", TextArea)
140
+ text_area.placeholder = self._placeholder_for_kind(kind)
141
+
142
+ def _build_feedback_type_items(self) -> list[ListItem]:
143
+ items: list[ListItem] = []
144
+ for kind in FeedbackKind:
145
+ label = Label(self._kind_label(kind), id=f"label-{kind.value}")
146
+ items.append(ListItem(label, id=f"kind-{kind.value}"))
147
+ return items
148
+
149
+ def _kind_from_item(self, item: ListItem | None) -> FeedbackKind | None:
150
+ if item is None or item.id is None:
151
+ return None
152
+ kind_id = item.id.removeprefix("kind-")
153
+ try:
154
+ return FeedbackKind(kind_id)
155
+ except ValueError:
156
+ return None
157
+
158
+ def _kind_label(self, kind: FeedbackKind) -> str:
159
+ display_names = {
160
+ FeedbackKind.BUG: "Bug Report",
161
+ FeedbackKind.FEATURE: "Feature Request",
162
+ FeedbackKind.OTHER: "Other",
163
+ }
164
+ return display_names.get(kind, kind.value.title())
165
+
166
+ def _placeholder_for_kind(self, kind: FeedbackKind) -> str:
167
+ placeholders = {
168
+ FeedbackKind.BUG: "Describe the bug you encountered...",
169
+ FeedbackKind.FEATURE: "Describe the feature you'd like to see...",
170
+ FeedbackKind.OTHER: "Tell us what's on your mind...",
171
+ }
172
+ return placeholders.get(kind, "Enter your feedback...")
173
+
174
+ def _submit_feedback(self) -> None:
175
+ text_area = self.query_one("#feedback-description", TextArea)
176
+ description = text_area.text.strip()
177
+
178
+ if not description:
179
+ self.notify(
180
+ "Please enter a description before submitting.", severity="error"
181
+ )
182
+ return
183
+
184
+ app = cast("ShotgunApp", self.app)
185
+ user_id = app.config_manager.get_user_id()
186
+
187
+ feedback = Feedback(
188
+ kind=self.selected_kind,
189
+ description=description,
190
+ user_id=user_id,
191
+ )
192
+
193
+ self.dismiss(feedback)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shotgun-sh
3
- Version: 0.1.14.dev1
3
+ Version: 0.1.15
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,8 +1,8 @@
1
1
  shotgun/__init__.py,sha256=P40K0fnIsb7SKcQrFnXZ4aREjpWchVDhvM1HxI4cyIQ,104
2
- shotgun/build_constants.py,sha256=RXNxMz46HaB5jucgMVpw8a2yCJqjbhTOh0PddyEVMN8,713
2
+ shotgun/build_constants.py,sha256=hDFr6eO0lwN0iCqHQ1A5s0D68txR8sYrTJLGa7tSi0o,654
3
3
  shotgun/logging_config.py,sha256=UKenihvgH8OA3W0b8ZFcItYaFJVe9MlsMYlcevyW1HY,7440
4
- shotgun/main.py,sha256=Fbg4MNEOR-FPibcbIQ7LwdQIOdYMNYMbMCPPjasbJyA,4834
5
- shotgun/posthog_telemetry.py,sha256=tu5FLao8uXd76RcKMyWQ9RWPCCJos749XJ_9uT_NNwI,4294
4
+ shotgun/main.py,sha256=670RwzIwEIz9QRil37IbVoxWuX66YATqXFLSYSqKw-w,4955
5
+ shotgun/posthog_telemetry.py,sha256=ZD_BjRej1v4Mxh7VN3AlXGKV4jIU9SC0uBrH94VQa6c,5885
6
6
  shotgun/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  shotgun/sentry_telemetry.py,sha256=L7jFMNAnDIENWVeQYSLpyul2nmIm2w3wnOp2kDP_cic,2902
8
8
  shotgun/telemetry.py,sha256=Ves6Ih3hshpKVNVAUUmwRdtW8NkTjFPg8hEqvFKZ0t0,3208
@@ -50,6 +50,7 @@ shotgun/agents/tools/web_search/utils.py,sha256=GLJ5QV9bT2ubFMuFN7caMN7tK9OTJ0R3
50
50
  shotgun/cli/__init__.py,sha256=_F1uW2g87y4bGFxz8Gp8u7mq2voHp8vQIUtCmm8Tojo,40
51
51
  shotgun/cli/config.py,sha256=LbjxDNPdetYJiwlcyOYLnqwzALfgU-m54cfstUshbrs,8715
52
52
  shotgun/cli/export.py,sha256=3hIwK2_OM1MFYSTfzBxsGuuBGm5fo0XdxASfQ5Uqb3Y,2471
53
+ shotgun/cli/feedback.py,sha256=Me1dQQgkYwP4AIFwYgfHcPXxFdJ6CzFbCBttKcFd2Q0,1238
53
54
  shotgun/cli/models.py,sha256=LoajeEK7MEDUSnZXb1Li-dbhXqne812YZglx-LcVpiQ,181
54
55
  shotgun/cli/plan.py,sha256=T-eu-I9z-dSoKqJ-KI8X5i5Mm0VL1BfornxRiUjTgnk,2324
55
56
  shotgun/cli/research.py,sha256=qvBBtX3Wyn6pDZlJpcEvbeK-0iTOXegi71tm8HKVYaE,2490
@@ -69,7 +70,7 @@ shotgun/codebase/core/code_retrieval.py,sha256=_JVyyQKHDFm3dxOOua1mw9eIIOHIVz3-I
69
70
  shotgun/codebase/core/cypher_models.py,sha256=Yfysfa9lLguILftkmtuJCN3kLBFIo7WW7NigM-Zr-W4,1735
70
71
  shotgun/codebase/core/ingestor.py,sha256=yh6BEIuUUfXU3dVpP0Llk19SrxA-uo3pdGnfcQsDsSo,63368
71
72
  shotgun/codebase/core/language_config.py,sha256=vsqHyuFnumRPRBV1lMOxWKNOIiClO6FyfKQR0fGrtl4,8934
72
- shotgun/codebase/core/manager.py,sha256=nwyDv6bnyZRIerra8LSC41fJasmfSs7mGpVYbbKGeYs,66378
73
+ shotgun/codebase/core/manager.py,sha256=USGLBdDUoFtq6fMFWRtUu2HBC_FI8d6lWcAV4l6fcvk,66000
73
74
  shotgun/codebase/core/nl_query.py,sha256=kPoSJXBlm5rLhzOofZhqPVMJ_Lj3rV2H6sld6BwtMdg,16115
74
75
  shotgun/codebase/core/parser_loader.py,sha256=LZRrDS8Sp518jIu3tQW-BxdwJ86lnsTteI478ER9Td8,4278
75
76
  shotgun/prompts/__init__.py,sha256=RswUm0HMdfm2m2YKUwUsEdRIwoczdbI7zlucoEvHYRo,132
@@ -102,7 +103,7 @@ shotgun/sdk/exceptions.py,sha256=qBcQv0v7ZTwP7CMcxZST4GqCsfOWtOUjSzGBo0-heqo,412
102
103
  shotgun/sdk/models.py,sha256=X9nOTUHH0cdkQW1NfnMEDu-QgK9oUsEISh1Jtwr5Am4,5496
103
104
  shotgun/sdk/services.py,sha256=J4PJFSxCQ6--u7rb3Ta-9eYtlYcxcbnzrMP6ThyCnw4,705
104
105
  shotgun/tui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
- shotgun/tui/app.py,sha256=xosEcdzWzRv0Aa0ZLJ04DYlYPpJ6dk2BITEPNLyFxms,4330
106
+ shotgun/tui/app.py,sha256=Ca7pAF2GOR6RvJdK1_P_aqF7OosTm5WRUhxF1M-Ihcs,4994
106
107
  shotgun/tui/filtered_codebase_service.py,sha256=lJ8gTMhIveTatmvmGLP299msWWTkVYKwvY_2FhuL2s4,1687
107
108
  shotgun/tui/styles.tcss,sha256=ETyyw1bpMBOqTi5RLcAJUScdPWTvAWEqE9YcT0kVs_E,121
108
109
  shotgun/tui/commands/__init__.py,sha256=8D5lvtpqMW5-fF7Bg3oJtUzU75cKOv6aUaHYYszydU8,2518
@@ -113,6 +114,7 @@ shotgun/tui/components/vertical_tail.py,sha256=kROwTaRjUwVB7H35dtmNcUVPQqNYvvfq7
113
114
  shotgun/tui/screens/chat.py,sha256=HIDnqt8og2KMmtdOok1lL44130M8V7IP6Un_8HcRwsA,30178
114
115
  shotgun/tui/screens/chat.tcss,sha256=2Yq3E23jxsySYsgZf4G1AYrYVcpX0UDW6kNNI0tDmtM,437
115
116
  shotgun/tui/screens/directory_setup.py,sha256=lIZ1J4A6g5Q2ZBX8epW7BhR96Dmdcg22CyiM5S-I5WU,3237
117
+ shotgun/tui/screens/feedback.py,sha256=cYtmuM3qqKwevstu8gJ9mmk7lkIKZvfAyDEBUOLh-yI,5660
116
118
  shotgun/tui/screens/provider_config.py,sha256=A_tvDHF5KLP5PV60LjMJ_aoOdT3TjI6_g04UIUqGPqM,7126
117
119
  shotgun/tui/screens/splash.py,sha256=E2MsJihi3c9NY1L28o_MstDxGwrCnnV7zdq00MrGAsw,706
118
120
  shotgun/tui/screens/chat_screen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -126,8 +128,8 @@ shotgun/utils/env_utils.py,sha256=8QK5aw_f_V2AVTleQQlcL0RnD4sPJWXlDG46fsHu0d8,10
126
128
  shotgun/utils/file_system_utils.py,sha256=l-0p1bEHF34OU19MahnRFdClHufThfGAjQ431teAIp0,1004
127
129
  shotgun/utils/source_detection.py,sha256=Co6Q03R3fT771TF3RzB-70stfjNP2S4F_ArZKibwzm8,454
128
130
  shotgun/utils/update_checker.py,sha256=IgzPHRhS1ETH7PnJR_dIx6lxgr1qHpCkMTgzUxvGjhI,7586
129
- shotgun_sh-0.1.14.dev1.dist-info/METADATA,sha256=3x81Mpn8f-zmc9tH8P_FVniZ7GqGV_SeH4nbDPqRIcU,11197
130
- shotgun_sh-0.1.14.dev1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
131
- shotgun_sh-0.1.14.dev1.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
132
- shotgun_sh-0.1.14.dev1.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
133
- shotgun_sh-0.1.14.dev1.dist-info/RECORD,,
131
+ shotgun_sh-0.1.15.dist-info/METADATA,sha256=ekzpPo1vA1skNUJUp12mXlOt_0A6UpzDN9E9GDaimjA,11192
132
+ shotgun_sh-0.1.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
133
+ shotgun_sh-0.1.15.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
134
+ shotgun_sh-0.1.15.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
135
+ shotgun_sh-0.1.15.dist-info/RECORD,,