Skip to content

chore(release): v0.22.0 - #68

Merged
kaiser-data merged 1 commit into
mainfrom
release/v0.22.0
Oct 1, 2026
Merged

kaiser-data merged 1 commit into
mainfrom
release/v0.22.0

Conversation

@kaiser-data

Copy link
Copy Markdown
Owner

Release v0.22.0. It ships what #67 merged:

  • Security: tool calls (auth, key, auto(keys=)) can no longer set KITSUNE_* or launch/supply-chain env vars (NODE_OPTIONS, LD_PRELOAD, PIP_INDEX_URL, proxies, CA bundles, …). Before this, a prompt-injected agent could switch off the trust gate, the Docker cage or the SSRF block.
  • Added: an opt-in action guard (stage 1) in front of every downstream tool call. It's off unless ~/.kitsune/policy.json exists.

This is a minor version rather than a patch because of the new guard.

This PR only bumps versions (pyproject.toml, package.json, server.json ×3, uv.lock) and dates the CHANGELOG.

Verified locally

  • The wheel builds as kitsune_mcp-0.22.0.
  • A fresh-venv install of kitsune-mcp[ws] resolves mcp 1.30.0.
  • The stdio server registers all 9 lean tools, and status() runs.
  • 909 passed, 2 skipped; ruff check and format are clean.

After merge: tag v0.22.0 on main. That triggers release.yml and publish.yml (PyPI, npm, MCP Registry).

🤖 Generated with Claude Code

Bump pyproject.toml, package.json and server.json (3 occurrences) to 0.22.0
and relock. CHANGELOG's [Unreleased] becomes [0.22.0].

Minor rather than patch: alongside the security fix (tool calls can no longer
set KITSUNE_* or launch/supply-chain env vars), this ships the opt-in action
guard (stage 1, off unless ~/.kitsune/policy.json exists).

Verified: wheel builds as kitsune_mcp-0.22.0; fresh-venv install of
`kitsune-mcp[ws]` resolves mcp 1.30.0, the stdio server registers all 9 lean
tools and status() runs with no guard line when no policy exists;
909 passed / 2 skipped; ruff check + format clean.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

🫀 flight recorder py3.13 — newest last, each line ~15s apart

t+  0s log=0B frozen=0s | loadavg=1.17 0.52 0.20 2/260 2214 | psi_io=avg10=11.09 psi_mem=avg10=0.00 | MemTotal=15989M MemFree=12572M MemAvailable=14916M SwapTotal=3071M SwapFree=3071M Committed_AS=2022M
t+8s CLEAN EXIT — suite finished
collected test.log tail
am_with_nl_task_returns_empty PASSED [ 97%]
tests/test_v019_intent_router.py::TestInferArgsEnhanced::test_repo_param_extracts_owner_repo PASSED [ 97%]
tests/test_v019_intent_router.py::TestInferArgsEnhanced::test_repo_param_no_match_returns_empty PASSED [ 97%]
tests/test_v019_works_now.py::TestWorksNowScore::test_zero_config_official_stdio_is_highest PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_missing_creds_lowers_score PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_smithery_http_scores_lower_than_official_stdio PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_source_tier_ordering PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_stdio_beats_http_same_source PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_high_token_cost_penalized PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_score_never_exceeds_one PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_score_non_negative PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_unknown_source_gets_zero_tier_bonus PASSED [ 98%]
tests/test_v019_works_now.py::TestCandidateSortUsesWorksNow::test_works_now_score_exported_from_registry PASSED [ 99%]
tests/test_v019_works_now.py::TestCandidateSortUsesWorksNow::test_official_stdio_sorts_before_smithery_http PASSED [ 99%]
tests/test_v0201_fixes.py::TestAuthServerIdGuard::test_server_id_with_value_returns_error PASSED [ 99%]
tests/test_v0201_fixes.py::TestAuthServerIdGuard::test_server_id_with_value_does_not_write_env PASSED [ 99%]
tests/test_v0201_fixes.py::TestAuthServerIdGuard::test_server_id_logout_does_not_write_env PASSED [ 99%]
tests/test_v0201_fixes.py::TestAuthServerIdGuard::test_plain_env_var_all_caps_still_saves PASSED [ 99%]
tests/test_v0201_fixes.py::TestAuthServerIdGuard::test_env_var_no_hyphen_passes_guard PASSED [ 99%]
tests/test_v0201_fixes.py::TestAutoCompositeRank::test_relevant_beats_merely_operable PASSED [ 99%]
tests/test_v0201_fixes.py::TestAutoCompositeRank::test_works_now_breaks_ties_among_equally_relevant PASSED [ 99%]
tests/test_v0201_fixes.py::TestAutoCompositeRank::test_exact_name_match_dominates PASSED [100%]

