add release skills, backfill changelog, wire CI to use changelog for GitHub releases

- Backfill CHANGELOG.md from all 17 GitHub releases (was stale at v0.1.0)
- Add draft-release-notes and release-bump agent skills
- Extract release notes from CHANGELOG.md in release CI instead of hardcoded placeholder
- Remove stale PATCH_NOTES.md, mlx-test/, move PROJECT_STATUS to docs/notes
- Reorganize API reference docs from unknown/ to named groups
- Update openapi.json
This commit is contained in:
James Pine
2026-03-16 06:18:46 -07:00
parent 5933cba8e9
commit e0a798dc0d
32 changed files with 1512 additions and 42 deletions
+2 -2
View File
@@ -119,6 +119,6 @@ Given current version `X.Y.Z`:
## Notes
- This skill does not create a GitHub Release. That happens when the tag is pushed and CI runs, or the user can create it manually via `gh release create`.
- When the tag is pushed, the release CI (`.github/workflows/release.yml`) automatically extracts the matching version section from `CHANGELOG.md` and uses it as the GitHub Release body. No manual copy-paste needed.
- The release commit message is controlled by `.bumpversion.cfg` (`Bump version: X.Y.Z -> A.B.C`). Do not override it.
- If the user wants to update the GitHub Release body with the changelog narrative after pushing, they can use: `gh release edit vX.Y.Z --notes-file <(sed -n '/## \[X.Y.Z\]/,/## \[/p' CHANGELOG.md | head -n -1)`
- If you need to manually update the GitHub Release body after the fact: `gh release edit vX.Y.Z --notes-file <(sed -n '/## \[X.Y.Z\]/,/## \[/p' CHANGELOG.md | head -n -1)`
+24 -11
View File
@@ -123,6 +123,29 @@ jobs:
p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }}
p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
- name: Extract release notes from CHANGELOG.md
id: changelog
shell: bash
run: |
# Get the version from the tag (strip leading 'v')
VERSION="${GITHUB_REF_NAME#v}"
# Extract the section for this version from CHANGELOG.md
# Matches from "## [X.Y.Z]" until the next "## [" heading
NOTES=$(sed -n "/^## \[${VERSION}\]/,/^## \[/{/^## \[${VERSION}\]/d;/^## \[/d;p;}" CHANGELOG.md)
# Fall back to a placeholder if the version isn't in the changelog
if [ -z "$(echo "$NOTES" | tr -d '[:space:]')" ]; then
NOTES="See the assets below to download and install this version."
fi
# Use multiline output syntax
{
echo "notes<<CHANGELOG_EOF"
echo "$NOTES"
echo "CHANGELOG_EOF"
} >> "$GITHUB_OUTPUT"
- uses: tauri-apps/[email protected]
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -139,17 +162,7 @@ jobs:
projectPath: tauri
tagName: v__VERSION__
releaseName: "voicebox v__VERSION__"
releaseBody: |
## What's Changed
See the assets below to download and install this version.
### Installation
- **macOS (Apple Silicon)**: Download the `aarch64.dmg` file - uses MLX for fast native inference
- **macOS (Intel)**: Download the `x64.dmg` file - uses PyTorch
- **Windows**: Download the `.msi` installer
- **Linux**: Compile from source (see README)
The app includes automatic updates - future updates will be installed automatically.
releaseBody: ${{ steps.changelog.outputs.notes }}
releaseDraft: true
prerelease: false
args: ${{ matrix.args }}
@@ -0,0 +1,4 @@
{
"title": "General",
"pages": ["root__get", "health_health_get"]
}
@@ -0,0 +1,8 @@
{
"title": "Generation",
"pages": [
"generate_speech_generate_post",
"transcribe_audio_transcribe_post",
"get_audio_audio__generation_id__get"
]
}
@@ -0,0 +1,9 @@
{
"title": "History",
"pages": [
"list_history_history_get",
"get_generation_history__generation_id__get",
"delete_generation_history__generation_id__delete",
"get_stats_history_stats_get"
]
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"title": "API Reference",
"defaultOpen": true,
"pages": ["unknown"]
"pages": ["general", "profiles", "generation", "history", "models"]
}
@@ -0,0 +1,10 @@
{
"title": "Models",
"pages": [
"get_model_status_models_status_get",
"load_model_models_load_post",
"unload_model_models_unload_post",
"trigger_model_download_models_download_post",
"get_model_progress_models_progress__model_name__get"
]
}
@@ -0,0 +1,13 @@
{
"title": "Profiles",
"pages": [
"list_profiles_profiles_get",
"create_profile_profiles_post",
"get_profile_profiles__profile_id__get",
"update_profile_profiles__profile_id__put",
"delete_profile_profiles__profile_id__delete",
"get_profile_samples_profiles__profile_id__samples_get",
"add_profile_sample_profiles__profile_id__samples_post",
"delete_profile_sample_profiles_samples__sample_id__delete"
]
}
@@ -1,27 +0,0 @@
{
"title": "Endpoints",
"pages": [
"root__get",
"health_health_get",
"list_profiles_profiles_get",
"create_profile_profiles_post",
"get_profile_profiles__profile_id__get",
"update_profile_profiles__profile_id__put",
"delete_profile_profiles__profile_id__delete",
"add_profile_sample_profiles__profile_id__samples_post",
"get_profile_samples_profiles__profile_id__samples_get",
"delete_profile_sample_profiles_samples__sample_id__delete",
"generate_speech_generate_post",
"list_history_history_get",
"get_generation_history__generation_id__get",
"delete_generation_history__generation_id__delete",
"get_stats_history_stats_get",
"transcribe_audio_transcribe_post",
"get_audio_audio__generation_id__get",
"load_model_models_load_post",
"unload_model_models_unload_post",
"get_model_progress_models_progress__model_name__get",
"get_model_status_models_status_get",
"trigger_model_download_models_download_post"
]
}
+1441 -1
View File
File diff suppressed because one or more lines are too long