Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
86a49e7
draft
Dec 4, 2025
2411bdd
missing md document
Dec 4, 2025
a5a2104
Add transport abstraction: Sink/Source pattern with IAsyncEnumerable
Dec 4, 2025
ec60d91
Clean up C# protocol API: remove redundant types, consistent naming
Dec 4, 2025
92b02bf
Add Unix Socket transport and comprehensive transport tests
Dec 4, 2025
c756700
Implement NNG transport using ModelingEvolution.Nng package
Dec 4, 2025
278b94c
Add NNG pipe notifications for subscriber connection tracking
Dec 4, 2025
23871bf
Update IMPLEMENTATION_STATUS.md with NNG transport completion
Dec 4, 2025
b680522
C# implementation 100% complete - all tests pass
Dec 4, 2025
f41ec4e
Optimize C# code: zero-copy memory access, DRY, ConfigureAwait
Dec 4, 2025
8ed01a0
Add HIGH_LEVEL_API.md design document
Dec 4, 2025
1d4841d
Add high-level API design to ARCHITECTURE.md
Dec 4, 2025
9aa3ca3
Implement high-level API: Schema + DataContext pattern
Dec 4, 2025
d35cbb2
Add strongly-typed connection strings with IParsable and composable p…
Dec 4, 2025
7ba6f0e
Fix connection string format to use clean URL syntax
Dec 4, 2025
fad0020
Add comprehensive cross-platform tests and transport layer
Dec 4, 2025
f4ef29d
feat(epic-001): FrameMetadata SDK + NNG transport + transport fixes
Dec 9, 2025
4cc509b
fix(nng): Enable and fix NNG Pub/Sub tests
Dec 9, 2025
aa50ecd
Enable UiService EventStore integration tests
Dec 9, 2025
a3b0220
Enable all previously skipped tests - now 136 pass, 0 skipped
Dec 9, 2025
07b617b
fix(nng): Fix NNG tests to use factory methods and code quality
Dec 9, 2025
5a15793
refactor(sdk): Simplify FrameMetadata to 16 bytes, add NNG sink support
Dec 10, 2025
47da6f1
fix(tests): Use MicroPlumberd.Testing NuGet package instead of local …
Dec 10, 2025
8f535ae
Add SessionStreamId for NNG URL generation
Dec 16, 2025
ff69977
Add preview publishing workflow for feature branches
Dec 16, 2025
6aa8c64
Update CI/CD to support preview versions from feature branches
Dec 16, 2025
071a18f
Fix CI/CD: add missing using, .NET 10, PEP 440 version format
Dec 16, 2025
81c30b3
Fix Python controller tests for 16-byte FrameMetadata prefix
Dec 16, 2025
2cdb721
Add RocketWelder.BinaryProtocol package for WASM-compatible protocol …
Dec 18, 2025
8facd56
Fix preview version parsing to exclude preview tags
Dec 18, 2025
79dd9a2
Add InternalsVisibleTo for ModelingEvolution.RocketWelder.Tests
Dec 18, 2025
a66d687
Add explicit NNG sink URL configuration support
Dec 19, 2025
616c539
Fix Python preview version to be PEP 440 compliant
Dec 19, 2025
49d62a1
Use NuGet package in C# examples instead of ProjectReference
Dec 19, 2025
60ba86c
Unify TransportProtocol and flatten HighLevel namespace
Dec 21, 2025
5229ae3
feat(python): Refactor high-level API with client module and update e…
Dec 21, 2025
b5dd1f9
chore: Update examples to RocketWelder.SDK 1.1.34
Dec 21, 2025
1f38d9b
Refactor transport layer: proper separation of concerns
Dec 21, 2025
2a86bf5
feat: Add FrameSinkFactory, NullFrameSink, and file:// support
Dec 21, 2025
4914627
docs: Add BinaryProtocols design document
Dec 21, 2025
f6d349e
tests: Add TDD design alignment tests for BinaryProtocols API
Dec 21, 2025
a3959ae
feat(BinaryProtocol): Add encoding/decoding primitives for round-trip…
Dec 21, 2025
eefcd0d
docs: Update BinaryProtocols design with implementation summary
Dec 21, 2025
f880da3
refactor: Rename RocketWelder.BinaryProtocol to RocketWelder.SDK.Prot…
Dec 21, 2025
86efa7c
Add RocketWelder.SDK.Blazor package with WASM decoders and samples
Dec 21, 2025
dde96d5
fix: Update NuGet publish workflow for renamed packages
Dec 21, 2025
4c8636b
chore(examples): Update SDK reference to 1.1.37
Dec 22, 2025
1de2084
fix: Add server-side Unix socket support (Bind API)
Dec 22, 2025
3a9a876
chore(examples): Update SDK reference to 1.1.38
Dec 22, 2025
5749321
streaming overlay
Dec 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
222 changes: 222 additions & 0 deletions .github/workflows/preview-publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
name: Publish Preview SDKs

