Files
wickra/repo-metadata.toml
T
kingchenc 91f6f67257 Add C# (.NET) binding over the C ABI hub (#226)
The first language stecker on the C ABI hub: a .NET binding exposing all 514
indicators as idiomatic `IDisposable` classes, generated from `wickra.h`.

## What's here

- **`bindings/csharp/`** — the `Wickra` .NET 8 package. `[LibraryImport]`
  source-generated P/Invoke (`NativeMethods.g.cs`) plus idiomatic wrappers
  (`Indicators.g.cs`), both generated from the committed `bindings/c/include/wickra.h`.
  The binding owns no indicator maths — it only marshals types across the C ABI.
- **Marshalling, verified end-to-end against the native library.** Opaque handles
  cross as `nint` kept alive per call via a `SafeHandle`; `bool` as
  `[MarshalAs(U1)]` (Rust `bool` is one byte); a self-correcting
  `DllImportResolver` validates the loaded library actually exports the Wickra
  ABI. Tests cover one representative per FFI archetype (scalar, candle, pairwise,
  multi-output, bars, profile, values-profile, order-book / array-input) plus
  exact Sma reference values.
- **NuGet packaging** — `dotnet pack` produces `Wickra.<version>.nupkg`; the
  release pipeline stages prebuilt native libraries under `runtimes/<rid>/native/`
  for six target triples (win/linux/osx × x64/arm64).
- **`examples/csharp/`** — nine examples mirroring `examples/c/`: streaming,
  backtest, multi_timeframe, parallel_assets, three strategies, and
  fetch_btcusdt + live_binance.
- **CI** — a `csharp` job on the three OSes builds the C ABI, tests the binding,
  and runs the offline examples. **Release** — a gated `csharp-publish` job packs
  and pushes to NuGet (gated on `NUGET_API_KEY`, independent of the GitHub-release
  job so a C# hiccup never blocks the C/C++ asset release).
- **Docs consistency wave** — README, CONTRIBUTING, CHANGELOG, examples/README,
  the issue / PR templates, `sync-about.yml`, and `.gitattributes`.

The native Python / Node / WASM bindings and the C ABI are untouched; this is
additive. Publishing to NuGet stays gated behind the release tag and the secret.
2026-06-09 14:32:05 +02:00

54 lines
1.8 KiB
TOML

# Single source of truth for repo-level identity (org slug, maintainer email,
# canonical URLs). The audit workflow `.github/workflows/sync-metadata.yml`
# parses this file and fails CI if any tracked file disagrees.
#
# Do NOT edit downstream files by hand for these fields. Edit here, then run
# the workflow locally to spot drift, fix the downstream files until the
# audit is green.
[repo]
org = "wickra-lib"
name = "wickra"
url = "https://github.com/wickra-lib/wickra"
docs_url = "https://docs.wickra.org"
docs_git = "https://github.com/wickra-lib/wickra-docs"
issues_url = "https://github.com/wickra-lib/wickra/issues"
discussions = "https://github.com/wickra-lib/wickra/discussions"
security_url = "https://github.com/wickra-lib/wickra/security/advisories/new"
[maintainer]
# `handle` is the natural-person credit shown in package manifests; it does
# not move with the GitHub org transfer. `github` is the org @-mention slug
# used in CODEOWNERS and prose.
handle = "kingchenc"
email = "support@wickra.org"
github = "wickra-lib"
[badges]
codecov_repo = "wickra-lib/wickra"
ci_workflow = "ci.yml"
[audit]
# Forbidden substrings that must not appear anywhere in the repo outside the
# allowlist below. These are the pre-migration values; if any one of them
# resurfaces in source, the audit workflow fails.
forbidden = [
"kingchenc/wickra",
]
# Paths that are exempt from the forbidden-substring scan. Historical
# CHANGELOG sections keep their prose unchanged; auto-generated and ignored
# folders never reach the repo but are listed for parity with `.git/info/exclude`.
allowlist = [
"target/",
"node_modules/",
"fuzz/target/",
".venv/",
"Cargo.lock",
"package-lock.json",
"bindings/node/index.js",
"bindings/node/index.d.ts",
"repo-metadata.toml",
".github/scripts/sync-metadata.py",
]