From daaad6acd61bdb1c1d16a254538df4249472f516 Mon Sep 17 00:00:00 2001 From: mohammed naji Date: Sat, 18 Jul 2026 18:07:16 +0400 Subject: [PATCH] chore: prepare v0.3.0 release --- CHANGELOG.md | 2 ++ docs/presets-and-clients.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- tests/release-version.test.ts | 22 +++++++++++----------- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5b0daf2..87c9d9e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format ## [Unreleased] +## [0.3.0] - 2026-07-18 + ### Changed - [#96](https://github.com/mohanagy/miftah/issues/96) Confirmation-required MCP calls now default to human form elicitation and fail closed when the client cannot present that form. The former self-approval bearer path is available only through explicit `security.approvalMode: "delegated-agent"`, is hidden from normal tool discovery, and is audited as delegated authorization rather than human proof; approval records are bound to that form or delegated mechanism. diff --git a/docs/presets-and-clients.md b/docs/presets-and-clients.md index 1b0dd4b8..29b6efbf 100644 --- a/docs/presets-and-clients.md +++ b/docs/presets-and-clients.md @@ -3,7 +3,7 @@ This is the compatibility source of truth for generated `miftah init` configurations and client snippets. - Catalog version: `1` -- Miftah package version: `0.2.1` +- Miftah package version: `0.3.0` - Last tested / validation boundary: the catalog builds strict Miftah configuration that `validateConfig` accepts. The docs contract test checks generated configuration only; it does **not** construct a runtime, start, authenticate to, or smoke-test external providers. Miftah itself requires Node.js `>=20`. That does not establish an upstream server's Node requirement. diff --git a/package-lock.json b/package-lock.json index 994f5047..2d553df1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@lubab/miftah", - "version": "0.2.1", + "version": "0.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@lubab/miftah", - "version": "0.2.1", + "version": "0.3.0", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", diff --git a/package.json b/package.json index 8f1ae1da..28912194 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@lubab/miftah", - "version": "0.2.1", + "version": "0.3.0", "description": "Wrap any MCP. Use the right account without reconnecting.", "keywords": [ "mcp", diff --git a/tests/release-version.test.ts b/tests/release-version.test.ts index 744a83d8..ec385c41 100644 --- a/tests/release-version.test.ts +++ b/tests/release-version.test.ts @@ -1,7 +1,7 @@ import { readFileSync } from "node:fs"; import { describe, expect, it } from "vitest"; -const releaseVersion = "0.2.1"; +const releaseVersion = "0.3.0"; function readRepositoryFile(path: string): string { return readFileSync(new URL(`../${path}`, import.meta.url), "utf8"); @@ -21,13 +21,13 @@ function releaseNotes(changelog: string, version: string): string { return changelog.slice(match.index, end < 0 ? undefined : end); } -describe("v0.2.1 release artifacts", () => { +describe("v0.3.0 release artifacts", () => { it.each([ - "## [0.2.1] - 2026-7-17\n\n### Fixed\n", - "Release candidate: ## [0.2.1] - 2026-07-17\n\n### Fixed\n" + "## [0.3.0] - 2026-7-18\n\n### Fixed\n", + "Release candidate: ## [0.3.0] - 2026-07-18\n\n### Fixed\n" ])("requires a dated release heading at the start of a line", (changelog) => { expect(() => releaseNotes(changelog, releaseVersion)).toThrow( - "Unable to find the 0.2.1 changelog entry." + "Unable to find the 0.3.0 changelog entry." ); }); @@ -69,14 +69,14 @@ describe("v0.2.1 release artifacts", () => { const changelog = readRepositoryFile("CHANGELOG.md"); const notes = releaseNotes(changelog, releaseVersion); - expect(notes).toContain("### Fixed"); - for (const issue of ["#79", "#80"]) { + expect(notes).toContain("### Changed"); + for (const issue of ["#96", "#97", "#98"]) { expect(notes).toContain(issue); } - expect(notes).toMatch(/OAuth support boundary/iu); - expect(notes).toMatch(/threat.model/iu); - expect(notes).toMatch(/does not (?:implement|run).*native OAuth/iu); - expect(notes).toMatch(/upstream.owned|provider.owned/iu); + expect(notes).toMatch(/fail closed/iu); + expect(notes).toMatch(/delegated-agent/iu); + expect(notes).toMatch(/profile-switch confirmation/iu); + expect(notes).toMatch(/Claude Code/iu); expect(readRepositoryFile("README.md")).toContain("experimental and pre-1.0"); }); });