on:
push:
branches:
- 'feature/*'
paths:
- 'csharp/**'
- 'python/**'
workflow_dispatch:
inputs:
version:
description: 'Preview version (e.g., 1.1.34-preview.1)'
required: false
type: string

permissions:
contents: read

jobs:
preview-version:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
short_sha: ${{ steps.version.outputs.short_sha }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Generate preview version
id: version
run: |
# Use input version if provided
if [ -n "${{ github.event.inputs.version }}" ]; then
PREVIEW_VERSION="${{ github.event.inputs.version }}"
SHORT_SHA=$(git rev-parse --short HEAD)
echo "version=$PREVIEW_VERSION" >> $GITHUB_OUTPUT
echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT
echo "Preview version (from input): $PREVIEW_VERSION"
exit 0
fi

# Get latest stable tag (exclude preview tags)
LATEST_TAG=$(git tag -l 'v[0-9]*.[0-9]*.[0-9]*' | grep -v preview | sort -V | tail -n1 || echo "v0.0.0")
if [ -z "$LATEST_TAG" ]; then
LATEST_TAG="v0.0.0"
fi
VERSION="${LATEST_TAG#v}"

# Parse version components (only X.Y.Z, no suffixes)
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
MAJOR=${MAJOR:-0}
MINOR=${MINOR:-0}
PATCH=${PATCH:-0}
# Strip any non-numeric suffix from PATCH
PATCH=$(echo "$PATCH" | grep -oE '^[0-9]+' || echo "0")

# Bump patch for preview
PATCH=$((PATCH + 1))

# Get short SHA
SHORT_SHA=$(git rev-parse --short HEAD)

# Generate preview version
PREVIEW_VERSION="$MAJOR.$MINOR.$PATCH-preview.$SHORT_SHA"

echo "version=$PREVIEW_VERSION" >> $GITHUB_OUTPUT
echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT
echo "Preview version: $PREVIEW_VERSION"

publish-csharp-preview:
needs: preview-version
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Update version in csproj
run: |
VERSION="${{ needs.preview-version.outputs.version }}"
# Update BinaryProtocol version
cd csharp/RocketWelder.BinaryProtocol
sed -i "s/<Version>.*<\/Version>/<Version>$VERSION<\/Version>/" RocketWelder.BinaryProtocol.csproj
cd ..
# Update SDK version
cd RocketWelder.SDK
sed -i "s/<Version>.*<\/Version>/<Version>$VERSION<\/Version>/" RocketWelder.SDK.csproj

- name: Restore dependencies
working-directory: ./csharp
run: dotnet restore

- name: Build
working-directory: ./csharp
run: dotnet build --configuration Release --no-restore

- name: Pack BinaryProtocol
working-directory: ./csharp
run: dotnet pack RocketWelder.BinaryProtocol/RocketWelder.BinaryProtocol.csproj --configuration Release --no-build --output ./nupkg /p:PackageVersion=${{ needs.preview-version.outputs.version }}

- name: Push BinaryProtocol to NuGet
working-directory: ./csharp
run: |
dotnet nuget push ./nupkg/RocketWelder.BinaryProtocol.*.nupkg \
--api-key ${{ secrets.NUGET_API_KEY }} \
--source https://api.nuget.org/v3/index.json \
--skip-duplicate
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}

- name: Pack SDK
working-directory: ./csharp
run: dotnet pack RocketWelder.SDK/RocketWelder.SDK.csproj --configuration Release --no-build --output ./nupkg /p:PackageVersion=${{ needs.preview-version.outputs.version }}

- name: Push SDK to NuGet
working-directory: ./csharp
run: |
dotnet nuget push ./nupkg/RocketWelder.SDK.*.nupkg \
--api-key ${{ secrets.NUGET_API_KEY }} \
--source https://api.nuget.org/v3/index.json \
--skip-duplicate
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}

