skydeckai-code 0.1.23__py3-none-any.whl → 0.1.24__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.
@@ -0,0 +1,160 @@
1
+ import os
2
+ import requests
3
+ from typing import List, Optional
4
+ from urllib.parse import urlparse
5
+
6
+ from mcp.types import TextContent
7
+ from .state import state
8
+
9
+
10
+ def web_fetch_tool():
11
+ return {
12
+ "name": "web_fetch",
13
+ "description": "Fetches content from a URL. "
14
+ "WHEN TO USE: When you need to retrieve data from web APIs, download documentation, "
15
+ "check external resources, or gather information from websites. Useful for getting "
16
+ "real-time data, documentation, or referencing external content. "
17
+ "WHEN NOT TO USE: When you need to interact with complex websites requiring authentication "
18
+ "or session management, when the data needs to be processed in a specific format not supported, "
19
+ "or when you need to make authenticated API calls with OAuth. "
20
+ "RETURNS: The content of the URL as text. For HTML pages, returns the raw HTML content. "
21
+ "For JSON endpoints, returns the JSON content as a string. Successful response includes HTTP "
22
+ "status code. Failed requests include error details. Maximum request size enforced for safety.",
23
+ "inputSchema": {
24
+ "type": "object",
25
+ "properties": {
26
+ "url": {
27
+ "type": "string",
28
+ "description": "The URL to fetch content from. Must be a valid URL with supported protocol "
29
+ "(http or https). Examples: 'https://example.com', 'https://api.github.com/repos/user/repo'. "
30
+ "The URL must be publicly accessible."
31
+ },
32
+ "headers": {
33
+ "type": "object",
34
+ "description": "Optional HTTP headers to include in the request. Useful for API calls that "
35
+ "require specific headers like User-Agent or Accept. Example: {'User-Agent': 'SkyDeckAI', "
36
+ "'Accept': 'application/json'}.",
37
+ "default": {}
38
+ },
39
+ "timeout": {
40
+ "type": "integer",
41
+ "description": "Request timeout in seconds. Maximum time to wait for the server to respond before "
42
+ "aborting the request. Defaults to 10 seconds.",
43
+ "default": 10
44
+ },
45
+ "save_to_file": {
46
+ "type": "string",
47
+ "description": "Optional path to save the response content to a file. If provided, the content "
48
+ "will be saved to this location. Must be within the allowed directory. Example: "
49
+ "'downloads/page.html', 'data/api_response.json'.",
50
+ "default": None
51
+ }
52
+ },
53
+ "required": ["url"]
54
+ }
55
+ }
56
+
57
+
58
+ async def handle_web_fetch(arguments: dict) -> List[TextContent]:
59
+ """Handle fetching content from a URL."""
60
+ url = arguments.get("url")
61
+ headers = arguments.get("headers", {})
62
+ timeout = arguments.get("timeout", 10)
63
+ save_to_file = arguments.get("save_to_file")
64
+
65
+ if not url:
66
+ raise ValueError("URL must be provided")
67
+
68
+ # Basic URL validation
69
+ parsed_url = urlparse(url)
70
+ if not parsed_url.scheme or not parsed_url.netloc:
71
+ raise ValueError(f"Invalid URL: {url}. Must include scheme (http/https) and domain.")
72
+
73
+ if parsed_url.scheme not in ["http", "https"]:
74
+ raise ValueError(f"Unsupported URL scheme: {parsed_url.scheme}. Only http and https are supported.")
75
+
76
+ # Add a default User-Agent if not provided
77
+ if "User-Agent" not in headers:
78
+ headers["User-Agent"] = "SkyDeckAI-Web-Fetch/1.0"
79
+
80
+ # Validate and prepare file path if saving to file
81
+ full_save_path = None
82
+ if save_to_file:
83
+ if os.path.isabs(save_to_file):
84
+ full_save_path = os.path.abspath(save_to_file)
85
+ else:
86
+ full_save_path = os.path.abspath(os.path.join(state.allowed_directory, save_to_file))
87
+
88
+ # Security check
89
+ if not full_save_path.startswith(state.allowed_directory):
90
+ raise ValueError(f"Access denied: Path ({full_save_path}) must be within allowed directory")
91
+
92
+ # Create parent directories if they don't exist
93
+ os.makedirs(os.path.dirname(full_save_path), exist_ok=True)
94
+
95
+ try:
96
+ # Make the request with a maximum size limit to prevent abuse
97
+ response = requests.get(
98
+ url,
99
+ headers=headers,
100
+ timeout=timeout,
101
+ stream=True # Use streaming for better control over large responses
102
+ )
103
+
104
+ # Check if response is successful
105
+ response.raise_for_status()
106
+
107
+ # Get content type from headers
108
+ content_type = response.headers.get("Content-Type", "").lower()
109
+
110
+ # Maximum size limit (10MB)
111
+ max_size = 10 * 1024 * 1024
112
+ content = b""
113
+ for chunk in response.iter_content(chunk_size=8192):
114
+ content += chunk
115
+ if len(content) > max_size:
116
+ raise ValueError(f"Response too large. Maximum size is {max_size // (1024 * 1024)}MB.")
117
+
118
+ # Save to file if requested
119
+ if full_save_path:
120
+ with open(full_save_path, 'wb') as f:
121
+ f.write(content)
122
+
123
+ # Try to decode the content
124
+ try:
125
+ text_content = content.decode('utf-8')
126
+ except UnicodeDecodeError:
127
+ # If content can't be decoded as utf-8, provide info about binary content
128
+ if full_save_path:
129
+ return [TextContent(
130
+ type="text",
131
+ text=f"Binary content saved to {save_to_file} (size: {len(content)} bytes, type: {content_type})"
132
+ )]
133
+ else:
134
+ return [TextContent(
135
+ type="text",
136
+ text=f"Binary content received (size: {len(content)} bytes, type: {content_type})"
137
+ )]
138
+
139
+ # Success message
140
+ status_info = f"HTTP {response.status_code}"
141
+ size_info = f"{len(content)} bytes"
142
+ save_info = f", saved to {save_to_file}" if full_save_path else ""
143
+
144
+ result = [TextContent(
145
+ type="text",
146
+ text=f"{status_info}, {size_info}{save_info}:\n\n{text_content}"
147
+ )]
148
+
149
+ return result
150
+
151
+ except requests.exceptions.RequestException as e:
152
+ # Handle request-related errors
153
+ error_message = str(e)
154
+ if hasattr(e, 'response') and e.response is not None:
155
+ error_message = f"HTTP {e.response.status_code}: {error_message}"
156
+
157
+ raise ValueError(f"Error fetching URL ({url}): {error_message}")
158
+ except Exception as e:
159
+ # Handle other errors
160
+ raise ValueError(f"Error processing content from {url}: {str(e)}")
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skydeckai-code
3
- Version: 0.1.23
4
- Summary: This MCP server provides a set of tools that support AI-driven Development workflows.
3
+ Version: 0.1.24
4
+ Summary: This MCP server provides a comprehensive set of tools for AI-driven Development workflows including file operations, code analysis, multi-language execution, Git operations, web content fetching, code content searching, and system information retrieval.
5
5
  Project-URL: Homepage, https://github.com/skydeckai/skydeckai-code
