ssh-to-code 1.0.0__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.
ssh_handler.py ADDED
@@ -0,0 +1,233 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ SSH Connection Handler
4
+ Manages SSH connections and remote command execution
5
+ """
6
+
7
+ import paramiko
8
+ import getpass
9
+ import os
10
+ import sys
11
+ from typing import Optional
12
+
13
+
14
+ class SSHHandler:
15
+ """Handle SSH connections and command execution"""
16
+
17
+ def __init__(self, hostname: str, username: str, port: int = 22,
18
+ key_filename: Optional[str] = None, use_password: bool = False,
19
+ key_passphrase: Optional[str] = None):
20
+ self.hostname = hostname
21
+ self.username = username
22
+ self.port = port
23
+ self.key_filename = key_filename
24
+ self.use_password = use_password
25
+ self.key_passphrase = key_passphrase
26
+ self.client: Optional[paramiko.SSHClient] = None
27
+ self.connected = False
28
+
29
+ def _load_private_key(self, key_path: str, passphrase: Optional[str] = None):
30
+ """Load and decrypt private key file"""
31
+ key_path = os.path.expanduser(key_path)
32
+
33
+ if not os.path.exists(key_path):
34
+ raise FileNotFoundError(f"Key file not found: {key_path}")
35
+
36
+ # Try different key types (DSS removed in Paramiko 3.0+)
37
+ key_types = [
38
+ ('RSA', paramiko.RSAKey),
39
+ ('Ed25519', paramiko.Ed25519Key),
40
+ ('ECDSA', paramiko.ECDSAKey),
41
+ ]
42
+
43
+ # Add DSS support if available (Paramiko < 3.0)
44
+ if hasattr(paramiko, 'DSSKey'):
45
+ key_types.append(('DSS', paramiko.DSSKey))
46
+
47
+ for key_name, key_class in key_types:
48
+ try:
49
+ # Try loading with passphrase if provided
50
+ if passphrase:
51
+ return key_class.from_private_key_file(key_path, password=passphrase)
52
+ else:
53
+ return key_class.from_private_key_file(key_path)
54
+ except paramiko.ssh_exception.PasswordRequiredException:
55
+ # Key is encrypted, need passphrase
56
+ if passphrase is None:
57
+ # This is expected for encrypted keys without passphrase
58
+ raise
59
+ # Continue to next key type if passphrase didn't work
60
+ continue
61
+ except paramiko.ssh_exception.SSHException:
62
+ # Not this key type, try next
63
+ continue
64
+ except (AttributeError, Exception):
65
+ # Other error (including missing key class), try next key type
66
+ continue
67
+
68
+ # If we get here, couldn't load the key
69
+ raise paramiko.ssh_exception.SSHException(f"Unable to load key from {key_path}")
70
+
71
+ def _try_key_authentication(self, connect_kwargs: dict, key_path: str) -> bool:
72
+ """Try to authenticate with a key file, handling encrypted keys"""
73
+ try:
74
+ # First try without passphrase
75
+ pkey = self._load_private_key(key_path)
76
+ connect_kwargs['pkey'] = pkey
77
+ return True
78
+ except paramiko.ssh_exception.PasswordRequiredException:
79
+ # Key is encrypted, prompt for passphrase
80
+ print(f"\nšŸ” Key file is encrypted: {key_path}")
81
+
82
+ # Try up to 3 times
83
+ for attempt in range(3):
84
+ try:
85
+ passphrase = getpass.getpass(f"Enter passphrase for key (attempt {attempt + 1}/3): ")
86
+
87
+ if not passphrase:
88
+ print("Passphrase cannot be empty for encrypted keys")
89
+ continue
90
+
91
+ pkey = self._load_private_key(key_path, passphrase)
92
+ connect_kwargs['pkey'] = pkey
93
+ print("āœ“ Key decrypted successfully")
94
+ return True
95
+
96
+ except paramiko.ssh_exception.SSHException:
97
+ if attempt < 2:
98
+ print("āœ— Incorrect passphrase, try again")
99
+ else:
100
+ print("āœ— Failed to decrypt key after 3 attempts")
101
+ return False
102
+ return False
103
+ except Exception as e:
104
+ print(f"Warning: Could not load key {key_path}: {str(e)}")
105
+ return False
106
+
107
+ def connect(self) -> bool:
108
+ """Establish SSH connection with support for encrypted keys"""
109
+ try:
110
+ self.client = paramiko.SSHClient()
111
+ self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
112
+
113
+ connect_kwargs = {
114
+ 'hostname': self.hostname,
115
+ 'username': self.username,
116
+ 'port': self.port,
117
+ 'timeout': 10,
118
+ }
119
+
120
+ key_auth_success = False
121
+
122
+ # Try key-based authentication first
123
+ if self.key_filename:
124
+ key_path = os.path.expanduser(self.key_filename)
125
+ if not os.path.exists(key_path):
126
+ print(f"āœ— Key file not found: {key_path}")
127
+ print("\nOptions:")
128
+ print(" 1. Check the path to your PEM/key file")
129
+ print(" 2. Use password authentication with --password flag")
130
+ print(" 3. Use SSH agent authentication (ssh-add your key)")
131
+ else:
132
+ print(f"šŸ”‘ Using key file: {key_path}")
133
+ key_auth_success = self._try_key_authentication(connect_kwargs, key_path)
134
+
135
+ if not key_auth_success:
136
+ print("\nšŸ’” Options:")
137
+ print(" 1. Try password authentication (will prompt below)")
138
+ print(" 2. Check if you have the correct passphrase")
139
+ print(" 3. Add key to SSH agent: ssh-add", key_path)
140
+ else:
141
+ # Try default SSH keys
142
+ default_keys = [
143
+ os.path.expanduser('~/.ssh/id_rsa'),
144
+ os.path.expanduser('~/.ssh/id_ed25519'),
145
+ os.path.expanduser('~/.ssh/id_ecdsa'),
146
+ ]
147
+
148
+ existing_keys = [k for k in default_keys if os.path.exists(k)]
149
+ if existing_keys:
150
+ print(f"šŸ” Trying default SSH keys...")
151
+ for key_path in existing_keys:
152
+ print(f" Trying: {key_path}")
153
+ if self._try_key_authentication(connect_kwargs, key_path):
154
+ key_auth_success = True
155
+ break
156
+
157
+ if not key_auth_success:
158
+ # Fall back to SSH agent
159
+ connect_kwargs['look_for_keys'] = False
160
+ connect_kwargs['allow_agent'] = True
161
+
162
+ # Password authentication
163
+ if self.use_password or (not key_auth_success and not connect_kwargs.get('pkey')):
164
+ if not self.use_password:
165
+ print("\nšŸ” Key authentication not available. Trying password authentication...")
166
+
167
+ password = getpass.getpass(f"Password for {self.username}@{self.hostname}: ")
168
+ connect_kwargs['password'] = password
169
+ connect_kwargs['look_for_keys'] = False
170
+ connect_kwargs['allow_agent'] = False
171
+ # Remove pkey if we're using password
172
+ connect_kwargs.pop('pkey', None)
173
+
174
+ try:
175
+ self.client.connect(**connect_kwargs)
176
+ self.connected = True
177
+ print("āœ“ Connected successfully!")
178
+ return True
179
+
180
+ except paramiko.AuthenticationException as e:
181
+ print(f"\nāœ— Authentication failed: {str(e)}")
182
+ print("\nšŸ”§ Troubleshooting:")
183
+ print(" 1. Check your username and hostname")
184
+ print(" 2. Verify key file has correct permissions (chmod 600)")
185
+ print(" 3. Ensure your key is authorized on the server")
186
+ print(" 4. Try: ssh -v " + f"{self.username}@{self.hostname}" + " (for debug info)")
187
+ print(" 5. Add key to SSH agent: ssh-add /path/to/key")
188
+ return False
189
+
190
+ except paramiko.AuthenticationException as e:
191
+ print(f"\nāœ— Authentication failed: {str(e)}")
192
+ return False
193
+ except paramiko.SSHException as e:
194
+ print(f"\nāœ— SSH connection error: {str(e)}")
195
+ return False
196
+ except Exception as e:
197
+ print(f"\nāœ— Connection error: {str(e)}")
198
+ return False
199
+
200
+ def execute_command(self, command: str, timeout: int = 10) -> str:
201
+ """Execute a command on the remote server and return output"""
202
+ if not self.connected or not self.client:
203
+ raise RuntimeError("Not connected to SSH server")
204
+
205
+ try:
206
+ stdin, stdout, stderr = self.client.exec_command(command, timeout=timeout)
207
+ exit_code = stdout.channel.recv_exit_status()
208
+
209
+ output = stdout.read().decode('utf-8', errors='ignore')
210
+ error = stderr.read().decode('utf-8', errors='ignore')
211
+
212
+ if exit_code != 0 and error:
213
+ raise RuntimeError(f"Command failed: {error}")
214
+
215
+ return output
216
+
217
+ except Exception as e:
218
+ raise RuntimeError(f"Command execution failed: {str(e)}")
219
+
220
+ def disconnect(self):
221
+ """Close SSH connection"""
222
+ if self.client:
223
+ self.client.close()
224
+ self.connected = False
225
+
226
+ def __enter__(self):
227
+ """Context manager entry"""
228
+ self.connect()
229
+ return self
230
+
231
+ def __exit__(self, exc_type, exc_val, exc_tb):
232
+ """Context manager exit"""
233
+ self.disconnect()
@@ -0,0 +1,384 @@
1
+ Metadata-Version: 2.4
2
+ Name: ssh-to-code
3
+ Version: 1.0.0
4
+ Summary: Terminal-based SSH directory browser with VS Code integration
5
+ Author-email: Rajesh <rajesh-cs18@users.noreply.github.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/rajesh-cs18/ssh-to-code
8
+ Project-URL: Bug Tracker, https://github.com/rajesh-cs18/ssh-to-code/issues
9
+ Project-URL: Repository, https://github.com/rajesh-cs18/ssh-to-code
10
+ Project-URL: Documentation, https://github.com/rajesh-cs18/ssh-to-code#readme
11
+ Keywords: ssh,vscode,terminal,directory-browser,remote-development
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Environment :: Console :: Curses
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: System Administrators
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Operating System :: MacOS
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.7
21
+ Classifier: Programming Language :: Python :: 3.8
22
+ Classifier: Programming Language :: Python :: 3.9
23
+ Classifier: Programming Language :: Python :: 3.10
24
+ Classifier: Programming Language :: Python :: 3.11
25
+ Classifier: Programming Language :: Python :: 3.12
26
+ Classifier: Topic :: System :: Systems Administration
27
+ Classifier: Topic :: Utilities
28
+ Requires-Python: >=3.7
29
+ Description-Content-Type: text/markdown
30
+ License-File: LICENSE
31
+ Requires-Dist: paramiko>=3.0.0
32
+ Dynamic: license-file
33
+
34
+ # SSH Directory Browser
35
+
36
+ A terminal-based directory browser that lets you SSH into a remote server, navigate through directories interactively, and open selected directories directly in VS Code using the Remote-SSH extension.
37
+
38
+ ![Terminal UI](https://img.shields.io/badge/Terminal-Based-blue)
39
+ ![Python](https://img.shields.io/badge/Python-3.7+-green)
40
+ ![VS Code](https://img.shields.io/badge/VS%20Code-Remote--SSH-purple)
41
+
42
+
43
+ ## Features
44
+
45
+ - šŸš€ **Interactive Terminal UI** - Browse remote directories with an intuitive curses-based interface
46
+ - šŸ” **Secure SSH Connection** - Support for key-based and password authentication
47
+ - šŸ“‚ **Visual File Browser** - Clear indicators for directories, files, executables, and symlinks
48
+ - šŸ’» **VS Code Integration** - Open any remote directory directly in VS Code with one keystroke
49
+ - āš™ļø **Configuration Management** - Save frequently used SSH hosts for quick access
50
+ - šŸŽØ **Keyboard Navigation** - Fast and efficient navigation using arrow keys
51
+
52
+ ## Requirements
53
+
54
+ - Python 3.7 or higher
55
+ - VS Code with Remote-SSH extension
56
+ - SSH access to remote server
57
+
58
+ ## Installation
59
+
60
+ ### 1. Clone the repository
61
+
62
+ ```bash
63
+ git clone <repository-url>
64
+ cd ssh-to-code
65
+ ```
66
+
67
+ ### 2. Install Python dependencies
68
+
69
+ ```bash
70
+ pip install paramiko
71
+ ```
72
+
73
+ Or use the provided requirements file:
74
+
75
+ ```bash
76
+ pip install -r requirements.txt
77
+ ```
78
+
79
+ ### 3. Make the script executable
80
+
81
+ ```bash
82
+ chmod +x ssh_dir_browser.py
83
+ ```
84
+
85
+ ### 4. (Optional) Add to PATH
86
+
87
+ For easy access from anywhere:
88
+
89
+ ```bash
90
+ # Add to your ~/.bashrc or ~/.zshrc
91
+ export PATH="$PATH:/path/to/ssh-to-code"
92
+
93
+ # Or create a symlink
94
+ sudo ln -s /path/to/ssh-to-code/ssh_dir_browser.py /usr/local/bin/ssh-browse
95
+ ```
96
+
97
+ ## Quick Start
98
+
99
+ ### Basic Usage
100
+
101
+ Connect to a remote server and start browsing:
102
+
103
+ ```bash
104
+ # Option 1: Use the wrapper script (automatically activates venv)
105
+ ./ssh-browse user@hostname
106
+
107
+ # Option 2: Activate venv manually
108
+ source venv/bin/activate
109
+ python ssh_dir_browser.py user@hostname
110
+ ```
111
+
112
+ ### With Custom Port
113
+
114
+ ```bash
115
+ ./ssh-browse user@hostname -p 2222
116
+ ```
117
+
118
+ ### With SSH Key
119
+
120
+ ```bash
121
+ ./ssh-browse user@hostname -i ~/.ssh/my_key
122
+ ```
123
+
124
+ ### Start in Specific Directory
125
+
126
+ ```bash
127
+ ./ssh-browse user@hostname --start-path /var/www
128
+ ```
129
+
130
+ ### Password Authentication
131
+
132
+ ```bash
133
+ ./ssh-browse user@hostname --password
134
+ ```
135
+
136
+ ### AWS EC2 Example
137
+
138
+ ```bash
139
+ ./ssh-browse ubuntu@ec2-12-34-56-78.compute.amazonaws.com -i ~/Downloads/aws-key.pem
140
+ ```
141
+
142
+ ## Usage
143
+
144
+ ### Keyboard Controls
145
+
146
+ | Key | Action |
147
+ |-----|--------|
148
+ | `↑` / `↓` | Navigate up/down |
149
+ | `Enter` | Open directory |
150
+ | `o` | Open current directory in VS Code |
151
+ | `n` | Create new folder |
152
+ | `h` | Go to home directory |
153
+ | `r` | Refresh directory listing |
154
+ | `q` | Quit |
155
+
156
+ ### Navigation
157
+
158
+ 1. Use arrow keys to move through the directory listing
159
+ 2. Press `Enter` to enter a directory
160
+ 3. Select `..` to go to parent directory
161
+ 4. Press `n` to create a new folder in the current directory
162
+ 5. Press `r` to refresh the directory contents
163
+ 6. Press `o` when you want to open the current directory in VS Code
164
+
165
+ ### VS Code Integration
166
+
167
+ When you press `o`, the application will:
168
+ 1. Open VS Code
169
+ 2. Connect to the remote server via Remote-SSH
170
+ 3. Open the selected directory
171
+ 4. Exit the browser
172
+
173
+ Make sure you have:
174
+ - VS Code installed with the `code` command in your PATH
175
+ - Remote-SSH extension installed in VS Code
176
+ - SSH host properly configured (or the app will help configure it)
177
+
178
+ ### Authentication Methods
179
+
180
+ The tool supports multiple authentication methods:
181
+
182
+ 1. **Unencrypted SSH Keys**: Automatic authentication
183
+ 2. **Encrypted SSH Keys**: Will prompt for passphrase (3 attempts)
184
+ 3. **Password Authentication**: Use `--password` flag
185
+ 4. **SSH Agent**: Automatically uses keys from ssh-agent
186
+
187
+ **See [AUTH_GUIDE.md](AUTH_GUIDE.md) for detailed authentication instructions**, including:
188
+ - How to handle encrypted PEM files
189
+ - What to do when you don't have the passphrase
190
+ - Using SSH agent for convenience
191
+ - Troubleshooting authentication issues
192
+ - Cloud provider specific examples (AWS, DigitalOcean, etc.)
193
+
194
+ ## Configuration
195
+
196
+ ### Saving SSH Hosts
197
+
198
+ You can save frequently used SSH connections:
199
+
200
+ ```python
201
+ from config_manager import ConfigManager
202
+
203
+ config = ConfigManager()
204
+ config.add_host(
205
+ name="myserver",
206
+ hostname="example.com",
207
+ username="myuser",
208
+ port=22,
209
+ key_file="~/.ssh/id_rsa",
210
+ default_path="/var/www"
211
+ )
212
+ ```
213
+
214
+ ### Configuration File
215
+
216
+ The configuration is stored in `~/.ssh-dir-browser.json`:
217
+
218
+ ```json
219
+ {
220
+ "version": "1.0",
221
+ "hosts": [
222
+ {
223
+ "name": "myserver",
224
+ "hostname": "example.com",
225
+ "username": "myuser",
226
+ "port": 22,
227
+ "key_file": "~/.ssh/id_rsa",
228
+ "default_path": "/var/www"
229
+ }
230
+ ],
231
+ "preferences": {
232
+ "default_start_path": "~",
233
+ "save_last_path": true
234
+ }
235
+ }
236
+ ```
237
+
238
+ ## Project Structure
239
+
240
+ ```
241
+ ssh-to-code/
242
+ ā”œā”€ā”€ ssh_dir_browser.py # Main application with terminal UI
243
+ ā”œā”€ā”€ ssh_handler.py # SSH connection management
244
+ ā”œā”€ā”€ vscode_integration.py # VS Code Remote-SSH integration
245
+ ā”œā”€ā”€ config_manager.py # Configuration file management
246
+ ā”œā”€ā”€ requirements.txt # Python dependencies
247
+ ā”œā”€ā”€ config.json.example # Example configuration
248
+ └── README.md # This file
249
+ ```
250
+
251
+ ## Examples
252
+
253
+ ### Example 1: Browse and Open Web Server Directory
254
+
255
+ ```bash
256
+ ./ssh_dir_browser.py webdev@myserver.com --start-path /var/www/html
257
+ ```
258
+
259
+ Navigate to your project directory and press `o` to open it in VS Code.
260
+
261
+ ### Example 2: Access Development Server with Custom Key
262
+
263
+ ```bash
264
+ ./ssh_dir_browser.py dev@staging.example.com -i ~/.ssh/staging_key -p 2222
265
+ ```
266
+
267
+ ### Example 3: Quick Access to Home Directory
268
+
269
+ ```bash
270
+ ./ssh_dir_browser.py user@server.com
271
+ # Press 'h' in the browser to go to home directory
272
+ # Navigate to desired folder
273
+ # Press 'o' to open in VS Code
274
+ ```
275
+
276
+ ## Troubleshooting
277
+
278
+ ### VS Code Command Not Found
279
+
280
+ Make sure VS Code is installed and the `code` command is in your PATH:
281
+
282
+ ```bash
283
+ # For macOS
284
+ # Open VS Code, press Cmd+Shift+P, type "shell command"
285
+ # Select "Shell Command: Install 'code' command in PATH"
286
+
287
+ # For Linux
288
+ sudo ln -s /usr/share/code/bin/code /usr/local/bin/code
289
+
290
+ # Verify installation
291
+ code --version
292
+ ```
293
+
294
+ ### Remote-SSH Extension Not Installed
295
+
296
+ Install it from VS Code:
297
+ 1. Open VS Code
298
+ 2. Go to Extensions (Cmd+Shift+X)
299
+ 3. Search for "Remote - SSH"
300
+ 4. Install the extension from Microsoft
301
+
302
+ ### SSH Connection Issues
303
+
304
+ - Verify SSH key permissions: `chmod 600 ~/.ssh/id_rsa`
305
+ - Test SSH connection manually: `ssh user@hostname`
306
+ - Check if SSH agent is running: `ssh-add -l`
307
+ - Add key to agent: `ssh-add ~/.ssh/id_rsa`
308
+
309
+ ### Python Module Not Found
310
+
311
+ Install the required dependency:
312
+
313
+ ```bash
314
+ pip install paramiko
315
+ ```
316
+
317
+ ## Advanced Features
318
+
319
+ ### Adding Custom SSH Config
320
+
321
+ The tool can automatically add SSH hosts to your `~/.ssh/config`:
322
+
323
+ ```python
324
+ from vscode_integration import VSCodeRemote
325
+
326
+ VSCodeRemote.add_ssh_host_to_config(
327
+ hostname="example.com",
328
+ username="myuser",
329
+ port=22,
330
+ key_file="~/.ssh/id_rsa",
331
+ alias="myserver"
332
+ )
333
+ ```
334
+
335
+ ### Programmatic Usage
336
+
337
+ You can use the components in your own scripts:
338
+
339
+ ```python
340
+ from ssh_handler import SSHHandler
341
+ from ssh_dir_browser import DirectoryBrowser
342
+ import curses
343
+
344
+ # Connect to server
345
+ ssh = SSHHandler("example.com", "myuser", port=22)
346
+ ssh.connect()
347
+
348
+ # Browse directories
349
+ browser = DirectoryBrowser(ssh, start_path="/var/www")
350
+ curses.wrapper(browser.run)
351
+
352
+ # Cleanup
353
+ ssh.disconnect()
354
+ ```
355
+
356
+ ## Contributing
357
+
358
+ Contributions are welcome! Feel free to:
359
+ - Report bugs
360
+ - Suggest features
361
+ - Submit pull requests
362
+
363
+ ## License
364
+
365
+ This project is open source and available under the MIT License.
366
+
367
+ ## Author
368
+
369
+ Created for seamless remote development workflow with VS Code.
370
+
371
+ ## Roadmap
372
+
373
+ - [ ] Support for bookmarking favorite directories
374
+ - [ ] Search functionality within directories
375
+ - [ ] File preview support
376
+ - [ ] Support for multiple simultaneous SSH connections
377
+ - [ ] Fuzzy search for quick navigation
378
+ - [ ] Integration with other editors (Neovim, Sublime Text, etc.)
379
+
380
+ ## Acknowledgments
381
+
382
+ - Built with [Paramiko](https://www.paramiko.org/) for SSH connectivity
383
+ - Uses Python's [curses](https://docs.python.org/3/library/curses.html) for terminal UI
384
+ - Integrates with [VS Code Remote-SSH](https://code.visualstudio.com/docs/remote/ssh)
@@ -0,0 +1,12 @@
1
+ config_manager.py,sha256=08461Dnz3uIJfcCp4AzVhQuYRgXQFiB1JEFCsbhIDdg,4572
2
+ host_selector.py,sha256=9egi5YcsWRpB5kDUXLoSmErz2_NVgpqmDx2XTCOfmCk,8520
3
+ save_config.py,sha256=Df0JkSfzPFmmxbCYI8FkybWh8TWXMUhH7FQaQ6-ozEQ,9942
4
+ ssh_dir_browser.py,sha256=0m5xyP5ywQqxtVLiMHrXyGW8Kdic1y3sAvsKGfNRSmw,13120
5
+ ssh_handler.py,sha256=Ed4DeEtj0eJch0h3qhF6Az9ZRkLqiD5PPaYZfL7s1ig,9887
6
+ vscode_integration.py,sha256=jDPijCgFve9u84NQ3gzKg9LpLW8NFwj4Pk8K_POvhzA,6405
7
+ ssh_to_code-1.0.0.dist-info/licenses/LICENSE,sha256=RwgOu8jMeTWzvhl8UyFrjiOH0GMjMglb9TarProBXoQ,1091
8
+ ssh_to_code-1.0.0.dist-info/METADATA,sha256=KhAhVn0mykA-4kqWpzH1PXAdywsgngm7rLlKcfauh3g,9695
9
+ ssh_to_code-1.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
10
+ ssh_to_code-1.0.0.dist-info/entry_points.txt,sha256=C8_owh3u-p0Fw_pzBpOZ0oNXwQuDn9d0I9ldamkOy0g,52
11
+ ssh_to_code-1.0.0.dist-info/top_level.txt,sha256=VRSKb_CtNWh0urK8yDuAJpj2gxW0CNi4ZYHA78wHoNA,88
12
+ ssh_to_code-1.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ ssh-browse = ssh_dir_browser:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 SSH Directory Browser Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,6 @@
1
+ config_manager
2
+ host_selector
3
+ save_config
4
+ ssh_dir_browser
5
+ ssh_handler
6
+ vscode_integration