shotgun-sh 0.1.14.dev2__py3-none-any.whl → 0.1.15.dev1__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.
- shotgun/cli/feedback.py +46 -0
- shotgun/main.py +12 -1
- shotgun/posthog_telemetry.py +51 -0
- shotgun/tui/app.py +19 -1
- shotgun/tui/screens/feedback.py +193 -0
- {shotgun_sh-0.1.14.dev2.dist-info → shotgun_sh-0.1.15.dev1.dist-info}/METADATA +1 -1
- {shotgun_sh-0.1.14.dev2.dist-info → shotgun_sh-0.1.15.dev1.dist-info}/RECORD +10 -8
- {shotgun_sh-0.1.14.dev2.dist-info → shotgun_sh-0.1.15.dev1.dist-info}/WHEEL +0 -0
- {shotgun_sh-0.1.14.dev2.dist-info → shotgun_sh-0.1.15.dev1.dist-info}/entry_points.txt +0 -0
- {shotgun_sh-0.1.14.dev2.dist-info → shotgun_sh-0.1.15.dev1.dist-info}/licenses/LICENSE +0 -0
shotgun/cli/feedback.py
ADDED
|
@@ -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!")
|
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
|
|
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:
|
shotgun/posthog_telemetry.py
CHANGED
|
@@ -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 [
|
|
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,8 +1,8 @@
|
|
|
1
1
|
shotgun/__init__.py,sha256=P40K0fnIsb7SKcQrFnXZ4aREjpWchVDhvM1HxI4cyIQ,104
|
|
2
2
|
shotgun/build_constants.py,sha256=RXNxMz46HaB5jucgMVpw8a2yCJqjbhTOh0PddyEVMN8,713
|
|
3
3
|
shotgun/logging_config.py,sha256=UKenihvgH8OA3W0b8ZFcItYaFJVe9MlsMYlcevyW1HY,7440
|
|
4
|
-
shotgun/main.py,sha256=
|
|
5
|
-
shotgun/posthog_telemetry.py,sha256=
|
|
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=Sh0aK93wE7rvvCI31QCbm0sU-AUEldg7s9QqoAm1oQM,1242
|
|
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
|
|
@@ -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=
|
|
106
|
+
shotgun/tui/app.py,sha256=HAfPbTSS8oyWlqoGL5hYw356_nHEGxHWrERdIA0uh2Q,4998
|
|
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.
|
|
130
|
-
shotgun_sh-0.1.
|
|
131
|
-
shotgun_sh-0.1.
|
|
132
|
-
shotgun_sh-0.1.
|
|
133
|
-
shotgun_sh-0.1.
|
|
131
|
+
shotgun_sh-0.1.15.dev1.dist-info/METADATA,sha256=EeBReM7IB4Iw_Nf9bkzFAkQL0LPGZzILv3N_A77FRqk,11197
|
|
132
|
+
shotgun_sh-0.1.15.dev1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
133
|
+
shotgun_sh-0.1.15.dev1.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
|
|
134
|
+
shotgun_sh-0.1.15.dev1.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
|
|
135
|
+
shotgun_sh-0.1.15.dev1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|