6
6
  Project-URL: Repository, https://github.com/skydeckai/skydeckai-code
7
7
  Project-URL: Documentation, https://github.com/skydeckai/skydeckai-code/blob/main/README.md
@@ -17,6 +17,7 @@ Requires-Dist: pillow>=11.1.0
17
17
  Requires-Dist: psutil>=7.0.0
18
18
  Requires-Dist: pygetwindow>=0.0.9
19
19
  Requires-Dist: pyobjc-framework-quartz>=11.0
20
+ Requires-Dist: requests>=2.32.3
20
21
  Requires-Dist: tree-sitter-c-sharp>=0.23.1
21
22
  Requires-Dist: tree-sitter-cpp>=0.23.4
22
23
  Requires-Dist: tree-sitter-go>=0.23.4
@@ -33,7 +34,7 @@ Description-Content-Type: text/markdown
33
34
 
34
35
  # SkyDeckAI Code
35
36
 
36
- An MCP server that provides a comprehensive set of tools for AI-driven development workflows. Features include file system operations, code analysis using tree-sitter for multiple programming languages, Git operations, code execution, and system information retrieval. Designed to enhance AI's capability to assist in software development tasks.
37
+ An MCP server that provides a comprehensive set of tools for AI-driven development workflows. Features include file system operations, code analysis using tree-sitter for multiple programming languages, Git operations, code execution, web content fetching, code content searching, and system information retrieval. Designed to enhance AI's capability to assist in software development tasks by providing direct access to both local and remote resources.
37
38
 
