This project uses `vmn` for semantic versioning via git tags.
Scanned 10/7/2026
npx -y skills add progovoy/vmn --skill docs --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Docs?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/progovoy-docs)More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.
# vmn — versioning
## Versioning workflow
This project uses `vmn` for semantic versioning via git tags.
### Stamping a new version
```sh
vmn stamp -r <mode> <app_name> # mode: major | minor | patch | hotfix
vmn stamp -r patch --pr rc <app_name> # prerelease
vmn release <app_name> # promote prerelease to final
```
- `vmn stamp` auto-initializes the repo and app on first run — no separate init step.
- Use `--dry-run` to preview without committing.
- Use `--pull` in CI or shared repos to auto-retry on tag conflicts.
- Use `--orm` (optional release mode) to stamp only if no prerelease already exists at the target version — safe for CI pipelines that re-run on the same commit.
- If `conventional_commits` is enabled in config, `-r` is optional — vmn infers the mode from commit messages (`fix:` → patch, `feat:` → minor, `BREAKING CHANGE` → major).
### Checking the current version
```sh
vmn show <app_name> # current version string
vmn show <app_name> --verbose # full YAML metadata
vmn show <app_name> --conf # show effective config
```
### Restoring state
```sh
vmn goto -v <version> <app_name> # checkout repo + all deps to exact state
```
### Build metadata
```sh
vmn add -v <version> --bm <key>=<value> <app_name> # attach metadata to a version
vmn add -v <version> --bm <key>=<value> --vmp <path> --vmu <url> <app_name>
```
Build metadata (the `+...` suffix) is append-only and does not change the version. Use it to record build hashes, artifact URLs, or CI run IDs after a stamp.
### File generation from templates
```sh
vmn gen -t <template.j2> -o <output_file> <app_name>
```
Renders a Jinja2 template with the current version context. Useful for generating version headers, build manifests, or embedding version info into non-standard file formats.
## Worktree islands (app + dependencies side by side)
```sh
vmn wt create <app_name> --island-name <name> # worktrees of the app and every dep
vmn wt create <app_name> --island-name <name> --carry-changes # also copy uncommitted work
vmn wt pull # rebase private branches onto their sources
vmn wt freeze <app_name> # pin deps to the real branches they are on
vmn wt list
vmn wt remove <name>
```
- Read `island.json` in the island directory: `main_repo.path` and each dep's `path`, private `branch`, and `source_branch`.
- Island checkouts start on private `island/<name>/<source>` branches. They cannot be pushed and `vmn stamp` refuses to run on them.
- Branches you create inside an island are normal branches: publish one with `git push -u origin <branch>`.
- To share: check out real branches in the repos you changed, push them, run `vmn wt freeze <app_name>` in the app, then commit and push the conf file it wrote.
- `--from-version <version>` builds an island at a released state instead.
## Key rules
1. **Never edit .vmn/ files directly** — vmn manages them.
2. **Commit before stamping** — `vmn stamp` requires a clean working tree.
3. **App names cannot contain `-`** — use `_` or `/` (for root apps).
4. **Root app format**: `root_app/service_name` — the root version auto-increments.
5. **Tags are the source of truth** — versions survive vmn uninstall.
## Configuration
Edit config interactively: `vmn config <app_name>`
Or non-interactively: `vmn config gen <app_name>`
Key config options:
- `conventional_commits: true` — auto-detect release mode from commits
- `version_backends` — auto-embed version into package.json, Cargo.toml, pyproject.toml
- `changelog.path` — auto-generate CHANGELOG.md on stamp
- `deps` — track external repo dependencies for multi-repo state recovery
### Branch-specific config
Integration branches can override the default config to pin deps to different branches:
```sh
vmn config gen <app_name> --branch # create branch conf for current branch
vmn config <app_name> --branch # edit branch conf interactively
```
The canonical path mirrors the branch name (slashes become directories):
- Branch `build_checker/chore/test_rdkafka` → `.vmn/<app>/branch_conf/build_checker/chore/test_rdkafka/conf.yml`
A branch conf should be identical to master's `conf.yml` except for added `branch:` lines on deps:
```yaml
deps:
Infra:
remote: ssh://git@gitlab.example.com/infra/Infra.git
vcs_type: git
branch: rdkafka/use_external_lz4_by_default
```
vmn resolves branch confs automatically at stamp time — no extra flags needed.
Experiment tracking: install vmn-exp and run `vmn-exp skill`.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!