# ReleaseKit v0.2.0 ## Summary ReleaseKit adds declarative candidate validation and module-selected release tooling for Woodpecker. Consumers can replace repeated release checks with typed Go selections or equivalent profile settings, while retaining product-specific assertions through `AdditionalChecks` and profile `checks`. ## New features - A facade-owned `ValidationSpec` on `ReleaseRequest` and corresponding profile `validation` object select shared checks for both `Check` and `Publish`. Structured `ValidationError` diagnostics identify the failed check, relevant paths and locations, compilation targets, directives, and size measurements. Wrapping preserves underlying causes and cancellation. - Race testing selects the race detector for the one standard Go suite. Separate full vet automatically disables test-time vet and runs after successful tests. Selected package-compilation targets run afterward with `CGO_ENABLED=0`, independently of executable artifacts. Source-only libraries can check target compatibility and retain page-only delivery. - Go formatting checks inspect committed regular Go source and report formatting differences while preserving files. - Offline Markdown validation checks local destinations and supported heading fragments, including inline/reference links, images, and autolinks. Heading anchors support visible text, duplicate headings, and Unicode. Outside-checkout destinations are reported as out of scope by default; consumers can select boundary enforcement. Submodule contents remain out of scope. - Independent module-distribution selections inspect committed workspace files and filesystem module replacements. Versioned replacements are permitted. - Optional file-size validation checks individual committed blobs, including symlink text, with a configurable limit and literal file/directory exclusions. Enabling the check selects a default limit of 1,000,000 bytes; only sizes strictly greater than the selected limit fail. - `ExpectedPushURL` and profile `expected_push_url` require an exact match with Git's effective push destination during publication preflight. A mismatch returns `ErrUnexpectedPushURL` before candidate validation or tag creation. Local `Check` ignores the publication expectation. - The maintained Woodpecker consumer template selects ReleaseKit from the released application's module configuration. It verifies the event tag and commit before building the tool, prepares tool dependencies in temporary module metadata, and preserves tagged module files. Retries use the triggering tag's dependency selection. ReleaseKit's self-bootstrap template also supports fetching missing tool dependencies after tag verification. See the [configuration reference](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.2.0/docs/config.md), [candidate check guide](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.2.0/docs/consumers/check.md), [publication guide](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.2.0/docs/consumers/publish.md), and [delivery guide](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.2.0/docs/consumers/delivery.md) for supported behavior and adoption examples. ## Compatibility The minimum Go version remains 1.25.0. The root orchestration facade and separate lightweight `buildinfo` runtime facade keep their existing responsibilities. Goldmark and `golang.org/x/mod` are new internal dependencies; prepare the module cache before offline validation or builds. Omitted validation selections preserve v0.1.0 defaults. Existing profiles and product-specific checks continue to work. Race testing requires the native toolchain's race prerequisites and reports an error when they are unavailable. Markdown and file-size checks are enabled by non-nil Go specifications or profile objects, including empty objects; omission or `null` disables them. `ReleaseRequest` gains fields, so callers using positional struct literals must convert them to keyed literals. Validation diagnostics now include structured detail and additional context. Go callers can inspect `ValidationError` with `errors.As` and underlying causes with `errors.Is`; CLI integrations should use exit classifications rather than complete diagnostic strings. Source publication still completes at confirmed publication of the intended annotated tag. Hosted Gitea delivery retains its separate status. ReleaseKit's deliverables remain the source tag and hosted note page. ## Upgrade guidance 1. Update the module dependency: ```sh go get gitea.maximumdirect.net/eric/ReleaseKit@v0.2.0 ``` Consumers using a separately installed executable can update it with: ```sh go install gitea.maximumdirect.net/eric/ReleaseKit/cmd/releasekit@v0.2.0 ``` 2. Use v0.2.0 tooling before adding new profile fields. Select the shared checks appropriate to the product and remove the corresponding duplicate commands from additional checks. Retain assertions about product behavior. Package compilation belongs under validation; executable deliverables use `build`. 3. For module-based CI, adopt the updated [tag-delivery template](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.2.0/examples/woodpecker/tag-delivery.yml) and remove the independent `RELEASEKIT_VERSION` workflow pin. Ensure the application module declares ReleaseKit, align local tool bootstrap with that selection, and retain the product's Go image, delivery profile, and secret mapping. The [Woodpecker guidance](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.2.0/docs/consumers/delivery.md#woodpecker-tag-workflows) describes temporary module metadata, older-tag retries, self-bootstrap, and separately installed tools. [COPYRIGHT](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.2.0/COPYRIGHT) | [LICENSE](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.2.0/LICENSE) | [ATTRIBUTION](https://gitea.maximumdirect.net/eric/ReleaseKit/src/tag/v0.2.0/docs/oss/attribution.md)