38
39
  # Formerly Known As MCP-Server-AIDD
39
40
 
@@ -90,11 +91,14 @@ If you're using SkyDeck AI Helper app, you can search for "SkyDeckAI Code" and i
90
91
 
91
92
  ## Key Features
92
93
 
93
- - File system operations (read, write, edit, move, delete)
94
+ - File system operations (read, write, edit, move, copy, delete)
94
95
  - Directory management and traversal
95
96
  - Multi-language code analysis using tree-sitter
97
+ - Code content searching with regex pattern matching
96
98
  - Multi-language code execution with safety measures
97
- - Git operations (status, diff, commit, branch management)
99
+ - Git operations (status, diff, commit, branch management, cloning)
100
+ - Web content fetching from APIs and websites
101
+ - Batch operations for parallel and serial tool execution
98
102
  - Security controls with configurable workspace boundaries
99
103
  - Screenshot and screen context tools
100
104
  - Image handling tools
@@ -103,24 +107,34 @@ If you're using SkyDeck AI Helper app, you can search for "SkyDeckAI Code" and i
103
107
 
104
108
  ### Basic File Operations
105
109
 
106
- | Tool | Parameters | Returns |
107
- | ------------------- | ----------------------------------- | --------------------------------------------- |
108
- | read_file | path: string | File content |
109
- | read_multiple_files | paths: string[] | Multiple file contents with headers |
110
- | write_file | path: string, content: string | Success confirmation |
111
- | move_file | source: string, destination: string | Success confirmation |
112
- | delete_file | path: string | Success confirmation |
113
- | get_file_info | path: string | File metadata (size, timestamps, permissions) |
110
+ | Tool | Parameters | Returns |
111
+ | ------------------- | -------------------------------------------------------- | --------------------------------------------- |
112
+ | read_file | path: string, offset?: integer, limit?: integer | File content (whole or partial) |
113
+ | read_multiple_files | paths: string[] | Multiple file contents with headers |
114
+ | write_file | path: string, content: string | Success confirmation |
115
+ | move_file | source: string, destination: string | Success confirmation |
116
+ | copy_file | source: string, destination: string, recursive?: boolean | Success confirmation |
117
+ | delete_file | path: string | Success confirmation |
118
+ | get_file_info | path: string | File metadata (size, timestamps, permissions) |
114
119
 
115
120
  Common usage:
116
121
 
117
122
  ```bash
118
- # Read file
123
+ # Read entire file
119
124
  skydeckai-code-cli --tool read_file --args '{"path": "src/main.py"}'
120
125
 
126
+ # Read 10 lines starting from line 20
127
+ skydeckai-code-cli --tool read_file --args '{"path": "src/main.py", "offset": 20, "limit": 10}'
128
+
129
+ # Read from line 50 to the end of the file
130
+ skydeckai-code-cli --tool read_file --args '{"path": "src/main.py", "offset": 50}'
131
+
121
132
  # Write file
122
133
  skydeckai-code-cli --tool write_file --args '{"path": "output.txt", "content": "Hello World"}'
123
134
 
135
+ # Copy file or directory
136
+ skydeckai-code-cli --tool copy_file --args '{"source": "config.json", "destination": "config.backup.json"}'
137
+
124
138
  # Get file info
125
139
  skydeckai-code-cli --tool get_file_info --args '{"path": "src/main.py"}'
126
140
  ```
