diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3062bbf..fe51272 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -52,4 +52,6 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: nuget-package
- path: artifacts/packages/*.nupkg
+ path: |
+ artifacts/packages/*.nupkg
+ artifacts/packages/*.snupkg
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..97d6a96
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,61 @@
+name: Release
+
+on:
+ push:
+ tags:
+ - 'v*.*.*'
+ workflow_dispatch:
+ inputs:
+ publish:
+ description: Publish to NuGet when NUGET_API_KEY is configured.
+ required: true
+ default: false
+ type: boolean
+
+permissions:
+ contents: read
+
+jobs:
+ package:
+ name: Build, test, pack, and publish
+ runs-on: ubuntu-latest
+ env:
+ NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 8.0.x
+
+ - name: Restore
+ run: dotnet restore Termii.SDK.sln
+
+ - name: Build
+ run: dotnet build Termii.SDK.sln --configuration Release --no-restore
+
+ - name: Unit tests
+ run: dotnet test tests/Termii.Tests/Termii.Tests.csproj --configuration Release --no-build --logger "trx;LogFileName=unit-tests.trx"
+
+ - name: Integration tests
+ run: dotnet test tests/Termii.IntegrationTests/Termii.IntegrationTests.csproj --configuration Release --no-build --logger "trx;LogFileName=integration-tests.trx"
+
+ - name: Pack
+ run: dotnet pack src/Termii/Termii.csproj --configuration Release --no-build --output artifacts/packages
+
+ - name: Upload package artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: nuget-package
+ path: |
+ artifacts/packages/*.nupkg
+ artifacts/packages/*.snupkg
+
+ - name: Publish to NuGet
+ if: ${{ (github.event_name == 'push' || inputs.publish) && env.NUGET_API_KEY != '' }}
+ run: dotnet nuget push "artifacts/packages/*.nupkg" --source https://api.nuget.org/v3/index.json --api-key "$NUGET_API_KEY" --skip-duplicate
diff --git a/Directory.Build.props b/Directory.Build.props
index bdc37b5..3c476b7 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -8,6 +8,13 @@
git
https://github.com/teesofttech/Termii.SDK
MIT
+ README.md
+ false
+ true
+ true
+ true
+ snupkg
+ true
Teesoft Tech
Teesoft Tech
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..4015f4d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 Teesoft Tech
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index d76eda1..6935849 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
# Termii .NET SDK
+[](https://github.com/teesofttech/Termii.SDK/actions/workflows/ci.yml)
+
A .NET SDK for the Termii messaging, token, and insights APIs.
> This SDK is in early development. The first milestones establish the client, tests, examples, API coverage matrix, and package structure before endpoint support is added feature by feature.
@@ -15,6 +17,12 @@ The initial repository setup includes:
## Usage
+Install the package:
+
+```bash
+dotnet add package Termii.SDK
+```
+
```csharp
using Termii;
@@ -88,3 +96,7 @@ Development is tracked through GitHub issues:
- CI, documentation, NuGet packaging, and GitHub Releases.
Official Termii documentation: https://developer.termii.com/
+
+## License
+
+This project is licensed under the MIT License.
diff --git a/docs/API_COVERAGE.md b/docs/API_COVERAGE.md
index 5351925..e153d47 100644
--- a/docs/API_COVERAGE.md
+++ b/docs/API_COVERAGE.md
@@ -32,8 +32,8 @@ The Termii docs describe a REST/JSON API and state that each account has its own
| Error handling and request validation | Implemented | #6, PR #19 |
| Reusable fake HTTP test helpers and opt-in live test conventions | Implemented | #10, PR #20 |
| README endpoint examples | Planned | #12 |
-| CI build/test/package validation | In progress | #11 |
-| NuGet package metadata and publishing workflow | Planned | #8 |
+| CI build/test/package validation | Implemented | #11, PR #22 |
+| NuGet package metadata and publishing workflow | In progress | #8 |
| First GitHub Release and NuGet publish | Planned | #13 |
## Endpoint Coverage
@@ -42,9 +42,9 @@ The Termii docs describe a REST/JSON API and state that each account has its own
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Messaging | Fetch sender IDs | GET | `/api/sender-id` | Query | `TermiiClient.SenderIds` | Planned | #3 | Planned unit + optional integration |
| Messaging | Request sender ID | POST | `/api/sender-id/request` | JSON body | `TermiiClient.SenderIds` | Planned | #3 | Planned unit + optional integration |
-| Messaging | Send SMS/channel message | POST | `/api/sms/send` | JSON body | `TermiiClient.Messaging` | In progress | #7 | Unit tests added |
-| Messaging | Send WhatsApp conversational message | POST | `/api/sms/send` | JSON body | `TermiiClient.Messaging` | In progress | #7 | Unit tests added |
-| Messaging | Send bulk message | POST | `/api/sms/send/bulk` | JSON body | `TermiiClient.Messaging` | In progress | #7 | Unit tests added |
+| Messaging | Send SMS/channel message | POST | `/api/sms/send` | JSON body | `TermiiClient.Messaging` | Implemented | #7, PR #21 | Unit tests added |
+| Messaging | Send WhatsApp conversational message | POST | `/api/sms/send` | JSON body | `TermiiClient.Messaging` | Implemented | #7, PR #21 | Unit tests added |
+| Messaging | Send bulk message | POST | `/api/sms/send/bulk` | JSON body | `TermiiClient.Messaging` | Implemented | #7, PR #21 | Unit tests added |
| Messaging | Send via Number API | POST | `/api/sms/number/send` | Query or JSON body, docs/examples vary | `TermiiClient.Messaging` or `TermiiClient.Numbers` | Planned | #5 | Planned unit + optional integration |
| Token | Send OTP token | POST | `/api/sms/otp/send` | JSON body | `TermiiClient.Token` | Planned | #4 | Planned unit + optional integration |
| Token | Verify OTP token | POST | `/api/sms/otp/verify` | JSON body | `TermiiClient.Token` | Planned | #4 | Planned unit + optional integration |
diff --git a/docs/RELEASING.md b/docs/RELEASING.md
new file mode 100644
index 0000000..52d189e
--- /dev/null
+++ b/docs/RELEASING.md
@@ -0,0 +1,27 @@
+# Releasing
+
+This project publishes the SDK as a NuGet package from version tags.
+
+## Versioning
+
+- Use semantic versioning.
+- Keep `VersionPrefix` in `src/Termii/Termii.csproj` aligned with the release tag.
+- Use preview suffixes for pre-release packages, for example `0.1.0-preview.1`.
+
+## Release Checklist
+
+1. Confirm all intended issues for the release are merged.
+2. Confirm CI is green on `main`.
+3. Update package metadata and README examples if needed.
+4. Update `VersionPrefix` in `src/Termii/Termii.csproj`.
+5. Create and push a tag like `v0.1.0`.
+6. Confirm the release workflow creates the package artifact.
+7. Confirm NuGet publishing succeeds when the `NUGET_API_KEY` secret is configured.
+
+## Required Secrets
+
+| Secret | Purpose |
+| --- | --- |
+| `NUGET_API_KEY` | API key used by the release workflow to publish to NuGet.org. |
+
+The release workflow skips the publish step when `NUGET_API_KEY` is not set, but still builds, tests, packs, and uploads the package artifact.
diff --git a/src/Termii/Termii.csproj b/src/Termii/Termii.csproj
index 4f665f2..1ed4ac4 100644
--- a/src/Termii/Termii.csproj
+++ b/src/Termii/Termii.csproj
@@ -3,8 +3,10 @@
netstandard2.0;net8.0
Termii
Termii
- Termii
+ Termii.SDK
+ 0.1.0
A .NET SDK for the Termii messaging, token, and insights APIs.
+ Initial SDK package metadata and release workflow preparation.
termii;sms;otp;messaging;dotnet;sdk
true
$(NoWarn);1591
@@ -12,6 +14,11 @@
+
+
+
+
+