Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
30e121a
feat(assets): spec-typed global file assets
apicircle-dev Jul 10, 2026
a2af40c
feat(mocks): run or import a spec asset as a mock server
apicircle-dev Jul 10, 2026
7a5bf96
feat(import): import an OpenAPI/Swagger spec into a collection
apicircle-dev Jul 11, 2026
cf8a7e0
feat(mocks): promote a mock endpoint into a collection
apicircle-dev Jul 11, 2026
a18d646
feat(assets): track spec-asset usage (mocks + imported collections)
apicircle-dev Jul 11, 2026
91aecdb
feat(mocks): add "Serve OpenAPI contract" run-live entry point
apicircle-dev Jul 11, 2026
d033321
fix(mocks): make live contract mocks truly read-only + truncate long …
apicircle-dev Jul 12, 2026
f6e9421
feat(mocks): convert a live contract mock into an editable one
apicircle-dev Jul 12, 2026
39c8d77
feat(mocks): update a live contract mock by re-uploading the revised …
apicircle-dev Jul 18, 2026
a0c049c
fix(mocks): hide (not just disable) mutation CTAs in the read-only ed…
apicircle-dev Jul 18, 2026
c08d552
feat(mocks): promote to collection with a Mock env, folder, and whole…
apicircle-dev Jul 18, 2026
7cd9450
refactor(mocks): extract mock->collection promotion into a shared cor…
apicircle-dev Jul 18, 2026
b1b89c1
feat(mocks): mock->collection parity for the MCP server + VS Code ext…
apicircle-dev Jul 18, 2026
58bfbbe
test(mcp): update the second promote_endpoint test to the runnable-re…
apicircle-dev Jul 18, 2026
39eff76
fix(vscode): keep coverage/ and .turbo/ out of the published VSIX
apicircle-dev Jul 18, 2026
b760a86
chore(release): 1.3.0
apicircle-dev Jul 18, 2026
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
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ but with:
read the same source of truth the UI uses, no IPC required.
- **Local mock servers**: describe an API in OpenAPI / Postman / Insomnia and
run a Hono-backed mock on `localhost`.
- An **MCP server**: exposes the workspace as a 94-tool catalog any
- An **MCP server**: exposes the workspace as a 97-tool catalog any
Model Context Protocol client (Codex Desktop, ChatGPT, Cursor, Copilot,
Codex, Continue, Cline, Zed, Windsurf) can drive.
- A **CLI** for headless use
Expand Down Expand Up @@ -262,7 +262,7 @@ studio/
│ ├── git/ GitHub REST client + typed error taxonomy
│ ├── ui-components/ ALL React UI + the Zustand store + IndexedDB persistence
│ ├── mock-server-core/ Hono mock-server engine + OpenAPI/Postman/Insomnia parsers
│ ├── mcp-server/ stdio MCP host + 94-tool catalog + workspace providers
│ ├── mcp-server/ stdio MCP host + 97-tool catalog + workspace providers
│ └── cli/ `apicircle` binary — mock / mcp / import / export / run / workspaces
├── examples/ Demo workspaces + a standalone mock-server example
├── docs/ Product + architecture + QA docs (see §9)
Expand Down
99 changes: 98 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,107 @@
> ship. Full per-platform walk-through:
> [`docs/installing.md`](docs/installing.md).

## 1.2.1 - Unreleased
## 1.3.0 - 2026-07-18

_All workspace packages move to **1.3.0** in lockstep — the published
`@apicircle/shared`, `@apicircle/core`, `@apicircle/mock-server-core`,
`@apicircle/mcp-server`, `@apicircle/cli`, and the `apicircle-vscode` VS Code
extension, plus the private desktop / web / ui-components / git / desktop-shell
packages. Highlights: the **spec asset hub** (upload an OpenAPI/Swagger spec
once, then serve it live or import it as a mock, import it as a collection, and
promote mock endpoints into runnable requests) and **Mock → collection parity**
across the app, the MCP server, and the VS Code extension._

### Added

