skydeckai-code 0.1.35__py3-none-any.whl → 0.1.36__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.
- {skydeckai_code-0.1.35.dist-info → skydeckai_code-0.1.36.dist-info}/METADATA +18 -13
- {skydeckai_code-0.1.35.dist-info → skydeckai_code-0.1.36.dist-info}/RECORD +7 -7
- src/aidd/tools/__init__.py +0 -4
- src/aidd/tools/file_tools.py +54 -66
- {skydeckai_code-0.1.35.dist-info → skydeckai_code-0.1.36.dist-info}/WHEEL +0 -0
- {skydeckai_code-0.1.35.dist-info → skydeckai_code-0.1.36.dist-info}/entry_points.txt +0 -0
- {skydeckai_code-0.1.35.dist-info → skydeckai_code-0.1.36.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: skydeckai-code
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.36
|
4
4
|
Summary: This MCP server provides a comprehensive set of tools for AI-driven Development workflows including file operations, code analysis, multi-language execution, web content fetching with HTML-to-markdown conversion, multi-engine web search, 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
|
@@ -90,27 +90,32 @@ If you're using SkyDeck AI Helper app, you can search for "SkyDeckAI Code" and i
|
|
90
90
|
|
91
91
|
### Basic File Operations
|
92
92
|
|
93
|
-
| Tool
|
94
|
-
|
|
95
|
-
| read_file
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
| get_file_info | path: string | File metadata (size, timestamps, permissions) |
|
93
|
+
| Tool | Parameters | Returns |
|
94
|
+
| ------------- | ---------------------------------------------------------- | --------------------------------------------- |
|
95
|
+
| read_file | files: [{path: string, offset?: integer, limit?: integer}] | File content (single or multiple files) |
|
96
|
+
| write_file | path: string, content: string | Success confirmation |
|
97
|
+
| move_file | source: string, destination: string | Success confirmation |
|
98
|
+
| copy_file | source: string, destination: string, recursive?: boolean | Success confirmation |
|
99
|
+
| delete_file | path: string | Success confirmation |
|
100
|
+
| get_file_info | path: string | File metadata (size, timestamps, permissions) |
|
102
101
|
|
103
102
|
Common usage:
|
104
103
|
|
105
104
|
```bash
|
106
105
|
# Read entire file
|
107
|
-
skydeckai-code-cli --tool read_file --args '{"path": "src/main.py"}'
|
106
|
+
skydeckai-code-cli --tool read_file --args '{"files": [{"path": "src/main.py"}]}'
|
108
107
|
|
109
108
|
# Read 10 lines starting from line 20
|
110
|
-
skydeckai-code-cli --tool read_file --args '{"path": "src/main.py", "offset": 20, "limit": 10}'
|
109
|
+
skydeckai-code-cli --tool read_file --args '{"files": [{"path": "src/main.py", "offset": 20, "limit": 10}]}'
|
111
110
|
|
112
111
|
# Read from line 50 to the end of the file
|
113
|
-
skydeckai-code-cli --tool read_file --args '{"path": "src/main.py", "offset": 50}'
|
112
|
+
skydeckai-code-cli --tool read_file --args '{"files": [{"path": "src/main.py", "offset": 50}]}'
|
113
|
+
|
114
|
+
# Read multiple files with different line ranges
|
115
|
+
skydeckai-code-cli --tool read_file --args '{"files": [
|
116
|
+
{"path": "src/main.py", "offset": 1, "limit": 10},
|
117
|
+
{"path": "README.md"}
|
118
|
+
]}'
|
114
119
|
|
115
120
|
# Write file
|
116
121
|
skydeckai-code-cli --tool write_file --args '{"path": "output.txt", "content": "Hello World"}'
|
@@ -2,13 +2,13 @@ src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
src/aidd/__init__.py,sha256=c9HBWxWruCxoAqLCJqltylAwz_7xmaK3g8DKViJZs0Q,222
|
3
3
|
src/aidd/cli.py,sha256=cLtaQJmMBfr7fHkd0dyJqpDrVTIwybL48PotniWGrFM,5031
|
4
4
|
src/aidd/server.py,sha256=kPRyWeWkMCZjabelC65XTmzZG7yw8htMJKSfnUcKnb0,1575
|
5
|
-
src/aidd/tools/__init__.py,sha256=
|
5
|
+
src/aidd/tools/__init__.py,sha256=j1uL7WVH3xS8JTGnpSIhaz7qkc3gcxuDyvZIYP9UztI,3731
|
6
6
|
src/aidd/tools/base.py,sha256=wHSAaGGYWM8ECmoYd7KEcmjsZRWesNQFf3zMjCKGMcc,380
|
7
7
|
src/aidd/tools/code_analysis.py,sha256=fDpm2o_If5PsngXzHN2-ezSkPVT0ZxivLuzmHrOAmVU,33188
|
8
8
|
src/aidd/tools/code_execution.py,sha256=HRLUR1-q1PiCXKZV5QmTknDJKsfvPvFSWZbTpYFcv7I,13703
|
9
9
|
src/aidd/tools/code_tools.py,sha256=DQ6N34Wbz5DwUPzt6RG7jk9HF2SsWFCFn99mencHK1c,14263
|
10
10
|
src/aidd/tools/directory_tools.py,sha256=Hxzge_ziYw_FsjYb5yF0R0dHEdvuWRsg7WsdYDG0AUg,12971
|
11
|
-
src/aidd/tools/file_tools.py,sha256=
|
11
|
+
src/aidd/tools/file_tools.py,sha256=GYzP6WxGbV1V42FlWNSuGIyiCtRp09kwF6lOZrFtq_U,43112
|
12
12
|
src/aidd/tools/get_active_apps_tool.py,sha256=BjLF7iXSDgyAmm_gfFgAul2Gn3iX-CNVYHM7Sh4jTAI,19427
|
13
13
|
src/aidd/tools/get_available_windows_tool.py,sha256=OVIYhItTn9u_DftOr3vPCT-R0DOFvMEEJXA6tD6gqWQ,15952
|
14
14
|
src/aidd/tools/image_tools.py,sha256=wT3EcJAfZWcM0IsXdDfbTNjgFhKZM9nu2wHN6Mk_TTQ,5970
|
@@ -18,8 +18,8 @@ src/aidd/tools/screenshot_tool.py,sha256=NMO5B4UG8qfMEOMRd2YoOjtwz_oQ2y1UAGU22jV
|
|
18
18
|
src/aidd/tools/state.py,sha256=RWSw0Jfsui8FqC0xsI7Ik07tAg35hRwLHa5xGBVbiI4,1493
|
19
19
|
src/aidd/tools/system_tools.py,sha256=H4_qveKC2HA7SIbi-j4vxA0W4jYh2wfu9A6ni5wkZyA,7249
|
20
20
|
src/aidd/tools/web_tools.py,sha256=gdsj2DEVYb_oYChItK5I1ugt2w25U7IAa5kEw9q6MVg,35534
|
21
|
-
skydeckai_code-0.1.
|
22
|
-
skydeckai_code-0.1.
|
23
|
-
skydeckai_code-0.1.
|
24
|
-
skydeckai_code-0.1.
|
25
|
-
skydeckai_code-0.1.
|
21
|
+
skydeckai_code-0.1.36.dist-info/METADATA,sha256=V76YaV--GsD3nv6GFQa9ch7oEgez1cOXOdFzUPXoyH4,29110
|
22
|
+
skydeckai_code-0.1.36.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
23
|
+
skydeckai_code-0.1.36.dist-info/entry_points.txt,sha256=ZkU1spOhLEnz5MpUn4dDihVcE0DMUC6ejzbsF-eNth4,88
|
24
|
+
skydeckai_code-0.1.36.dist-info/licenses/LICENSE,sha256=uHse04vmI6ZjW7TblegFl30X-sDyyF0-QvH8ItPca3c,10865
|
25
|
+
skydeckai_code-0.1.36.dist-info/RECORD,,
|
src/aidd/tools/__init__.py
CHANGED
@@ -25,12 +25,10 @@ from .file_tools import (
|
|
25
25
|
handle_get_file_info,
|
26
26
|
handle_move_file,
|
27
27
|
handle_read_file,
|
28
|
-
handle_read_multiple_files,
|
29
28
|
handle_search_files,
|
30
29
|
handle_write_file,
|
31
30
|
move_file_tool,
|
32
31
|
read_file_tool,
|
33
|
-
read_multiple_files_tool,
|
34
32
|
search_files_tool,
|
35
33
|
write_file_tool,
|
36
34
|
)
|
@@ -60,7 +58,6 @@ TOOL_DEFINITIONS = [
|
|
60
58
|
edit_file_tool(),
|
61
59
|
list_directory_tool(),
|
62
60
|
read_file_tool(),
|
63
|
-
read_multiple_files_tool(),
|
64
61
|
move_file_tool(),
|
65
62
|
copy_file_tool(),
|
66
63
|
search_files_tool(),
|
@@ -96,7 +93,6 @@ TOOL_HANDLERS = {
|
|
96
93
|
"read_file": handle_read_file,
|
97
94
|
"write_file": handle_write_file,
|
98
95
|
"edit_file": handle_edit_file,
|
99
|
-
"read_multiple_files": handle_read_multiple_files,
|
100
96
|
"move_file": handle_move_file,
|
101
97
|
"copy_file": handle_copy_file,
|
102
98
|
"search_files": handle_search_files,
|
src/aidd/tools/file_tools.py
CHANGED
@@ -17,32 +17,43 @@ from .state import state
|
|
17
17
|
def read_file_tool():
|
18
18
|
return {
|
19
19
|
"name": "read_file",
|
20
|
-
"description": "Read the contents of
|
21
|
-
"WHEN TO USE: When you need to examine the actual content of
|
20
|
+
"description": "Read the contents of one or more files from the file system. "
|
21
|
+
"WHEN TO USE: When you need to examine the actual content of one or more files, view source code, check configuration files, or analyze text data. "
|
22
22
|
"This is the primary tool for accessing file contents directly. "
|
23
23
|
"WHEN NOT TO USE: When you only need file metadata like size or modification date (use get_file_info instead), when you need to list directory contents "
|
24
|
-
"(use directory_listing instead)
|
25
|
-
"RETURNS: The complete text content of the specified file or the requested portion if offset/limit are specified. Binary files or files with unknown encodings will return an error message. "
|
26
|
-
"
|
27
|
-
"
|
28
|
-
"
|
24
|
+
"(use directory_listing instead). "
|
25
|
+
"RETURNS: The complete text content of the specified file(s) or the requested portion if offset/limit are specified. Binary files or files with unknown encodings will return an error message. "
|
26
|
+
"Each file's content is preceded by a header showing the file path (==> path/to/file <==). "
|
27
|
+
"Handles various text encodings and provides detailed error messages if a file cannot be read. Only works within the allowed directory. "
|
28
|
+
"Example: Use 'files: [{\"path\": \"src/main.py\"}]' to read a Python file, or add offset/limit to read specific line ranges. "
|
29
|
+
"For multiple files, use 'files: [{\"path\": \"file1.txt\"}, {\"path\": \"file2.txt\"}]' with optional offset/limit for each file.",
|
29
30
|
"inputSchema": {
|
30
31
|
"type": "object",
|
31
32
|
"properties": {
|
32
|
-
"
|
33
|
-
"type": "
|
34
|
-
"
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
33
|
+
"files": {
|
34
|
+
"type": "array",
|
35
|
+
"items": {
|
36
|
+
"type": "object",
|
37
|
+
"properties": {
|
38
|
+
"path": {
|
39
|
+
"type": "string",
|
40
|
+
"description": "Path to the file to read. This must be a path to a file, not a directory. Examples: 'README.md', 'src/main.py', 'config.json'. Both absolute and relative paths are supported, but must be within the allowed workspace."
|
41
|
+
},
|
42
|
+
"offset": {
|
43
|
+
"type": "integer",
|
44
|
+
"description": "Line number to start reading from (1-indexed). If specified, the file will be read starting from this line. Default is to start from the beginning of the file."
|
45
|
+
},
|
46
|
+
"limit": {
|
47
|
+
"type": "integer",
|
48
|
+
"description": "Maximum number of lines to read after the offset. If specified along with offset, only this many lines will be read. Default is to read to the end of the file."
|
49
|
+
}
|
50
|
+
},
|
51
|
+
"required": ["path"]
|
52
|
+
},
|
53
|
+
"description": "List of files to read with optional offset and limit for each file."
|
43
54
|
}
|
44
55
|
},
|
45
|
-
"required": ["
|
56
|
+
"required": ["files"]
|
46
57
|
},
|
47
58
|
}
|
48
59
|
|
@@ -215,31 +226,6 @@ def delete_file_tool():
|
|
215
226
|
},
|
216
227
|
}
|
217
228
|
|
218
|
-
def read_multiple_files_tool():
|
219
|
-
return {
|
220
|
-
"name": "read_multiple_files",
|
221
|
-
"description": "Read the contents of multiple files simultaneously. "
|
222
|
-
"WHEN TO USE: When you need to examine or compare multiple files at once, analyze related files together, or gather content from several files efficiently. "
|
223
|
-
"Useful for understanding code across multiple files, comparing configuration files, or collecting information from related documents. "
|
224
|
-
"WHEN NOT TO USE: When you only need to read a single file (use read_file instead), when you need to read binary files or images (use read_image_file instead), "
|
225
|
-
"or when you need metadata about files rather than their contents (use get_file_info instead). "
|
226
|
-
"RETURNS: The contents of all specified files, with each file's content preceded by a header showing its path (==> path/to/file <==). "
|
227
|
-
"If an individual file cannot be read, an error message is included in its place, but the operation continues for other files. "
|
228
|
-
"Failed reads for individual files won't stop the entire operation. Only works within the allowed directory. "
|
229
|
-
"Example: Enter ['src/main.py', 'README.md'] to read both files.",
|
230
|
-
"inputSchema": {
|
231
|
-
"type": "object",
|
232
|
-
"properties": {
|
233
|
-
"paths": {
|
234
|
-
"type": "array",
|
235
|
-
"items": {"type": "string"},
|
236
|
-
"description": "List of file paths to read. Must contain at least one path. Each path should point to a text file. Examples: ['README.md', 'package.json'], ['src/main.py', 'src/utils.py', 'config.ini']. Both absolute and relative paths are supported, but must be within the allowed workspace.",
|
237
|
-
}
|
238
|
-
},
|
239
|
-
"required": ["paths"]
|
240
|
-
},
|
241
|
-
}
|
242
|
-
|
243
229
|
def edit_file_tool():
|
244
230
|
return {
|
245
231
|
"name": "edit_file",
|
@@ -396,41 +382,43 @@ async def handle_write_file(arguments: dict):
|
|
396
382
|
raise ValueError(f"Error writing file: {str(e)}")
|
397
383
|
|
398
384
|
async def handle_read_file(arguments: dict):
|
399
|
-
|
400
|
-
if not
|
401
|
-
raise ValueError("
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
if not paths:
|
416
|
-
raise ValueError("paths list cannot be empty")
|
417
|
-
|
385
|
+
files = arguments.get("files")
|
386
|
+
if not files:
|
387
|
+
raise ValueError("files must be provided")
|
388
|
+
if not isinstance(files, list):
|
389
|
+
raise ValueError("files must be an array")
|
390
|
+
if not files:
|
391
|
+
raise ValueError("files array cannot be empty")
|
392
|
+
|
393
|
+
# Validate each file entry
|
394
|
+
for file_entry in files:
|
395
|
+
if not isinstance(file_entry, dict):
|
396
|
+
raise ValueError("each file entry must be an object")
|
397
|
+
if "path" not in file_entry:
|
398
|
+
raise ValueError("each file entry must have a path property")
|
399
|
+
|
400
|
+
# Read each file with its own offset/limit
|
418
401
|
results = []
|
419
|
-
for
|
402
|
+
for file_entry in files:
|
403
|
+
path = file_entry.get("path")
|
404
|
+
offset = file_entry.get("offset")
|
405
|
+
limit = file_entry.get("limit")
|
406
|
+
|
420
407
|
try:
|
421
408
|
# Add file path header first
|
422
409
|
results.append(TextContent(
|
423
410
|
type="text",
|
424
411
|
text=f"\n==> {path} <==\n"
|
425
412
|
))
|
426
|
-
# Then add file contents
|
427
|
-
file_contents = await _read_single_file(path)
|
413
|
+
# Then add file contents with specific offset/limit
|
414
|
+
file_contents = await _read_single_file(path, offset, limit)
|
428
415
|
results.extend(file_contents)
|
429
416
|
except Exception as e:
|
430
417
|
results.append(TextContent(
|
431
418
|
type="text",
|
432
419
|
text=f"Error: {str(e)}\n"
|
433
420
|
))
|
421
|
+
|
434
422
|
return results
|
435
423
|
|
436
424
|
async def handle_move_file(arguments: dict):
|
File without changes
|
File without changes
|
File without changes
|