release-kit 0.9.11

A canonical release workflow: a technology-agnostic method, per-technology bindings, and the rk CLI that lands and serves them.
Documentation
1
2
3
4
5
6
7
8
9
10
11
# blocks

The whole texts the binary writes outside `snippets/`: the routing, glossary, and hook blocks it splices into a target, the post-merge hook it installs on a host, and the self-depend texts `rk self-depend add` serves and seeds for each manager and venue pair — the three flake fragments and the seed flake, the mise entry for the crate and for the release archive with the mise seed, the devbox entry and seed, the asdf line, the `.envrc` line, and the seed `.envrc` — carrying `RK_DEVSHELL_*` tokens that `src/self_depend/fragments.rs` renders from the pin grammar, so no embedded file names the flake's owner. `target-config.toml.in` is the target configuration a first landing writes, in rk's own form: one key per line, one space before its class comment, and one blank line between tables. Every later write edits the keys it changes in place and keeps every other byte, so a project may format the file once with its own formatter; and `acquisition-config.toml.in` is the configuration `rk self-depend add --host` writes where a target has none yet: the schema and the host-install answer alone, which the landing that follows completes.

`.in` files are templates carrying `RK_*` and `OWNER` tokens, substituted in `src/landing.rs`; the hooks fragment is not standalone YAML, and the token lines must survive formatting, which is what the suffix buys.

The hook block composes from one template and its optional parts. The template carries the status check, and wherever the record names a release, `pre-commit-tag-guard.yaml.in` adds the tag guard and `pre-commit-status-release-files.yaml.in` adds the release files the status check watches to its `files` pattern. The workflow guards add `pre-commit-message-guards.yaml.in` and `pre-commit-branch-name-guard.yaml.in`, whose commit hook drops `--force-scope` where the record names no release, and under them `pre-commit-worktree-guard.yaml.in` is the checkout mode's answer. The integration mode picks the trunk guards: `pre-commit-trunk-commit-guard.yaml.in` and `pre-commit-trunk-push-guard.yaml.in` under forge integration, where a request is the one way in, and `pre-commit-local-trunk-commit-guard.yaml.in` and `pre-commit-local-trunk-push-guards.yaml.in` under local integration, where `rk integrate` moves the trunk with no commit hook and the operator pushes it, so the commit refuses at the pre-commit stage alone and the push refuses a rewrite and a merge commit. `pre-commit-sweep-skip.yaml.in` and `pre-commit-sweep-none.yaml.in` are the header's two shapes, and `pre-commit-integrate-note.yaml.in` names the pre-integrate contract under local integration. A part's token is a prefix of the next content line, never a line of its own, so an absent part leaves no blank line behind; the guard tokens are adjacent for that reason. The routing block does the same with the workflow guards' two fragments, `agents-line-agent-policy.md.in` and `agents-line-commit-policy.md.in`, and carries no mode line. The commit policy composes in turn from the merge form's message source, `agents-line-commit-source-squash.md.in` or `agents-line-commit-source-rebase.md.in`, and the release mode's scope rule, `agents-line-commit-scope-required.md.in` or `agents-line-commit-scope-preferred.md.in`. A target whose release mode is `none` takes the workflow variants `agents-block-workflow.md.in`, `agents-line-agent-policy-workflow.md.in`, and `glossary-workflow.md.in`, which carry no release term.

A recorded development environment composes the rust release jobs from `dev-environment-release.yaml.in` and `dev-environment-request.yaml.in`, which each take `dev-environment-git-user.yaml.in` at `RK_DEV_GIT_USER` and the recorded action steps at `RK_DEV_SETUP_STEPS`, and replace the spans the snippets mark with `RK_DEV_ENV_*`; `RK_DEV_RUN` carries the recorded prefix in both forges.

Every file ends with one enforced newline; the `.in` readers strip exactly one because the spliced form carries none, `post-merge-hook.sh` is written verbatim because a hook file ends in its newline, and byte-equality tests pin both round trips.