-
Notifications
You must be signed in to change notification settings - Fork 0
Add release make target and /release skill #11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,130 @@ | ||||||||||
| --- | ||||||||||
| name: release | ||||||||||
| description: Prepare and publish a new release. Updates CHANGELOG.md and README.md with version information, analyzes git commits to determine semantic version, and guides through the release process. | ||||||||||
| --- | ||||||||||
|
|
||||||||||
| # Release Skill | ||||||||||
|
|
||||||||||
| You are helping to prepare a new release of the elli_openapi library. | ||||||||||
|
|
||||||||||
| ## Step 1: Detect Current Version | ||||||||||
|
|
||||||||||
| Read the CHANGELOG.md to determine the current version (the most recent version listed at the top). | ||||||||||
|
|
||||||||||
| ## Step 2: Analyze Changes | ||||||||||
|
|
||||||||||
| Check recent git commits since the last release: | ||||||||||
| ```bash | ||||||||||
| git log --oneline --since="$(git log -1 --format=%ai $(git describe --tags --abbrev=0 2>/dev/null || echo HEAD))" 2>/dev/null || git log --oneline -20 | ||||||||||
|
||||||||||
| git log --oneline --since="$(git log -1 --format=%ai $(git describe --tags --abbrev=0 2>/dev/null || echo HEAD))" 2>/dev/null || git log --oneline -20 | |
| git describe --tags --abbrev=0 >/dev/null 2>&1 && git log --oneline "$(git describe --tags --abbrev=0)"..HEAD || git log --oneline -20 |
Copilot
AI
Mar 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The README guidance here doesn't match the current README.md in this repo: there is no Hex dependency example like {elli_openapi, "~> X.Y.Z"} (README currently shows a git dependency). Update the skill to match the actual installation instructions you want users to maintain.
| - Find and update the installation example: `{elli_openapi, "~> X.Y.Z"}` | |
| - Find and update the installation example that uses a git dependency, for example: | |
| ```elixir | |
| {:elli_openapi, github: "elli-lib/elli_openapi", tag: "vX.Y.Z"} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| # Changelog | ||
|
|
||
| All notable changes to this project will be documented in this file. | ||
|
|
||
| The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), | ||
| and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). | ||
|
|
||
| ## [0.1.0] - 2026-03-27 | ||
|
|
||
| ### Added | ||
| - Type-safe HTTP API routing using Elli with automatic OpenAPI documentation generation | ||
| - Integration with [Spectra](https://github.com/andreashasse/spectra) for Erlang type-based request/response validation | ||
| - URL routing with path parameter extraction (e.g. `<<"/api/users/{userId}">>`) | ||
| - Support for multiple HTTP status codes per endpoint via union types in function specs | ||
| - Request and response body validation and encoding (JSON and text/plain) | ||
| - Request header validation against declared function specs | ||
| - Swagger UI served at `/api-docs` | ||
| - Redoc UI served at `/redoc` | ||
| - OpenAPI spec stored in `persistent_term` for fast in-memory access |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,4 +1,4 @@ | ||||||||||||||||||
| .PHONY: all compile format test cover clean doc hank format_verify build-test dialyzer xref type_check check_app_calls hex | ||||||||||||||||||
| .PHONY: all compile format test cover clean doc hank format_verify build-test dialyzer xref type_check check_app_calls hex release | ||||||||||||||||||
|
|
||||||||||||||||||
| all: compile format test cover | ||||||||||||||||||
|
|
||||||||||||||||||
|
|
@@ -50,3 +50,33 @@ doc: | |||||||||||||||||
| hex: | ||||||||||||||||||
| rebar3 hex build | ||||||||||||||||||
| rebar3 hex publish | ||||||||||||||||||
|
|
||||||||||||||||||
| release: | ||||||||||||||||||
| @branch=$$(git rev-parse --abbrev-ref HEAD); \ | ||||||||||||||||||
| if [ "$$branch" != "main" ]; then \ | ||||||||||||||||||
| echo "Error: You must be on the main branch to release (currently on '$$branch')."; \ | ||||||||||||||||||
| exit 1; \ | ||||||||||||||||||
| fi | ||||||||||||||||||
| @git fetch origin main --quiet | ||||||||||||||||||
| @if [ "$$(git rev-parse HEAD)" != "$$(git rev-parse origin/main)" ]; then \ | ||||||||||||||||||
| echo "Error: Local main is not in sync with origin/main. Please pull or push first."; \ | ||||||||||||||||||
| git status -sb; \ | ||||||||||||||||||
| exit 1; \ | ||||||||||||||||||
| fi | ||||||||||||||||||
| @if [ -n "$$(git status --porcelain)" ]; then \ | ||||||||||||||||||
| echo "Error: There are uncommitted changes. Please commit or stash them before releasing."; \ | ||||||||||||||||||
| git status --short; \ | ||||||||||||||||||
| exit 1; \ | ||||||||||||||||||
| fi | ||||||||||||||||||
| @echo "Last 5 tags:" | ||||||||||||||||||
| @git tag --sort=-version:refname | head -n 5 | ||||||||||||||||||
| @echo "" | ||||||||||||||||||
| @read -r -p "Enter the next tag (e.g., v1.0.0): " tag && [ -n "$$tag" ] || { echo "Tag cannot be empty. Aborted."; exit 1; }; \ | ||||||||||||||||||
| read -r -p "Did you update the README install instructions _AND_ CHANGELOG.md? (Y/N) " a && [ "$$a" = "Y" ] || { echo "Aborted."; exit 1; }; \ | ||||||||||||||||||
| git tag "$$tag" && \ | ||||||||||||||||||
| rebar3 compile && \ | ||||||||||||||||||
| rebar3 hex build && \ | ||||||||||||||||||
| rebar3 hex publish && \ | ||||||||||||||||||
|
andreashasse marked this conversation as resolved.
andreashasse marked this conversation as resolved.
|
||||||||||||||||||
| git push origin "$$tag" && \ | ||||||||||||||||||
| gh release create "$$tag" --title "v$$tag" --notes "$$(sed -n "/## \[$$tag\]/,/## \[/p" CHANGELOG.md | sed '$$d' | tail -n +2)" && \ | ||||||||||||||||||
|
andreashasse marked this conversation as resolved.
|
||||||||||||||||||
| gh release create "$$tag" --title "v$$tag" --notes "$$(sed -n "/## \[$$tag\]/,/## \[/p" CHANGELOG.md | sed '$$d' | tail -n +2)" && \ | |
| gh release create "$$tag" --title "v$$tag" --notes "$$(awk -v tag="$$tag" ' \ | |
| $$0 == "## [" tag "]" {found=1; next} \ | |
| found && /^## \[/ {exit} \ | |
| found {print} \ | |
| ' CHANGELOG.md)" && \ |
Copilot
AI
Mar 27, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The tag prompt suggests entering something like v1.0.0, but the release title is set to v$$tag, which will produce titles like vv1.0.0. Decide whether tags include the leading v and keep it consistent across the prompt, the tag name, and the GitHub release title.
| gh release create "$$tag" --title "v$$tag" --notes "$$(sed -n "/## \[$$tag\]/,/## \[/p" CHANGELOG.md | sed '$$d' | tail -n +2)" && \ | |
| gh release create "$$tag" --title "$$tag" --notes "$$(sed -n "/## \[$$tag\]/,/## \[/p" CHANGELOG.md | sed '$$d' | tail -n +2)" && \ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This skill instructs the user to read/update
CHANGELOG.md, but the repo currently doesn't include that file. Either add a CHANGELOG.md to the repository (and define its expected format) or adjust the skill to use whatever release notes source this repo actually maintains.