Commit Graph

5 Commits

Author SHA1 Message Date
Faris Laptop d832e748ec ci: guard on the tag itself, not the release object
CI / build (push) Successful in 34s
A tag can exist without a release (pushed by hand), and that still means
the version is taken. Checking the tag makes the failure say 'bump the
version' instead of surfacing a raw NuGet duplicate error.
2026-07-20 16:14:53 +05:00
Faris Laptop 7e80226bf2 ci: release from the production branch, version from the project file
CI / build (push) Successful in 39s
Release / release (push) Failing after 36s
Two branches: dev for everyday work, production for releases.

- ci.yml builds and packs on dev and on pull requests; it never publishes.
- release.yml runs on a push (usually a merge) into production: reads
  <Version> from the csproj, refuses to proceed if that tag already
  exists, publishes to nuget.org, and only then creates the tag and the
  Gitea release — so a tag always means a published package.
- Drop --skip-duplicate: a duplicate push must fail loudly instead of
  reporting success while shipping nothing.
2026-07-20 16:12:21 +05:00
Faris Laptop 2cd024f782 chore: extract the SDK into its own repository
CI / build (push) Successful in 33s
CI / publish (push) Successful in 32s
Standalone home for the CertifiEd .NET client SDK, split out of the
platform repository with its history.

- src/ layout with its own solution, Directory.Build.props and
  global.json (warnings as errors, XML docs required).
- Gitea Actions CI: build and pack on every push, publish to nuget.org
  on a v* tag using the NUGET_API_KEY secret.
- CONTRIBUTING documents the release flow and the one-time CI setup.
v1.0.0
2026-07-20 15:36:26 +05:00
Faris Laptop e0354458df feat: hardware binding modes, operator management, packaged SDK
- Hardware binding: License.HwBinding (none | fixed | firstActivation).
  firstActivation leaves the license unbound until the first activation,
  which claims the machine; afterwards it behaves like fixed. Legacy rows
  backfilled to fixed when a fingerprint was already set.
- Rebind: POST /panel/licenses/{id}/rebind moves a license to new
  hardware (or releases the binding), deactivating existing activations
  and re-signing a new version; 409 on revoked/expired. Operator or
  company admin. Audited, emits license.rebound.
- Operator management: list, invite, promote and demote operators
  (operator-only), guarding self-demotion and the last operator — until
  now a second operator could only be seeded directly into the database.
- SDK packaging: CertifiEd.Client is now a proper NuGet package (id,
  version, MIT license, README, XML docs, symbols) and gained the
  missing public XML documentation.
2026-07-20 14:16:51 +05:00
Faris Laptop 49725ddad5 feat: initial CertifiEd licensing platform
Self-hosted, multitenant licensing platform for on-prem software.

- Backend: .NET 10 Clean Architecture (Domain/Application/Infrastructure/Api),
  PostgreSQL 16 with ltree company tree, Ed25519 signing (NSec), cookie auth
  with Argon2id, role enforcement (Operator/Owner/Admin/Viewer over subtree),
  webhooks, audit log, rate limiting.
- Panel: Next.js 15 enterprise admin (RU/EN/TG), Ofarandagon light theme,
  command palette, license issue wizard, server-side pagination.
- Landing: Next.js 15 static export, awwwards-grade, RU/EN/TG + full SEO.
- Client SDK (CertifiEd.Client) with offline Ed25519 validation, heartbeat,
  feature gating; QuickStart example; usage docs.
2026-07-16 19:35:01 +05:00