- name: Summary
run: |
echo "## C# Packages Preview Published to NuGet" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- **Version**: ${{ needs.preview-version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### RocketWelder.BinaryProtocol" >> $GITHUB_STEP_SUMMARY
echo '```bash' >> $GITHUB_STEP_SUMMARY
echo 'dotnet add package RocketWelder.BinaryProtocol --version ${{ needs.preview-version.outputs.version }}' >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### RocketWelder.SDK" >> $GITHUB_STEP_SUMMARY
echo '```bash' >> $GITHUB_STEP_SUMMARY
echo 'dotnet add package RocketWelder.SDK --version ${{ needs.preview-version.outputs.version }}' >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY

publish-python-preview:
needs: preview-version
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Create VERSION file
run: |
# Convert NuGet version to PEP 440 compliant version
# NuGet: 1.1.34-preview.a66d687 -> PyPI: 1.1.34.dev<run_number>
NUGET_VERSION="${{ needs.preview-version.outputs.version }}"
RUN_NUMBER="${{ github.run_number }}"

# Extract base version (before -preview)
BASE_VERSION=$(echo "$NUGET_VERSION" | sed 's/-preview.*//')

# Create PEP 440 compliant version: X.Y.Z.devN (development release)
PEP440_VERSION="${BASE_VERSION}.dev${RUN_NUMBER}"

echo "NuGet version: $NUGET_VERSION"
echo "PEP 440 version: $PEP440_VERSION"

cd python
echo "$PEP440_VERSION" > VERSION

- name: Install build dependencies
run: |
python -m pip install --upgrade pip
pip install build twine

- name: Build package
working-directory: ./python
run: python -m build

- name: Check package
working-directory: ./python
run: twine check dist/*

- name: Publish to Test PyPI
working-directory: ./python
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.TEST_PYPI_API_TOKEN }}
run: |
twine upload --repository testpypi dist/* --skip-existing
continue-on-error: true

- name: Publish to PyPI
working-directory: ./python
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: |
twine upload dist/* --skip-existing

- name: Summary
run: |
echo "## Python SDK Preview Published to PyPI" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- **Version**: ${{ needs.preview-version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "- **Package**: rocket-welder-sdk" >> $GITHUB_STEP_SUMMARY
echo "- **PyPI**: https://pypi.org/project/rocket-welder-sdk/" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Install with:" >> $GITHUB_STEP_SUMMARY
echo '```bash' >> $GITHUB_STEP_SUMMARY
echo 'pip install rocket-welder-sdk==${{ needs.preview-version.outputs.version }}' >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
70 changes: 60 additions & 10 deletions .github/workflows/publish-csharp-nuget.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
tags:
- 'v*.*.*'
- 'v*.*.*-preview*'
- 'csharp-v*.*.*'
workflow_dispatch:
inputs:
Expand All @@ -26,7 +27,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'
dotnet-version: '10.0.x'

- name: Set version
id: version
Expand All @@ -44,10 +45,20 @@ jobs:
- name: Update version in csproj
run: |
VERSION="${{ steps.version.outputs.version }}"
cd csharp/RocketWelder.SDK
# Update version in .csproj file
# Update SDK.Protocols version
cd csharp/RocketWelder.SDK.Protocols
sed -i "s/<Version>.*<\/Version>/<Version>$VERSION<\/Version>/" RocketWelder.SDK.Protocols.csproj
sed -i "s/<PackageVersion>.*<\/PackageVersion>/<PackageVersion>$VERSION<\/PackageVersion>/" RocketWelder.SDK.Protocols.csproj
cd ..
# Update SDK version
cd RocketWelder.SDK
sed -i "s/<Version>.*<\/Version>/<Version>$VERSION<\/Version>/" RocketWelder.SDK.csproj
sed -i "s/<PackageVersion>.*<\/PackageVersion>/<PackageVersion>$VERSION<\/PackageVersion>/" RocketWelder.SDK.csproj
cd ..
# Update SDK.Blazor version
cd RocketWelder.SDK.Blazor
sed -i "s/<Version>.*<\/Version>/<Version>$VERSION<\/Version>/" RocketWelder.SDK.Blazor.csproj
sed -i "s/<PackageVersion>.*<\/PackageVersion>/<PackageVersion>$VERSION<\/PackageVersion>/" RocketWelder.SDK.Blazor.csproj

- name: Restore dependencies
working-directory: ./csharp
Expand All @@ -57,11 +68,25 @@ jobs:
working-directory: ./csharp
run: dotnet build --configuration Release --no-restore

- name: Pack
- name: Pack SDK.Protocols
working-directory: ./csharp
run: dotnet pack RocketWelder.SDK.Protocols/RocketWelder.SDK.Protocols.csproj --configuration Release --no-build --output ./nupkg /p:PackageVersion=${{ steps.version.outputs.version }}

- name: Push SDK.Protocols to NuGet
working-directory: ./csharp
run: |
dotnet nuget push ./nupkg/RocketWelder.SDK.Protocols.*.nupkg \
--api-key ${{ secrets.NUGET_API_KEY }} \
--source https://api.nuget.org/v3/index.json \
--skip-duplicate
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}

- name: Pack SDK
working-directory: ./csharp
run: dotnet pack RocketWelder.SDK/RocketWelder.SDK.csproj --configuration Release --no-build --output ./nupkg /p:PackageVersion=${{ steps.version.outputs.version }}
- name: Push to NuGet

- name: Push SDK to NuGet
working-directory: ./csharp
run: |
dotnet nuget push ./nupkg/RocketWelder.SDK.*.nupkg \
Expand All @@ -70,16 +95,41 @@ jobs:
--skip-duplicate
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}

- name: Pack SDK.Blazor
working-directory: ./csharp
run: dotnet pack RocketWelder.SDK.Blazor/RocketWelder.SDK.Blazor.csproj --configuration Release --no-build --output ./nupkg /p:PackageVersion=${{ steps.version.outputs.version }}

- name: Push SDK.Blazor to NuGet
working-directory: ./csharp
run: |
dotnet nuget push ./nupkg/RocketWelder.SDK.Blazor.*.nupkg \
--api-key ${{ secrets.NUGET_API_KEY }} \
--source https://api.nuget.org/v3/index.json \
--skip-duplicate
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}

- name: Summary
run: |
echo "## C# SDK Published to NuGet" >> $GITHUB_STEP_SUMMARY
echo "## C# Packages Published to NuGet" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- **Version**: ${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "- **Package**: RocketWelder.SDK" >> $GITHUB_STEP_SUMMARY
echo "- **NuGet**: https://www.nuget.org/packages/RocketWelder.SDK" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "Install with:" >> $GITHUB_STEP_SUMMARY
echo "### RocketWelder.SDK.Protocols" >> $GITHUB_STEP_SUMMARY
echo "- **NuGet**: https://www.nuget.org/packages/RocketWelder.SDK.Protocols" >> $GITHUB_STEP_SUMMARY
echo '```bash' >> $GITHUB_STEP_SUMMARY
echo 'dotnet add package RocketWelder.SDK.Protocols --version ${{ steps.version.outputs.version }}' >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### RocketWelder.SDK" >> $GITHUB_STEP_SUMMARY
echo "- **NuGet**: https://www.nuget.org/packages/RocketWelder.SDK" >> $GITHUB_STEP_SUMMARY
echo '```bash' >> $GITHUB_STEP_SUMMARY
echo 'dotnet add package RocketWelder.SDK --version ${{ steps.version.outputs.version }}' >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### RocketWelder.SDK.Blazor" >> $GITHUB_STEP_SUMMARY
echo "- **NuGet**: https://www.nuget.org/packages/RocketWelder.SDK.Blazor" >> $GITHUB_STEP_SUMMARY
echo '```bash' >> $GITHUB_STEP_SUMMARY
echo 'dotnet add package RocketWelder.SDK.Blazor --version ${{ steps.version.outputs.version }}' >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
8 changes: 8 additions & 0 deletions .github/workflows/publish-python-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
tags:
- 'v*.*.*'
- 'v*.*.*-preview*'
- 'python-v*.*.*'
workflow_dispatch:
inputs:
Expand Down Expand Up @@ -38,6 +39,13 @@ jobs:
VERSION="${VERSION#v}"
VERSION="${VERSION#python-v}"
fi
# Convert preview versions to PEP 440 format
# 1.1.34-preview.1 -> 1.1.34a1
if [[ "$VERSION" == *"-preview"* ]]; then
BASE_VERSION="${VERSION%%-preview*}"
PREVIEW_NUM="${VERSION##*-preview.}"
VERSION="${BASE_VERSION}a${PREVIEW_NUM}"
fi
echo "VERSION=$VERSION" >> $GITHUB_ENV
echo "version=$VERSION" >> $GITHUB_OUTPUT

Expand Down
Loading
Loading