Search by

A multi-host bulk git repository manager built with Laravel Zero. Clone, pull, and list open issues across hundreds of repos on GitHub, GitLab, and Bitbucket from your terminal.

Package info

github.com/jeffersongoncalves/repos-cli

Type:project

pkg:composer/jeffersongoncalves/repos-cli

Statistics

Installs: 20

Dependents: 0

Suggesters: 0

Stars: 1

Open Issues: 0

1.2.6 2026-09-08 21:55 UTC

This package is auto-updated.

Last update: 2026-09-12 01:49:32 UTC


README

repos-cli

repos-cli

Buy Me A Coffee

A multi-host bulk git repository manager. Clone, pull, and list open issues across hundreds of repos on GitHub, GitLab, and Bitbucket from one terminal — no more cd-ing into 600 folders one at a time.

Built with Laravel Zero and modeled on the other CLIs in this monorepo.

Tests Total Downloads License PHP 8.2+

Install

Global (recommended)

composer global require jeffersongoncalves/repos-cli

The binary repos will be on your PATH as long as Composer's global vendor/bin is in it.

From source

git clone https://github.com/jeffersongoncalves/repos-cli.git
cd repos-cli
composer install

Usage

Update

repos self-update

Authenticate

Clones use your local SSH key, same as any git clone. The saved token is only used for API calls (listing repos, listing issues) — one login per host you use.

GitHub

Device flow (recommended — nothing to create or manage):

repos auth:github:login --device

Opens a verification URL and a short code; approve it in the browser. The saved token refreshes itself automatically once it expires.

Personal access token instead:

  1. Create a classic token with the repo scope (covers repos, issues, and search)
  2. repos auth:github:login and paste it

GitLab

Device flow (recommended):

repos auth:gitlab:login --device

Personal access token instead:

  1. GitLab → Settings → Access Tokens → create one with the read_api scope
  2. repos auth:gitlab:login and paste it

Bitbucket

No device flow — Bitbucket doesn't support it. API token only:

  1. Bitbucket → Personal settings → Security → API tokensCreate API token with scopes
  2. Name it (e.g. repos-cli), select Bitbucket as the app, and grant these permissions — Write does not imply Read, each is separate:
Scope Permission Scope ID
User Read read:user:bitbucket
Repositories Read read:repository:bitbucket
Issues Read read:issue:bitbucket

User Read is required even though the CLI never reads user data directly — it's what the login check (GET /2.0/user) needs to verify the token.

  1. repos auth:bitbucket:login — prompts for your Atlassian account email (not your Bitbucket username) and the token
repos auth:show

# Confirm every saved credential still works (pings each host's API,
# never prints the token/app password)
repos auth:show --verify

Credentials are stored in ~/.repos-cli/config.json (mode 0600).

Multiple credentials per host

Every auth:*:login command takes --profile=<name> (default: default), so you can keep more than one credential for the same host — e.g. a personal GitHub device-flow login alongside a work PAT for an org with OAuth App restrictions:

repos auth:github:login --device                       # profile "default"
repos auth:github:login --profile=work                  # a second, separate token

repos clone acme --host=github --profile=work --path=~/code/acme
repos issues acme --host=github --profile=work

repos auth:show lists every profile per host. Commands that hit a host's API (clone for bulk owner/org clones, issues) accept --profile=; it defaults to default when omitted.

Clone

# Single repo (URL, or owner/repo with --host)
repos clone git@github.com:acme/widgets.git
repos clone acme/widgets --host=github

# Bulk-clone every repo of an owner/org. Already-cloned repos are pulled
# instead of re-cloned, so re-running this is how you "update everything".
repos clone acme --host=github --path=~/code/acme

Submodules are cloned recursively (git clone --recurse-submodules).

Pull

# git pull --all --recurse-submodules on every repo found one level under a folder
repos pull ~/code/acme

Issues

# Single repo
repos issues acme/widgets --host=github

# Every repo of an owner/org
# (GitHub: one search API call. GitLab/Bitbucket: looped per repo.)
repos issues acme --host=github

Supported hosts

Host Auth Notes
GitHub Personal access token, or --device flow Bulk clone/issues via orgs/{org}/repos or users/{user}/repos; issues search via search/issues.
GitLab Personal access token, or --device flow Bulk clone/issues via groups/{ns}/projects or users/{ns}/projects.
Bitbucket Account email + API token Same auth shape as bb-cli. Issues skipped for repos with no issue tracker enabled. No device flow — Bitbucket doesn't support it.

Development

composer install
composer test       # Pest tests + Pint lint
composer lint        # Auto-fix style
composer phpstan      # Static analysis
composer build        # Build the PHAR into builds/repos

License

MIT © Jefferson Goncalves