OrcAI.Tool
0.3.0
See the version list below for details.
dotnet tool install --global OrcAI.Tool --version 0.3.0
dotnet new tool-manifest
dotnet tool install --local OrcAI.Tool --version 0.3.0
#tool dotnet:?package=OrcAI.Tool&version=0.3.0
nuke :add-package OrcAI.Tool --version 0.3.0
OrcAI CLI
A CLI tool for automating bulk GitHub repository upgrades. It reads a YAML job configuration file and manages GitHub Projects, issues, and Copilot assignments across multiple repositories.
Prerequisites
ghCLI: Install from cli.github.com — must be installed and onPATH- Authentication: One of the following must be configured before running any command other than
orcai auth:- Stored PAT —
ORCAI_PATenv var, or~/.config/orcai/auth.jsonwith"type": "pat" - Stored GitHub App —
ORCAI_APP_ID/ORCAI_APP_INSTALLATION_ID/ORCAI_APP_KEY_PATH/ORCAI_APP_PRIVATE_KEYenv vars, or~/.config/orcai/auth.jsonwith"type": "app" GH_TOKENenvironment variable- Ambient
ghCLI auth (gh auth token)
- Stored PAT —
Usage
YAML Config Format
All data commands require a YAML file:
job:
title: "My Project Title"
org: "my-github-org"
# skipCopilot: true # optional — disable @copilot assignment
repos:
- "repo-one"
- "repo-two"
issue:
template: "./issue-body.md"
labels: ["migration", "automated"]
generate
Scaffold a new YAML job config and a stub Markdown issue template.
orcai generate --name <name> --org <org> [--repo <repo>...] [--output <path>] [--skip-copilot] [--interactive]
| Flag | Required | Description |
|---|---|---|
--name |
Conditional | Job name (used as project and issue title). Required unless --interactive. |
--org |
Conditional | GitHub organisation slug. Required unless --interactive. |
--repo |
No | Repo short-name to include. Repeatable (--repo a --repo b). |
--output |
No | Output YAML file path. Defaults to <slug>.yml in the current directory. |
--skip-copilot |
No | Emit skipCopilot: true in the generated config. |
--interactive |
No | Prompt for missing values and show a TUI repo multi-select fetched live from GitHub. |
Outputs a <slug>.yml config file and a <slug>.md stub issue template.
auth
Store credentials for use by all other commands. Three subcommands are available: pat, app, and create-app.
PAT:
orcai auth pat --token <token>
| Flag | Required | Description |
|---|---|---|
--token |
Yes | GitHub Personal Access Token (ghp_...). Requires repo and project scopes. |
GitHub App:
orcai auth app --app-id <id> --key <path> --installation-id <id>
| Flag | Required | Description |
|---|---|---|
--app-id |
Yes | GitHub App ID (shown on the App settings page) |
--key |
Yes | Path to the PEM private key file |
--installation-id |
Yes | Installation ID for the target organisation |
Create GitHub App (browser-based):
orcai auth create-app [--app-name <name>] [--org <org>] [--port <port>]
| Flag | Required | Description |
|---|---|---|
--app-name |
No | Name for the new GitHub App (default: orcai) |
--org |
No | Register the app under an organisation instead of your personal account |
--port |
No | Local callback port for the OAuth redirect (default: 9876) |
This command automates app registration but app installation requires a manual step:
- Automatic — opens your browser, submits the app manifest to GitHub, exchanges the OAuth code for credentials, saves the private key to
~/.config/orcai/app.pemand writesauth.json. A second browser tab opens to the app's permissions page so you can grant the org-level Projects: Read and write permission (not settable via manifest). - Manual — you must install the app on your org or account by clicking through the GitHub UI. The CLI prints step-by-step instructions showing exactly where to find the installation ID in the GitHub UI.
- Automatic (interactive) — if running in a terminal, you are shown the install instructions and then prompted to enter the installation ID immediately, which completes the
auth.jsonconfiguration. In non-interactive (CI) mode, the same instructions plus the manual command to run are printed instead:
orcai auth app --app-id <id> --key <path> --installation-id <id>
Credentials are stored in ~/.config/orcai/auth.json and validated immediately. Environment variables (ORCAI_PAT, ORCAI_APP_ID, etc.) override stored values at runtime without modifying the file.
See docs/app-auth.md for setting up GitHub App authentication and docs/AUTH-ENV-VARS.md for environment variable reference.
run
Execute a bulk upgrade job. For each repository in the YAML, orcai will:
- Find or create the GitHub Project for the org (idempotent)
- Find or create an issue using the issue template (idempotent)
- Add the issue to the GitHub Project (idempotent)
- Assign
@copilotto the issue if no assignees are set
orcai run <yaml_file> [--verbose] [--auto-create-labels] [--skip-copilot]
| Argument / Flag | Required | Description |
|---|---|---|
<yaml_file> |
Yes | Path to the YAML job configuration file |
--verbose |
No | Emit detailed per-repo progress messages |
--auto-create-labels |
No | Create any labels that don't exist in a repo before applying them |
--skip-copilot |
No | Skip assigning @copilot to issues |
On success a lock file (<basename>.lock.json) is written alongside the YAML. On subsequent runs, if the YAML is unchanged the lock file is used to short-circuit all network calls.
info
Display a formatted snapshot of the current state of a job.
orcai info <yaml_file> [--skip-lock] [--save-lock]
| Argument / Flag | Required | Description |
|---|---|---|
<yaml_file> |
Yes | Path to the YAML job configuration file |
--skip-lock |
No | Bypass the lock file and fetch live state from GitHub |
--save-lock |
No | After fetching live state from GitHub, persist a new lock file |
By default, reads from the lock file if it exists (no network calls). Use --skip-lock --save-lock to force a fresh fetch and update the lock file.
cleanup
Tear down everything that run created for the same YAML configuration.
orcai cleanup <yaml_file> [--dryrun]
| Argument / Flag | Required | Description |
|---|---|---|
<yaml_file> |
Yes | Path to the YAML job configuration file |
--dryrun |
No | Preview all deletions without making any changes |
Closes open PRs linked to each issue, deletes each issue, deletes the GitHub Project, and removes the lock file.
For full flag details, output formats, lock file schema, and advanced usage see docs/cli-reference.md.
OrcAI Nushell Scripts
This repository contains Nushell scripts for managing GitHub projects and issues in bulk.
Prerequisites
- Nushell: Install Nushell from nushell.sh
- GitHub CLI: Install the GitHub CLI from cli.github.com
Authentication
Local Environment
Run gh auth login to authenticate with GitHub CLI.
CI Environment
Set the GH_TOKEN environment variable with a GitHub Personal Access Token that has the necessary permissions (project and issue management).
Scripts
orca.nu
Creates a GitHub project and adds issues to it across multiple repositories.
Usage:
./orca.nu [--verbose] <yaml_file>
Options:
--verbose: Enable verbose outputyaml_file: Path to YAML configuration file
YAML Configuration Structure:
job:
title: "Project Title"
org: "organization-name"
repos:
- "repo1"
- "repo2"
issue:
template: "path/to/issue-template.md"
labels:
- "label1"
- "label2"
cleanup.nu
Deletes a GitHub project and cleans up associated issues and PRs.
Usage:
./cleanup.nu [--dryrun] <yaml_file>
Options:
--dryrun: Preview what would be deleted without actually deletingyaml_file: Path to YAML configuration file
YAML Configuration Structure:
job:
title: "Project Title"
org: "organization-name"
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.8.1 | 125 | 6/16/2026 |
| 0.8.0 | 115 | 6/9/2026 |
| 0.7.5-beta6 | 93 | 6/9/2026 |
| 0.7.4-beta5 | 97 | 5/21/2026 |
| 0.7.3-beta4 | 109 | 5/19/2026 |
| 0.7.2-beta3 | 100 | 5/18/2026 |
| 0.7.1-beta2 | 113 | 5/18/2026 |
| 0.7.0-beta1 | 97 | 5/13/2026 |
| 0.6.0 | 116 | 5/7/2026 |
| 0.5.1 | 257 | 3/17/2026 |
| 0.5.0 | 131 | 3/16/2026 |
| 0.4.4 | 131 | 3/16/2026 |
| 0.4.3 | 124 | 3/16/2026 |
| 0.4.2 | 130 | 3/16/2026 |
| 0.4.1 | 123 | 3/15/2026 |
| 0.4.0 | 120 | 3/13/2026 |
| 0.3.0 | 124 | 3/11/2026 |
[BREAKING] Renamed package from `Orca.Tool` to `OrcAI.Tool` and CLI command from `orca` to `orcai`; [BREAKING] Renamed config directory from `~/.config/orca/` to `~/.config/orcai/`; [BREAKING] Renamed environment variables: `ORCA_PAT` → `ORCAI_PAT`, `ORCA_APP_ID` → `ORCAI_APP_ID`, `ORCA_APP_INSTALLATION_ID` → `ORCAI_APP_INSTALLATION_ID`, `ORCA_APP_KEY_PATH` → `ORCAI_APP_KEY_PATH`, `ORCA_APP_PRIVATE_KEY` → `ORCAI_APP_PRIVATE_KEY`