ripperdoc 0.2.7__py3-none-any.whl → 0.2.9__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 +33 -115
- ripperdoc/cli/commands/__init__.py +70 -6
- ripperdoc/cli/commands/agents_cmd.py +6 -3
- ripperdoc/cli/commands/clear_cmd.py +1 -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/help_cmd.py +11 -1
- ripperdoc/cli/commands/hooks_cmd.py +610 -0
- ripperdoc/cli/commands/models_cmd.py +26 -9
- ripperdoc/cli/commands/permissions_cmd.py +57 -37
- ripperdoc/cli/commands/resume_cmd.py +6 -4
- ripperdoc/cli/commands/status_cmd.py +4 -4
- ripperdoc/cli/commands/tasks_cmd.py +8 -4
- ripperdoc/cli/ui/file_mention_completer.py +64 -8
- ripperdoc/cli/ui/interrupt_handler.py +3 -4
- ripperdoc/cli/ui/message_display.py +5 -3
- ripperdoc/cli/ui/panels.py +13 -10
- ripperdoc/cli/ui/provider_options.py +247 -0
- ripperdoc/cli/ui/rich_ui.py +196 -77
- ripperdoc/cli/ui/spinner.py +25 -1
- ripperdoc/cli/ui/tool_renderers.py +8 -2
- ripperdoc/cli/ui/wizard.py +215 -0
- ripperdoc/core/agents.py +9 -3
- ripperdoc/core/config.py +49 -12
- ripperdoc/core/custom_commands.py +412 -0
- ripperdoc/core/default_tools.py +11 -2
- ripperdoc/core/hooks/__init__.py +99 -0
- ripperdoc/core/hooks/config.py +301 -0
- ripperdoc/core/hooks/events.py +535 -0
- ripperdoc/core/hooks/executor.py +496 -0
- ripperdoc/core/hooks/integration.py +344 -0
- ripperdoc/core/hooks/manager.py +745 -0
- ripperdoc/core/permissions.py +40 -8
- ripperdoc/core/providers/anthropic.py +548 -68
- ripperdoc/core/providers/gemini.py +70 -5
- ripperdoc/core/providers/openai.py +60 -5
- ripperdoc/core/query.py +140 -39
- ripperdoc/core/query_utils.py +2 -0
- ripperdoc/core/skills.py +9 -3
- ripperdoc/core/system_prompt.py +4 -2
- ripperdoc/core/tool.py +9 -5
- ripperdoc/sdk/client.py +2 -2
- ripperdoc/tools/ask_user_question_tool.py +5 -3
- ripperdoc/tools/background_shell.py +2 -1
- ripperdoc/tools/bash_output_tool.py +1 -1
- ripperdoc/tools/bash_tool.py +30 -20
- 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 +8 -4
- ripperdoc/tools/file_read_tool.py +9 -5
- ripperdoc/tools/file_write_tool.py +9 -5
- 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/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 +5 -4
- ripperdoc/tools/todo_tool.py +2 -2
- ripperdoc/tools/tool_search_tool.py +3 -2
- ripperdoc/utils/conversation_compaction.py +11 -7
- ripperdoc/utils/file_watch.py +8 -2
- ripperdoc/utils/json_utils.py +2 -1
- ripperdoc/utils/mcp.py +11 -3
- ripperdoc/utils/memory.py +4 -2
- ripperdoc/utils/message_compaction.py +21 -7
- ripperdoc/utils/message_formatting.py +11 -7
- ripperdoc/utils/messages.py +105 -66
- ripperdoc/utils/path_ignore.py +38 -12
- ripperdoc/utils/permissions/path_validation_utils.py +2 -1
- ripperdoc/utils/permissions/shell_command_validation.py +427 -91
- ripperdoc/utils/safe_get_cwd.py +2 -1
- ripperdoc/utils/session_history.py +13 -6
- ripperdoc/utils/todo.py +2 -1
- ripperdoc/utils/token_estimation.py +6 -1
- {ripperdoc-0.2.7.dist-info → ripperdoc-0.2.9.dist-info}/METADATA +24 -3
- ripperdoc-0.2.9.dist-info/RECORD +123 -0
- ripperdoc-0.2.7.dist-info/RECORD +0 -113
- {ripperdoc-0.2.7.dist-info → ripperdoc-0.2.9.dist-info}/WHEEL +0 -0
- {ripperdoc-0.2.7.dist-info → ripperdoc-0.2.9.dist-info}/entry_points.txt +0 -0
- {ripperdoc-0.2.7.dist-info → ripperdoc-0.2.9.dist-info}/licenses/LICENSE +0 -0
- {ripperdoc-0.2.7.dist-info → ripperdoc-0.2.9.dist-info}/top_level.txt +0 -0
ripperdoc/core/permissions.py
CHANGED
|
@@ -26,8 +26,29 @@ class PermissionResult:
|
|
|
26
26
|
decision: Optional[PermissionDecision] = None
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
def _format_input_preview(parsed_input: Any) -> str:
|
|
30
|
-
"""Create a
|
|
29
|
+
def _format_input_preview(parsed_input: Any, tool_name: Optional[str] = None) -> str:
|
|
30
|
+
"""Create a human-friendly preview for prompts.
|
|
31
|
+
|
|
32
|
+
For Bash commands, shows full details for security review.
|
|
33
|
+
For other tools, shows a concise preview.
|
|
34
|
+
"""
|
|
35
|
+
# For Bash tool, show full command details for security review
|
|
36
|
+
if tool_name == "Bash" and hasattr(parsed_input, "command"):
|
|
37
|
+
lines = [f"Command: {getattr(parsed_input, 'command')}"]
|
|
38
|
+
|
|
39
|
+
# Add other relevant parameters
|
|
40
|
+
if hasattr(parsed_input, "timeout") and parsed_input.timeout:
|
|
41
|
+
lines.append(f"Timeout: {parsed_input.timeout}ms")
|
|
42
|
+
if hasattr(parsed_input, "sandbox"):
|
|
43
|
+
lines.append(f"Sandbox: {parsed_input.sandbox}")
|
|
44
|
+
if hasattr(parsed_input, "run_in_background"):
|
|
45
|
+
lines.append(f"Background: {parsed_input.run_in_background}")
|
|
46
|
+
if hasattr(parsed_input, "shell_executable") and parsed_input.shell_executable:
|
|
47
|
+
lines.append(f"Shell: {parsed_input.shell_executable}")
|
|
48
|
+
|
|
49
|
+
return "\n ".join(lines)
|
|
50
|
+
|
|
51
|
+
# For other tools with commands, show concise preview
|
|
31
52
|
if hasattr(parsed_input, "command"):
|
|
32
53
|
return f"command='{getattr(parsed_input, 'command')}'"
|
|
33
54
|
if hasattr(parsed_input, "file_path"):
|
|
@@ -94,10 +115,13 @@ def _rule_strings(rule_suggestions: Optional[Any]) -> list[str]:
|
|
|
94
115
|
|
|
95
116
|
def make_permission_checker(
|
|
96
117
|
project_path: Path,
|
|
97
|
-
|
|
118
|
+
yolo_mode: bool,
|
|
98
119
|
prompt_fn: Optional[Callable[[str], str]] = None,
|
|
99
120
|
) -> Callable[[Tool[Any, Any], Any], Awaitable[PermissionResult]]:
|
|
100
|
-
"""Create a permission checking function for the current project.
|
|
121
|
+
"""Create a permission checking function for the current project.
|
|
122
|
+
|
|
123
|
+
In yolo mode, all tool calls are allowed without prompting.
|
|
124
|
+
"""
|
|
101
125
|
|
|
102
126
|
project_path = project_path.resolve()
|
|
103
127
|
config_manager.get_project_config(project_path)
|
|
@@ -120,7 +144,7 @@ def make_permission_checker(
|
|
|
120
144
|
"""Check and optionally persist permission for a tool invocation."""
|
|
121
145
|
config = config_manager.get_project_config(project_path)
|
|
122
146
|
|
|
123
|
-
if
|
|
147
|
+
if yolo_mode:
|
|
124
148
|
return PermissionResult(result=True)
|
|
125
149
|
|
|
126
150
|
try:
|
|
@@ -130,7 +154,11 @@ def make_permission_checker(
|
|
|
130
154
|
# Tool implementation error - log and deny for safety
|
|
131
155
|
logger.warning(
|
|
132
156
|
"[permissions] Tool needs_permissions check failed",
|
|
133
|
-
extra={
|
|
157
|
+
extra={
|
|
158
|
+
"tool": getattr(tool, "name", None),
|
|
159
|
+
"error": str(exc),
|
|
160
|
+
"error_type": type(exc).__name__,
|
|
161
|
+
},
|
|
134
162
|
)
|
|
135
163
|
return PermissionResult(
|
|
136
164
|
result=False,
|
|
@@ -172,7 +200,11 @@ def make_permission_checker(
|
|
|
172
200
|
# Tool implementation error - fall back to asking user
|
|
173
201
|
logger.warning(
|
|
174
202
|
"[permissions] Tool check_permissions failed",
|
|
175
|
-
extra={
|
|
203
|
+
extra={
|
|
204
|
+
"tool": getattr(tool, "name", None),
|
|
205
|
+
"error": str(exc),
|
|
206
|
+
"error_type": type(exc).__name__,
|
|
207
|
+
},
|
|
176
208
|
)
|
|
177
209
|
decision = PermissionDecision(
|
|
178
210
|
behavior="ask",
|
|
@@ -203,7 +235,7 @@ def make_permission_checker(
|
|
|
203
235
|
)
|
|
204
236
|
|
|
205
237
|
# Ask/passthrough flows prompt the user.
|
|
206
|
-
input_preview = _format_input_preview(parsed_input)
|
|
238
|
+
input_preview = _format_input_preview(parsed_input, tool_name=tool.name)
|
|
207
239
|
prompt_lines = [
|
|
208
240
|
f"{tool.name}",
|
|
209
241
|
"",
|