Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion docs/presets-and-clients.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
22 changes: 11 additions & 11 deletions tests/release-version.test.ts
Original file line number Diff line number Diff line change
@@ -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");
Expand All @@ -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."
);
});

Expand Down Expand Up @@ -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");
});
});