ripperdoc 0.2.8__py3-none-any.whl → 0.2.10__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.
- ripperdoc/__init__.py +1 -1
- ripperdoc/cli/cli.py +257 -123
- ripperdoc/cli/commands/__init__.py +2 -1
- ripperdoc/cli/commands/agents_cmd.py +138 -8
- ripperdoc/cli/commands/clear_cmd.py +9 -4
- ripperdoc/cli/commands/config_cmd.py +1 -1
- ripperdoc/cli/commands/context_cmd.py +3 -2
- ripperdoc/cli/commands/doctor_cmd.py +18 -4
- ripperdoc/cli/commands/exit_cmd.py +1 -0
- ripperdoc/cli/commands/hooks_cmd.py +27 -53
- ripperdoc/cli/commands/models_cmd.py +27 -10
- ripperdoc/cli/commands/permissions_cmd.py +27 -9
- ripperdoc/cli/commands/resume_cmd.py +9 -3
- ripperdoc/cli/commands/stats_cmd.py +244 -0
- ripperdoc/cli/commands/status_cmd.py +4 -4
- ripperdoc/cli/commands/tasks_cmd.py +8 -4
- ripperdoc/cli/ui/file_mention_completer.py +2 -1
- ripperdoc/cli/ui/interrupt_handler.py +2 -3
- ripperdoc/cli/ui/message_display.py +4 -2
- ripperdoc/cli/ui/panels.py +1 -0
- ripperdoc/cli/ui/provider_options.py +247 -0
- ripperdoc/cli/ui/rich_ui.py +403 -81
- ripperdoc/cli/ui/spinner.py +54 -18
- ripperdoc/cli/ui/thinking_spinner.py +1 -2
- ripperdoc/cli/ui/tool_renderers.py +8 -2
- ripperdoc/cli/ui/wizard.py +213 -0
- ripperdoc/core/agents.py +19 -6
- ripperdoc/core/config.py +51 -17
- ripperdoc/core/custom_commands.py +7 -6
- ripperdoc/core/default_tools.py +101 -12
- ripperdoc/core/hooks/config.py +1 -3
- ripperdoc/core/hooks/events.py +27 -28
- ripperdoc/core/hooks/executor.py +4 -6
- ripperdoc/core/hooks/integration.py +12 -21
- ripperdoc/core/hooks/llm_callback.py +59 -0
- ripperdoc/core/hooks/manager.py +40 -15
- ripperdoc/core/permissions.py +118 -12
- ripperdoc/core/providers/anthropic.py +109 -36
- ripperdoc/core/providers/gemini.py +70 -5
- ripperdoc/core/providers/openai.py +89 -24
- ripperdoc/core/query.py +273 -68
- ripperdoc/core/query_utils.py +2 -0
- ripperdoc/core/skills.py +9 -3
- ripperdoc/core/system_prompt.py +4 -2
- ripperdoc/core/tool.py +17 -8
- ripperdoc/sdk/client.py +79 -4
- ripperdoc/tools/ask_user_question_tool.py +5 -3
- ripperdoc/tools/background_shell.py +307 -135
- ripperdoc/tools/bash_output_tool.py +1 -1
- ripperdoc/tools/bash_tool.py +63 -24
- ripperdoc/tools/dynamic_mcp_tool.py +29 -8
- ripperdoc/tools/enter_plan_mode_tool.py +1 -1
- ripperdoc/tools/exit_plan_mode_tool.py +1 -1
- ripperdoc/tools/file_edit_tool.py +167 -54
- ripperdoc/tools/file_read_tool.py +28 -4
- ripperdoc/tools/file_write_tool.py +13 -10
- ripperdoc/tools/glob_tool.py +3 -2
- ripperdoc/tools/grep_tool.py +3 -2
- ripperdoc/tools/kill_bash_tool.py +1 -1
- ripperdoc/tools/ls_tool.py +1 -1
- ripperdoc/tools/lsp_tool.py +615 -0
- ripperdoc/tools/mcp_tools.py +13 -10
- ripperdoc/tools/multi_edit_tool.py +8 -7
- ripperdoc/tools/notebook_edit_tool.py +7 -4
- ripperdoc/tools/skill_tool.py +1 -1
- ripperdoc/tools/task_tool.py +519 -69
- ripperdoc/tools/todo_tool.py +2 -2
- ripperdoc/tools/tool_search_tool.py +3 -2
- ripperdoc/utils/conversation_compaction.py +9 -5
- ripperdoc/utils/file_watch.py +214 -5
- ripperdoc/utils/json_utils.py +2 -1
- ripperdoc/utils/lsp.py +806 -0
- ripperdoc/utils/mcp.py +11 -3
- ripperdoc/utils/memory.py +4 -2
- ripperdoc/utils/message_compaction.py +21 -7
- ripperdoc/utils/message_formatting.py +14 -7
- ripperdoc/utils/messages.py +126 -67
- ripperdoc/utils/path_ignore.py +35 -8
- ripperdoc/utils/permissions/path_validation_utils.py +2 -1
- ripperdoc/utils/permissions/shell_command_validation.py +427 -91
- ripperdoc/utils/permissions/tool_permission_utils.py +174 -15
- ripperdoc/utils/safe_get_cwd.py +2 -1
- ripperdoc/utils/session_heatmap.py +244 -0
- ripperdoc/utils/session_history.py +13 -6
- ripperdoc/utils/session_stats.py +293 -0
- ripperdoc/utils/todo.py +2 -1
- ripperdoc/utils/token_estimation.py +6 -1
- {ripperdoc-0.2.8.dist-info → ripperdoc-0.2.10.dist-info}/METADATA +8 -2
- ripperdoc-0.2.10.dist-info/RECORD +129 -0
- ripperdoc-0.2.8.dist-info/RECORD +0 -121
- {ripperdoc-0.2.8.dist-info → ripperdoc-0.2.10.dist-info}/WHEEL +0 -0
- {ripperdoc-0.2.8.dist-info → ripperdoc-0.2.10.dist-info}/entry_points.txt +0 -0
- {ripperdoc-0.2.8.dist-info → ripperdoc-0.2.10.dist-info}/licenses/LICENSE +0 -0
- {ripperdoc-0.2.8.dist-info → ripperdoc-0.2.10.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"""Session statistics collection and analysis."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections import defaultdict
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from datetime import datetime, timedelta
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Dict, List, Tuple
|
|
10
|
+
|
|
11
|
+
from ripperdoc.utils.log import get_logger
|
|
12
|
+
from ripperdoc.utils.session_history import list_session_summaries
|
|
13
|
+
|
|
14
|
+
logger = get_logger()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class SessionStats:
|
|
19
|
+
"""Aggregated statistics across all sessions."""
|
|
20
|
+
|
|
21
|
+
# Basic counts
|
|
22
|
+
total_sessions: int = 0
|
|
23
|
+
total_messages: int = 0
|
|
24
|
+
total_cost_usd: float = 0.0
|
|
25
|
+
|
|
26
|
+
# Token statistics
|
|
27
|
+
total_tokens: int = 0
|
|
28
|
+
total_input_tokens: int = 0
|
|
29
|
+
total_output_tokens: int = 0
|
|
30
|
+
total_cache_read_tokens: int = 0
|
|
31
|
+
total_cache_creation_tokens: int = 0
|
|
32
|
+
|
|
33
|
+
# Model statistics (model -> count)
|
|
34
|
+
model_usage: Dict[str, int] = field(default_factory=dict)
|
|
35
|
+
favorite_model: str = ""
|
|
36
|
+
|
|
37
|
+
# Time statistics
|
|
38
|
+
longest_session_duration: timedelta = field(default_factory=lambda: timedelta(0))
|
|
39
|
+
earliest_session: datetime | None = None
|
|
40
|
+
latest_session: datetime | None = None
|
|
41
|
+
|
|
42
|
+
# Streak statistics
|
|
43
|
+
current_streak: int = 0
|
|
44
|
+
longest_streak: int = 0
|
|
45
|
+
active_days: int = 0
|
|
46
|
+
total_days: int = 0
|
|
47
|
+
|
|
48
|
+
# Activity patterns (hour -> count)
|
|
49
|
+
hourly_activity: Dict[int, int] = field(default_factory=dict)
|
|
50
|
+
|
|
51
|
+
# Daily activity (date_str -> count)
|
|
52
|
+
daily_activity: Dict[str, int] = field(default_factory=dict)
|
|
53
|
+
|
|
54
|
+
# Weekday activity (0=Monday -> 6=Sunday, count)
|
|
55
|
+
weekday_activity: Dict[int, int] = field(default_factory=dict)
|
|
56
|
+
|
|
57
|
+
# Peak hour (hour with most activity)
|
|
58
|
+
peak_hour: int = 0
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _calculate_streaks(active_dates: List[datetime]) -> Tuple[int, int]:
|
|
62
|
+
"""Calculate current and longest streak from sorted active dates."""
|
|
63
|
+
if not active_dates:
|
|
64
|
+
return 0, 0
|
|
65
|
+
|
|
66
|
+
# Sort dates
|
|
67
|
+
sorted_dates = sorted(set(d.date() for d in active_dates))
|
|
68
|
+
|
|
69
|
+
# Calculate longest streak
|
|
70
|
+
longest = 1
|
|
71
|
+
current = 1
|
|
72
|
+
for i in range(1, len(sorted_dates)):
|
|
73
|
+
if (sorted_dates[i] - sorted_dates[i - 1]).days == 1:
|
|
74
|
+
current += 1
|
|
75
|
+
longest = max(longest, current)
|
|
76
|
+
else:
|
|
77
|
+
current = 1
|
|
78
|
+
|
|
79
|
+
# Calculate current streak (from today backwards)
|
|
80
|
+
today = datetime.now().date()
|
|
81
|
+
current_streak = 0
|
|
82
|
+
|
|
83
|
+
# Check if today or yesterday has activity
|
|
84
|
+
if sorted_dates[-1] == today:
|
|
85
|
+
current_streak = 1
|
|
86
|
+
check_date = today - timedelta(days=1)
|
|
87
|
+
elif sorted_dates[-1] == today - timedelta(days=1):
|
|
88
|
+
current_streak = 1
|
|
89
|
+
check_date = sorted_dates[-1] - timedelta(days=1)
|
|
90
|
+
else:
|
|
91
|
+
return 0, longest
|
|
92
|
+
|
|
93
|
+
# Count backwards
|
|
94
|
+
i = len(sorted_dates) - 2
|
|
95
|
+
while i >= 0:
|
|
96
|
+
if sorted_dates[i] == check_date:
|
|
97
|
+
current_streak += 1
|
|
98
|
+
check_date -= timedelta(days=1)
|
|
99
|
+
i -= 1
|
|
100
|
+
else:
|
|
101
|
+
break
|
|
102
|
+
|
|
103
|
+
return current_streak, longest
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def collect_session_stats(project_path: Path, days: int = 32) -> SessionStats:
|
|
107
|
+
"""Collect statistics from session history.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
project_path: Project root directory
|
|
111
|
+
days: Number of days to look back (default 32)
|
|
112
|
+
"""
|
|
113
|
+
stats = SessionStats(
|
|
114
|
+
hourly_activity=defaultdict(int),
|
|
115
|
+
daily_activity=defaultdict(int),
|
|
116
|
+
weekday_activity=defaultdict(int),
|
|
117
|
+
model_usage=defaultdict(int),
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
summaries = list_session_summaries(project_path)
|
|
121
|
+
if not summaries:
|
|
122
|
+
return stats
|
|
123
|
+
|
|
124
|
+
# Filter by date range (use timezone-aware cutoff if needed)
|
|
125
|
+
from datetime import timezone
|
|
126
|
+
cutoff = datetime.now(timezone.utc) - timedelta(days=days)
|
|
127
|
+
|
|
128
|
+
# Ensure comparison works with both naive and aware datetimes
|
|
129
|
+
recent_summaries = []
|
|
130
|
+
for s in summaries:
|
|
131
|
+
# Make updated_at timezone-aware if it's naive
|
|
132
|
+
updated_at = s.updated_at
|
|
133
|
+
if updated_at.tzinfo is None:
|
|
134
|
+
updated_at = updated_at.replace(tzinfo=timezone.utc)
|
|
135
|
+
if updated_at >= cutoff:
|
|
136
|
+
recent_summaries.append(s)
|
|
137
|
+
|
|
138
|
+
if not recent_summaries:
|
|
139
|
+
return stats
|
|
140
|
+
|
|
141
|
+
# Basic counts
|
|
142
|
+
stats.total_sessions = len(recent_summaries)
|
|
143
|
+
stats.total_messages = sum(s.message_count for s in recent_summaries)
|
|
144
|
+
|
|
145
|
+
# Time statistics
|
|
146
|
+
stats.earliest_session = min(s.created_at for s in recent_summaries)
|
|
147
|
+
stats.latest_session = max(s.updated_at for s in recent_summaries)
|
|
148
|
+
stats.total_days = (stats.latest_session - stats.earliest_session).days + 1
|
|
149
|
+
|
|
150
|
+
# Calculate longest session and activity patterns in single pass
|
|
151
|
+
active_dates: List[datetime] = []
|
|
152
|
+
date_set: set[str] = set()
|
|
153
|
+
|
|
154
|
+
for summary in recent_summaries:
|
|
155
|
+
# Longest session
|
|
156
|
+
duration = summary.updated_at - summary.created_at
|
|
157
|
+
if duration > stats.longest_session_duration:
|
|
158
|
+
stats.longest_session_duration = duration
|
|
159
|
+
|
|
160
|
+
# Track dates
|
|
161
|
+
date_str = summary.updated_at.date().isoformat()
|
|
162
|
+
if date_str not in date_set:
|
|
163
|
+
date_set.add(date_str)
|
|
164
|
+
active_dates.append(summary.updated_at)
|
|
165
|
+
|
|
166
|
+
# Hourly activity
|
|
167
|
+
stats.hourly_activity[summary.updated_at.hour] += 1
|
|
168
|
+
|
|
169
|
+
# Daily activity (for heatmap)
|
|
170
|
+
stats.daily_activity[date_str] += 1
|
|
171
|
+
|
|
172
|
+
# Weekday activity
|
|
173
|
+
stats.weekday_activity[summary.updated_at.weekday()] += 1
|
|
174
|
+
|
|
175
|
+
# Active days
|
|
176
|
+
stats.active_days = len(date_set)
|
|
177
|
+
|
|
178
|
+
# Streaks
|
|
179
|
+
stats.current_streak, stats.longest_streak = _calculate_streaks(active_dates)
|
|
180
|
+
|
|
181
|
+
# Peak hour
|
|
182
|
+
if stats.hourly_activity:
|
|
183
|
+
stats.peak_hour = max(stats.hourly_activity.items(), key=lambda x: x[1])[0]
|
|
184
|
+
|
|
185
|
+
# Load detailed session data for token and model statistics
|
|
186
|
+
import json
|
|
187
|
+
|
|
188
|
+
for summary in recent_summaries:
|
|
189
|
+
session_file = summary.path
|
|
190
|
+
if not session_file.exists():
|
|
191
|
+
continue
|
|
192
|
+
|
|
193
|
+
try:
|
|
194
|
+
with session_file.open("r", encoding="utf-8") as fh:
|
|
195
|
+
for line in fh:
|
|
196
|
+
if not line.strip():
|
|
197
|
+
continue
|
|
198
|
+
# Quick string check before full JSON parse
|
|
199
|
+
if '"type":"assistant"' not in line and '"type": "assistant"' not in line:
|
|
200
|
+
continue
|
|
201
|
+
try:
|
|
202
|
+
entry = json.loads(line)
|
|
203
|
+
payload = entry.get("payload", {})
|
|
204
|
+
|
|
205
|
+
# Only process assistant messages
|
|
206
|
+
if payload.get("type") != "assistant":
|
|
207
|
+
continue
|
|
208
|
+
|
|
209
|
+
# Extract model and token information
|
|
210
|
+
model = payload.get("model")
|
|
211
|
+
if model:
|
|
212
|
+
stats.model_usage[model] += 1
|
|
213
|
+
|
|
214
|
+
# Extract token counts
|
|
215
|
+
input_tokens = payload.get("input_tokens", 0)
|
|
216
|
+
output_tokens = payload.get("output_tokens", 0)
|
|
217
|
+
cache_read = payload.get("cache_read_tokens", 0)
|
|
218
|
+
cache_creation = payload.get("cache_creation_tokens", 0)
|
|
219
|
+
|
|
220
|
+
stats.total_input_tokens += input_tokens
|
|
221
|
+
stats.total_output_tokens += output_tokens
|
|
222
|
+
stats.total_cache_read_tokens += cache_read
|
|
223
|
+
stats.total_cache_creation_tokens += cache_creation
|
|
224
|
+
|
|
225
|
+
# Extract cost
|
|
226
|
+
cost = payload.get("cost_usd", 0.0)
|
|
227
|
+
stats.total_cost_usd += cost
|
|
228
|
+
|
|
229
|
+
except (json.JSONDecodeError, KeyError, TypeError, ValueError):
|
|
230
|
+
continue
|
|
231
|
+
except (OSError, IOError):
|
|
232
|
+
continue
|
|
233
|
+
|
|
234
|
+
# Calculate total tokens
|
|
235
|
+
stats.total_tokens = (
|
|
236
|
+
stats.total_input_tokens
|
|
237
|
+
+ stats.total_output_tokens
|
|
238
|
+
+ stats.total_cache_read_tokens
|
|
239
|
+
+ stats.total_cache_creation_tokens
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
# Determine favorite model
|
|
243
|
+
if stats.model_usage:
|
|
244
|
+
stats.favorite_model = max(stats.model_usage.items(), key=lambda x: x[1])[0]
|
|
245
|
+
|
|
246
|
+
return stats
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def format_duration(td: timedelta) -> str:
|
|
250
|
+
"""Format timedelta as human-readable string."""
|
|
251
|
+
total_seconds = int(td.total_seconds())
|
|
252
|
+
if total_seconds < 60:
|
|
253
|
+
return f"{total_seconds}s"
|
|
254
|
+
|
|
255
|
+
minutes = total_seconds // 60
|
|
256
|
+
if minutes < 60:
|
|
257
|
+
seconds = total_seconds % 60
|
|
258
|
+
return f"{minutes}m {seconds}s"
|
|
259
|
+
|
|
260
|
+
hours = minutes // 60
|
|
261
|
+
remaining_mins = minutes % 60
|
|
262
|
+
if hours < 24:
|
|
263
|
+
return f"{hours}h {remaining_mins}m"
|
|
264
|
+
|
|
265
|
+
days = hours // 24
|
|
266
|
+
remaining_hours = hours % 24
|
|
267
|
+
return f"{days}d {remaining_hours}h {remaining_mins}m"
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def format_large_number(num: int) -> str:
|
|
271
|
+
"""Format large numbers with k/m/b suffix.
|
|
272
|
+
|
|
273
|
+
Examples:
|
|
274
|
+
1234 -> "1.2k"
|
|
275
|
+
1234567 -> "1.2m"
|
|
276
|
+
1234567890 -> "1.2b"
|
|
277
|
+
"""
|
|
278
|
+
if num < 1000:
|
|
279
|
+
return str(num)
|
|
280
|
+
elif num < 1_000_000:
|
|
281
|
+
return f"{num / 1000:.1f}k"
|
|
282
|
+
elif num < 1_000_000_000:
|
|
283
|
+
return f"{num / 1_000_000:.1f}m"
|
|
284
|
+
else:
|
|
285
|
+
return f"{num / 1_000_000_000:.1f}b"
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
__all__ = [
|
|
289
|
+
"SessionStats",
|
|
290
|
+
"collect_session_stats",
|
|
291
|
+
"format_duration",
|
|
292
|
+
"format_large_number",
|
|
293
|
+
]
|
ripperdoc/utils/todo.py
CHANGED
|
@@ -86,7 +86,8 @@ def load_todos(project_root: Optional[Path] = None) -> List[TodoItem]:
|
|
|
86
86
|
except (json.JSONDecodeError, OSError, IOError, UnicodeDecodeError) as exc:
|
|
87
87
|
logger.warning(
|
|
88
88
|
"Failed to load todos from disk: %s: %s",
|
|
89
|
-
type(exc).__name__,
|
|
89
|
+
type(exc).__name__,
|
|
90
|
+
exc,
|
|
90
91
|
extra={"path": str(path)},
|
|
91
92
|
)
|
|
92
93
|
return []
|
|
@@ -14,7 +14,12 @@ try: # pragma: no cover - optional dependency
|
|
|
14
14
|
import tiktoken # type: ignore
|
|
15
15
|
|
|
16
16
|
_TIKTOKEN_ENCODING = tiktoken.get_encoding("cl100k_base")
|
|
17
|
-
except (
|
|
17
|
+
except (
|
|
18
|
+
ImportError,
|
|
19
|
+
ModuleNotFoundError,
|
|
20
|
+
OSError,
|
|
21
|
+
RuntimeError,
|
|
22
|
+
): # pragma: no cover - runtime fallback
|
|
18
23
|
pass
|
|
19
24
|
|
|
20
25
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ripperdoc
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.10
|
|
4
4
|
Summary: AI-powered terminal assistant for coding tasks
|
|
5
5
|
Author: Ripperdoc Team
|
|
6
6
|
License: Apache-2.0
|
|
@@ -33,6 +33,12 @@ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
|
33
33
|
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
34
34
|
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
35
35
|
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
36
|
+
Provides-Extra: anthropic
|
|
37
|
+
Requires-Dist: anthropic>=0.39.0; extra == "anthropic"
|
|
38
|
+
Provides-Extra: openai
|
|
39
|
+
Requires-Dist: openai>=1.0.0; extra == "openai"
|
|
40
|
+
Provides-Extra: gemini
|
|
41
|
+
Requires-Dist: google-genai>=0.3.0; extra == "gemini"
|
|
36
42
|
Dynamic: license-file
|
|
37
43
|
|
|
38
44
|
<div align="center">
|
|
@@ -137,7 +143,7 @@ See the [examples/](examples/) directory for complete SDK usage examples.
|
|
|
137
143
|
|
|
138
144
|
### Safe Mode Permissions
|
|
139
145
|
|
|
140
|
-
Safe mode is the default. Use `--
|
|
146
|
+
Safe mode is the default. Use `--yolo` to skip permission prompts. Choose `a`/`always` to allow a tool for the current session (not persisted across sessions).
|
|
141
147
|
|
|
142
148
|
### Agent Skills
|
|
143
149
|
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
ripperdoc/__init__.py,sha256=oGsHv3v5Rn-xgN3ZJ5m1ExqzAZleylUN7J1e5kmk5bA,67
|
|
2
|
+
ripperdoc/__main__.py,sha256=1Avq2MceBfwUlNsfasC8n4dqVL_V56Bl3DRsnY4_Nxk,370
|
|
3
|
+
ripperdoc/cli/__init__.py,sha256=03wf6gXBcEgXJrDJS-W_5BEG_DdJ_ep7CxQFPML-73g,35
|
|
4
|
+
ripperdoc/cli/cli.py,sha256=BHZTyn5AfVOUE5-dmj6hEdkXgMDJ0YB65wYDY3eAlBM,19207
|
|
5
|
+
ripperdoc/cli/commands/__init__.py,sha256=Z8REiBCaBjGT8Ce4gD3h5MH3YyhTM9mVqhaaU85E7WQ,4718
|
|
6
|
+
ripperdoc/cli/commands/agents_cmd.py,sha256=AlkuSxdIsAC53BhGz5kztfgNmjoaOHs4kHrVwEzI22I,15763
|
|
7
|
+
ripperdoc/cli/commands/base.py,sha256=4KUjxCM04MwbSMUKVNEBph_jeAKPI8b5MHsUFoz7l5g,386
|
|
8
|
+
ripperdoc/cli/commands/clear_cmd.py,sha256=iyOLWtgYwJKNjG-el2mwFRA3VWGIXrNNLl32Xdwpq9o,584
|
|
9
|
+
ripperdoc/cli/commands/compact_cmd.py,sha256=uR_nB1OX7cUL1TOJoefwdO31Qfyjd0nZSSttErqUxbA,473
|
|
10
|
+
ripperdoc/cli/commands/config_cmd.py,sha256=QcFYOOmNFSHmw6K2vY_wfKrYXi8PSzz6koJFREJoF_c,884
|
|
11
|
+
ripperdoc/cli/commands/context_cmd.py,sha256=tM8o2ZfX-axFYaFLsWOTSER_Yevk3ANr2numHfuh2UE,5232
|
|
12
|
+
ripperdoc/cli/commands/cost_cmd.py,sha256=yD9LSqgxVvYNTDPnEHxugjyLWcmbtH5dXim7DIW9zXc,2822
|
|
13
|
+
ripperdoc/cli/commands/doctor_cmd.py,sha256=K3bea4DHb34twx_lr_iyPpxdTGvmx4OewGGfKpXSM-Y,7170
|
|
14
|
+
ripperdoc/cli/commands/exit_cmd.py,sha256=lEGLMVozoOM2Ea_Yw-sbaIvAbfb_Nx3UTpC49ga-MZ8,376
|
|
15
|
+
ripperdoc/cli/commands/help_cmd.py,sha256=jyK6U2bsGEIwFpu08slVHKfxRyS3oblnRXdqSgU_W4w,978
|
|
16
|
+
ripperdoc/cli/commands/hooks_cmd.py,sha256=-ixQhKb1CX2c7_2zDdAqXV9ThnMf31UH3a9UBERD9mw,21026
|
|
17
|
+
ripperdoc/cli/commands/mcp_cmd.py,sha256=ZCnswx0TIiaiUUsIX7NpHaLZLZtvlUhBnN12s_ZtPCA,2424
|
|
18
|
+
ripperdoc/cli/commands/memory_cmd.py,sha256=gDvRr_-U1gMrOdC3OvujYLL5_CUgyZpwaJdytRP5CBM,6549
|
|
19
|
+
ripperdoc/cli/commands/models_cmd.py,sha256=Jjj7iw4p5ydBZ8RBl4ozdgBozlKWFyXwF7FWzSKjHOo,16373
|
|
20
|
+
ripperdoc/cli/commands/permissions_cmd.py,sha256=aIMIvmt78nB2Q-Qa5ojqClUOsPRcoyeDIuhOJX8xg2k,11559
|
|
21
|
+
ripperdoc/cli/commands/resume_cmd.py,sha256=zcZ-pimjn-XPm5s3dw-SCkw1-ALVFlFUzT1zmkTH9Cg,4268
|
|
22
|
+
ripperdoc/cli/commands/stats_cmd.py,sha256=W0KKp4qTyo9olDS_AiJi3tri7m0W37pjX16Nd4g0p0c,7855
|
|
23
|
+
ripperdoc/cli/commands/status_cmd.py,sha256=Sqm8-5Q-3gui2relPHA99z2R50ft1mkf2QnqvKlDtVM,5535
|
|
24
|
+
ripperdoc/cli/commands/tasks_cmd.py,sha256=M-LuowiRt4xSzvIv_m5-h9KTi5o3KvdV9k2VQBqyuYM,8867
|
|
25
|
+
ripperdoc/cli/commands/todos_cmd.py,sha256=7Q0B1NVqGtB3R29ndbn4m0VQQm-YQ7d4Wlk7vJ7dLQI,1848
|
|
26
|
+
ripperdoc/cli/commands/tools_cmd.py,sha256=3cMi0vN4mAUhpKqJtRgNvZfcKzRPaMs_pkYYXlyvSSU,384
|
|
27
|
+
ripperdoc/cli/ui/__init__.py,sha256=TxSzTYdITlrYmYVfins_w_jzPqqWRpqky5u1ikwvmtM,43
|
|
28
|
+
ripperdoc/cli/ui/context_display.py,sha256=3ezdtHVwltkPQ5etYwfqUh-fjnpPu8B3P81UzrdHxZs,10020
|
|
29
|
+
ripperdoc/cli/ui/file_mention_completer.py,sha256=PYfcauxhU4NkLsNP-fGeBhZQFzUeKoDC5FO4S4pC1LU,11650
|
|
30
|
+
ripperdoc/cli/ui/helpers.py,sha256=DmgMMouyQdesjQ5RsErwsRCKVdWiDJnpqJjv90a3neE,2545
|
|
31
|
+
ripperdoc/cli/ui/interrupt_handler.py,sha256=mZAZhBXID6_NR03K8fSjPDDjtTScy182VFBbVHamcoM,5914
|
|
32
|
+
ripperdoc/cli/ui/message_display.py,sha256=W9VlRCpMykkamxphej5LHgmU-P4YaBfm9HPdIKlFKpg,10573
|
|
33
|
+
ripperdoc/cli/ui/panels.py,sha256=A0xX0Lxk7WTSz5y8sJDAYnpFFAX5WWql0199teuTipA,1929
|
|
34
|
+
ripperdoc/cli/ui/provider_options.py,sha256=Ic30K1ev8w2oEcha4IjDYSoxw1tyCVB4hLoQpS_Y_5E,8369
|
|
35
|
+
ripperdoc/cli/ui/rich_ui.py,sha256=PHEl0epQyeOGc9qomjjUsSmfrXPHPEroGDgLnljB5Tw,60789
|
|
36
|
+
ripperdoc/cli/ui/spinner.py,sha256=4T47qbT_YZlFkzWMGew_NP7fg_xf81AkWbWo8gJskZM,2663
|
|
37
|
+
ripperdoc/cli/ui/thinking_spinner.py,sha256=3zmxj3vd-1njdiHF2Afsm7RGiRl7645AEc7fTLKgAbU,2805
|
|
38
|
+
ripperdoc/cli/ui/tool_renderers.py,sha256=tWXFyHOHz-kryoidra5RL-h9K8nbjrTBZ9o_thIgRho,11220
|
|
39
|
+
ripperdoc/cli/ui/wizard.py,sha256=vc_uGuuf6F73bDB4DSgfTki8kVzwMywQ_u9YyGPuWPY,6972
|
|
40
|
+
ripperdoc/core/__init__.py,sha256=UemJCA-Y8df1466AX-YbRFj071zKajmqO1mi40YVW2g,40
|
|
41
|
+
ripperdoc/core/agents.py,sha256=t7Bc5BqUlSp8Xzqe2lMGhM9oupEJIsUBNsUaJGkwt9Y,20343
|
|
42
|
+
ripperdoc/core/commands.py,sha256=NXCkljYbAP4dDoRy-_3semFNWxG4YAk9q82u8FTKH60,835
|
|
43
|
+
ripperdoc/core/config.py,sha256=hjC6c02HGSzwJ0pEu2Gp0w0X_6yiZ_UwxFG2H-u1FC4,21947
|
|
44
|
+
ripperdoc/core/custom_commands.py,sha256=2BMYiBq15FDjl3aOa3styN6nARyfU7xFAb4ly2Vsp-w,14254
|
|
45
|
+
ripperdoc/core/default_tools.py,sha256=TWNo537SqI4ViWqINpbR-SOiBe40Chl2l0A1ddaUVqY,5249
|
|
46
|
+
ripperdoc/core/permissions.py,sha256=v8pFdLw3fYr73ynW2pkANXH34M6Djf3iDcM4KfLOS7I,13901
|
|
47
|
+
ripperdoc/core/query.py,sha256=WXAgwQbozeeRi7kZGGQYoZc1peBWW3kAQpzGoJqBoe0,50298
|
|
48
|
+
ripperdoc/core/query_utils.py,sha256=xF9_vcqVSKANd9gwbk7aIG0t4a_f6R0m78-p3j5vkyI,24923
|
|
49
|
+
ripperdoc/core/skills.py,sha256=cco9vpQxg_5HCKp64k6TtN01NaWbvWef2A9olbpTZaU,10366
|
|
50
|
+
ripperdoc/core/system_prompt.py,sha256=d3GNCsJ_mdIojpWg1Wc0gRDC_gzRDI5G4tQN_gxhRdo,26752
|
|
51
|
+
ripperdoc/core/tool.py,sha256=m9O8MvzCS_8q1QvwO7-ZlYepyly7egjHjMIzgmz6eeA,8124
|
|
52
|
+
ripperdoc/core/hooks/__init__.py,sha256=xw7VJQu1ZB0ENHVqL5xtruBnP3d0FNgrBH6NTL2xYgg,2735
|
|
53
|
+
ripperdoc/core/hooks/config.py,sha256=wE_eMHDZu9-yHGyJ45ySL1_l2yx7B8i4jiThs78W6Zc,10085
|
|
54
|
+
ripperdoc/core/hooks/events.py,sha256=UGBDdec52abi2e6ox8ncsLeDo3t9ZJesymKaPwxNDAE,18403
|
|
55
|
+
ripperdoc/core/hooks/executor.py,sha256=3MdiCdc4Bn2xHcTlRT72BajrgAZ5roKck0NBnO4Re0c,16781
|
|
56
|
+
ripperdoc/core/hooks/integration.py,sha256=IzkOSpaMjC397zKdKO1jTR0uyzOet-eCwPLuXwTYOts,11082
|
|
57
|
+
ripperdoc/core/hooks/llm_callback.py,sha256=umUB0iG9BcHv8PQvBflrM-LIkqxoc9e1pl5OfkyXi80,1734
|
|
58
|
+
ripperdoc/core/hooks/manager.py,sha256=11CVV3GHbVETNCw5hYG_Fn-CgSHP-PncBdmuqlvKso8,24607
|
|
59
|
+
ripperdoc/core/providers/__init__.py,sha256=yevsHF0AUI4b6Wiq_401NXewJ3dqe8LUUtQm0TLPPNQ,1911
|
|
60
|
+
ripperdoc/core/providers/anthropic.py,sha256=B967szN1Thc0K1Iv8TvKWcVKktCevBmShftupVag8pk,28551
|
|
61
|
+
ripperdoc/core/providers/base.py,sha256=HNOa3_XWszu6DbI8BYixxV0hnZb9qZ_FU4uinFVRHjU,9271
|
|
62
|
+
ripperdoc/core/providers/gemini.py,sha256=Fs-dShsmIVBFfz-jg4fBjvQyrxVnZ5yx4ALcES-l5Sg,27089
|
|
63
|
+
ripperdoc/core/providers/openai.py,sha256=DukxAXZJUVIZPDEuFwG748y3iucSIJnPQUqGjX_qUgQ,23675
|
|
64
|
+
ripperdoc/sdk/__init__.py,sha256=aDSgI4lcCDs9cV3bxNmEEV3SuYx2aCd4VnUjs6H-R7E,213
|
|
65
|
+
ripperdoc/sdk/client.py,sha256=ioDp1xwTUPmdTzBemKjZroO9bu6RC8geJk5Io9AkkHE,14785
|
|
66
|
+
ripperdoc/tools/__init__.py,sha256=RBFz0DDnztDXMqv_zRxFHVY-ez2HYcncx8zh_y-BX6w,42
|
|
67
|
+
ripperdoc/tools/ask_user_question_tool.py,sha256=ZWg5xAdeaRoR98KvvPuKmJH4L2dgzH87VXM4dxKcqBE,15478
|
|
68
|
+
ripperdoc/tools/background_shell.py,sha256=qrLxxwK85KsZTrQpw_bdAfz2EE4tSdut8u0xXbEXXQg,19525
|
|
69
|
+
ripperdoc/tools/bash_output_tool.py,sha256=cC5dDmKYmkOTsLCXCcTYgc0loVWtmRobPn0C-I6qO-o,3379
|
|
70
|
+
ripperdoc/tools/bash_tool.py,sha256=jKPx_dTcN7npULsNCDfP50xsgxus4yDo88JKnOvEbtU,44644
|
|
71
|
+
ripperdoc/tools/dynamic_mcp_tool.py,sha256=kxxWhp6pP9N8fK3ubu5fHQYQv7aSwxcnaa3C9ZsBbOU,15879
|
|
72
|
+
ripperdoc/tools/enter_plan_mode_tool.py,sha256=LNQv43uWkohiQTYQdsrKbpAfQSJNE_FJ9Y6AM_ckjng,7976
|
|
73
|
+
ripperdoc/tools/exit_plan_mode_tool.py,sha256=XxhEih5EUrcscvkRA9lel54XoVIhl_cCL2xcvMJjtVA,5756
|
|
74
|
+
ripperdoc/tools/file_edit_tool.py,sha256=lk54kJo7KbwPMRLwcLnLpptt7gx3Y2LXj-r5bKnD1pQ,19172
|
|
75
|
+
ripperdoc/tools/file_read_tool.py,sha256=jB4g0jF2Bl5WCzZNrLLTfzM_FmLDGTxK2q3eetrBkhw,8553
|
|
76
|
+
ripperdoc/tools/file_write_tool.py,sha256=J6SCapkBGN0Wotfb8ce0sKhAtyC7SloKNSDqrBlkdcU,7040
|
|
77
|
+
ripperdoc/tools/glob_tool.py,sha256=eZG4fzahjJsSM8NdmTiVl5nBfDQK7egPg6P7cqOM_1Y,5948
|
|
78
|
+
ripperdoc/tools/grep_tool.py,sha256=ng2vJjMnkhY9ZukKrKTYLAHI0ZqzmooEuaNe6gdocr0,14141
|
|
79
|
+
ripperdoc/tools/kill_bash_tool.py,sha256=_jwnJVCPe8uXZTJd7myh4hWCD-eBuB2XDaYwRCmNSsI,4625
|
|
80
|
+
ripperdoc/tools/ls_tool.py,sha256=JWQucgNOLjrGZwM7imu3GWe5YFwXxdXGoaBr50wDZCQ,15367
|
|
81
|
+
ripperdoc/tools/lsp_tool.py,sha256=dW7i0b0ziPy0W-Hnaj-T96EKovzx9guGZDoZY4dEeD0,21363
|
|
82
|
+
ripperdoc/tools/mcp_tools.py,sha256=BVz8MJhijNnHq1J2LLkZS89wp_pwwnOytH1HYcfkFqQ,23085
|
|
83
|
+
ripperdoc/tools/multi_edit_tool.py,sha256=Kq8kQ-j-kUgJWpx2OMSUjbjiFoiSaBLaYdg0avoZM0k,17607
|
|
84
|
+
ripperdoc/tools/notebook_edit_tool.py,sha256=Y2XkQB4WDbSWeCsO3Ybnsrbcxki99aOv3o23jZ5D1Hw,14445
|
|
85
|
+
ripperdoc/tools/skill_tool.py,sha256=TIUiUzL69mrKXFTais2YOssAwWnS5dwfK2_JFMG4xsY,7701
|
|
86
|
+
ripperdoc/tools/task_tool.py,sha256=buQrpTeK-za9QBxePwa1tnZDTdKKRSwW2tyL7y4hCG8,32492
|
|
87
|
+
ripperdoc/tools/todo_tool.py,sha256=eIwF-s1117DrXJ4yXUMwkNs1gfKYNF2OlWzkJAXDzmk,20001
|
|
88
|
+
ripperdoc/tools/tool_search_tool.py,sha256=AeY-tFtWr2IAHTCEnG9kvsRRBqrBd-PJ96oUnFKa3Vs,13890
|
|
89
|
+
ripperdoc/utils/__init__.py,sha256=gdso60znB2hsYZ_YZBKVcuOY3QVfoqD2wHQ4pvr5lSw,37
|
|
90
|
+
ripperdoc/utils/bash_constants.py,sha256=KNn8bzB6nVU5jid9jvjiH4FAu8pP3DZONJ-OknJypAQ,1641
|
|
91
|
+
ripperdoc/utils/bash_output_utils.py,sha256=3Cf5wKJzRbUesmCNy5HtXIBtv0Z2BxklTfFHJ9q1T3w,1210
|
|
92
|
+
ripperdoc/utils/coerce.py,sha256=KOPb4KR4p32nwHWG_6GsGHeVZunJyYc2YhC5DLmEZO8,1015
|
|
93
|
+
ripperdoc/utils/context_length_errors.py,sha256=oyDVr_ME_6j97TLwVZ8bDMb6ISGQx6wEHrY7ckc0GuA,7714
|
|
94
|
+
ripperdoc/utils/conversation_compaction.py,sha256=mbOYwQXXsAqiJ7mBQ25195bXtH3tb5GSU0HUNsvnl1g,18345
|
|
95
|
+
ripperdoc/utils/exit_code_handlers.py,sha256=QtO1iDxVAb8Xp03D6_QixPoJC-RQlcp3ssIo_rm4two,7973
|
|
96
|
+
ripperdoc/utils/file_watch.py,sha256=8uOPZNqiJffEPRnbBDJ-JwyVIMEPletBZIHfEHOmDuc,11653
|
|
97
|
+
ripperdoc/utils/git_utils.py,sha256=Hq-Zx-KPyX4lp_i8ozhic15LyYdX_IfCRm-EyoFu59A,9047
|
|
98
|
+
ripperdoc/utils/json_utils.py,sha256=Bx1pHHu5r7GtvCqFHM3K9EoknFAtYOaCqTn9RN-5qBA,757
|
|
99
|
+
ripperdoc/utils/log.py,sha256=mieFMPxiv-M87bB-dgiY8D5WMxQbjVKJdsrW8QvCui8,6138
|
|
100
|
+
ripperdoc/utils/lsp.py,sha256=L0y9laUbj4gxR1rHgFOcloVGsH1QTPbv7eAmPsr2V64,26712
|
|
101
|
+
ripperdoc/utils/mcp.py,sha256=92PMrGOzAWoqKGIiWBX2nNO-wkyQ-lgchmdlQ8Oo3zs,19548
|
|
102
|
+
ripperdoc/utils/memory.py,sha256=J_kucw1BBnHQ1qG2_ZzdNysKvS1lrpuMtB5wxJDmXZU,8033
|
|
103
|
+
ripperdoc/utils/message_compaction.py,sha256=FwYxjWc0B7IlzT1VPEyfhwEl8rXbDi37utbEbS5qGWw,22577
|
|
104
|
+
ripperdoc/utils/message_formatting.py,sha256=0d0hDAUy-9G2Kxl16z63sPtTGAKLqtEZAhCeQCtmHBc,7828
|
|
105
|
+
ripperdoc/utils/messages.py,sha256=RP5jvZejiMCPhq6hyuyq1igBtYKRf658ZhbtGacTFfU,24340
|
|
106
|
+
ripperdoc/utils/output_utils.py,sha256=R3wqFh9Dko_GK00Exx7XI0DnnldRWMsxZypYX5y6SJo,7448
|
|
107
|
+
ripperdoc/utils/path_ignore.py,sha256=5VOk075Ef9Wz9LhAWjFQuXJfnypxTD0w9cZVoTGko2M,17882
|
|
108
|
+
ripperdoc/utils/path_utils.py,sha256=C45Q3OeXnj-0FVEtvf_tdG5922XB6HthUzlUCvfc17Y,1626
|
|
109
|
+
ripperdoc/utils/prompt.py,sha256=zICNEsA_OtKx8t3zo9tHLXXu6G5K8rPO3jFLKz4j5tg,560
|
|
110
|
+
ripperdoc/utils/safe_get_cwd.py,sha256=lYxFJAN7lomoLwTAfMZtyOueotuvhC8TN84NtrPKj1E,827
|
|
111
|
+
ripperdoc/utils/sandbox_utils.py,sha256=G91P8dw2VFcCiCpjXZ4LvzbAPiO8REqMhw39eI5Z4dU,1123
|
|
112
|
+
ripperdoc/utils/session_heatmap.py,sha256=5zEJCfAo6eP1byuvBjho0ojbhXP-u63bTcIfvHgbgKY,8442
|
|
113
|
+
ripperdoc/utils/session_history.py,sha256=67RKV6eiX16FYYRR851MBFjgezkyP95LnllNZazWwcU,9704
|
|
114
|
+
ripperdoc/utils/session_stats.py,sha256=jWqkTGH5qplVW8aHOBy3JCWiKl70SvXroyr_fT7khb4,9100
|
|
115
|
+
ripperdoc/utils/session_usage.py,sha256=p8_s46zDTzV1qzP4HR4PuZmLeJvSfq9mG_Y5rCnRYyA,3213
|
|
116
|
+
ripperdoc/utils/shell_token_utils.py,sha256=SduoSU-RERJdM_7gBn0urr5UXtl4XOpPgydBd2fwzWg,2500
|
|
117
|
+
ripperdoc/utils/shell_utils.py,sha256=t-neFPy_VhEmWZ79J7hh1ULBEdX116Rb9_pnXvir1Jw,5235
|
|
118
|
+
ripperdoc/utils/todo.py,sha256=6siiBz3R5iC7arONolPVxwmM68K5o_N-qIdv2bFeTZo,7051
|
|
119
|
+
ripperdoc/utils/token_estimation.py,sha256=qPQbeUwVlafEjzsXw6qMo0hd4Vjb1gCUMAPBouYUASI,1066
|
|
120
|
+
ripperdoc/utils/permissions/__init__.py,sha256=33FfOaDLepxJSkp0RLvTdVu7qBXuEcnOoTHFbEtFOt0,653
|
|
121
|
+
ripperdoc/utils/permissions/path_validation_utils.py,sha256=KOegjWaph8tXU7aqwQXRAxFEzrmRuPvdLb36J1QIPDQ,5772
|
|
122
|
+
ripperdoc/utils/permissions/shell_command_validation.py,sha256=tEp0sJoijYdy0stLdYxekCxGlGhPTTd46lRrWaY7w-I,33280
|
|
123
|
+
ripperdoc/utils/permissions/tool_permission_utils.py,sha256=auKylTR73EVmkeQ5TTRRhCDMGl-cEEt882Qt6Fa5VSI,14579
|
|
124
|
+
ripperdoc-0.2.10.dist-info/licenses/LICENSE,sha256=bRv9UhBor6GhnQDj12RciDcRfu0R7sB-lqCy1sWF75c,9242
|
|
125
|
+
ripperdoc-0.2.10.dist-info/METADATA,sha256=GQ1s_0BaysD_QxGX9konIIMUKFY6T4-WstY_2fbHdjw,7702
|
|
126
|
+
ripperdoc-0.2.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
127
|
+
ripperdoc-0.2.10.dist-info/entry_points.txt,sha256=79aohFxFPJmrQ3-Mhain04vb3EWpuc0EyzvDDUnwAu4,81
|
|
128
|
+
ripperdoc-0.2.10.dist-info/top_level.txt,sha256=u8LbdTr1a-laHgCO0Utl_R3QGFUhLxWelCDnP2ZgpCU,10
|
|
129
|
+
ripperdoc-0.2.10.dist-info/RECORD,,
|
ripperdoc-0.2.8.dist-info/RECORD
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
ripperdoc/__init__.py,sha256=lrY1tU8qp_EIUO-H5GAvKzGaBf8Z5xcFbY1i2_NBgjE,66
|
|
2
|
-
ripperdoc/__main__.py,sha256=1Avq2MceBfwUlNsfasC8n4dqVL_V56Bl3DRsnY4_Nxk,370
|
|
3
|
-
ripperdoc/cli/__init__.py,sha256=03wf6gXBcEgXJrDJS-W_5BEG_DdJ_ep7CxQFPML-73g,35
|
|
4
|
-
ripperdoc/cli/cli.py,sha256=5H_kIa-kPVyF_KyQA2QROLr6JrHg99RORyHKPrS82qk,14316
|
|
5
|
-
ripperdoc/cli/commands/__init__.py,sha256=Xs69l9O8VglF1z1JkxbmAy_9ylrfXZxFW9G5GiPQBZk,4676
|
|
6
|
-
ripperdoc/cli/commands/agents_cmd.py,sha256=YDE9oIXPmsPyvkHhq95aXxnneN3PqZ1ZOtcn26cXeO8,10438
|
|
7
|
-
ripperdoc/cli/commands/base.py,sha256=4KUjxCM04MwbSMUKVNEBph_jeAKPI8b5MHsUFoz7l5g,386
|
|
8
|
-
ripperdoc/cli/commands/clear_cmd.py,sha256=FDZ0W34VxGyLhLiU4TzukHCyElqsnLwkCmfKJqLfFAQ,366
|
|
9
|
-
ripperdoc/cli/commands/compact_cmd.py,sha256=uR_nB1OX7cUL1TOJoefwdO31Qfyjd0nZSSttErqUxbA,473
|
|
10
|
-
ripperdoc/cli/commands/config_cmd.py,sha256=ebIQk7zUFv353liWfbBSSfPiOaaCR7rQsd_eTw7nsvY,884
|
|
11
|
-
ripperdoc/cli/commands/context_cmd.py,sha256=6Yrz3_Oa2NwEsZo4tLK_PFFYP0Vq-amQCMBomSVFmBo,5220
|
|
12
|
-
ripperdoc/cli/commands/cost_cmd.py,sha256=yD9LSqgxVvYNTDPnEHxugjyLWcmbtH5dXim7DIW9zXc,2822
|
|
13
|
-
ripperdoc/cli/commands/doctor_cmd.py,sha256=q_PO1mnknRysVG7uopiqDWvkIIcvRX2i-JWgfKN-0gQ,7052
|
|
14
|
-
ripperdoc/cli/commands/exit_cmd.py,sha256=B0CNKQos2eRC4LSjizLdKsFYzFfwRkrUur6Afu3Fh9M,334
|
|
15
|
-
ripperdoc/cli/commands/help_cmd.py,sha256=jyK6U2bsGEIwFpu08slVHKfxRyS3oblnRXdqSgU_W4w,978
|
|
16
|
-
ripperdoc/cli/commands/hooks_cmd.py,sha256=9kTMXl-7vR9Y63Dm8iieuRK5jYnnlsqWKG5NvDsWUxU,21228
|
|
17
|
-
ripperdoc/cli/commands/mcp_cmd.py,sha256=ZCnswx0TIiaiUUsIX7NpHaLZLZtvlUhBnN12s_ZtPCA,2424
|
|
18
|
-
ripperdoc/cli/commands/memory_cmd.py,sha256=gDvRr_-U1gMrOdC3OvujYLL5_CUgyZpwaJdytRP5CBM,6549
|
|
19
|
-
ripperdoc/cli/commands/models_cmd.py,sha256=p6IeV_K9BjOahmtqmI2Gu7xsqRagVsIPYy7FEeuKQWQ,16135
|
|
20
|
-
ripperdoc/cli/commands/permissions_cmd.py,sha256=k2n82VxlESxM7u5TUrUh85NM-n0JHjqnJxzeAaHpDL0,11325
|
|
21
|
-
ripperdoc/cli/commands/resume_cmd.py,sha256=pFuo3_S_6l3F8usQ9NfyJvc-nBliKW9ct8Rma8YXPlA,4121
|
|
22
|
-
ripperdoc/cli/commands/status_cmd.py,sha256=yM_c_GgoAL7CMH_ucGSwUhlbHggxYuvCEb4AXtpN-8s,5534
|
|
23
|
-
ripperdoc/cli/commands/tasks_cmd.py,sha256=QrRF9MKg6LIH9BQz5E39KKdrwMiI3HTvI-c14aM7BU0,8815
|
|
24
|
-
ripperdoc/cli/commands/todos_cmd.py,sha256=7Q0B1NVqGtB3R29ndbn4m0VQQm-YQ7d4Wlk7vJ7dLQI,1848
|
|
25
|
-
ripperdoc/cli/commands/tools_cmd.py,sha256=3cMi0vN4mAUhpKqJtRgNvZfcKzRPaMs_pkYYXlyvSSU,384
|
|
26
|
-
ripperdoc/cli/ui/__init__.py,sha256=TxSzTYdITlrYmYVfins_w_jzPqqWRpqky5u1ikwvmtM,43
|
|
27
|
-
ripperdoc/cli/ui/context_display.py,sha256=3ezdtHVwltkPQ5etYwfqUh-fjnpPu8B3P81UzrdHxZs,10020
|
|
28
|
-
ripperdoc/cli/ui/file_mention_completer.py,sha256=U6uZbhCamC-cJTVCbblcXvPqmkaevNgKotMC_ftssug,11648
|
|
29
|
-
ripperdoc/cli/ui/helpers.py,sha256=DmgMMouyQdesjQ5RsErwsRCKVdWiDJnpqJjv90a3neE,2545
|
|
30
|
-
ripperdoc/cli/ui/interrupt_handler.py,sha256=dg15njl4NsFQvwAtxKPETeubuYl5OwiV2VlPECW2aNI,5930
|
|
31
|
-
ripperdoc/cli/ui/message_display.py,sha256=FHvfBY9hvf-lroB6SDzHDMS6bxuh57BfK5iBIifs2Ks,10361
|
|
32
|
-
ripperdoc/cli/ui/panels.py,sha256=lzgg7kP8nzJKqGFjE-0UVbr9a1YZ0i2XlkUy6-LcLnk,1875
|
|
33
|
-
ripperdoc/cli/ui/rich_ui.py,sha256=_VOx1zdt_QV23cwwiV6P8FiAA_H-JLIbC6WqYBLgUwM,47066
|
|
34
|
-
ripperdoc/cli/ui/spinner.py,sha256=XsPRwJ-70InLX9Qw50CEgSHn5oKA5PFIue8Un4edhUk,1449
|
|
35
|
-
ripperdoc/cli/ui/thinking_spinner.py,sha256=9Et5EqPChfkmkiOO8w1OPs8t-sHaisgjn9A__kEYLyg,2824
|
|
36
|
-
ripperdoc/cli/ui/tool_renderers.py,sha256=gVuZM083Nys9KWYAFTdmr1vpJm7ardqNhyUZx7KkL6s,11170
|
|
37
|
-
ripperdoc/core/__init__.py,sha256=UemJCA-Y8df1466AX-YbRFj071zKajmqO1mi40YVW2g,40
|
|
38
|
-
ripperdoc/core/agents.py,sha256=3glBiVM8e9NruCQGYl4inQ6Lt7jWb7C4S44YQXRWWl8,19930
|
|
39
|
-
ripperdoc/core/commands.py,sha256=NXCkljYbAP4dDoRy-_3semFNWxG4YAk9q82u8FTKH60,835
|
|
40
|
-
ripperdoc/core/config.py,sha256=fuzXTSSpPFIkzgZJW-tOf18cNeemrot64ihO4cdM79g,20979
|
|
41
|
-
ripperdoc/core/custom_commands.py,sha256=2Voc1u6WSZ-nJYRvGKmUcpNvzLCotacgGupvXUv6RT8,14289
|
|
42
|
-
ripperdoc/core/default_tools.py,sha256=fHmqIlPIE9qGwmgeYYw-QepKRoQLMhclnCv6Qahews0,3090
|
|
43
|
-
ripperdoc/core/permissions.py,sha256=_WLWE7Kq-Z5j3zEDAPr8JqdT0fz2oFqNs18NL0qoeWQ,9768
|
|
44
|
-
ripperdoc/core/query.py,sha256=We15XbLl_rAdAgJ5NAufYLNes6kNNeQ7CMj8rcGgBsE,40939
|
|
45
|
-
ripperdoc/core/query_utils.py,sha256=-lBRL5oAV0p6p6LukpFfBZKEcRdztbzCNOt51pEsKBM,24776
|
|
46
|
-
ripperdoc/core/skills.py,sha256=XkMt3WPT2_0xfx2qQhEnBbwJ0121aRFmuXLckw3MtVU,10251
|
|
47
|
-
ripperdoc/core/system_prompt.py,sha256=smhuRfzbvhfzNsQ3D89Mucll16u_40VWpOzKS0kJPFQ,26724
|
|
48
|
-
ripperdoc/core/tool.py,sha256=Hnnt7FYBGlD6lyAr9XhDgp_LfcP7o3yapzd7t6FPlBE,7813
|
|
49
|
-
ripperdoc/core/hooks/__init__.py,sha256=xw7VJQu1ZB0ENHVqL5xtruBnP3d0FNgrBH6NTL2xYgg,2735
|
|
50
|
-
ripperdoc/core/hooks/config.py,sha256=2KZXpkCGWecg3loQkYZbr5Xh68dDZv-XlTvjwQbl29o,10123
|
|
51
|
-
ripperdoc/core/hooks/events.py,sha256=ZDyP_YaRPKeDz23d6wKbfwlb64poRZDpiuPJaz8ZN9w,17957
|
|
52
|
-
ripperdoc/core/hooks/executor.py,sha256=inOAT2-xB_lXiz0io6c3QV4Wnw9ntl0unf-w0nXPMak,16818
|
|
53
|
-
ripperdoc/core/hooks/integration.py,sha256=Gb3ADGoTTYWDrCmkcgjlyLyldu3wRcji77_2VAyuYJw,11213
|
|
54
|
-
ripperdoc/core/hooks/manager.py,sha256=8YqvGPfOL3ianxFz_tnd7c_HbhHeLDHr5cLk1ayKicU,23706
|
|
55
|
-
ripperdoc/core/providers/__init__.py,sha256=yevsHF0AUI4b6Wiq_401NXewJ3dqe8LUUtQm0TLPPNQ,1911
|
|
56
|
-
ripperdoc/core/providers/anthropic.py,sha256=V5sofBIU1w7bo1FmrrZ_lqVvGRXt9ZkykDa_J0b1xtc,26309
|
|
57
|
-
ripperdoc/core/providers/base.py,sha256=HNOa3_XWszu6DbI8BYixxV0hnZb9qZ_FU4uinFVRHjU,9271
|
|
58
|
-
ripperdoc/core/providers/gemini.py,sha256=3U69Gh6hiL8QWsf-nawZJTfh5oeZP5DAmXYDfWtrEQE,24786
|
|
59
|
-
ripperdoc/core/providers/openai.py,sha256=FiNTCBtFpq0i0K6S0OyC-F-0HssSWJE6jrH3xRsPzD4,20981
|
|
60
|
-
ripperdoc/sdk/__init__.py,sha256=aDSgI4lcCDs9cV3bxNmEEV3SuYx2aCd4VnUjs6H-R7E,213
|
|
61
|
-
ripperdoc/sdk/client.py,sha256=aNnFs8pE2IUslXcHEtEUtkCHrDztAtq9moddjlOVxZs,11357
|
|
62
|
-
ripperdoc/tools/__init__.py,sha256=RBFz0DDnztDXMqv_zRxFHVY-ez2HYcncx8zh_y-BX6w,42
|
|
63
|
-
ripperdoc/tools/ask_user_question_tool.py,sha256=QgzmIDVR-wdlLf9fSiVPbRm_8tSaIlGJhuuRYOCGiUU,15446
|
|
64
|
-
ripperdoc/tools/background_shell.py,sha256=HangGLwN4iy-udo02zUZF3QRPIqOa7sVDesbv2wL9Js,12854
|
|
65
|
-
ripperdoc/tools/bash_output_tool.py,sha256=ljIOzTOnkbQfe3jExlhpUlMiLT6HpeD-1QI-D1CwHh8,3379
|
|
66
|
-
ripperdoc/tools/bash_tool.py,sha256=Wua9_R7S0fMfV8SmmI6_m4mpJ7gYdyku34dyTPIRA4o,42757
|
|
67
|
-
ripperdoc/tools/dynamic_mcp_tool.py,sha256=GERh7qT1mPVivFUIhlFxPNRUwOGNw5CmCnymEwQ-7vk,15662
|
|
68
|
-
ripperdoc/tools/enter_plan_mode_tool.py,sha256=FYjm_TmBL55pY4GdP7t0ISlqg-Qe3DwpIt-2weL1S4s,7976
|
|
69
|
-
ripperdoc/tools/exit_plan_mode_tool.py,sha256=3smkwGLTITem5fgA8catSSRay_a1OGQrjs8JF1zDdUQ,5756
|
|
70
|
-
ripperdoc/tools/file_edit_tool.py,sha256=pF4ZCBFq3vy2DukxGZjBGoyVJIRH-7UY4A-TpFegzdA,13768
|
|
71
|
-
ripperdoc/tools/file_read_tool.py,sha256=CvjnYusjolTH-PoQ8CPUVVR37GMLAntT16ffRwqKBto,7396
|
|
72
|
-
ripperdoc/tools/file_write_tool.py,sha256=SUsFvLVvCwegxEDhL8xpppNRlSl_Hcc1xwNR35FbMqU,7044
|
|
73
|
-
ripperdoc/tools/glob_tool.py,sha256=oy1S-MrQl57X_wpNXcqXyE4oHI3kmpOQoTYavx3mzEg,5932
|
|
74
|
-
ripperdoc/tools/grep_tool.py,sha256=n_YNKg8w63JgVJVpg7Qakj75JrymeKByNoapl8IS05U,14125
|
|
75
|
-
ripperdoc/tools/kill_bash_tool.py,sha256=36F8w2Rm1IVQitwOAwS-D8NTnyQdWfKWIam44qlXErk,4625
|
|
76
|
-
ripperdoc/tools/ls_tool.py,sha256=x0nw7F5cWjKK7Vb66nqdg9djgupPpCTwPAqd5rZlMUs,15367
|
|
77
|
-
ripperdoc/tools/mcp_tools.py,sha256=P0wbk_WRUD_MVkLDpMjttjQ13nje8Zc-mR3ud94QqZ0,23018
|
|
78
|
-
ripperdoc/tools/multi_edit_tool.py,sha256=ndCb-OlHQRqlrGElZ_q5QOTibZqW9uDp6e4ctOPNLbU,17579
|
|
79
|
-
ripperdoc/tools/notebook_edit_tool.py,sha256=FOgx0RtZnD1zZCUv5vsXS531ep26ABXaNsRhh0ZU4Uc,14393
|
|
80
|
-
ripperdoc/tools/skill_tool.py,sha256=vquTDL8ZihGvgP6U6EswOm5IjQYFHwxIiLzlzCEWrVw,7701
|
|
81
|
-
ripperdoc/tools/task_tool.py,sha256=EcUAaWY3aTTZawE84wvk2LyHSNU7nXAbpeDoOjU4_K0,18325
|
|
82
|
-
ripperdoc/tools/todo_tool.py,sha256=9LpU5PZpnXacvtcY41z6qeFow8n15uCtk9ELBUAFCtI,20001
|
|
83
|
-
ripperdoc/tools/tool_search_tool.py,sha256=97v_5Epbr-qeltrCtJkwB73weegcF_TE8TeuqATXl3g,13870
|
|
84
|
-
ripperdoc/utils/__init__.py,sha256=gdso60znB2hsYZ_YZBKVcuOY3QVfoqD2wHQ4pvr5lSw,37
|
|
85
|
-
ripperdoc/utils/bash_constants.py,sha256=KNn8bzB6nVU5jid9jvjiH4FAu8pP3DZONJ-OknJypAQ,1641
|
|
86
|
-
ripperdoc/utils/bash_output_utils.py,sha256=3Cf5wKJzRbUesmCNy5HtXIBtv0Z2BxklTfFHJ9q1T3w,1210
|
|
87
|
-
ripperdoc/utils/coerce.py,sha256=KOPb4KR4p32nwHWG_6GsGHeVZunJyYc2YhC5DLmEZO8,1015
|
|
88
|
-
ripperdoc/utils/context_length_errors.py,sha256=oyDVr_ME_6j97TLwVZ8bDMb6ISGQx6wEHrY7ckc0GuA,7714
|
|
89
|
-
ripperdoc/utils/conversation_compaction.py,sha256=m9AHZcRJwbZUHrNYl5Q1esjKQSBKFkARBkO9YNUjm5Q,18364
|
|
90
|
-
ripperdoc/utils/exit_code_handlers.py,sha256=QtO1iDxVAb8Xp03D6_QixPoJC-RQlcp3ssIo_rm4two,7973
|
|
91
|
-
ripperdoc/utils/file_watch.py,sha256=CoUIcLuS-VcfxotuxFkel5KpNluMmLGJKDzx26MG3yY,4039
|
|
92
|
-
ripperdoc/utils/git_utils.py,sha256=Hq-Zx-KPyX4lp_i8ozhic15LyYdX_IfCRm-EyoFu59A,9047
|
|
93
|
-
ripperdoc/utils/json_utils.py,sha256=e12eMpWlLDniHZVg7zdOkXw5wBZhnjhVtDm8tpBEOjk,741
|
|
94
|
-
ripperdoc/utils/log.py,sha256=mieFMPxiv-M87bB-dgiY8D5WMxQbjVKJdsrW8QvCui8,6138
|
|
95
|
-
ripperdoc/utils/mcp.py,sha256=xszG3kDrlctVVZvXOHr7wgndthpu-AwMySSwpnaHFGc,19445
|
|
96
|
-
ripperdoc/utils/memory.py,sha256=KNB8Eoobl0vgIEh6phXKtGmDUct7_DNQH-F6Il4KRDQ,8009
|
|
97
|
-
ripperdoc/utils/message_compaction.py,sha256=ydTtMqo09ds1qTneJrHaFroZ4UtmzzXlXHErPm7ZY5E,22370
|
|
98
|
-
ripperdoc/utils/message_formatting.py,sha256=M-2zEkjNEiLyda9x4S0-xyIBSsVOQS3eTzbIE3K7G_Q,7492
|
|
99
|
-
ripperdoc/utils/messages.py,sha256=OrUK758mmUx2_u_hE5RFLJMp8VeDy-crLGVADwgFO3c,21665
|
|
100
|
-
ripperdoc/utils/output_utils.py,sha256=R3wqFh9Dko_GK00Exx7XI0DnnldRWMsxZypYX5y6SJo,7448
|
|
101
|
-
ripperdoc/utils/path_ignore.py,sha256=m-cbf5I_1HeV7mjwzpb4O9BXGMTFZ4EnFmmguzD7WeY,17596
|
|
102
|
-
ripperdoc/utils/path_utils.py,sha256=C45Q3OeXnj-0FVEtvf_tdG5922XB6HthUzlUCvfc17Y,1626
|
|
103
|
-
ripperdoc/utils/prompt.py,sha256=zICNEsA_OtKx8t3zo9tHLXXu6G5K8rPO3jFLKz4j5tg,560
|
|
104
|
-
ripperdoc/utils/safe_get_cwd.py,sha256=IvG8dIJd2tC5_glUsfeWXkpcF1EHzdkjFtuUGJd669w,815
|
|
105
|
-
ripperdoc/utils/sandbox_utils.py,sha256=G91P8dw2VFcCiCpjXZ4LvzbAPiO8REqMhw39eI5Z4dU,1123
|
|
106
|
-
ripperdoc/utils/session_history.py,sha256=SQ3HusavKtbVyx6V-KPCXbQtTm_rcVuL-qjwv_iNS7Y,9568
|
|
107
|
-
ripperdoc/utils/session_usage.py,sha256=p8_s46zDTzV1qzP4HR4PuZmLeJvSfq9mG_Y5rCnRYyA,3213
|
|
108
|
-
ripperdoc/utils/shell_token_utils.py,sha256=SduoSU-RERJdM_7gBn0urr5UXtl4XOpPgydBd2fwzWg,2500
|
|
109
|
-
ripperdoc/utils/shell_utils.py,sha256=t-neFPy_VhEmWZ79J7hh1ULBEdX116Rb9_pnXvir1Jw,5235
|
|
110
|
-
ripperdoc/utils/todo.py,sha256=6aj3-AuKaY93bzljsIpvZlM_O8CPgnRROSLEEgzaMHU,7039
|
|
111
|
-
ripperdoc/utils/token_estimation.py,sha256=t98_zC95CZaA95A-1yu9H4p9r_IOjelspl2qqBLVyf8,1047
|
|
112
|
-
ripperdoc/utils/permissions/__init__.py,sha256=33FfOaDLepxJSkp0RLvTdVu7qBXuEcnOoTHFbEtFOt0,653
|
|
113
|
-
ripperdoc/utils/permissions/path_validation_utils.py,sha256=FWbb21Hwgb9gUPu_WtA14w99UUojVQLVz5HByormoUs,5760
|
|
114
|
-
ripperdoc/utils/permissions/shell_command_validation.py,sha256=94ylqoDUiTF4v4wEiVS35jFJakyaSxdIFqYKumPTrGk,21205
|
|
115
|
-
ripperdoc/utils/permissions/tool_permission_utils.py,sha256=6Fdu9-dMKhLsUExjEjoS0EUeRpEVN5UkqyseIC05YmM,9207
|
|
116
|
-
ripperdoc-0.2.8.dist-info/licenses/LICENSE,sha256=bRv9UhBor6GhnQDj12RciDcRfu0R7sB-lqCy1sWF75c,9242
|
|
117
|
-
ripperdoc-0.2.8.dist-info/METADATA,sha256=aoAeFiQqkUDQpJEt4buP6G1wKlkCMXI88slI-tGSDGg,7474
|
|
118
|
-
ripperdoc-0.2.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
119
|
-
ripperdoc-0.2.8.dist-info/entry_points.txt,sha256=79aohFxFPJmrQ3-Mhain04vb3EWpuc0EyzvDDUnwAu4,81
|
|
120
|
-
ripperdoc-0.2.8.dist-info/top_level.txt,sha256=u8LbdTr1a-laHgCO0Utl_R3QGFUhLxWelCDnP2ZgpCU,10
|
|
121
|
-
ripperdoc-0.2.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|