Skip to content
Merged
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
5 changes: 5 additions & 0 deletions .bumpy/merge-migrate-into-init.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@varlock/bumpy': minor
---

Merge migrate command into init — `bumpy init` now auto-detects `.changeset/` and handles migration. Added 🐸 emoji to success messages across all commands.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ Bumpy is built as a successor to [@changesets/changesets](https://github.com/cha
- **Custom publish commands** — changesets is hardcoded to `npm publish`. Bumpy supports per-package custom publish for VSCode extensions, Docker images, JSR, etc.
- **Flexible package management** — changesets treats all private packages the same. Bumpy lets you include/exclude any package individually.
- **CI without a separate action** — just `bunx @varlock/bumpy ci check` in any workflow, no bot or action to install.
- **`bumpy migrate`** — converts `.changeset/` config and pending changeset files to `.bumpy/`.
- **Automatic migration** — `bumpy init` detects `.changeset/`, renames it to `.bumpy/`, migrates config, keeps pending files, and offers to uninstall `@changesets/cli`.

## Development

Expand Down
20 changes: 6 additions & 14 deletions docs/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,17 @@ All commands can be run via `bunx @varlock/bumpy <command>` or, (or just `bunx b

## `bumpy init`

Create the `.bumpy/` config directory with default settings.
Initialize the `.bumpy/` config directory. If `.changeset/` is detected, it automatically migrates — renaming the directory to `.bumpy/`, converting config, keeping pending bump files, and offering to uninstall `@changesets/cli`. Also ensures `@varlock/bumpy` is installed as a dev dependency and warns about changeset references in GitHub workflows.

```bash
bumpy init
bumpy init --force # skip interactive prompts
```

| Flag | Description |
| --------- | ------------------------ |
| `--force` | Skip interactive prompts |

## `bumpy add`

Create a bump file interactively or non-interactively.
Expand Down Expand Up @@ -172,19 +177,6 @@ Interactive guide to set up `BUMPY_GH_TOKEN` for CI. Walks through creating a fi
bumpy ci setup
```

## `bumpy migrate`

Convert from changesets (`.changeset/`) to bumpy (`.bumpy/`). Migrates config and pending changeset files.

```bash
bumpy migrate
bumpy migrate --force
```

| Flag | Description |
| --------- | ------------------------- |
| `--force` | Skip cleanup confirmation |

## `bumpy ai setup`

Install an AI skill for creating bump files in supported coding tools.
Expand Down
2 changes: 1 addition & 1 deletion docs/differences-from-changesets.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ Bumpy includes the release date in every changelog heading by default.

### Migration tool

`bumpy migrate` converts `.changeset/` config and pending bump files to `.bumpy/`.
`bumpy init` detects `.changeset/` and automatically migrates — renaming the directory to `.bumpy/`, converting config, and keeping pending bump files.

- (Previously listed under Planned)

Expand Down
27 changes: 11 additions & 16 deletions llms.md
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,11 @@ The critical difference: changesets bumps dependents to **major** when a peer de

### `bumpy init`

Creates `.bumpy/` directory with default `_config.json` and a README.
Initialize `.bumpy/` directory. Automatically detects and migrates from `.changeset/` if present. Ensures `@varlock/bumpy` is installed as a dev dependency.

| Flag | Description |
| --------- | ------------------------ |
| `--force` | Skip interactive prompts |

### `bumpy add`

Expand Down Expand Up @@ -361,16 +365,6 @@ Default mode (`version-pr`): creates a branch, runs `bumpy version`, commits, an

Auto-publish mode: runs `bumpy version`, commits, pushes, then `bumpy publish` in one step.

### `bumpy migrate`

Migrate from `.changeset/` to `.bumpy/`.

| Flag | Description |
| --------- | ---------------------------------------------------------- |
| `--force` | Skip interactive prompts (don't ask to delete .changeset/) |

Migrates `.changeset/config.json` fields to `.bumpy/_config.json`, copies pending bump files, and prints key differences from changesets.

## Changelog Customization

The `changelog` config controls how CHANGELOG.md entries are formatted.
Expand Down Expand Up @@ -663,14 +657,15 @@ Or with a custom title:
### Migrating from changesets

```bash
bumpy migrate
bumpy init
```

This will:
If `.changeset/` is detected, `bumpy init` will automatically:

1. Create `.bumpy/` and migrate settings to `_config.json`
2. Copy pending bump `.md` files
3. Optionally remove `.changeset/` directory
1. Rename `.changeset/` to `.bumpy/` (keeping pending bump files)
2. Convert `config.json` to `_config.json` (migrating compatible fields)
3. Offer to uninstall `@changesets/cli` and install `@varlock/bumpy`
4. Warn about changeset references in GitHub workflows

Key behavioral differences after migration:

Expand Down
16 changes: 4 additions & 12 deletions packages/bumpy/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ async function main() {
case 'init': {
const rootDir = await findRoot();
const { initCommand } = await import('./commands/init.ts');
await initCommand(rootDir);
await initCommand(rootDir, {
force: flags.force === true,
});
break;
}

Expand Down Expand Up @@ -81,15 +83,6 @@ async function main() {
break;
}

case 'migrate': {
const rootDir = await findRoot();
const { migrateCommand } = await import('./commands/migrate.ts');
await migrateCommand(rootDir, {
force: flags.force === true,
});
break;
}

case 'check': {
const rootDir = await findRoot();
const { checkCommand } = await import('./commands/check.ts');
Expand Down Expand Up @@ -187,7 +180,7 @@ function printHelp() {
Usage: bumpy <command> [options]

Commands:
init Initialize .bumpy/ directory
init [--force] Initialize .bumpy/ (migrates from .changeset/ if found)
add Create a new bump file
generate Generate bump file from branch commits
status Show pending releases
Expand All @@ -197,7 +190,6 @@ function printHelp() {
ci check PR check — report pending releases, comment on PR
ci release Release — create version PR or auto-publish
ci setup Set up a token for triggering CI on version PRs
migrate Migrate from .changeset/ to .bumpy/
ai setup Install AI skill for creating bump files

Add options:
Expand Down
6 changes: 3 additions & 3 deletions packages/bumpy/src/commands/add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export async function addCommand(rootDir: string, opts: AddOptions): Promise<voi
const filePath = resolve(bumpyDir, `${filename}.md`);
const { writeText } = await import('../utils/fs.ts');
await writeText(filePath, '---\n---\n');
log.success(`Created empty bump file: .bumpy/${filename}.md`);
log.success(`🐸 Created empty bump file: .bumpy/${filename}.md`);
return;
}

Expand Down Expand Up @@ -198,7 +198,7 @@ export async function addCommand(rootDir: string, opts: AddOptions): Promise<voi
await writeBumpFile(rootDir, filename, releases, summary);

if (opts.packages) {
log.success(`Created bump file: .bumpy/${filename}.md`);
log.success(`🐸 Created bump file: .bumpy/${filename}.md`);
for (const r of releases) {
log.dim(` ${r.name}: ${r.type}${formatCascade(r)}`);
}
Expand All @@ -207,7 +207,7 @@ export async function addCommand(rootDir: string, opts: AddOptions): Promise<voi
releases.map((r) => `${pc.cyan(r.name)} ${pc.dim('→')} ${pc.bold(r.type)}${formatCascade(r)}`).join('\n'),
'Bump file',
);
p.outro(pc.green(`Created .bumpy/${filename}.md`));
p.outro(pc.green(`🐸 Created .bumpy/${filename}.md`));
}
}

Expand Down
2 changes: 1 addition & 1 deletion packages/bumpy/src/commands/check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export async function checkCommand(rootDir: string): Promise<void> {
const missing = changedPackages.filter((name) => !coveredPackages.has(name));

if (missing.length === 0) {
log.success(`All ${changedPackages.length} changed package(s) have bump files.`);
log.success(`🐸 All ${changedPackages.length} changed package(s) have bump files.`);
return;
}

Expand Down
4 changes: 2 additions & 2 deletions packages/bumpy/src/commands/ci.ts
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ async function createVersionPr(
input: prBody,
}),
);
log.success(`Updated PR #${validPr}`);
log.success(`🐸 Updated PR #${validPr}`);
} else {
log.step('Creating version PR...');
const prTitle = config.versionPr.title;
Expand All @@ -390,7 +390,7 @@ async function createVersionPr(
{ cwd: rootDir, input: prBody },
),
);
log.success(`Created PR: ${result}`);
log.success(`🐸 Created PR: ${result}`);
if (!patPr) {
// Push again with the custom token now that the PR exists, so that a
// `pull_request: synchronize` event is generated and CI workflows trigger.
Expand Down
2 changes: 1 addition & 1 deletion packages/bumpy/src/commands/generate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ export async function generateCommand(rootDir: string, opts: GenerateOptions): P
const summary = summaryLines.join('\n');
await writeBumpFile(rootDir, filename, releases, summary);

log.success(`Created bump file: .bumpy/${filename}.md`);
log.success(`🐸 Created bump file: .bumpy/${filename}.md`);
for (const r of releases) {
log.dim(` ${r.name}: ${r.type}`);
}
Expand Down
Loading