@@ -161,6 +175,8 @@ Returns: Diff of changes or preview in dry run mode.
161
175
  | create_directory | path: string | Success confirmation |
162
176
  | search_files | pattern: string, path?: string, include_hidden?: boolean | Matching files list |
163
177
 
178
+ The `search_files` tool searches for files by name pattern, while the `search_code` tool searches within file contents using regex. Use `search_files` when looking for files with specific names or extensions, and `search_code` when searching for specific text patterns inside files.
179
+
164
180
  #### directory_tree
165
181
 
166
182
  Generates complete directory structure:
@@ -186,17 +202,18 @@ skydeckai-code-cli --tool search_files --args '{"pattern": ".py", "path": "src"}
186
202
 
187
203
  ### Git Operations
188
204
 
189
- | Tool | Parameters | Returns |
190
- | ----------------- | -------------------------------------- | -------------------------------- |
191
- | git_init | path: string, initial_branch?: string | Repository initialization status |
192
- | git_status | repo_path: string | Working directory status |
193
- | git_add | repo_path: string, files: string[] | Staging confirmation |
194
- | git_reset | repo_path: string | Unstaging confirmation |
195
- | git_checkout | repo_path: string, branch_name: string | Branch switch confirmation |
196
- | git_create_branch | repo_path: string, branch_name: string | Branch creation confirmation |
197
- | git_diff_unstaged | repo_path: string | Unstaged changes diff |
198
- | git_diff_staged | repo_path: string | Staged changes diff |
199
- | git_show | repo_path: string, commit_hash: string | Details of a specific commit |
205
+ | Tool | Parameters | Returns |
206
+ | ----------------- | ------------------------------------------------- | -------------------------------- |
207
+ | git_init | path: string, initial_branch?: string | Repository initialization status |
208
+ | git_status | repo_path: string | Working directory status |
209
+ | git_add | repo_path: string, files: string[] | Staging confirmation |
210
+ | git_reset | repo_path: string | Unstaging confirmation |
211
+ | git_checkout | repo_path: string, branch_name: string | Branch switch confirmation |
212
+ | git_create_branch | repo_path: string, branch_name: string | Branch creation confirmation |
213
+ | git_clone | url: string, target_path: string, branch?: string | Clone confirmation |
214
+ | git_diff_unstaged | repo_path: string | Unstaged changes diff |
215
+ | git_diff_staged | repo_path: string | Staged changes diff |
216
+ | git_show | repo_path: string, commit_hash: string | Details of a specific commit |
200
217
 
201
218
  #### Complex Git Operations
202
219
 
@@ -239,6 +256,9 @@ Common usage:
239
256
  # Check status
240
257
  skydeckai-code-cli --tool git_status --args '{"repo_path": "."}'
241
258
 
259
+ # Clone a repository
260
+ skydeckai-code-cli --tool git_clone --args '{"url": "https://github.com/username/repo.git", "target_path": "repo"}'
261
+
242
262
  # Create and switch to new branch
243
263
  skydeckai-code-cli --tool git_create_branch --args '{"repo_path": ".", "branch_name": "feature/new-branch"}'
