Release Notes — CLI credential storage at rest

Sprint: SPRINT_20260501_004_Cli_token_encryption Module: CLI (src/Cli/) Audit finding closed: B4 (Pass-2 audit)

Summary

The StellaOps CLI no longer writes access tokens, refresh tokens, or any other secret-bearing field to ~/.stellaops/profiles.json in plaintext. Secrets are now persisted through an OS-native per-user secret store:

A new stella login --no-save flag (and matching STELLAOPS_LOGIN_NO_SAVE=1 env-var default) keeps tokens in process memory only — required for CI pipelines and kiosk runs.

Breaking changes

On-disk format. The CLI now writes a sibling secrets blob next to profiles.json. The cleartext file no longer carries token-shaped fields (accessToken, refreshToken, dpopPrivateKeyPem, tenantBearerTokens). External tools that grepped the cleartext file for a token will now find nothing.

This is not a CLI major-version bump because the migration is automatic and one-way:

Migration

No operator action is required for the encryption change — the CLI migrates on first read.

For CI / kiosk users who never want secrets persisted at all:

export STELLAOPS_LOGIN_NO_SAVE=1
stella auth login --client-id=ci-runner ...

For Linux headless servers without libsecret/dbus:

What changed under the hood

Test coverage