- **Mock → collection parity across the MCP server + VS Code (catalog 96 → 97).**
`mock.promote_endpoint` now produces a RUNNABLE request like the app —
ensuring the active `Mock` environment (`MOCK_BASE_URL` + `MOCK_PORT`,
prefilled from the mock's port else `8080`, existing values preserved),
dropping it in a `<name> (mock)` folder, and templating the URL
`{{MOCK_BASE_URL}}:{{MOCK_PORT}}<path>` — and a new
`mock.promote_to_collection` tool promotes every endpoint at once. The VS Code
extension gains matching **Add to Collection** (mock endpoint node) + **Add
All to Collection** (mock server node) commands. All surfaces go through one
shared `buildMockPromotion` (`@apicircle/core`), so the web/desktop store, the
MCP server, and the VS Code extension stay in lockstep.
(`@apicircle/shared`, `@apicircle/core`, `@apicircle/mcp-server`, VS Code)
- **Spec-typed Global File Assets (additive).** Uploading an OpenAPI 3.x /
Swagger 2.0 document (`.json` / `.yaml` / `.yml`) into the Global Assets
**Files** library now parses it once on upload and records a `SpecAssetMeta`
summary (`dialect`, `format`, `title`, `version`, `operationCount`,
`warnings`) on the asset. The Assets panel shows a spec badge
("OpenAPI 3 · N ops") plus a parsed summary in the file editor, and the MCP
`assets.list_files` envelope gains a `spec` field (`null` for ordinary files).
Purely additive — existing assets and non-spec files are untouched. Foundation
for spec-driven mock servers and code-vs-spec drift.
(`@apicircle/shared`, `@apicircle/mock-server-core`, `@apicircle/ui-components`,
`@apicircle/mcp-server`)
- **Mock servers from a spec asset — "run live" vs "import & edit" (additive).**
A mock server can now be built from an uploaded spec asset (`GlobalFileAsset`)
in two modes: **linked** ("run live" — endpoints derive from the asset and stay
in sync; read-only) or **materialized** ("import & edit" — parsed into editable
endpoints). New `MockServerSource` variant
`{ kind: 'openapi-asset', assetId, format, mode }` + an `isLinkedMockSource`
helper; the store resolves the asset's bytes → parses → materializes, auto-
refreshes linked mocks when the asset changes, and keeps linked mocks read-only
on every surface. New `refreshMockServer` store action + `mock.refresh` MCP tool
(catalog **94 → 95**). Two distinct entry points in the Mocks header: **New
Mock Server → From spec asset** imports a contract as editable endpoints
(materialized), and **Serve OpenAPI contract** stands up a live, read-only
server straight from a contract (linked) with a spec preview, name, and port.
The mock panel shows a "Served directly from contract" callout and a friendly
source label for a live contract server, and the endpoint editor is fully
read-only for a linked mock — mutation CTAs (Add rule, Import rule, Add param,
Add header, Add multiplier, …) are hidden (not just disabled) and their
empty-state copy drops the "click Add …" hints, every remaining native control
is disabled via `<fieldset disabled>`, the Monaco response-body editor is
read-only, and an explanatory banner says why — so a live contract mock can't
be hand-edited. A live
contract mock can be **converted to an editable mock** in place (the Mocks
kebab, the read-only banner, or the panel callout) — this flips it to a
materialized copy while keeping the spec link, so "Re-import from spec" still
works. When the contract itself changes, **Update spec…** (the Mocks kebab or
the panel callout) re-uploads the revised OpenAPI/Swagger file — replacing the
shared asset's bytes and live-refreshing the linked mock's endpoints. Long
mock-server names now truncate in the sidebar so the per-server actions menu
stays reachable.
(`@apicircle/shared`, `@apicircle/mock-server-core`, `@apicircle/ui-components`,
`@apicircle/mcp-server`, VS Code)
- **Import an OpenAPI/Swagger spec into a collection (editor, additive).** The
editor's unified Import modal now recognises OpenAPI 3.x / Swagger 2.0
(`Auto-detect`, or the explicit "OpenAPI / Swagger" source) — paste or upload a
spec and it becomes a new folder with one request per operation (method, path,
query/header/path params). The Global Assets spec editor gains an **Import to
collection** button that imports straight from the stored asset. `ApiRequest`
gains additive `specAssetId` + `operationId` back-refs so an imported
collection knows which spec asset + operation each request came from.
(`@apicircle/shared`, `@apicircle/ui-components`)
- **Promote mock endpoints into a collection (additive).** A mock's endpoint
kebab has **Add to collection**, and the server kebab has **Add all to
collection** (the whole mock at once) — available even on read-only "run live"
mocks. Promoted requests target the live mock: they land in a
**"<name> (mock)" folder** with a `{{MOCK_BASE_URL}}:{{MOCK_PORT}}<path>` URL,
backed by a dedicated, activated **"Mock" environment** (`MOCK_BASE_URL` =
`http://localhost`; `MOCK_PORT` prefilled from the server's port, else `8080`;
existing values preserved on re-promote) so you can retarget host/port before
running. New `promoteMockToCollection` store action alongside
`promoteMockEndpointToRequest`; `mock.promote_endpoint` was added to the MCP
server here (catalog 95 → **96**) and later brought to full parity with the
app — the same env, folder, and templated URL, across MCP + VS Code (see the
Mock → collection parity entry above). A shared
`requestShapeFromMockEndpoint(ep, urlPrefix)` mapper keeps promoted +
OpenAPI-imported requests identical.
(`@apicircle/ui-components`, `@apicircle/mcp-server`)
- **Spec-asset usage tracking (additive).** The Global Assets usage index now
counts, per spec asset, the mock servers whose source it is (`openapi-asset`)
and the requests imported from it (`Request.specAssetId`) — so the Assets
panel's "Used in N" and the delete confirmation surface the mocks and
collections a spec backs. This completes the spec-asset hub: upload a spec
once, then run/import it as a mock, import it as a collection, promote mock
endpoints into requests, and (in the Lens edition) drift-check code against it,
all referencing the same asset.
(`@apicircle/shared`, `@apicircle/ui-components`)
- **UI sections/mode seam (open-core, additive).** Building on the `extraPanels`
seam, the React shell (`@apicircle/ui-components`) now accepts edition-contributed
top-level **sections** ("modes") via an optional `App` `sections` prop
Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ but with:
read the same source of truth the UI uses, no IPC required.
- **Local mock servers**: describe an API in OpenAPI / Postman / Insomnia and
run a Hono-backed mock on `localhost`.
- An **MCP server**: exposes the workspace as a 94-tool catalog any
- An **MCP server**: exposes the workspace as a 97-tool catalog any
Model Context Protocol client (Claude Desktop, ChatGPT, Cursor, Copilot,
Codex, Continue, Cline, Zed, Windsurf) can drive.
- A **CLI** for headless use
Expand Down Expand Up @@ -310,7 +310,7 @@ studio/
│ │ (root = Node + swagger-parser; `/parsing` subpath =
│ │ browser-safe, in-document `$ref` only — used by the
│ │ web/desktop renderer to materialize endpoints at import)
│ ├── mcp-server/ stdio MCP host + 94-tool catalog + workspace providers
│ ├── mcp-server/ stdio MCP host + 97-tool catalog + workspace providers
│ ├── desktop-shell/ Reusable Electron main-process building blocks —
│ │ OS-keychain secrets, mock / MCP / workspace-file IPC
│ │ bridges, OAuth2 callback server, window-state. Composed
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ rebuilt around two ideas the others miss:
branch. Teams collaborate the way they collaborate on code — branches,
diffs, pull requests, review.
2. **Your workspace is an AI tool catalog.** A built-in Model Context Protocol
server exposes **94 tools**, so Claude, ChatGPT, Cursor, Copilot, and any
server exposes **97 tools**, so Claude, ChatGPT, Cursor, Copilot, and any
other MCP client can read, author, and run requests on your behalf.

No cloud account. No vendor lock-in. Your data stays on your machine and in
Expand Down Expand Up @@ -80,7 +80,7 @@ The bundled `@apicircle/mcp-server` speaks the open
[Model Context Protocol](https://modelcontextprotocol.io) over stdio, so it
works with **Claude Desktop, Claude Code, ChatGPT, GitHub Copilot, Cursor,
Continue, Cline, Zed, and Windsurf** — or anything else that talks MCP. The
94-tool catalog covers request and folder CRUD, environment authoring,
97-tool catalog covers request and folder CRUD, environment authoring,
assertions, execution plans, history, mock-server lifecycle, the release
ledger (publish / deprecate / withdraw), linked-workspace config (list / pin /
scope / unlink), codebase scanning, imports, code generation, and
Expand Down Expand Up @@ -437,7 +437,7 @@ packages/
shared/ Types, generateId, validators, encryption helpers
git/ GitHub API client + sync logic
mock-server-core/ Hono mock-server engine + OpenAPI/Postman/Insomnia parsers
mcp-server/ stdio MCP host with the 94-tool catalog
mcp-server/ stdio MCP host with the 97-tool catalog
cli/ `apicircle` binary — mock / mocks / mcp / import / export / run / workspaces
```

Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@apicircle/desktop",
"version": "1.2.0",
"version": "1.3.0",
"private": true,
"description": "Electron shell that hosts the API Circle Studio UI with native OS-keychain secret storage.",
"homepage": "https://github.com/apicircle/studio",
Expand Down
2 changes: 2 additions & 0 deletions apps/vscode/.vscodeignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
src/**
test/**
out/**
coverage/**
.turbo/**
node_modules/**
.gitignore
.eslintrc*
Expand Down
15 changes: 15 additions & 0 deletions apps/vscode/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,21 @@ extension version lives in `package.json`.
> repository-root [`CHANGELOG.md`](../../CHANGELOG.md). This file is the
> extension-focused subset that ships inside the `.vsix`.

## 1.3.0 - 2026-07-18

### Added

- **Promote mock endpoints into a collection.** A mock server's endpoint node
now has an **Add to Collection** action, and the server node has **Add All to
Collection** — promote one endpoint or the whole mock at once. Promoted
requests land in a `<name> (mock)` folder with a
`{{MOCK_BASE_URL}}:{{MOCK_PORT}}<path>` URL, backed by a dedicated, activated
**Mock** environment (`MOCK_BASE_URL` + `MOCK_PORT`, prefilled from the mock's
port else `8080`) — so the request is runnable and easy to retarget. Behaves
identically to the Desktop/Web app and the MCP server (`mock.promote_endpoint`
/ `mock.promote_to_collection`); all three go through one shared builder in
`@apicircle/core`.

## 1.1.4 - 2026-06-22

### Added
Expand Down
2 changes: 1 addition & 1 deletion apps/vscode/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ VS Code is where the same engineers who use API Circle already live with Git. Ed

### MCP integration

- **94-tool MCP catalog** for AI clients — Claude Desktop, Claude Code, Codex, Cursor, Copilot, Windsurf, Zed, Continue, Cline.
- **97-tool MCP catalog** for AI clients — Claude Desktop, Claude Code, Codex, Cursor, Copilot, Windsurf, Zed, Continue, Cline.
- **One-click Copilot Chat install** — writes `.vscode/mcp.json` idempotently.
- **Per-client config snippets** — copy or direct-install MCP configuration.
- **Curated prompts** — 19 starter prompts across 7 categories in the MCP sidebar.
Expand Down
24 changes: 23 additions & 1 deletion apps/vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "apicircle-vscode",
"displayName": "API Circle Studio",
"description": "Git-backed API workspace with mocks, plans, and MCP — natively in VS Code.",
"version": "1.2.0",
"version": "1.3.0",
"publisher": "apicircle",
"private": false,
"license": "SEE LICENSE IN LICENSE",
Expand Down Expand Up @@ -1301,6 +1301,18 @@
"category": "API Circle",
"icon": "$(clippy)"
},
{
"command": "apicircle.addAllToCollection",
"title": "Add All to Collection",
"category": "API Circle",
"icon": "$(references)"
},
{
"command": "apicircle.addEndpointToCollection",
"title": "Add to Collection",
"category": "API Circle",
"icon": "$(add)"
},
{
"command": "apicircle.revealEndpointInMockYaml",
"title": "Reveal Endpoint in Mock YAML",
Expand Down Expand Up @@ -2013,6 +2025,11 @@
"when": "view == apicircle.mock && viewItem =~ /^mock-(idle|running)$/",
"group": "1_actions@3"
},
{
"command": "apicircle.addAllToCollection",
"when": "view == apicircle.mock && viewItem =~ /^mock-(idle|running)$/",
"group": "1_actions@4"
},
{
"command": "apicircle.deleteMock",
"when": "view == apicircle.mock && viewItem =~ /^mock-(idle|running)$/",
Expand Down Expand Up @@ -2043,6 +2060,11 @@
"when": "view == apicircle.mock && viewItem == mock-endpoint",
"group": "1_actions@3"
},
{
"command": "apicircle.addEndpointToCollection",
"when": "view == apicircle.mock && viewItem == mock-endpoint",
"group": "1_actions@4"
},
{
"command": "apicircle.revealEndpointInMockYaml",
"when": "view == apicircle.mock && viewItem == mock-endpoint",
Expand Down
Loading
Loading