244
264
  ```
@@ -277,6 +297,59 @@ Supported Languages:
277
297
  - C# (.cs)
278
298
  - Kotlin (.kt, .kts)
279
299
 
300
+ #### search_code
301
+
302
+ Fast content search tool using regular expressions:
303
+
304
+ ```json
305
+ {
306
+ "pattern": "function\\s+\\w+",
307
+ "include": "*.js",
308
+ "exclude": "node_modules/**",
309
+ "max_results": 50,
310
+ "case_sensitive": false,
311
+ "path": "src"
312
+ }
313
+ ```
314
+
315
+ **Parameters:**
316
+ | Parameter | Type | Required | Description |
317
+ |-----------|------|----------|-------------|
318
+ | pattern | string | Yes | Regular expression pattern to search in file contents |
319
+ | include | string | No | File pattern to include (glob syntax, default: "\*") |
320
+ | exclude | string | No | File pattern to exclude (glob syntax, default: "") |
321
+ | max_results | integer | No | Maximum results to return (default: 100) |
322
+ | case_sensitive | boolean | No | Whether search is case-sensitive (default: false) |
323
+ | path | string | No | Base directory to search from (default: ".") |
324
+
325
+ **Returns:**
326
+ Matching lines grouped by file with line numbers, sorted by file modification time with newest files first.
327
+
328
+ This tool uses ripgrep when available for optimal performance, with a Python fallback implementation. It's ideal for finding specific code patterns like function declarations, imports, variable usages, or error handling.
329
+
330
+ **Example Usage:**
331
+
332
+ ```bash
333
+ # Find function declarations in JavaScript files
334
+ skydeckai-code-cli --tool search_code --args '{
335
+ "pattern": "function\\s+\\w+",
336
+ "include": "*.js"
337
+ }'
338
+
339
+ # Find all console.log statements with errors
340
+ skydeckai-code-cli --tool search_code --args '{
341
+ "pattern": "console\\.log.*[eE]rror",
342
+ "path": "src"
343
+ }'
344
+
345
+ # Find import statements in TypeScript files
346
+ skydeckai-code-cli --tool search_code --args '{
347
+ "pattern": "import.*from",
348
+ "include": "*.{ts,tsx}",
349
+ "exclude": "node_modules/**"
350
+ }'
351
+ ```
352
+
280
353
  ### System Information
281
354
 
282
355
  | Tool | Parameters | Returns |
@@ -443,6 +516,181 @@ Base64-encoded image data that can be displayed or processed.
443
516
 
444
517
  This tool supports common image formats like PNG, JPEG, GIF, and WebP, and automatically resizes images for optimal viewing.
445
518
 
519
+ ### Web Tools
520
+
521
+ #### web_fetch
522
+
523
+ Fetches content from a URL and optionally saves it to a file.
524
+
525
+ ```json
526
+ {
527
+ "url": "https://api.github.com/users/octocat",
528
+ "headers": {
529
+ "Accept": "application/json"
530
+ },
531
+ "timeout": 15,
532
+ "save_to_file": "downloads/octocat.json"
533
+ }
534
+ ```
535
+
536
+ **Parameters:**
537
+ | Parameter | Type | Required | Description |
538
+ |-----------|---------|----------|---------------------------------------|
539
+ | url | string | Yes | URL to fetch content from (http/https only) |
540
+ | headers | object | No | Optional HTTP headers to include in the request |
541
+ | timeout | integer | No | Maximum time to wait for response (default: 10s) |
542
+ | save_to_file | string | No | Path to save response content (within allowed directory) |
543
+
544
+ **Returns:**
545
+ Response content as text with HTTP status code and size information. For binary content, returns metadata and saves to file if requested.
546
+
547
+ This tool can be used to access web APIs, fetch documentation, or download content from the web while respecting size limits (10MB max) and security constraints.
548
+
549
+ **Example Usage:**
550
+
551
+ ```bash
552
+ # Fetch JSON from an API
553
+ skydeckai-code-cli --tool web_fetch --args '{
554
+ "url": "https://api.github.com/users/octocat",
555
+ "headers": {"Accept": "application/json"}
556
+ }'
557
+
558
+ # Download content to a file
559
+ skydeckai-code-cli --tool web_fetch --args '{
560
+ "url": "https://github.com/github/github-mcp-server/blob/main/README.md",
561
+ "save_to_file": "downloads/readme.md"
562
+ }'
563
+ ```
564
+
565
+ ### Utility Tools
566
+
567
+ #### batch_tools
568
+
569
+ Execute multiple tool invocations in a single request with parallel execution when possible.
570
+
571
+ ```json
572
+ {
573
+ "description": "Setup new project",
574
+ "sequential": true,
575
+ "invocations": [
576
+ {
577
+ "tool": "create_directory",
578
+ "arguments": {
579
+ "path": "src"
580
+ }
581
+ },
582
+ {
583
+ "tool": "write_file",
584
+ "arguments": {
585
+ "path": "README.md",
586
+ "content": "# New Project\n\nThis is a new project."
587
+ }
588
+ },
589
+ {
590
+ "tool": "git_init",
591
+ "arguments": {
592
+ "path": ".",
593
+ "initial_branch": "main"
594
+ }
595
+ }
596
+ ]
597
+ }
598
+ ```
599
+
600
+ **Parameters:**
601
+ | Parameter | Type | Required | Description |
602
+ |-----------|---------|----------|---------------------------------------|
603
+ | description | string | Yes | Short description of the batch operation |
604
+ | sequential | boolean | No | Whether to run tools in sequence (default: false) |
605
+ | invocations | array | Yes | List of tool invocations to execute |
606
+ | invocations[].tool | string | Yes | Name of the tool to invoke |
607
+ | invocations[].arguments | object | Yes | Arguments for the specified tool |
608
+
609
+ **Returns:**
610
+ Combined results from all tool invocations, grouped by tool with success/error status for each. Results are presented in the original invocation order with clear section headers.
611
+
612
+ This tool provides efficient execution of multiple operations in a single request. When `sequential` is false (default), tools are executed in parallel for better performance. When `sequential` is true, tools are executed in order, and if any tool fails, execution stops.
613
+
614
+ **IMPORTANT**: All tools in the batch execute in the same working directory context. If a tool creates a directory and a subsequent tool needs to work inside that directory, you must either:
615
+
616
+ 1. Use paths relative to the current working directory (e.g., "project/src" rather than just "src"), or
617
+ 2. Include an explicit tool invocation to change directories using `update_allowed_directory`
618
+
619
+ **Example Usage:**
620
+
621
+ ```bash
622
+ # Setup a new project with multiple steps in sequential order (using proper paths)
623
+ skydeckai-code-cli --tool batch_tools --args '{
624
+ "description": "Setup new project",
625
+ "sequential": true,
626
+ "invocations": [
627
+ {"tool": "create_directory", "arguments": {"path": "project"}},
628
+ {"tool": "create_directory", "arguments": {"path": "project/src"}},
629
+ {"tool": "write_file", "arguments": {"path": "project/README.md", "content": "# Project\n\nA new project."}}
630
+ ]
631
+ }'
632
+
633
+ # Create nested structure using relative paths (without changing directory)
634
+ skydeckai-code-cli --tool batch_tools --args '{
635
+ "description": "Create project structure",
636
+ "sequential": true,
637
+ "invocations": [
638
+ {"tool": "create_directory", "arguments": {"path": "project/src"}},
639
+ {"tool": "create_directory", "arguments": {"path": "project/docs"}},
640
+ {"tool": "write_file", "arguments": {"path": "project/README.md", "content": "# Project"}}
641
+ ]
642
+ }'
643
+
644
+ # Gather system information and take a screenshot (tasks can run in parallel)
645
+ skydeckai-code-cli --tool batch_tools --args '{
646
+ "description": "System diagnostics",
647
+ "sequential": false,
648
+ "invocations": [
649
+ {"tool": "get_system_info", "arguments": {}},
650
+ {"tool": "capture_screenshot", "arguments": {
651
+ "output_path": "diagnostics/screen.png",
652
+ "capture_mode": {
653
+ "type": "full"
654
+ }
655
+ }}
656
+ ]
657
+ }'
658
+ ```
659
+
660
+ #### think
661
+
662
+ A tool for complex reasoning and brainstorming without making changes to the repository.
663
+
664
+ ```json
665
+ {
666
+ "thought": "Let me analyze the performance issue in the codebase:\n\n## Root Cause Analysis\n\n1. The database query is inefficient because:\n - It doesn't use proper indexing\n - It fetches more columns than needed\n - The JOIN operation is unnecessarily complex\n\n## Potential Solutions\n\n1. **Add database indexes**:\n - Create an index on the user_id column\n - Create a composite index on (created_at, status)\n\n2. **Optimize the query**:\n - Select only necessary columns\n - Rewrite the JOIN using a subquery\n - Add LIMIT clause for pagination\n\n3. **Add caching layer**:\n - Cache frequent queries using Redis\n - Implement cache invalidation strategy\n\nAfter weighing the options, solution #2 seems to be the simplest to implement with the highest impact."
667
+ }
668
+ ```
669
+
670
+ **Parameters:**
671
+ | Parameter | Type | Required | Description |
672
+ |-----------|---------|----------|---------------------------------------|
673
+ | thought | string | Yes | Your detailed thoughts, analysis or reasoning process |
674
+
675
+ **Returns:**
676
+ Your thoughts formatted as markdown, with a note indicating this was a thinking exercise.
677
+
678
+ This tool is useful for thinking through complex problems, brainstorming solutions, or laying out implementation plans without making any actual changes. It's a great way to document your reasoning process, evaluate different approaches, or plan out a multi-step strategy before taking action.
679
+
680
+ **Example Usage:**
681
+
682
+ ```bash
683
+ # Analyze a bug and plan a fix
684
+ skydeckai-code-cli --tool think --args '{
685
+ "thought": "# Bug Analysis\n\n## Observed Behavior\nThe login endpoint returns a 500 error when email contains Unicode characters.\n\n## Root Cause\nThe database adapter is not properly encoding Unicode strings before constructing the SQL query.\n\n## Potential Fixes\n1. Update the database adapter to use parameterized queries\n2. Add input validation to reject Unicode in emails\n3. Encode email input manually before database operations\n\nFix #1 is the best approach as it solves the core issue and improves security."
686
+ }'
687
+
688
+ # Evaluate design alternatives
689
+ skydeckai-code-cli --tool think --args '{
690
+ "thought": "# API Design Options\n\n## REST vs GraphQL\nFor this use case, GraphQL would provide more flexible data fetching but adds complexity. REST is simpler and sufficient for our current needs.\n\n## Authentication Methods\nJWT-based authentication offers stateless operation and better scalability compared to session-based auth.\n\nRecommendation: Use REST with JWT authentication for the initial implementation."
691
+ }'
692
+ ```
693
+
446
694
  ### Code Execution
447
695
 
448
696
  #### execute_code
@@ -1,22 +1,25 @@
1
1
  aidd/__init__.py,sha256=c9HBWxWruCxoAqLCJqltylAwz_7xmaK3g8DKViJZs0Q,222
2
2
  aidd/cli.py,sha256=cLtaQJmMBfr7fHkd0dyJqpDrVTIwybL48PotniWGrFM,5031
3
3
  aidd/server.py,sha256=kPRyWeWkMCZjabelC65XTmzZG7yw8htMJKSfnUcKnb0,1575
4
- aidd/tools/__init__.py,sha256=Ey6Kvj1_riwKwnS6PN2152QM_qLExZJj4pXtYMiYcS0,4548
4
+ aidd/tools/__init__.py,sha256=Ang69KUss3OzXQdJ8Wyabo-5WNMRB0gmlPlPbrKprg8,5214
5
5
  aidd/tools/base.py,sha256=wHSAaGGYWM8ECmoYd7KEcmjsZRWesNQFf3zMjCKGMcc,380
6
6
  aidd/tools/code_analysis.py,sha256=fDpm2o_If5PsngXzHN2-ezSkPVT0ZxivLuzmHrOAmVU,33188
7
7
  aidd/tools/code_execution.py,sha256=dIPxHBtclsetDZY4jGlSBrw_t-7VlIVrK8mflnZ6c4w,13176
8
+ aidd/tools/code_tools.py,sha256=rkKPtChLWnlMcluDQDAUxWM8sCkfodDerx5JbU8mUN8,12616
8
9
  aidd/tools/directory_tools.py,sha256=Hxzge_ziYw_FsjYb5yF0R0dHEdvuWRsg7WsdYDG0AUg,12971
9
- aidd/tools/file_tools.py,sha256=DP58WQCkNEcWsu4n1MNWLS3ki6CLX9Q4tW_Jy4XzPiw,36995
10
+ aidd/tools/file_tools.py,sha256=IDgGr0EyLEEGmbsy-L1gnf7QbR2QaEi8KeX7NJPe5Zo,43823
10
11
  aidd/tools/get_active_apps_tool.py,sha256=BjLF7iXSDgyAmm_gfFgAul2Gn3iX-CNVYHM7Sh4jTAI,19427
11
12
  aidd/tools/get_available_windows_tool.py,sha256=OVIYhItTn9u_DftOr3vPCT-R0DOFvMEEJXA6tD6gqWQ,15952
12
- aidd/tools/git_tools.py,sha256=gpjme4REvDYuVhn2iDcgwYvp6C0MnP36NWB6HgCA1YQ,35401
13
+ aidd/tools/git_tools.py,sha256=AgolgrZnpN2NALV7SfIwc6D7U7tdPrPTSFmU2WjPfVE,39846
13
14
  aidd/tools/image_tools.py,sha256=wT3EcJAfZWcM0IsXdDfbTNjgFhKZM9nu2wHN6Mk_TTQ,5970
15
+ aidd/tools/other_tools.py,sha256=PUel7C--9KXO_uixrcTl0zm1lt22x7lBFogfINhM2eg,10723
14
16
  aidd/tools/path_tools.py,sha256=RGoOhqP69eHJzM8tEgn_5-GRaR0gp25fd0XZIJ_RnQE,4045
15
- aidd/tools/screenshot_tool.py,sha256=peifNcpyDPtodubs7XyzheoUyK2h_e3qXsdM57bEB5U,45906
17
+ aidd/tools/screenshot_tool.py,sha256=NMO5B4UG8qfMEOMRd2YoOjtwz_oQ2y1UAGU22jV1yGU,46337
16
18
  aidd/tools/state.py,sha256=RWSw0Jfsui8FqC0xsI7Ik07tAg35hRwLHa5xGBVbiI4,1493
17
19
  aidd/tools/system_tools.py,sha256=H4_qveKC2HA7SIbi-j4vxA0W4jYh2wfu9A6ni5wkZyA,7249
18
- skydeckai_code-0.1.23.dist-info/METADATA,sha256=DpYWSa8FMSBNJDNpI6YTYOgbuM-Xe9Obw2WSkKjzfzE,17406
19
- skydeckai_code-0.1.23.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
20
- skydeckai_code-0.1.23.dist-info/entry_points.txt,sha256=cT-IHh3_ioGLk3kwIeqj1X6Li1dnJinX9qKWUl7nOLg,80
21
- skydeckai_code-0.1.23.dist-info/licenses/LICENSE,sha256=uHse04vmI6ZjW7TblegFl30X-sDyyF0-QvH8ItPca3c,10865
22
- skydeckai_code-0.1.23.dist-info/RECORD,,
20
+ aidd/tools/web_tools.py,sha256=VlxjWrd6Vtzxv8wbwC8zoocWK7CUM-K_x0JTdH1TpKk,6925
21
+ skydeckai_code-0.1.24.dist-info/METADATA,sha256=s87VUINzGUZNOf1YbJmnpPvSnx_EBdxLpWyiX2DOhBU,28662
22
+ skydeckai_code-0.1.24.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
23
+ skydeckai_code-0.1.24.dist-info/entry_points.txt,sha256=cT-IHh3_ioGLk3kwIeqj1X6Li1dnJinX9qKWUl7nOLg,80
24
+ skydeckai_code-0.1.24.dist-info/licenses/LICENSE,sha256=uHse04vmI6ZjW7TblegFl30X-sDyyF0-QvH8ItPca3c,10865
25
+ skydeckai_code-0.1.24.dist-info/RECORD,,