This document describes how to create a new release of LFM.
LFM uses automated GitHub Actions to build and publish releases. The process is triggered by pushing a version tag.
- All changes committed and pushed to
masterbranch - CHANGELOG.md updated with new version details
- Version numbers updated in code (see below)
Update version in these files:
CLI Version (src/Lfm.Cli/Lfm.Cli.csproj):
<Version>1.6.0</Version>MCP Server Version (lfm-mcp-release/server.js):
const server = new Server(
{
name: 'lfm-mcp',
version: '0.3.0', // Update this
},Add a new section at the top of CHANGELOG.md:
## [1.6.0] - 2025-MM-DD
### Added
- New feature descriptions
### Improved
- Enhancement descriptions
### Fixed
- Bug fix descriptionsgit add src/Lfm.Cli/Lfm.Cli.csproj lfm-mcp-release/server.js CHANGELOG.md
git commit -m "chore: Bump version to 1.6.0"
git push# Create annotated tag
git tag -a v1.6.0 -m "Release v1.6.0"
# Push tag to GitHub
git push --tagsOnce the tag is pushed, GitHub Actions automatically:
-
Builds binaries for all platforms:
- Windows x64 (self-contained)
- macOS Intel (self-contained)
- macOS Apple Silicon (self-contained)
- Linux x64 (self-contained)
-
Packages MCP server:
- server.js
- lfm-guidelines.md (CRITICAL - must be included)
- package.json
- package-lock.json
- README.md
-
Creates GitHub Release:
- Generates release notes from template
- Uploads all binary archives
- Uploads MCP server package
- Makes release public
- Go to https://github.com/Steven-Marshall/lfm/releases
- Check that v1.6.0 appears with all assets
- Verify download links work
- Test installation scripts point to new version
-
lfm-windows-x64.zip (~60MB self-contained)
- Includes .NET runtime
- No prerequisites needed
-
lfm-macos-intel.zip (~60MB self-contained)
- For Intel Macs (x86_64)
- Includes .NET runtime
-
lfm-macos-apple-silicon.zip (~60MB self-contained)
- For M1/M2/M3 Macs (ARM64)
- Includes .NET runtime
-
lfm-linux-x64.tar.gz (~60MB self-contained)
- For most Linux distributions
- Includes .NET runtime
- lfm-mcp-server-v0.3.0.zip
- server.js (MCP server implementation)
- lfm-guidelines.md (CRITICAL - LLM behavior guidelines)
- package.json (Node.js dependencies)
- package-lock.json (Locked dependency versions)
- README.md (MCP-specific documentation)
The one-liner installation scripts automatically download the "latest" release:
Windows:
iwr -useb https://raw.githubusercontent.com/Steven-Marshall/lfm/master/install.ps1 | iexmacOS/Linux:
curl -fsSL https://raw.githubusercontent.com/Steven-Marshall/lfm/master/install.sh | bashThese scripts:
- Detect platform automatically
- Download appropriate binary from latest release
- Extract to correct location
- Add to PATH
- Verify installation
- Show next steps
Check GitHub Actions logs:
- Go to https://github.com/Steven-Marshall/lfm/actions
- Click on the failed workflow run
- Review build logs for errors
Common issues:
- Version number mismatch
- Missing files in MCP package
- .NET SDK version incompatibility
If you need to recreate a tag:
# Delete local tag
git tag -d v1.6.0
# Delete remote tag
git push origin :refs/tags/v1.6.0
# Recreate and push
git tag -a v1.6.0 -m "Release v1.6.0"
git push --tagsIf GitHub Actions completes but no release appears:
- Check repository settings → Actions → Workflow permissions
- Ensure "Read and write permissions" is enabled
- Re-run the workflow
If GitHub Actions is unavailable, you can build manually:
# Build all platforms
dotnet publish src/Lfm.Cli -c Release -r win-x64 -o publish/win-x64 --self-contained true
dotnet publish src/Lfm.Cli -c Release -r osx-x64 -o publish/osx-x64 --self-contained true
dotnet publish src/Lfm.Cli -c Release -r osx-arm64 -o publish/osx-arm64 --self-contained true
dotnet publish src/Lfm.Cli -c Release -r linux-x64 -o publish/linux-x64 --self-contained true
# Create archives
cd publish/win-x64 && zip -r ../../lfm-windows-x64.zip lfm.exe && cd ../..
cd publish/osx-x64 && zip -r ../../lfm-macos-intel.zip lfm && cd ../..
cd publish/osx-arm64 && zip -r ../../lfm-macos-apple-silicon.zip lfm && cd ../..
cd publish/linux-x64 && tar -czf ../../lfm-linux-x64.tar.gz lfm && cd ../..
# Package MCP server
mkdir -p lfm-mcp-server
cp lfm-mcp-release/server.js lfm-mcp-server/
cp lfm-mcp-release/lfm-guidelines.md lfm-mcp-server/
cp lfm-mcp-release/package.json lfm-mcp-server/
cp lfm-mcp-release/package-lock.json lfm-mcp-server/
cp lfm-mcp-release/README.md lfm-mcp-server/
zip -r lfm-mcp-server-v0.3.0.zip lfm-mcp-server/
# Create GitHub Release manually via web UI
# Upload all archivesLFM follows Semantic Versioning:
- MAJOR (1.x.x) - Breaking changes
- MINOR (x.6.x) - New features, backward compatible
- PATCH (x.x.1) - Bug fixes, backward compatible
CLI and MCP server versions can differ:
- CLI: 1.6.0
- MCP Server: 0.3.0
This is normal - the MCP server version reflects its own API stability.
After release is published:
-
Announce (if applicable):
- GitHub Discussions
- Social media
- Documentation updates
-
Monitor:
- GitHub Issues for bug reports
- Download counts
- User feedback
-
Update CLAUDE.md:
- Document any new features
- Update version references
- Archive old session notes if needed
# Standard release process
git add src/Lfm.Cli/Lfm.Cli.csproj lfm-mcp-release/server.js CHANGELOG.md
git commit -m "chore: Bump version to 1.6.0"
git push
git tag -a v1.6.0 -m "Release v1.6.0"
git push --tagsThat's it! GitHub Actions handles the rest.