CLI tool for syncing GitHub repositories from ITCPR Cloud
Project description
ITCPR CLI
A production-ready CLI tool for syncing GitHub repositories from ITCPR Cloud to your local machine.
Features
- 🔐 Device-based authentication with cloud.itcpr.org
- 📦 Automatic repository synchronization
- 🔄 Manual or continuous sync modes
- 💾 Local SQLite database for metadata tracking
- 🔒 Secure token storage using OS keyring
- 🛡️ Safe git operations with conflict detection
Installation
From PyPI (Recommended)
pip install itcpr
# OR
pip3 install itcpr
# OR
python3 -m pip install itcpr
From Source
If you want to install from source or contribute:
git clone <repository-url>
cd cloud-cli
pip install -e .
# OR
pip3 install -e .
# OR
python3 -m pip install -e .
Uninstall
To remove the CLI tool:
pip uninstall itcpr
Note: This will remove the CLI tool but will not delete:
- Configuration files (
~/.itcpr/config.toml) - Local repository database (
~/.itcpr/repos.db) - Stored device tokens (in OS keyring)
To completely remove all data:
# Uninstall the package
pip uninstall itcpr
# OR
pip3 uninstall itcpr
# OR
python3 -m pip uninstall itcpr
# Remove configuration and data
rm -rf ~/.itcpr
# Remove stored tokens (OS keyring)
# On macOS: Use Keychain Access app to remove "itcpr" entries
# On Linux: Use your keyring manager (e.g., seahorse, kwallet)
# On Windows: Use Credential Manager
Requirements
- Python 3.10+
- Git (system installation)
- Access to cloud.itcpr.org
Quick Start
1. Login
Authenticate your device with ITCPR Cloud:
itcpr login
This will:
- Open your browser to the device login page
- Display a device code
- Wait for approval
- Store credentials securely
2. Check Status
View your assigned repositories:
itcpr status
3. List Repositories
See all repositories assigned to your device:
itcpr repos
4. Clone a Repository
Clone a repository to your local machine:
itcpr clone paperport-itcpr
Or specify a custom path:
itcpr clone paperport-itcpr --path ~/projects/paperport
5. Sync Repositories
Sync all cloned repositories:
itcpr sync
Run continuous sync (watches for changes):
itcpr sync --watch
With custom interval:
itcpr sync --watch --interval 120 # Sync every 2 minutes
6. Logout
Clear stored credentials:
itcpr logout
Commands
itcpr login
Starts device authentication flow. Opens browser to cloud.itcpr.org/device and polls for approval.
itcpr logout
Revokes device token and clears local metadata.
itcpr status
Shows:
- Logged-in user information
- Device ID
- Assigned repositories
- Local repositories with sync status
itcpr repos
Lists all repositories assigned to this device with their clone status.
itcpr clone <repo>
Clones a repository from GitHub using short-lived installation tokens.
Options:
--path, -p: Custom local path for the repository
itcpr sync
One-shot synchronization of all cloned repositories.
Options:
--watch, -w: Run continuous sync loop--interval, -i: Sync interval in seconds (watch mode only, default: 60)
Sync Rules (itcpr.yml):
You can configure per-repository sync behavior by creating an itcpr.yml file in the repository root:
sync:
enabled: true # Enable/disable sync for this repo (default: true)
auto_commit: true # Auto-commit local changes (default: true)
auto_push: true # Auto-push local commits (default: true)
branch: main # Optional: specific branch to sync
ignore: # Optional: patterns to ignore
- "*.log"
- "temp/"
Note: To use itcpr.yml, install PyYAML: pip install itcpr[yaml] or pip install PyYAML
How It Works
Authentication
- Device requests authentication code from backend
- User approves device in browser at
cloud.itcpr.org/device - Device token is stored securely in OS keyring
- Token is used for all API requests
Repository Sync
- Fetches latest changes from remote
- Detects uncommitted local changes
- Commits local changes if any
- Pulls remote changes with rebase
- Pushes local commits if permitted
- Aborts on merge conflicts (requires manual resolution)
Security
- No Personal Access Tokens: Only uses backend-issued short-lived GitHub installation tokens
- Device Tokens: Revocable device authentication
- OS Keyring: Credentials stored securely using system keyring
- Safe Git Operations: Never force-pushes, detects conflicts
Configuration
Global Configuration
Configuration is stored in ~/.itcpr/config.toml.
Repository metadata is stored in ~/.itcpr/repos.db (SQLite).
Per-Repository Configuration (itcpr.yml)
Each repository can have its own itcpr.yml file in the repository root to control sync behavior:
sync:
enabled: true # Enable/disable sync for this repo
auto_commit: true # Automatically commit local changes
auto_push: true # Automatically push local commits
branch: main # Optional: sync specific branch
ignore: [] # Optional: file patterns to ignore
Example: Disable auto-push for a repository
sync:
auto_push: false
Example: Disable sync entirely for a repository
sync:
enabled: false
Installation: To use itcpr.yml files, install the optional YAML dependency:
pip install itcpr[yaml]
# OR
pip install PyYAML
Troubleshooting
"Not logged in" error
Run itcpr login to authenticate your device.
"Repository not assigned" error
The repository must be assigned to your device in ITCPR Cloud. Contact an administrator.
Merge conflicts
If a merge conflict is detected during sync:
- Resolve conflicts manually in the repository
- Commit the resolution
- Run
itcpr syncagain
Git command not found
Ensure Git is installed and available in your PATH:
git --version
Token storage issues
On Linux, you may need to install a keyring backend:
# For GNOME
sudo apt-get install python3-keyring
# For KDE
sudo apt-get install python3-keyring kdewallet
Development
Project Structure
cloud-cli/
├── itcpr/
│ ├── __init__.py # Package initialization
│ ├── cli.py # CLI commands
│ ├── auth.py # Authentication
│ ├── api.py # API client
│ ├── gitops.py # Git operations
│ ├── sync.py # Sync logic
│ ├── config.py # Configuration
│ ├── storage.py # SQLite storage
│ └── utils.py # Utilities
├── setup.py # Setup script
├── pyproject.toml # Project metadata
└── README.md # This file
Running Tests
# Install in development mode
pip install -e .
# OR
pip3 install -e .
# OR
python3 -m pip install -e .
# Run CLI
itcpr --help
API Endpoints
The CLI communicates with these backend endpoints:
POST /api/device/start- Start device authenticationGET /api/device/poll- Poll for authentication approvalPOST /api/device/revoke- Revoke device tokenGET /api/agent/me- Get device/user informationGET /api/agent/repos- Get assigned repositoriesPOST /api/agent/token- Get GitHub installation token
License
MIT License
Support
For issues and questions, contact ITCPR support or open an issue on GitHub.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file itcpr-2.0.7.tar.gz.
File metadata
- Download URL: itcpr-2.0.7.tar.gz
- Upload date:
- Size: 18.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
90e16cf279f551e5fce25184c6e939887b78a3d92e902ca6998ac26fcb52f35d
|
|
| MD5 |
4abd9658b3f233e92e91ea45584f2317
|
|
| BLAKE2b-256 |
d81c02be47e960e02a6cfbeffd361bb4bb27888ebe73729f448f2483435b5244
|
File details
Details for the file itcpr-2.0.7-py3-none-any.whl.
File metadata
- Download URL: itcpr-2.0.7-py3-none-any.whl
- Upload date:
- Size: 17.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
486189d5e50b8b31c5e78a629305908e5865c1ee7e4c99fcebe5398442c56b14
|
|
| MD5 |
5f20c4cb733c3d79aea9a4dd18f4303d
|
|
| BLAKE2b-256 |
d527c18339fc2406e1c650961d9e1e296c2365c0e2d2bf59a40e7ff0716a0684
|