Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,10 @@ jobs:

- name: Verify binaries
run: |
ls -lh target/debug/meta target/debug/meta-git
ls -lh target/debug/meta target/debug/meta-git target/debug/meta-rust
./target/debug/meta --version
./target/debug/meta-git --meta-plugin-info | jq .name
./target/debug/meta-rust --meta-plugin-info | jq .name
shell: bash

- name: Install bats
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ jobs:
cargo build --release --target ${{ matrix.target }} -p meta
cargo build --release --target ${{ matrix.target }} -p meta_git_cli
cargo build --release --target ${{ matrix.target }} -p meta_project_cli
cargo build --release --target ${{ matrix.target }} -p meta_rust_cli
cargo build --release --target ${{ matrix.target }} -p meta-mcp
cargo build --release --target ${{ matrix.target }} -p loop_cli

Expand All @@ -92,6 +93,7 @@ jobs:
cp target/${{ matrix.target }}/release/${{ matrix.binary_name }} dist/
cp target/${{ matrix.target }}/release/meta-git dist/
cp target/${{ matrix.target }}/release/meta-project dist/
cp target/${{ matrix.target }}/release/meta-rust dist/
cp target/${{ matrix.target }}/release/meta-mcp dist/
cp target/${{ matrix.target }}/release/loop dist/
cd dist
Expand All @@ -106,6 +108,7 @@ jobs:
copy target\${{ matrix.target }}\release\${{ matrix.binary_name }} dist\
copy target\${{ matrix.target }}\release\meta-git.exe dist\
copy target\${{ matrix.target }}\release\meta-project.exe dist\
copy target\${{ matrix.target }}\release\meta-rust.exe dist\
copy target\${{ matrix.target }}\release\meta-mcp.exe dist\
copy target\${{ matrix.target }}\release\loop.exe dist\
cd dist
Expand Down Expand Up @@ -283,6 +286,10 @@ jobs:
run: cargo publish -p meta --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
continue-on-error: true

- name: Publish meta_rust_cli
run: cargo publish -p meta_rust_cli --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
continue-on-error: true

# Tier 3: Depends on meta
- name: Publish meta_git_lib
run: cargo publish -p meta_git_lib --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
Expand Down Expand Up @@ -374,6 +381,7 @@ jobs:
bin.install "meta"
bin.install "meta-git"
bin.install "meta-project"
bin.install "meta-rust"
bin.install "meta-mcp"
bin.install "loop"
end
Expand Down
28 changes: 18 additions & 10 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

36 changes: 33 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ Most multi-repo tools solve the *cloning* problem. Meta solves the *working* pro

This clones the meta repo and all child repositories defined in its `.meta` file.

2. **Run commands across all repos:**
2. **Run workspace commands:**

```bash
meta git status
meta git pull
meta exec npm install
meta exec cargo test
meta cargo test
```

3. **Filter by tags:**
Expand Down Expand Up @@ -274,6 +274,36 @@ This enables impact analysis ("what breaks if I change shared-utils?"), topologi
| `meta git snapshot list` | List snapshots |
| `meta git snapshot restore <name>` | Restore workspace to snapshot |

### Rust/Cargo Plugin

`meta cargo` is an explicit plugin namespace. The Rust plugin selects directories that contain a
`Cargo.toml` and runs the requested command in each one; Cargo remains responsible for validating
built-in commands, aliases, and installed `cargo-*` extensions. `meta rust` is an alias that
produces the same canonical `cargo` command.

```bash
meta cargo clean
meta cargo check --all-targets
meta cargo clippy --all-targets -- -D warnings
meta cargo nextest run
meta rust test
```

Put Meta options before the `cargo` or `rust` namespace:

```bash
meta --include api --dry-run cargo check
meta --dry-run --sequential cargo clean --recursive
```

In this first pass, `--recursive` before Cargo's `--` remains a Meta scope control, including
postfix usage such as `meta cargo clean --recursive`.

