---
name: syncmeta
description: Sync changes from hotpath and hotpath-macros crates to their meta counterparts (hotpath-meta and hotpath-macros-meta). Use when meta crates need to be updated with recent changes.
allowed-tools: Bash, Read, Edit, Write, Glob, Grep
---

# Sync Meta Crates

Sync recent changes from `hotpath` → `hotpath-meta` and `hotpath-macros` → `hotpath-macros-meta`.

The meta crates are copies of the main crates used to profile the profiler itself. They must stay in sync with the source crates.

## Effective Approach

**DO NOT copy entire files from hotpath to hotpath-meta and then sed-replace.** This approach fails because the meta crates have many naming differences beyond simple `hotpath::` → `hotpath_meta::` substitution:

- Feature flags: `hotpath` → `hotpath-meta`, `hotpath-alloc` → `hotpath-alloc-meta`, `hotpath-off` → `hotpath-off-meta`
- Crate imports: `hotpath_macros` → `hotpath_macros_meta`
- Environment variables: `HOTPATH_FOCUS` → `HOTPATH_META_FOCUS`, `HOTPATH_EXCLUDE_WRAPPER` → `HOTPATH_META_EXCLUDE_WRAPPER`, `HOTPATH_OUTPUT_PATH` → `HOTPATH_META_OUTPUT_PATH`
- Self-instrumentation: lines like `#[cfg_attr(feature = "hotpath-meta", hotpath_meta::measure_all)]` exist in hotpath but must NOT exist in hotpath-meta

**Instead, apply diffs to the existing meta files:**

1. Get the actual diff for each changed file: `git diff HEAD~N..HEAD -- crates/hotpath/src/path/to/file.rs`
2. Read the corresponding meta file
3. Apply the equivalent semantic changes, preserving all meta-specific naming

## Steps

1. **Check the last N commits** (default 1, user can specify more) for changes to `crates/hotpath/` and `crates/hotpath-macros/`:

```
git log --oneline -N
git diff HEAD~N..HEAD --name-only -- crates/hotpath/src/ crates/hotpath-macros/src/
```

2. **For each changed file**, get the hotpath diff:

```
git diff HEAD~N..HEAD -- crates/hotpath/src/path/to/file.rs
```

3. **Read the corresponding meta file** and apply the equivalent changes using Edit tool. The meta files are at:
   - `crates/hotpath/src/**` → `crates/hotpath-meta/src/**`
   - `crates/hotpath-macros/src/**` → `crates/hotpath-macros-meta/src/**`

4. **Verify** the meta crates compile:

```
cargo check -p hotpath-meta --features hotpath-meta
cargo check -p hotpath-macros-meta --features hotpath-meta
cargo check -p hotpath-meta --features hotpath-alloc-meta
cargo check -p hotpath-meta --features hotpath-off-meta
```

5. Report a summary of what was synced.

## Rules

- Only sync `src/` files, never `Cargo.toml` or other config files.
- If no changes were made to the source crates in the specified commits, report that and exit.
- NEVER copy entire files and do bulk find-and-replace. Always apply diffs to existing meta files.
- Preserve ALL meta-specific naming conventions (feature flags, env vars, crate names, self-instrumentation removal).
- Lines with `#[cfg_attr(feature = "hotpath-meta", hotpath_meta::...)]` in hotpath are self-instrumentation and must NOT be copied to meta crates.
- The meta feature flags are `hotpath-meta`, `hotpath-alloc-meta`, `hotpath-off-meta` (NOT `hotpath`, `hotpath-alloc`, `hotpath-off`).
