shotgun-sh 0.1.14.dev1__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/codebase/core/manager.py +11 -21
- 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.dev1.dist-info → shotgun_sh-0.1.15.dev1.dist-info}/METADATA +1 -1
- {shotgun_sh-0.1.14.dev1.dist-info → shotgun_sh-0.1.15.dev1.dist-info}/RECORD +11 -9
- {shotgun_sh-0.1.14.dev1.dist-info → shotgun_sh-0.1.15.dev1.dist-info}/WHEEL +0 -0
- {shotgun_sh-0.1.14.dev1.dist-info → shotgun_sh-0.1.15.dev1.dist-info}/entry_points.txt +0 -0
- {shotgun_sh-0.1.14.dev1.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/codebase/core/manager.py
CHANGED
|
@@ -1221,26 +1221,11 @@ class CodebaseGraphManager:
|
|
|
1221
1221
|
|
|
1222
1222
|
removed_graphs = []
|
|
1223
1223
|
|
|
1224
|
-
# Find all .kuzu
|
|
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
|
-
#
|
|
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
|
-
|
|
1460
|
-
|
|
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
|
|
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
|
|
@@ -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=
|
|
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=
|
|
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
|