1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# A complete verctl.toml. Every table here is live, not commented out, so
# `tests/examples.rs` parses this exact file and plans from it — the examples
# cannot drift from the schema without failing the build. Copy it and delete
# what you do not need; only [[packages]] is required.
# `cargo` and `npm` are stock drivers and `cargo` and `bun` are stock
# publishers. Redeclaring one merges over the stock recipe rather than
# replacing it, so this pair changes nothing and is here to show the shape.
# Because it is a merge, a table may carry only the field it overrides.
[]
= "toml"
= ["workspace.package.version", "package.version"]
[]
= "json"
= ["version"]
# after = "bun install" # omit and verctl infers from the lockfile
# A manifest verctl neither parses nor knows: give it a read and a write
# command instead of format+keys. A string is a mise task, an array is execvp
# (no shell). Stdin is the file; stdout is the version (read) or the whole new
# file (write), and a write also gets VERCTL_VERSION.
[]
= ["cat"]
= ["printenv", "VERCTL_VERSION"]
# Any stack publishes through one table of argv. This adds uv alongside the
# stock cargo and bun recipes without a new verb.
[]
= "package"
= ["uv", "publish"]
[[]]
= "verctl"
= "Cargo.toml"
# driver = "cargo" # inferred from the file name
[[]]
= "@org/pkg"
= "package.json"
= "bun"
= "github"
# changelog = "docs/PKG.md" # defaults to CHANGELOG.md beside the manifest
# A file name that implies nothing, so both the driver and the publisher are
# named. This is what the `plain` driver and `[publishers.twine]` above are
# for — nothing here is declared without a package that uses it.
[[]]
= "py-tool"
= "VERSION"
= "plain"
= "twine"
# One argv after every bump, on the Version PR. `stage` lists the extra paths
# it may write; any other dirty file fails the run.
[]
= ["mise", "run", "version-sync"]
= ["packages/*/src/version.rs"]
# Machines are declared once. The header names one, `labels` is how GitHub
# finds it — every label at once, so `big` is a single machine carrying three
# labels, not three machines. verctl ships no built-in machine names: this
# table is yours, and only `labels` ever reaches runs-on.
[]
= ["self-hosted", "linux", "x64"]
[]
= ["nscloud-ubuntu-24.04-amd64-4x8"]
# Omit [assets] entirely for a library. `bin` is the recipe every target
# shares; prepare/build/binary override the stock rust recipe.
[]
= "verctl"
# One [assets.NAME] table per host binary. The name is the job, the tarball,
# and the platform. darwin-arm64 and linux-x64 are built in, so naming one is
# enough — and it keeps free hosted minutes.
[]
# Name a `runner` only when the built-in machine is wrong. One tarball is one
# machine, so this is one name and never a list.
[]
= "big"
# A name outside darwin-arm64 / linux-x64 describes a platform verctl knows
# nothing about, so it must describe all of it.
[]
= "ns"
= "linux"
= "arm64"
= "aarch64-unknown-linux-gnu"
# PR and push validation. Omit [ci] for one `verify` job on ubuntu-latest.
# A job may name several machines: one check each, `verify (ns)` and
# `verify (big)`. No os/arch/triple — validation does not cross-compile.
[]
= ["ns", "big"]
# A second job is a second table, and stays a separate check.
[]
= ["ns"]
# Collocated mise pins rewritten by `verctl pin` after the tarball exists.
[[]]
= "mise.release.toml"
= "github:victor-software-house/verctl"
= "verctl"