The Rust plugin treats `-h` and `--help` before Cargo's `--` separator as side-effect-free
namespace help. For command-specific Cargo help, run
`cargo help <command>` directly (for example, `cargo help check`). Meta never inspects or removes
arguments after Cargo's `--` separator.

### Plugin Management

| Command | Description |
Expand Down Expand Up @@ -349,7 +379,7 @@ Plugins are standalone executables that extend meta. They're discovered automati
|--------|-------------|
| `git` | Clone, status, update, commit, snapshots, SSH multiplexing |
| `project` | Project health checks and sync |
| `rust` | Cargo build, test, and command passthrough |
| `rust` | Cargo commands across Rust projects; `meta rust` aliases `meta cargo` |

### Writing Plugins

Expand Down
1 change: 1 addition & 0 deletions distribution/homebrew/meta-cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def install
bin.install "meta"
bin.install "meta-git"
bin.install "meta-project"
bin.install "meta-rust"
bin.install "meta-mcp"
bin.install "loop"
end
Expand Down
6 changes: 3 additions & 3 deletions docs/advanced_usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,8 @@ meta exec --exclude legacy-app -- npm install
# Tag filter + directory filter
meta --tag backend git status --include api

# For non-plugin commands, use exec
meta exec --tag backend --include api -- cargo test
# Cargo commands use the Rust plugin namespace directly
meta --tag backend --include api cargo test
```

**Filter precedence:**
Expand Down Expand Up @@ -338,7 +338,7 @@ By default, commands run sequentially with live output. Use `--parallel` for con

```bash
meta git status --parallel
meta exec --parallel -- cargo test
meta --parallel cargo test
```

### Parallel Mode Behavior
Expand Down
9 changes: 5 additions & 4 deletions docs/architecture_overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,9 +151,10 @@ Project management plugin:
### meta_rust_cli

Rust/Cargo plugin:
- Workspace-aware builds
- Test execution
- Cargo command passthrough
- Owns the explicit `cargo` and `rust` namespaces
- Selects Meta project directories that contain `Cargo.toml`
- Canonicalizes both namespaces to shell-safe `cargo` execution plans
- Leaves command validation, aliases, and installed `cargo-*` extensions to Cargo

## Plugin System

Expand Down Expand Up @@ -211,7 +212,7 @@ When you run `meta <command>`:
4. **Otherwise** - Show "unrecognized command" error

**Important:** Bare commands like `meta npm install` are not supported. You must either:
- Use a plugin command: `meta git status`, `meta rust build`
- Use a plugin command: `meta git status`, `meta cargo check` (`meta rust check` is an alias)
- Use explicit exec: `meta exec -- npm install`

Special case commands (like `meta git clone`) are fully handled by the plugin rather than passed through to all repos.
Expand Down
2 changes: 1 addition & 1 deletion install.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ function Install-Meta {

# Install binaries
Write-Info "Installing to $InstallDir..."
$expectedBinaries = @("meta.exe", "meta-git.exe", "meta-project.exe", "meta-mcp.exe", "loop.exe")
$expectedBinaries = @("meta.exe", "meta-git.exe", "meta-project.exe", "meta-rust.exe", "meta-mcp.exe", "loop.exe")
foreach ($binary in $expectedBinaries) {
$binaryPath = Join-Path $tempDir $binary
if (Test-Path $binaryPath) {
Expand Down
2 changes: 1 addition & 1 deletion install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ install_meta() {

# Install binaries
info "Installing to ${INSTALL_DIR}..."
local expected_binaries=("meta" "meta-git" "meta-project" "meta-mcp" "loop")
local expected_binaries=("meta" "meta-git" "meta-project" "meta-rust" "meta-mcp" "loop")
for binary_name in "${expected_binaries[@]}"; do
local binary="$tmp_dir/$binary_name"
if [ -f "$binary" ]; then
Expand Down
Loading
Loading