v0.1.0 — first OSS release
First public release on PyPI as bc-cli.
The PyPI distribution name is
bc-cli—bcliis squatted by an unrelated 2018-era package. The Python import name (import bcli) and CLI binary (bcli) are unaffected.
Added
- SDK —
BCClient(sync) andAsyncBCClient(async) for Microsoft Dynamics 365 Business Central. Profile-based and programmatic construction modes. - CLI — Typer-based
bcliwith subcommands for query (get), write (post/patch/delete/attach), config, auth, registry import, batch, saved queries (q), and ETL. - Three-tier endpoint resolution. Custom registry → standard v2.0 → fuzzy-match suggestion. Imports from Postman v2.1, raw JSON, or live
$metadata. - Auth — Client-credentials, device-code, browser (PKCE), and WorkOS AuthKit. Token cache with 5-min expiry buffer; OS keychain via
keyring. - Write safety —
SafeContextenforces explicitenvironment+company_idon writes; production writes requireconfirm_production=True. Thedisable_writesprofile flag adds an interactive confirmation before any mutating call. - Saved queries (
bcli q) — Named, parameterised aliases per-profile with type/pattern/min/max/enum validation. OData v4 escape on string interpolation intofilter:. - ETL pipeline — Built-in dlt source for incremental backup. Polaris REST catalog integration for Iceberg snapshots.
- Telemetry — Pluggable backends (
null,console,azure_monitor, arbitrarymodule:Class). Privacy-first defaults; opt-in capture of filter text and signed-in UPN. - Structured logging — JSON request logs on the
bcli.httplogger.
Security
Two independent review passes before publish. Highlights:
- Project-level
.bcli.tomlcannot override[telemetry] backend(closes an arbitrary-Python-import RCE). - Token and identity caches written with
0o600via atomic write; parent dir0o700. - WorkOS role cache expires after 1 hour.
@odata.nextLinkvalidated against a BC host allowlist before bearer attachment.- CI hardened — actions pinned by full SHA, default
permissions: contents: read,uv sync --locked. - Saved-query OData injection prevention.
See CHANGELOG.md for the full record.