> ## Documentation Index
> Fetch the complete documentation index at: https://beads.gascity.com/llms.txt
> Use this file to discover all available pages before exploring further.

# bd migrate

> Database migration commands

Generated from `bd help --doc migrate`.

Database migration and data transformation commands.

Without subcommand, checks and updates database metadata to current version.

Subcommands:
hooks                            Plan git hook migration to marker-managed format
issues                           Move issues between repositories
schema                           Apply pending schema migrations (idempotent)
sync                             Set up sync.branch workflow for multi-clone setups
from-server-to-proxied-server           \[EXPERIMENTAL] Switch server mode to proxied-server mode
from-proxied-server-to-server           \[EXPERIMENTAL] Switch proxied-server mode to server mode
from-shared-server-to-proxied-server    \[EXPERIMENTAL] Switch shared-server mode to proxied-server mode
from-proxied-server-to-shared-server    \[EXPERIMENTAL] Switch proxied-server mode to shared-server mode

On a remote-backed database with pending schema migrations bd refuses to
migrate in place (#4259): migrating two clones independently forks the schema
so bd dolt pull can no longer merge — the break is silent and unrecoverable.
Use --force to confirm you are the single designated migrator, after which you
should publish the migrated schema with 'bd dolt push'. The env-var equivalent
BD\_ALLOW\_REMOTE\_MIGRATE=1 remains supported for scripted/CI use.

```
bd migrate [flags]
bd migrate [command]
```

**Flags:**

```
      --dry-run          Show what would be done without making changes
      --force            Bypass the remote-migrate gate as the single designated migrator (equivalent to BD_ALLOW_REMOTE_MIGRATE=1)
      --inspect          Show migration plan and database state for AI agent analysis
      --json             Output migration statistics in JSON format
      --update-repo-id   Update repository ID (use after changing git remote)
      --yes              Auto-confirm prompts
```

## bd migrate from-proxied-server-to-server

Switch a repo from proxied-server mode to server mode (bd init --server).

Both modes root their dolt sql-server at the same .beads/dolt directory, so this
only rewrites .beads/metadata.json (dolt\_mode) and removes the proxied-server
sidecar — no Dolt data is copied or moved. Stop the running proxy first with
'bd dolt stop'.

Note: dolt\_mode lives in the committed metadata.json, so this change propagates
to clones on the next push.

```
bd migrate from-proxied-server-to-server [flags]
```

**Flags:**

```
      --dry-run   Show what would be done without making changes
```

## bd migrate from-proxied-server-to-shared-server

Switch a repo from proxied-server mode back to shared-server mode.

Only applies to a proxied-server repo rooted at the shared dolt directory
(\~/.beads/shared-server/dolt) — the reverse of from-shared-server-to-proxied-server.
This rewrites .beads/metadata.json (dolt\_mode), re-enables dolt.shared-server, and
removes the proxied-server sidecar; no Dolt data is copied or moved. Stop the
running proxy first with 'bd dolt stop'.

```
bd migrate from-proxied-server-to-shared-server [flags]
```

**Flags:**

```
      --dry-run   Show what would be done without making changes
```

## bd migrate from-server-to-proxied-server

Switch a repo from server mode (bd init --server) to proxied-server mode.

Both modes root their dolt sql-server at the same .beads/dolt directory, so this
only rewrites .beads/metadata.json (dolt\_mode) and writes the proxied-server
sidecar — no Dolt data is copied or moved. Stop the running server first with
'bd dolt stop'.

Note: dolt\_mode lives in the committed metadata.json, so this change propagates
to clones on the next push.

```
bd migrate from-server-to-proxied-server [flags]
```

**Flags:**

```
      --dry-run                 Show what would be done without making changes
      --idle-timeout duration   Proxy idle timeout; omit for the 30s default, 0 for indefinite uptime
```

## bd migrate from-shared-server-to-proxied-server

Switch a repo from shared-server mode to proxied-server mode.

The proxied server is rooted at the shared dolt directory
(\~/.beads/shared-server/dolt), so no Dolt data is copied or moved; this rewrites
.beads/metadata.json (dolt\_mode), turns off dolt.shared-server for this repo, and
writes the proxied-server sidecar. Stop the running shared server first with
'bd dolt stop' — note that stops it for every project sharing it.

```
bd migrate from-shared-server-to-proxied-server [flags]
```

**Flags:**

```
      --dry-run                 Show what would be done without making changes
      --idle-timeout duration   Proxy idle timeout; omit for the 30s default, 0 for indefinite uptime
```

## bd migrate hooks

Analyze git hook files and sidecar artifacts for migration to marker-managed format.

Modes:
\--dry-run  Preview migration operations without changing files
\--apply    Apply migration operations

Examples:
bd migrate hooks --dry-run
bd migrate hooks --apply
bd migrate hooks --apply --yes
bd migrate hooks --dry-run --json

```
bd migrate hooks [path] [flags]
```

**Flags:**

```
      --apply     Apply planned hook migration changes
      --dry-run   Show what would be done without making changes
      --json      Output in JSON format
      --yes       Skip confirmation prompt for --apply
```

## bd migrate issues

Move issues from one source repository to another with filtering and dependency preservation.

This command updates the source\_repo field for selected issues, allowing you to:

* Move contributor planning issues to upstream repository
* Reorganize issues across multi-phase repositories
* Consolidate issues from multiple repos

Examples:

# Preview migration from planning repo to current repo

bd migrate-issues --from \~/.beads-planning --to . --dry-run

# Move all open P1 bugs

bd migrate-issues --from \~/repo1 --to \~/repo2 --priority 1 --type bug --status open

# Move specific issues with their dependencies

bd migrate-issues --from . --to \~/archive --id bd-abc --id bd-xyz --include closure

# Move issues with label filter

bd migrate-issues --from . --to \~/feature-work --label frontend --label urgent

```
bd migrate issues [flags]
```

**Flags:**

```
      --dry-run            Show plan without making changes
      --from string        Source repository (required)
      --id strings         Specific issue IDs to migrate (can specify multiple)
      --ids-file string    File containing issue IDs (one per line)
      --include string     Include dependencies: none/upstream/downstream/closure (default "none")
      --label strings      Filter by labels (can specify multiple)
      --priority int       Filter by priority (0-4) (default -1)
      --status string      Filter by status (open/closed/all)
      --strict             Fail on orphaned dependencies or missing repos
      --to string          Destination repository (required)
      --type string        Filter by issue type (bug/feature/task/epic/chore/decision)
      --within-from-only   Only include dependencies from source repo (default true)
      --yes                Skip confirmation prompt
```

## bd migrate schema

Apply pending schema migrations idempotently.

Schema migrations also run automatically on store open, so this subcommand
is typically a no-op. It exists to make migration explicit and observable
in CI, release gates, and recovery scenarios.

Example:
bd migrate schema
bd migrate schema --json

```
bd migrate schema [flags]
```

**Flags:**

```
      --force   Bypass the remote-migrate gate as the single designated migrator (equivalent to BD_ALLOW_REMOTE_MIGRATE=1)
      --json    Output in JSON format
```

## bd migrate sync

Configure separate branch workflow for multi-clone setups.

This sets the sync.branch config value so that issue data is committed
to a dedicated branch, keeping your main branch clean.

Example:
bd migrate sync beads-sync

```
bd migrate sync <branch> [flags]
```

**Flags:**

```
      --dry-run   Show what would be done without making changes
      --json      Output in JSON format
```
