.remote-cache/kreuzberg-shared-rules/.ai-rulez/skills/release-and-deployment-processes/SKILL.md
______________________________________________________________________ ## priority: critical # Release & Deployment Processes ## Semantic Versioning Strategy - **Format**: MAJOR.MINOR.PATCH (e.g., 1.2.3) - MAJOR: Breaking changes to public API - MINOR: New features, backward-compatible - PATCH: Bug fixes, no new features - **Pre-releases**: Use -alpha, -beta, -rc suffixes (e.g., 1.0.0-beta.1) - **Build metadata**: +build.123 for CI build info (not part of precedence) - **Commit tags**:
npx skillsauth add kreuzberg-dev/html-to-markdown .remote-cache/kreuzberg-shared-rules/.ai-rulez/skills/release-and-deployment-processesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
release/v1.2.3 from main with final version bumpsExample workflow for coordinated release:
name: Release
on:
push:
tags:
- 'v*'
jobs:
publish-rust:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: cargo publish --token ${{ secrets.CARGO_TOKEN }}
publish-python:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- run: |
pip install twine wheel
cd python && python -m build
twine upload dist/* -u __token__ -p ${{ secrets.PYPI_TOKEN }}
publish-npm:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- run: npm ci && npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
create-github-release:
runs-on: ubuntu-latest
needs: [publish-rust, publish-python, publish-npm]
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
path: artifacts
- uses: softprops/action-gh-release@v1
with:
files: artifacts/**/*
draft: false
Example cliff.toml:
[changelog]
title = "# Changelog"
body = """
{% for release in releases -%}
## [{{ release.version }}] - {{ release.date }}
{% if release.breaking %}
### Breaking Changes
{% for breaking in release.breaking -%}
- {{ breaking.message }}
{% endfor %}
{% endif %}
{% if release.features %}
### Features
{% for feature in release.features -%}
- {{ feature.message }}
{% endfor %}
{% endif %}
{% if release.fixes %}
### Bug Fixes
{% for fix in release.fixes -%}
- {{ fix.message }}
{% endfor %}
{% endif %}
{% endfor %}
"""
commit_parsers = [
{ message = "^feat", group = "features" },
{ message = "^fix", group = "fixes" },
{ message = "^doc", group = "documentation" },
{ message = "^perf", group = "performance" },
{ message = "^refactor", group = "refactoring" },
{ message = "^test", skip = true },
]
Usage:
git cliff --output CHANGELOG.md
git cliff v1.0.0..v1.1.0 # Specific version range
cargo publish from clean workspacecargo package --allow-dirty before publishingcargo login # Stores token in ~/.cargo/credentials.toml
cargo publish --token $CARGO_TOKEN
twine for secure uploads with API tokenspython -m build # Creates dist/ with wheels and sdist
twine upload dist/* --username __token__ --password $PYPI_TOKEN
npm publish --access public # or --access restricted
npm info @myorg/pkg # Verify published version
gem build gemspec.gemspecgem build html-to-markdown.gemspec
gem push html-to-markdown-1.0.0.gem
plugins {
id "io.github.gradle-nexus.publish-plugin" version "1.3.0"
}
nexusPublishing {
repositories {
sonatype {
nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/"))
snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/"))
username = System.getenv("MAVEN_USERNAME")
password = System.getenv("MAVEN_PASSWORD")
}
}
}
proxy.golang.org) automatically caches modulesgit tag v1.2.3 && git push --tagsgit tag v1.2.3
git push origin v1.2.3
# Go proxy caches within 24h, can purge with go get -u
dotnet packdotnet pack --configuration Release
dotnet nuget push bin/Release/MyPackage.1.0.0.nupkg \
--api-key $NUGET_API_KEY \
--source https://api.nuget.org/v3/index.json
Pre-release:
Version bump:
Changelog:
Git tag:
git tag -a v1.2.3 -m "Release 1.2.3"git tag -s v1.2.3 -m "Release 1.2.3" (requires GPG)git push origin v1.2.3Registry publishing:
Post-release:
pip install, npm install, cargo addtools
Convert HTML to Markdown, Djot, or plain text with structured extraction. Use when writing code that calls html-to-markdown APIs in Rust, Python, TypeScript, Go, Ruby, PHP, Java, C#, Elixir, R, C, or WASM. Covers installation, conversion, configuration, metadata extraction, document structure, and CLI usage.
development
Developer quick start guide with prerequisites, setup, and workflow commands
development
Common task runner commands for build, test, lint, and format workflows
tools
______________________________________________________________________ ## priority: high # Workspace Structure & Project Organization **Rust workspace** (Cargo.toml): crates/{kreuzberg,kreuzberg-py,kreuzberg-node,kreuzberg-ffi,kreuzberg-cli}, packages/ruby/ext/kreuzberg_rb/native, tools/{benchmark-harness,e2e-generator}, e2e/{rust,go}. **Language packages**: packages/{python,typescript,ruby,java,go} - thin wrappers around Rust core. **E2E tests**: Auto-generated from fixtures/ via tools/e2e