================================ tests coverage ================================
_______________ coverage: platform linux, python 3.13.15-final-0 _______________

Coverage XML written to file coverage.xml
======================== 909 passed, 2 skipped in 7.05s ========================

recent kmsg
(quiet)

@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

🫀 flight recorder py3.12 — newest last, each line ~15s apart

t+  0s log=0B frozen=0s | loadavg=0.76 0.23 0.08 1/253 2206 | psi_io=avg10=21.69 psi_mem=avg10=0.00 | MemTotal=15988M MemFree=12560M MemAvailable=14896M SwapTotal=3071M SwapFree=3071M Committed_AS=2049M
t+8s CLEAN EXIT — suite finished
collected test.log tail
am_with_nl_task_returns_empty PASSED [ 97%]
tests/test_v019_intent_router.py::TestInferArgsEnhanced::test_repo_param_extracts_owner_repo PASSED [ 97%]
tests/test_v019_intent_router.py::TestInferArgsEnhanced::test_repo_param_no_match_returns_empty PASSED [ 97%]
tests/test_v019_works_now.py::TestWorksNowScore::test_zero_config_official_stdio_is_highest PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_missing_creds_lowers_score PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_smithery_http_scores_lower_than_official_stdio PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_source_tier_ordering PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_stdio_beats_http_same_source PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_high_token_cost_penalized PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_score_never_exceeds_one PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_score_non_negative PASSED [ 98%]
tests/test_v019_works_now.py::TestWorksNowScore::test_unknown_source_gets_zero_tier_bonus PASSED [ 98%]
tests/test_v019_works_now.py::TestCandidateSortUsesWorksNow::test_works_now_score_exported_from_registry PASSED [ 99%]
tests/test_v019_works_now.py::TestCandidateSortUsesWorksNow::test_official_stdio_sorts_before_smithery_http PASSED [ 99%]
tests/test_v0201_fixes.py::TestAuthServerIdGuard::test_server_id_with_value_returns_error PASSED [ 99%]
tests/test_v0201_fixes.py::TestAuthServerIdGuard::test_server_id_with_value_does_not_write_env PASSED [ 99%]
tests/test_v0201_fixes.py::TestAuthServerIdGuard::test_server_id_logout_does_not_write_env PASSED [ 99%]
tests/test_v0201_fixes.py::TestAuthServerIdGuard::test_plain_env_var_all_caps_still_saves PASSED [ 99%]
tests/test_v0201_fixes.py::TestAuthServerIdGuard::test_env_var_no_hyphen_passes_guard PASSED [ 99%]
tests/test_v0201_fixes.py::TestAutoCompositeRank::test_relevant_beats_merely_operable PASSED [ 99%]
tests/test_v0201_fixes.py::TestAutoCompositeRank::test_works_now_breaks_ties_among_equally_relevant PASSED [ 99%]
tests/test_v0201_fixes.py::TestAutoCompositeRank::test_exact_name_match_dominates PASSED [100%]

================================ tests coverage ================================
_______________ coverage: platform linux, python 3.12.14-final-0 _______________

Coverage XML written to file coverage.xml
======================== 909 passed, 2 skipped in 6.58s ========================

recent kmsg
(quiet)

@kaiser-data
kaiser-data merged commit a5ee05c into main Oct 1, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant