cloudx-proxy 0.6.0__tar.gz → 0.7.0__tar.gz
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.
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/.github/workflows/release.yml +29 -2
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/CHANGELOG.md +14 -0
- cloudx_proxy-0.7.0/CLAUDE.md +122 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/CONTRIBUTING.md +3 -1
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/PKG-INFO +2 -1
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/README.md +1 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy/_version.py +2 -2
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy.egg-info/PKG-INFO +2 -1
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy.egg-info/SOURCES.txt +1 -1
- cloudx_proxy-0.6.0/package.json +0 -20
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/.clinerules +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/.github/dependabot.yml +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/.gitignore +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/.releaserc +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/LICENSE +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy/_1password.py +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy/__init__.py +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy/cli.py +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy/core.py +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy/setup.py +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy.egg-info/dependency_links.txt +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy.egg-info/entry_points.txt +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy.egg-info/requires.txt +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/cloudx_proxy.egg-info/top_level.txt +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/pyproject.toml +0 -0
- {cloudx_proxy-0.6.0 → cloudx_proxy-0.7.0}/setup.cfg +0 -0
@@ -5,6 +5,33 @@ on:
|
|
5
5
|
- main
|
6
6
|
|
7
7
|
jobs:
|
8
|
+
security-audit:
|
9
|
+
name: Security Audit
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
steps:
|
12
|
+
- name: Checkout
|
13
|
+
uses: actions/checkout@v5
|
14
|
+
|
15
|
+
- name: Setup Python
|
16
|
+
uses: actions/setup-python@v5
|
17
|
+
with:
|
18
|
+
python-version: '3.x'
|
19
|
+
|
20
|
+
- name: Install pip-audit
|
21
|
+
run: |
|
22
|
+
python -m pip install --upgrade pip
|
23
|
+
pip install pip-audit
|
24
|
+
|
25
|
+
- name: Run pip-audit
|
26
|
+
run: pip-audit --format=json --output=pip-audit-report.json .
|
27
|
+
|
28
|
+
- name: Upload pip-audit results
|
29
|
+
uses: actions/upload-artifact@v4
|
30
|
+
if: always()
|
31
|
+
with:
|
32
|
+
name: pip-audit-report
|
33
|
+
path: pip-audit-report.json
|
34
|
+
|
8
35
|
release:
|
9
36
|
name: Release
|
10
37
|
runs-on: ubuntu-latest
|
@@ -38,7 +65,7 @@ jobs:
|
|
38
65
|
env:
|
39
66
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
40
67
|
run: |
|
41
|
-
version=$(npx semantic-release --dry-run
|
68
|
+
version=$(npx semantic-release --dry-run | grep -oP 'The next release version is \K[0-9]+\.[0-9]+\.[0-9]+' || echo "")
|
42
69
|
if [ -n "$version" ]; then
|
43
70
|
echo "new_release_version=$version" >> $GITHUB_OUTPUT
|
44
71
|
echo "Version to be released: $version"
|
@@ -51,7 +78,7 @@ jobs:
|
|
51
78
|
if: steps.semantic.outputs.new_release_version != ''
|
52
79
|
env:
|
53
80
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
54
|
-
run: npx semantic-release
|
81
|
+
run: npx semantic-release
|
55
82
|
|
56
83
|
- name: Build package
|
57
84
|
if: steps.semantic.outputs.new_release_version != ''
|
@@ -1,3 +1,17 @@
|
|
1
|
+
# [0.7.0](https://github.com/easytocloud/cloudX-proxy/compare/v0.6.1...v0.7.0) (2025-09-02)
|
2
|
+
|
3
|
+
|
4
|
+
### Features
|
5
|
+
|
6
|
+
* add pip-audit security scanning to CI/CD pipeline ([3ded9bb](https://github.com/easytocloud/cloudX-proxy/commit/3ded9bbeaeee0e25cb3ca981ca0204faf4735ca7))
|
7
|
+
|
8
|
+
## [0.6.1](https://github.com/easytocloud/cloudX-proxy/compare/v0.6.0...v0.6.1) (2025-08-22)
|
9
|
+
|
10
|
+
|
11
|
+
### Bug Fixes
|
12
|
+
|
13
|
+
* clean up versioning configuration and remove unnecessary package.json ([62af606](https://github.com/easytocloud/cloudX-proxy/commit/62af606f57367948845fc16863e196207b92645d))
|
14
|
+
|
1
15
|
# [0.6.0](https://github.com/easytocloud/cloudX-proxy/compare/v0.5.3...v0.6.0) (2025-08-22)
|
2
16
|
|
3
17
|
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# CLAUDE.md
|
2
|
+
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
4
|
+
|
5
|
+
## Project Overview
|
6
|
+
|
7
|
+
cloudX-proxy is a Python CLI tool that enables SSH connections from VSCode to EC2 instances using AWS Systems Manager Session Manager. It eliminates the need for direct SSH access or public IP addresses by creating secure tunnels through AWS SSM.
|
8
|
+
|
9
|
+
### Core Architecture
|
10
|
+
|
11
|
+
The application consists of three main modules:
|
12
|
+
|
13
|
+
- **`cli.py`**: Click-based command-line interface with three main commands:
|
14
|
+
- `setup`: Configure AWS profiles, SSH keys, and SSH configuration
|
15
|
+
- `connect`: Establish connection to EC2 instance via SSM (used internally by SSH)
|
16
|
+
- `list`: Display configured SSH hosts
|
17
|
+
|
18
|
+
- **`core.py`**: `CloudXProxy` class that handles the connection workflow:
|
19
|
+
1. Check instance status via SSM
|
20
|
+
2. Start instance if needed and wait for online status
|
21
|
+
3. Push SSH public key via EC2 Instance Connect
|
22
|
+
4. Start SSM session with SSH port forwarding
|
23
|
+
|
24
|
+
- **`setup.py`**: `CloudXSetup` class that implements a comprehensive setup wizard with three-tier SSH configuration
|
25
|
+
|
26
|
+
### SSH Configuration Architecture
|
27
|
+
|
28
|
+
The setup creates a hierarchical three-tier SSH configuration:
|
29
|
+
|
30
|
+
1. **Generic (cloudx-*)**: Common settings for all environments (user, keepalive, multiplexing)
|
31
|
+
2. **Environment (cloudx-{env}-*)**: Environment-specific settings (authentication, ProxyCommand)
|
32
|
+
3. **Host (cloudx-{env}-hostname)**: Instance-specific settings (HostName = instance ID)
|
33
|
+
|
34
|
+
This approach minimizes duplication and creates clear inheritance patterns.
|
35
|
+
|
36
|
+
### Security Model
|
37
|
+
|
38
|
+
Primary security is enforced through AWS IAM/SSM rather than SSH:
|
39
|
+
- AWS Systems Manager controls access via IAM permissions
|
40
|
+
- EC2 Instance Connect temporarily injects SSH public keys per session
|
41
|
+
- No inbound SSH ports needed - all traffic flows through SSM tunneling
|
42
|
+
- CloudTrail logs all connection attempts and key pushes
|
43
|
+
|
44
|
+
## Development Commands
|
45
|
+
|
46
|
+
### Building and Installing
|
47
|
+
|
48
|
+
```bash
|
49
|
+
# Install in development mode
|
50
|
+
pip install -e .
|
51
|
+
|
52
|
+
# Build package
|
53
|
+
python -m build
|
54
|
+
|
55
|
+
# Install from built package
|
56
|
+
pip install dist/cloudx_proxy-*.whl
|
57
|
+
```
|
58
|
+
|
59
|
+
### Running the Application
|
60
|
+
|
61
|
+
The application is designed to be run via `uvx` (from the `uv` package manager):
|
62
|
+
|
63
|
+
```bash
|
64
|
+
# Setup (interactive)
|
65
|
+
uvx cloudx-proxy setup
|
66
|
+
|
67
|
+
# Setup (non-interactive with parameters)
|
68
|
+
uvx cloudx-proxy setup --profile myprofile --ssh-key mykey --instance i-123456789 --hostname myserver --yes
|
69
|
+
|
70
|
+
# Connect (typically called by SSH ProxyCommand, not directly)
|
71
|
+
uvx cloudx-proxy connect i-123456789 22 --profile myprofile
|
72
|
+
|
73
|
+
# List configured hosts
|
74
|
+
uvx cloudx-proxy list
|
75
|
+
```
|
76
|
+
|
77
|
+
### Release Process
|
78
|
+
|
79
|
+
The project uses semantic-release with GitHub Actions:
|
80
|
+
|
81
|
+
- **Automatic versioning**: Based on conventional commit messages
|
82
|
+
- **Release triggers**: Pushes to `main` branch
|
83
|
+
- **Artifacts**: GitHub releases, PyPI packages, CHANGELOG.md updates
|
84
|
+
|
85
|
+
Commit message format affects version bumps:
|
86
|
+
- `feat:` → minor version
|
87
|
+
- `fix:`, `docs:`, `style:`, etc. → patch version
|
88
|
+
|
89
|
+
### 1Password Integration
|
90
|
+
|
91
|
+
When `--1password` is used:
|
92
|
+
- Checks for existing SSH keys in any 1Password vault
|
93
|
+
- Creates new keys in user-selected vault if needed
|
94
|
+
- Configures SSH to use 1Password SSH agent (`IdentityAgent ~/.1password/agent.sock`)
|
95
|
+
- Uses public key file to limit SSH agent key search (`IdentitiesOnly yes`)
|
96
|
+
|
97
|
+
### AWS Environment Support
|
98
|
+
|
99
|
+
The `--aws-env` parameter enables AWS profile organization:
|
100
|
+
- Looks for credentials in `~/.aws/aws-envs/{env}/` instead of `~/.aws/`
|
101
|
+
- Sets `AWS_CONFIG_FILE` and `AWS_SHARED_CREDENTIALS_FILE` environment variables
|
102
|
+
- Supports multiple isolated AWS environments
|
103
|
+
|
104
|
+
## Key Configuration Files
|
105
|
+
|
106
|
+
- **`pyproject.toml`**: Python packaging configuration with semantic versioning via setuptools_scm
|
107
|
+
- **`.releaserc`**: Semantic-release configuration with conventional commits and changelog generation
|
108
|
+
- **`.github/workflows/release.yml`**: CI/CD pipeline for automated releases to PyPI
|
109
|
+
- **`.clinerules`**: Detailed project documentation including architecture and operating modes
|
110
|
+
|
111
|
+
## Code Quality Notes
|
112
|
+
|
113
|
+
- Uses modern Python features (pathlib, type hints, f-strings)
|
114
|
+
- Supports Python 3.9+ (recently updated from 3.8+)
|
115
|
+
- No test suite currently exists
|
116
|
+
- Uses Click for CLI with proper help text and option validation
|
117
|
+
- Implements comprehensive error handling with user-friendly messages
|
118
|
+
- Cross-platform support (Windows, macOS, Linux) with platform-specific adjustments
|
119
|
+
|
120
|
+
## Known Issues
|
121
|
+
|
122
|
+
- No automated testing framework configured
|
@@ -18,9 +18,11 @@ The package is automatically published to PyPI via GitHub Actions when a new rel
|
|
18
18
|
|
19
19
|
## Versioning
|
20
20
|
|
21
|
-
The project uses semantic-release for versioning
|
21
|
+
The project uses semantic-release for versioning.
|
22
|
+
Version numbers are automatically determined based on commit messages following the conventional commits specification.
|
22
23
|
|
23
24
|
The GitHub Actions workflow will:
|
25
|
+
|
24
26
|
1. Determine next version based on commits
|
25
27
|
2. Update CHANGELOG.md
|
26
28
|
3. Create GitHub release
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: cloudx-proxy
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.7.0
|
4
4
|
Summary: SSH proxy command to connect VSCode with Cloud9/CloudX instance using AWS Systems Manager
|
5
5
|
Author-email: easytocloud <info@easytocloud.com>
|
6
6
|
License: MIT License
|
@@ -56,6 +56,7 @@ Dynamic: license-file
|
|
56
56
|
[](https://pypi.org/project/cloudx-proxy/)
|
57
57
|
[](https://github.com/easytocloud/cloudX-proxy/blob/main/LICENSE)
|
58
58
|
[](https://github.com/easytocloud/cloudX-proxy/actions/workflows/release.yml)
|
59
|
+
[](https://github.com/easytocloud/cloudX-proxy/actions/workflows/release.yml)
|
59
60
|
[](https://github.com/easytocloud/cloudX-proxy/network/updates)
|
60
61
|
[](https://pypi.org/project/cloudx-proxy/)
|
61
62
|
|
@@ -4,6 +4,7 @@
|
|
4
4
|
[](https://pypi.org/project/cloudx-proxy/)
|
5
5
|
[](https://github.com/easytocloud/cloudX-proxy/blob/main/LICENSE)
|
6
6
|
[](https://github.com/easytocloud/cloudX-proxy/actions/workflows/release.yml)
|
7
|
+
[](https://github.com/easytocloud/cloudX-proxy/actions/workflows/release.yml)
|
7
8
|
[](https://github.com/easytocloud/cloudX-proxy/network/updates)
|
8
9
|
[](https://pypi.org/project/cloudx-proxy/)
|
9
10
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
28
28
|
commit_id: COMMIT_ID
|
29
29
|
__commit_id__: COMMIT_ID
|
30
30
|
|
31
|
-
__version__ = version = '0.
|
32
|
-
__version_tuple__ = version_tuple = (0,
|
31
|
+
__version__ = version = '0.7.0'
|
32
|
+
__version_tuple__ = version_tuple = (0, 7, 0)
|
33
33
|
|
34
34
|
__commit_id__ = commit_id = None
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: cloudx-proxy
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.7.0
|
4
4
|
Summary: SSH proxy command to connect VSCode with Cloud9/CloudX instance using AWS Systems Manager
|
5
5
|
Author-email: easytocloud <info@easytocloud.com>
|
6
6
|
License: MIT License
|
@@ -56,6 +56,7 @@ Dynamic: license-file
|
|
56
56
|
[](https://pypi.org/project/cloudx-proxy/)
|
57
57
|
[](https://github.com/easytocloud/cloudX-proxy/blob/main/LICENSE)
|
58
58
|
[](https://github.com/easytocloud/cloudX-proxy/actions/workflows/release.yml)
|
59
|
+
[](https://github.com/easytocloud/cloudX-proxy/actions/workflows/release.yml)
|
59
60
|
[](https://github.com/easytocloud/cloudX-proxy/network/updates)
|
60
61
|
[](https://pypi.org/project/cloudx-proxy/)
|
61
62
|
|
cloudx_proxy-0.6.0/package.json
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"name": "cloudx-client",
|
3
|
-
"version": "1.0.0",
|
4
|
-
"description": "Client to connect VSCode with Cloud9/CloudX instance over ssh using Session Manager plugin",
|
5
|
-
"main": "index.js",
|
6
|
-
"scripts": {
|
7
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
8
|
-
},
|
9
|
-
"repository": {
|
10
|
-
"type": "git",
|
11
|
-
"url": "git+https://github.com/easytocloud/cloudX-client.git"
|
12
|
-
},
|
13
|
-
"keywords": [],
|
14
|
-
"author": "",
|
15
|
-
"license": "ISC",
|
16
|
-
"bugs": {
|
17
|
-
"url": "https://github.com/easytocloud/cloudX-client/issues"
|
18
|
-
},
|
19
|
-
"homepage": "https://github.com/easytocloud/cloudX-client#readme"
|
20
|
-
}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|