Skip to main content

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 ITCPR Cloud
  • 📦 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 api.itcpr.org (API) and cloud.itcpr.org (frontend)

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 the API at api.itcpr.org 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

  1. Device requests authentication code from backend
  2. User approves device in browser at cloud.itcpr.org/device
  3. Device token is stored securely in OS keyring
  4. Token is used for all API requests

Repository Sync

  1. Fetches latest changes from remote
  2. Detects uncommitted local changes
  3. Commits local changes if any
  4. Pulls remote changes with rebase
  5. Pushes local commits if permitted
  6. 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

Development / Mock Mode

When the API at api.itcpr.org is unavailable, the CLI automatically falls back to mock API responses for testing and development.

Automatic Mock Mode:

  • If the backend returns 404 or is unreachable, mock responses are used automatically
  • You'll see a warning: "⚠️ Backend unavailable, using mock mode for testing"

Manual Mock Mode: You can also enable mock mode explicitly:

# Using environment variable
export ITCPR_MOCK_MODE=true
itcpr login

# Or set in config file (~/.itcpr/config.toml)
# mock_mode = true

Mock Features:

  • Auto-approves device login after 2 seconds
  • Provides sample user and repository data
  • Generates mock GitHub tokens
  • All commands work in mock mode for testing

Troubleshooting

"Not logged in" error

Run itcpr login to authenticate your device. If the backend is unavailable, mock mode will activate automatically.

"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:

  1. Resolve conflicts manually in the repository
  2. Commit the resolution
  3. Run itcpr sync again

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 authentication
  • GET /api/device/poll - Poll for authentication approval
  • POST /api/device/revoke - Revoke device token
  • GET /api/agent/me - Get device/user information
  • GET /api/agent/repos - Get assigned repositories
  • POST /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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

itcpr-2.0.9.tar.gz (20.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

itcpr-2.0.9-py3-none-any.whl (19.8 kB view details)

Uploaded Python 3

File details

Details for the file itcpr-2.0.9.tar.gz.

File metadata

  • Download URL: itcpr-2.0.9.tar.gz
  • Upload date:
  • Size: 20.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for itcpr-2.0.9.tar.gz
Algorithm Hash digest
SHA256 fd3f000f31cd9d5f018a2bab56677b8da62effe3d49ad5bd91fbc1727562503a
MD5 f4da0f0644f29579c8460ba3b78c489e
BLAKE2b-256 d37ec9a0244221d51f0c25b0dfe230ea58ac1c2017dcf8302a4b39f59a924e33

See more details on using hashes here.

File details

Details for the file itcpr-2.0.9-py3-none-any.whl.

File metadata

  • Download URL: itcpr-2.0.9-py3-none-any.whl
  • Upload date:
  • Size: 19.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for itcpr-2.0.9-py3-none-any.whl
Algorithm Hash digest
SHA256 9b54815b0c095d4f6af2762743cbcf1000de51a870b518eb921874f8764fba21
MD5 62555e468a28e9d7d65448283d380d7d
BLAKE2b-256 7e52b7e286c18d967f789c346e3a39d822e2d0b143b19c1aec53712f3ca4e01a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page