원클릭으로
aphrodite-release-workflow
Auto-release, version sync, pre-release verification, and release notes for aphrodite.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Auto-release, version sync, pre-release verification, and release notes for aphrodite.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Comprehensive benchmark protocol for aphrodite proxy - compression throughput, cache hit rates, cross-worker behavior, terminal threshold verification, and all-type coverage. Current as of v1.3.2.
Protocol for testing auto-expand behavior - controlled by AUTO_EXPAND_LIMIT from TOML auto_expand_limit (default 5 → effectively OFF). APHRODITE_AUTO_EXPAND=1 enables aggressive. Context engine is the real async engine.
Critical development pitfalls for Aphrodite - auto-expand, env_passthrough, plugin symlink, dual-store pattern, release notes, and session setup checklist.
Operational patterns for working with aphrodite - engine compression handling, prefetch workflow, dual-mode rebuild, standalone repo sync.
Historical development patterns from v0.8.5→v0.8.6 cycle. Most patterns now live in aphrodite-dev-workflow, aphrodite-upgrade-breakpoints, and aphrodite-development-lessons. Keep as reference snapshot.
Cargo upgrade breakpoints for aphrodite + headroom - reqwest features, axum ConnectInfo+fallback, tokio-tungstenite Messages, pyo3 allow_threads, workspace pinning. What breaks and how to fix.
| name | aphrodite-release-workflow |
| description | Auto-release, version sync, pre-release verification, and release notes for aphrodite. |
| version | 1.3.0 |
| platforms | ["macos"] |
MANDATORY before every release. Missing symbols silently kill the plugin -
Failed to load plugin with no error.
cd /path/to/Aphrodite
python3 -c "import sys; sys.path.insert(0, 'plugins'); import aphrodite; print('OK:', aphrodite.__doc__[:60])"
ruff check plugins/aphrodite/ Maintain/scripts/ crates/
npx pyright plugins/aphrodite/
cargo check -p aphrodite
If any step fails, fix BEFORE releasing. A broken plugin means zero tools, no compression, no context engine - a silent degradation users won't notice.
GIT_EDITOR=true Maintain/scripts/release/auto-release.sh "descriptive message"
Handles: stage → commit → bump version → cargo build → cargo test → tag → push
to Source remote.
Do NOT run cargo publish locally. .github/workflows/Publish.yml builds and
publishes aphrodite-headroom-core → aphrodite → aphrodite-hermes (in that
dependency order) - but only on an explicit workflow_dispatch with
publish_crates: true; a plain Aphrodite/v* tag push alone does NOT publish
to crates.io (it only triggers Build.yml's GitHub Release artifacts). This
gate exists because crates.io versions are immutable - a version number burned
by a bad manual cargo publish can never be reused (see the v1.3.1 incident in
Maintain/CHANGELOG.md's "Why 1.3.2, not 1.3.1" note). Trigger it deliberately
via gh workflow run Publish.yml -f publish_crates=true (or the Actions UI)
only once the tagged release's artifacts are verified.
The Aphrodite project has two independent version tracks:
1.0.4) - Rust crates, must match across Cargo.toml files2.0.1) - Hermes plugin, lives in the plugins/aphrodite submoduleBinary version locations (monorepo - bump these together):
crates/aphrodite/Cargo.toml - version = "1.0.4" (line 3)crates/aphrodite-hermes/Cargo.toml - version = "1.0.4" (line 3, package)crates/aphrodite-hermes/Cargo.toml - aphrodite = { ..., version = "1.0.4" } (line 15, dependency)Plugin version locations (submodule plugins/aphrodite/):
plugin.yaml - version: 2.0.1 (line 2)plugin.yaml - install_message: block contains aphrodite v2.0.1 - (line 31)pyproject.toml - version = "2.0.1" (if file exists)__init__.py - docstring aphrodite v2.0.1 - ... (if version appears there)_core/config.py - BIN_VERSION + PLUGIN_VERSION constants (if file exists)Documentation:
README.md - example output shows "version":"v1.0.4" (line ~258)What auto-release.sh bumps (complete list):
crates/aphrodite/Cargo.toml - binary version ✅crates/aphrodite-hermes/Cargo.toml - package version + aphrodite dependency ✅plugins/aphrodite/plugin.yaml - version field + install_message ✅plugins/aphrodite/pyproject.toml - version (if file exists) ✅plugins/aphrodite/__init__.py - docstring version (if present) ✅plugins/aphrodite/_core/config.py - BIN_VERSION + PLUGIN_VERSION (if file exists) ✅plugins/aphrodite is a git submodule → separate repo PlayForm/Aphrodite-Hermes.
auto-release.sh handles the full cross-repo release:
plugin.yaml (and other submodule files) via sedcd plugins/aphrodite && git commit -m "release: plugin vX.Y.Z"git tag "vX.Y.Z"$SUBMODULE_REMOTE (default: Source)git update-index --cacheinfo to track new submodule SHA
(needed because .gitmodules has ignore = all, which hides dirty submodules)chore: sync aphrodite submodule → plugin vX.Y.ZManually verify after release:
README.md:~258 - example output version (non-critical, grep for "version":"v)ln -sf /path/to/repo/target/release/aphrodite ~/.hermes/aphrodite/aphrodite
Every release MUST include: Summary, Changes, Infrastructure, What Ships, and Links.
See .hermes/RELEASE-TEMPLATE.md for the canonical template.
Anti-pattern (DO NOT): bare compare link with zero description. 30+ releases (v0.8.13-v0.8.43) currently ship with only:
**Full Changelog**: https://github.com/PlayForm/Aphrodite/compare/...
Never use backticks with gh release create --notes. Use --notes-file with a
heredoc:
cat > /tmp/notes.md << 'EOF'
**[Compare vX.Y.Z...vX.Y.Z](https://github.com/PlayForm/Aphrodite/compare/vX.Y.Z...vX.Y.Z)**
## Aphrodite vX.Y.Z 💋 Plugin vA.B.C
### Summary
One paragraph. What this release is. 2-3 sentences.
### Changes
- **Feature**: description
- **Fix**: description
### Infrastructure
- Build: `cargo build --release -p aphrodite` ✅
- Tests: `cargo test -p aphrodite` ✅ (NNN passed)
- Python: `ruff check` + `pyright` ✅
- Lint: `cargo clippy` ✅
### What Ships
Build.yml's 4-target matrix (`aarch64-apple-darwin`, `x86_64-apple-darwin`,
`x86_64-unknown-linux-gnu`, `x86_64-pc-windows-msvc`) stages, per target, the
`aphrodite` binary + `libaphrodite_hermes` dylib + a `SHA256SUMS-<target>.txt`
- 4 targets × 3 files = 12 artifacts total on a full release.
| Artifact pattern | Platform |
|----------|----------|
| `aphrodite-<target>` / `libaphrodite_hermes-<target>.{so,dylib,dll}` | per matrix target above |
| `SHA256SUMS-<target>.txt` | checksums for that target's two binaries |
| Plugin vA.B.C | Hermes (standalone repo) |
### Links
- **Full Changelog**: https://github.com/PlayForm/Aphrodite/compare/...
- **CHANGELOG.md**: [CHANGELOG.md](CHANGELOG.md)
- **Plugin**: https://github.com/PlayForm/Aphrodite-Hermes
EOF
# In normal operation Build.yml's Release job attaches every staged artifact
# automatically on tag push - this manual form is only for a from-source
# re-attach. Glob every staged file rather than naming 2 of the 12:
gh release create Aphrodite/vX.Y.Z --notes-file /tmp/notes.md \
staging/aphrodite-* staging/libaphrodite_hermes-* staging/SHA256SUMS-*.txt
Adding a new import in one module (e.g., from .live import _is_live_tool)
without defining the symbol in the target module silently kills the plugin at
session start. Always test the full import chain before releasing:
python3 -c "import aphrodite".