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.
Files changed (94) hide show
  1. ripperdoc/__init__.py +1 -1
  2. ripperdoc/cli/cli.py +257 -123
  3. ripperdoc/cli/commands/__init__.py +2 -1
  4. ripperdoc/cli/commands/agents_cmd.py +138 -8
  5. ripperdoc/cli/commands/clear_cmd.py +9 -4
  6. ripperdoc/cli/commands/config_cmd.py +1 -1
  7. ripperdoc/cli/commands/context_cmd.py +3 -2
  8. ripperdoc/cli/commands/doctor_cmd.py +18 -4
  9. ripperdoc/cli/commands/exit_cmd.py +1 -0
  10. ripperdoc/cli/commands/hooks_cmd.py +27 -53
  11. ripperdoc/cli/commands/models_cmd.py +27 -10
  12. ripperdoc/cli/commands/permissions_cmd.py +27 -9
  13. ripperdoc/cli/commands/resume_cmd.py +9 -3
  14. ripperdoc/cli/commands/stats_cmd.py +244 -0
  15. ripperdoc/cli/commands/status_cmd.py +4 -4
  16. ripperdoc/cli/commands/tasks_cmd.py +8 -4
  17. ripperdoc/cli/ui/file_mention_completer.py +2 -1
  18. ripperdoc/cli/ui/interrupt_handler.py +2 -3
  19. ripperdoc/cli/ui/message_display.py +4 -2
  20. ripperdoc/cli/ui/panels.py +1 -0
  21. ripperdoc/cli/ui/provider_options.py +247 -0
  22. ripperdoc/cli/ui/rich_ui.py +403 -81
  23. ripperdoc/cli/ui/spinner.py +54 -18
  24. ripperdoc/cli/ui/thinking_spinner.py +1 -2
  25. ripperdoc/cli/ui/tool_renderers.py +8 -2
  26. ripperdoc/cli/ui/wizard.py +213 -0
  27. ripperdoc/core/agents.py +19 -6
  28. ripperdoc/core/config.py +51 -17
  29. ripperdoc/core/custom_commands.py +7 -6
  30. ripperdoc/core/default_tools.py +101 -12
  31. ripperdoc/core/hooks/config.py +1 -3
  32. ripperdoc/core/hooks/events.py +27 -28
  33. ripperdoc/core/hooks/executor.py +4 -6
  34. ripperdoc/core/hooks/integration.py +12 -21
  35. ripperdoc/core/hooks/llm_callback.py +59 -0
  36. ripperdoc/core/hooks/manager.py +40 -15
  37. ripperdoc/core/permissions.py +118 -12
  38. ripperdoc/core/providers/anthropic.py +109 -36
  39. ripperdoc/core/providers/gemini.py +70 -5
  40. ripperdoc/core/providers/openai.py +89 -24
  41. ripperdoc/core/query.py +273 -68
  42. ripperdoc/core/query_utils.py +2 -0
  43. ripperdoc/core/skills.py +9 -3
  44. ripperdoc/core/system_prompt.py +4 -2
  45. ripperdoc/core/tool.py +17 -8
  46. ripperdoc/sdk/client.py +79 -4
  47. ripperdoc/tools/ask_user_question_tool.py +5 -3
  48. ripperdoc/tools/background_shell.py +307 -135
  49. ripperdoc/tools/bash_output_tool.py +1 -1
  50. ripperdoc/tools/bash_tool.py +63 -24
  51. ripperdoc/tools/dynamic_mcp_tool.py +29 -8
  52. ripperdoc/tools/enter_plan_mode_tool.py +1 -1
  53. ripperdoc/tools/exit_plan_mode_tool.py +1 -1
  54. ripperdoc/tools/file_edit_tool.py +167 -54
  55. ripperdoc/tools/file_read_tool.py +28 -4
  56. ripperdoc/tools/file_write_tool.py +13 -10
  57. ripperdoc/tools/glob_tool.py +3 -2
  58. ripperdoc/tools/grep_tool.py +3 -2
  59. ripperdoc/tools/kill_bash_tool.py +1 -1
  60. ripperdoc/tools/ls_tool.py +1 -1
  61. ripperdoc/tools/lsp_tool.py +615 -0
  62. ripperdoc/tools/mcp_tools.py +13 -10
  63. ripperdoc/tools/multi_edit_tool.py +8 -7
  64. ripperdoc/tools/notebook_edit_tool.py +7 -4
  65. ripperdoc/tools/skill_tool.py +1 -1
  66. ripperdoc/tools/task_tool.py +519 -69
  67. ripperdoc/tools/todo_tool.py +2 -2
  68. ripperdoc/tools/tool_search_tool.py +3 -2
  69. ripperdoc/utils/conversation_compaction.py +9 -5
  70. ripperdoc/utils/file_watch.py +214 -5
  71. ripperdoc/utils/json_utils.py +2 -1
  72. ripperdoc/utils/lsp.py +806 -0
  73. ripperdoc/utils/mcp.py +11 -3
  74. ripperdoc/utils/memory.py +4 -2
  75. ripperdoc/utils/message_compaction.py +21 -7
  76. ripperdoc/utils/message_formatting.py +14 -7
  77. ripperdoc/utils/messages.py +126 -67
  78. ripperdoc/utils/path_ignore.py +35 -8
  79. ripperdoc/utils/permissions/path_validation_utils.py +2 -1
  80. ripperdoc/utils/permissions/shell_command_validation.py +427 -91
  81. ripperdoc/utils/permissions/tool_permission_utils.py +174 -15
  82. ripperdoc/utils/safe_get_cwd.py +2 -1
  83. ripperdoc/utils/session_heatmap.py +244 -0
  84. ripperdoc/utils/session_history.py +13 -6
  85. ripperdoc/utils/session_stats.py +293 -0
  86. ripperdoc/utils/todo.py +2 -1
  87. ripperdoc/utils/token_estimation.py +6 -1
  88. {ripperdoc-0.2.8.dist-info → ripperdoc-0.2.10.dist-info}/METADATA +8 -2
  89. ripperdoc-0.2.10.dist-info/RECORD +129 -0
  90. ripperdoc-0.2.8.dist-info/RECORD +0 -121
  91. {ripperdoc-0.2.8.dist-info → ripperdoc-0.2.10.dist-info}/WHEEL +0 -0
  92. {ripperdoc-0.2.8.dist-info → ripperdoc-0.2.10.dist-info}/entry_points.txt +0 -0
  93. {ripperdoc-0.2.8.dist-info → ripperdoc-0.2.10.dist-info}/licenses/LICENSE +0 -0
  94. {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__, exc,
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 (ImportError, ModuleNotFoundError, OSError, RuntimeError): # pragma: no cover - runtime fallback
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.8
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 `--unsafe` to skip permission prompts. Choose `a`/`always` to allow a tool for the current session (not persisted across sessions).
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,,
@@ -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,,