Releases: TLS-Radar/tlsradar-claude-plugin
Release list
v0.7.0
More of /tls-cert moves from prose into tested code, issuance becomes
resumable across sessions, and the model-routing eval now runs on a
schedule.
Added
- Tested cert helper (
scripts/cert_helper.py+
cert_helper_test.py). The key/CSR generation that used to be a
hand-builtopenssl reqline in the prompt is now
cert_helper.py csr: it validates the domain before anything runs,
picks the SAN set the order expects (dns-01 = apex+www, http-01 =
apex), writes the key0600in a0700dir, and backs up an
existing key instead of clobbering it (the old key may be the only
copy of one still deployed). - Issued chains are verified before being presented as usable.
The fullchain PEM is server-provided (untrusted); it's saved with
the Write tool (no shell) andcert_helper.py verify-chainthen
parses the leaf with openssl and refuses (exit 2) unless its SANs
cover the requested domain - a wrong or garbage chain is caught
before the user installs it. On success it reports SANs, expiry,
and days remaining. - Resumable issuance.
/tls-certpersists each order to
~/.config/tlsradar/orders/<domain>.json(order_id, resume_token,
challenge, email, challenge records) and offers to resume an
in-flight order from a previous session instead of starting over.
Once issued, the file is markedcompleted_atand becomes local
history:/tls-renewreads it to reuse the saved email and
challenge method (with confirmation) instead of re-asking. - Scheduled LLM routing eval (
.github/workflows/llm-eval.yml).
The real model-routing eval (evals/run_evals.py --llm) now runs
weekly (and on manual dispatch) instead of being local-only, so a
routing regression is noticed within days. Skips cleanly when the
ANTHROPIC_API_KEYsecret is absent; never gates merges.
Changed
/tls-certand/tls-renewcall the cert helper instead of
hand-buildingopenssl req;cert_helper_test.pyruns in CI
alongside the DNS-provider tests.
v0.6.1
Close a shell-injection boundary in the DNS-provider flow (buildwithclaude
review follow-up).
Changed
- Untrusted challenge records never touch a shell. Previously
/tls-certinterpolated the MCP response'srecord.name/record.value
directly into thedns_provider.pycommand line, so shell expansion of
$(...), backticks, or;could happen before Python could reject the
value. Now/tls-certwrites the records to
~/.config/tlsradar/challenge-records.jsonwith the Write tool (no
shell), and the helper reads them via--records-file, structurally
validates each (json.loadcan't execute; non-string fields rejected),
runs the existing_acme-challenge/base64url checks on every record,
and only then performs the provider write or delete. Only the fixed file
path and the user's own domain reach the shell.
Added
- End-to-end repro test (
MainClosesShellBoundary) proving a malicious
TXT value (e.g.$(rm -rf ~)) returns exit 2 with the provider never
called, plus structural-validation and shell-metacharacter cases.
v0.6.0
Client-side hardening from the buildwithclaude marketplace review, and
removal of the SessionStart welcome hook.
Added
- DNS challenge validation before any provider write.
scripts/dns_provider.pynow requires--domainand refuses to write
(or delete) any record that isn't the expected_acme-challenge
record for that domain (apex or a subdomain of it), and rejects TXT
values that aren't plausible dns-01 tokens. A buggy or compromised
MCP response can no longer steer a Cloudflare/Route 53 write into an
unrelated zone you control./tls-certpasses--domain; new tests
cover suffix-confusion, unrelated zones, and bad values.
Changed
- Remote MCP responses are treated as untrusted data. The skill and
commands no longer relay server-authored strings (handoff.message,
nudge.message) verbatim or act on them. User-facing wording is
client-authored; only validated structured values (tier name, numeric
price/counts) are surfaced, with a fallback to/tls-upgradewhen a
field is missing or unexpected. The funnel behavior stays the same,
just bounded by client-side rules.
Removed
- The SessionStart welcome hook (the
hooks/directory). It printed
an onboarding banner and wrote a flag file on startup; a marketplace
reviewer flagged the automatic home-directory write and startup promo.
Attribution is unaffected - the install-id mint already lived in the
scan/cert commands, and the config dir is created on demand.
v0.5.1
Docs-only patch for clean strict plugin validation.
Changed
commands/README.mdfolded intoCONTRIBUTING.mdand removed.
claude plugin validate --strictparsed every flat.mdundercommands/
as a slash command and flagged the dev-doc README for having no frontmatter.
Moving it out ofcommands/clears that warning.- Refreshed stale doc lines to match 0.5.0: the
.mcp.json"install header"
note, the hook "install-id mint" note, and thecommands//skills/tree
labels inCLAUDE.mdandREADME.md.
No runtime or behavior changes.
v0.5.0
Marketplace-readiness: anonymous attribution no longer touches your shell
config or sends a tracking header.
Removed
- Shell-config modification. The plugin no longer appends anything to your
~/.zshrc/~/.bashrc/~/.profile. - Default tracking header.
.mcp.jsonno longer sends an
X-TLSRadar-Installheader. - The risky SessionStart hook operations. The welcome hook no longer runs
openssl, the legacymv …/credentials.jsonmigration, orrmcleanups, and
never touches your shell config. It now does only aprintfwelcome plus a
one-timetouchof a flag file in the plugin's own config dir (so it shows
once, not every session). The install id is created by/tls-scanand
/tls-certfrom the server response, not the hook.
Upgrading from 0.4.0: 0.4.0 added an
export TLSRADAR_INSTALL_ID=…line
(under a# tlsradar-install-idcomment) to your shell rc. The new hook
neither adds nor removes it — removing it would mean editing your shell
config again, the very thing we stopped doing. The line is now harmless (the
header that read it is gone), but you can delete those two lines yourself.
Changed
- Attribution now rides on a tool argument.
/tls-scanand/tls-cert
read the install id from~/.config/tlsradar/install_idand pass it as a
client_idargument — same anonymous, per-install signal, with no shell
changes and no header. Opt out by deleting that file. /tls-certnow states what your email is used for when it's collected:
the Let's Encrypt order and a one-time monitoring follow-up (marketing stays
opt-in, default off).- Tighter
/tls-certpermissions. Dropped the blanketBash(aws*)/
Bash(open*)grants and scopedpython3to the bundled DNS helper.