@reflectai/mirror-vs-cli
v0.6.10
Published
Mirror VS CLI - Run the Mirror VS agent from the command line
Readme
@mirror-vs/cli
Command Line Interface for Mirror VS - Run the Mirror VS agent from the terminal without VSCode.
Overview
This CLI uses the @mirror-vs/vscode-shim package to provide a VSCode API compatibility layer, allowing the main Mirror VS extension to run in a Node.js environment.
Installation
Quick Install (Recommended)
Install the Mirror VS CLI with a single command:
curl -fsSL https://raw.githubusercontent.com/ReflectAIs/mirror-vs/main/apps/cli/install.sh | shRequirements:
- Node.js 20 or higher
- macOS Apple Silicon (M1/M2/M3/M4) or Linux x64
Custom installation directory:
MIRROR_INSTALL_DIR=/opt/mirror-code MIRROR_BIN_DIR=/usr/local/bin curl -fsSL ... | shInstall a specific version:
MIRROR_VERSION=0.1.0 curl -fsSL https://raw.githubusercontent.com/ReflectAIs/mirror-vs/main/apps/cli/install.sh | shUpdating
Re-run the install script to update to the latest version:
curl -fsSL https://raw.githubusercontent.com/ReflectAIs/mirror-vs/main/apps/cli/install.sh | shOr run:
mirror upgradeUninstalling
rm -rf ~/.mirror/cli ~/.local/bin/mirrorUsage
Interactive Mode (Default)
By default, the CLI auto-approves actions and runs in interactive TUI mode:
export OPENROUTER_API_KEY=sk-or-v1-...
mirror "What is this project?" -w ~/Documents/my-projectYou can also run without a prompt and enter it interactively in TUI mode:
mirror -w ~/Documents/my-projectIn interactive mode:
- Tool executions are auto-approved
- Commands are auto-approved
- Followup questions show suggestions with a 60-second timeout, then auto-select the first suggestion
- Browser and MCP actions are auto-approved
Approval-Required Mode (--require-approval)
If you want manual approval prompts, enable approval-required mode:
mirror "Refactor the utils.ts file" --require-approval -w ~/Documents/my-projectIn approval-required mode:
- Tool, command, browser, and MCP actions prompt for yes/no approval
- Followup questions wait for manual input (no auto-timeout)
Print Mode (--print)
Use --print for non-interactive execution and machine-readable output:
# Prompt is required
mirror --print "Summarize this repository"
# Create a new task with a specific session ID (UUID)
mirror --print --create-with-session-id 018f7fc8-7c96-7f7c-98aa-2ec4ff7f6d87 "Summarize this repository"Stdin Stream Mode (--stdin-prompt-stream)
For programmatic control (one process, multiple prompts), use --stdin-prompt-stream with --print.
Send NDJSON commands via stdin:
printf '{"command":"start","requestId":"1","prompt":"1+1=?"}\n' | mirror --print --stdin-prompt-stream --output-format stream-json
# Optional: provide taskId per start command
printf '{"command":"start","requestId":"1","taskId":"018f7fc8-7c96-7f7c-98aa-2ec4ff7f6d87","prompt":"1+1=?"}\n' | mirror --print --stdin-prompt-stream --output-format stream-jsonOptions
| Option | Description | Default |
| --------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------- |
| [prompt] | Your prompt (positional argument, optional) | None |
| --prompt-file <path> | Read prompt from a file instead of command line argument | None |
| --create-with-session-id <session-id> | Create a new task using the provided session ID (UUID) | None |
| -w, --workspace <path> | Workspace path to operate in | Current directory |
| -p, --print | Print response and exit (non-interactive mode) | false |
| --stdin-prompt-stream | Read NDJSON control commands from stdin (requires --print) | false |
| -e, --extension <path> | Path to the extension bundle directory | Auto-detected |
| -d, --debug | Enable debug output (includes detailed debug information, prompts, paths, etc) | false |
| -a, --require-approval | Require manual approval before actions execute | false |
| -k, --api-key <key> | API key for the LLM provider | From env var |
| --provider <provider> | API provider (anthropic, openai, openrouter, etc.) | openrouter |
| -m, --model <model> | Model to use | anthropic/claude-opus-4.6 |
| --mode <mode> | Mode to start in (code, architect, ask, debug, etc.) | code |
| --terminal-shell <path> | Absolute shell path for inline terminal command execution | Auto-detected shell |
| -r, --reasoning-effort <effort> | Reasoning effort level (unspecified, disabled, none, minimal, low, medium, high, xhigh) | medium |
| --consecutive-mistake-limit <n> | Consecutive error/repetition limit before guidance prompt (0 disables the limit) | 10 |
| --ephemeral | Run without persisting state (uses temporary storage) | false |
| --oneshot | Exit upon task completion | false |
| --output-format <format> | Output format with --print: text, json, or stream-json | text |
Environment Variables
The CLI will look for API keys in environment variables if not provided via --api-key:
| Provider | Environment Variable |
| ----------------- | --------------------------- |
| anthropic | ANTHROPIC_API_KEY |
| openai-native | OPENAI_API_KEY |
| openrouter | OPENROUTER_API_KEY |
| gemini | GOOGLE_API_KEY |
| vercel-ai-gateway | VERCEL_AI_GATEWAY_API_KEY |
Architecture
┌─────────────────┐
│ CLI Entry │
│ (index.ts) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ ExtensionHost │
│ (extension- │
│ host.ts) │
└────────┬────────┘
│
┌────┴────┐
│ │
▼ ▼
┌───────┐ ┌──────────┐
│vscode │ │Extension │
│-shim │ │ Bundle │
└───────┘ └──────────┘How It Works
CLI Entry Point (
index.ts): Parses command line arguments and initializes the ExtensionHostExtensionHost (
extension-host.ts):- Creates a VSCode API mock using
@mirror-vs/vscode-shim - Intercepts
require('vscode')to return the mock - Loads and activates the extension bundle
- Manages bidirectional message flow
- Creates a VSCode API mock using
Message Flow:
- CLI → Extension:
emit("webviewMessage", {...}) - Extension → CLI:
emit("extensionWebviewMessage", {...})
- CLI → Extension:
Development
# Run directly from source (no build required)
pnpm dev --provider openrouter --api-key $OPENROUTER_API_KEY --print "Hello"
# Run tests
pnpm test
# Type checking
pnpm check-types
# Linting
pnpm lintReleasing
Official releases are created via the GitHub Actions workflow at .github/workflows/cli-release.yml.
To trigger a release:
- Go to Actions → CLI Release
- Click Run workflow
- Optionally specify a version (defaults to
package.jsonversion) - Click Run workflow
The workflow will:
- Build the CLI on all platforms (macOS Apple Silicon, Linux x64)
- Create platform-specific tarballs with bundled ripgrep
- Verify each tarball
- Create a GitHub release with all tarballs attached
Local Builds
For local development and testing, use the build script:
# Build tarball for your current platform
./apps/cli/scripts/build.sh
# Build and install locally
./apps/cli/scripts/build.sh --install
# Fast build (skip verification)
./apps/cli/scripts/build.sh --skip-verify