Claude independence: edakit with Copilot, Qwen, Mistral and OpenCode, and with self-hosted models¶
A source
This page is a source of edakit – a concept, a prompt or the rules of a session –, shown as it is in the repository. Read it as such; the guides say what edakit does.
Status 2026-11-01: decided. Asked for by the owner ("write a concept – Claude independence; I want to open it for Qwen
and Llama, Mistral and Copilot"), where "Llama" meant running models oneself – "I mean the LLM self-hosting, not the LLM
itself" –; decisions 1, 2 and 4 taken by the owner the same day in a decision round in Claude Code's form, the rest
decided by Claude on the owner's word ("make a proposal") and confirmed by the owner the same day (the table at the
end); OpenCode added by the owner the same day ("maybe OpenCode integration too?"); the third item of the README's
"Future work" on the owner's word the same day; nothing built – the steps CI.0 to CI.7 start on the owner's word, listed
in TODO.md. Written against main at e4b82a0. The findings on edakit come from its code, skills, agents, hooks, tests
and evals at that commit; those on the other harnesses and models from their documentation and source, read on
2026-11-01 from the repositories the sites are built from – docs.github.com and code.visualstudio.com were not reachable
from the session, their sources were –, each with its commit or date under "Sources". What rests only on search
summaries is marked so.
The short answer¶
edakit's checks are independent of Claude already: the command line, the catalog, the engines, the simulation, the gate
and the EasyEDA MCP server run without Claude Code (uvx … edakit <command>). What binds edakit to Claude is the layer
that steers the model: the plugin's format and marketplace, two hooks in Claude Code's protocol, the session identity
behind the EasyEDA claim, 27 paths through ${CLAUDE_PLUGIN_ROOT}, two tool names – AskUserQuestion and Claude in
Chrome –, MCP tool names in three agents, and the eval runner.
The ground has moved in edakit's favour. Claude Code's plugin format has become the format others read: GitHub Copilot's
CLI installs plugins with .claude-plugin/plugin.json and marketplace.json, gives Claude-format hooks Claude's
payloads and matchers, and hands plugin hooks CLAUDE_PLUGIN_ROOT; since VS Code 1.143 its default agent runs the same
runtime. Qwen Code installs Claude Code plugins and converts their agents, skills, hooks and MCP servers. Mistral Vibe
imports a plugin's skills and MCP servers, not yet its agents and hooks. Agent Skills (SKILL.md) and AGENTS.md are
read by all of them.
Proposed: the plugin made portable once, so that Copilot, Qwen Code and – for skills and MCP – Vibe take it from the same marketplace; project files generated from the plugin for what a harness does not take (Vibe's agents, the working agreements where a harness has no session-start hook, and OpenCode, which takes no plugin but reads skills, Markdown sub-agents and TypeScript plugins); a few things moved into the command line, where every harness reaches them; and support measured, not claimed – the evals run for every pair of harness and model, and the README names the pairs that pass.
Two findings set the expectations. Self-hosting works in all four harnesses – Copilot through the user's own key with Ollama or any OpenAI-compatible endpoint, Qwen Code through an OpenAI-compatible base URL, Vibe through its llama.cpp provider, OpenCode through Ollama, llama.cpp, vLLM or LM Studio –, so that a project's files can stay on the user's machine. And the open models are behind on long agentic work – in Qwen's own report its newest coding model scores 25.8 on Terminal-Bench 2.0 in Qwen Code against 37.1 for Claude Sonnet 4.5; edakit's checks catch a wrong result, not a model that stops halfway. edakit's own development – the sessions in this repository, CLAUDE.md, the Action proposals – stays on Claude.
What binds edakit to Claude today¶
| Place | What is Claude Code's | Where it binds |
|---|---|---|
.claude-plugin/plugin.json, marketplace.json |
the plugin format; the EasyEDA server started with ${CLAUDE_PLUGIN_ROOT} in its arguments |
distribution, the MCP server's start |
skills/*/SKILL.md (13) |
front matter name, description – Agent Skills – and argument-hint; ${CLAUDE_PLUGIN_ROOT} 27 times in 18 skills and agents, 18 of them paths into the handbook; AskUserQuestion in decision-round and new-project; Claude in Chrome in cart and release |
paths, two tools |
agents/*.md (7) |
front matter name, description, tools; 3 tool lists name mcp__plugin_edakit_easyeda__… |
the plugin's MCP tool names |
hooks/hooks.json |
SessionStart: edakit/agreements.py answers with hookSpecificOutput.additionalContext; PreToolUse: edakit/lock.py with permissionDecision: deny, matched on mcp__plugin_edakit_easyeda__.*\|mcp__easyeda__.* |
the hook protocol, MCP tool names |
edakit/lock.py, doctor.py |
the session is CLAUDE_CODE_SESSION_ID or the hook's session_id; without one nothing is claimed |
the EasyEDA claim |
skills/new-project/SKILL.md |
writes .claude/settings.json (extraKnownMarketplaces, enabledPlugins) |
the project's files |
evals/ (7 cases) |
the runner claude plugin eval; graders regex, tool_used (tool: Bash), a judge |
the runner, the transcript tool_used reads |
README.md, handbook/ |
"Claude" 10 times in the README, 82 in the handbook; chapter 11 "Working with Claude Code" | words |
the command line, the checks, edakit/easyeda/mcp-server.sh |
nothing – stdio MCP for any client | – |
Three tests hold Claude Code's names: tests/test_references.py resolves every ${CLAUDE_PLUGIN_ROOT}/… path,
tests/test_plugin.py wants "AskUserQuestion" in new-project and the hook line python3
"${CLAUDE_PLUGIN_ROOT}/edakit/agreements.py". They change with the plugin, on the same branch.
What the other harnesses read¶
| Harness | Takes the Claude Code plugin | Skills | Sub-agents | Hooks: session start / before a tool | MCP tool names | Question tool | Headless | Local models |
|---|---|---|---|---|---|---|---|---|
| Claude Code | – | the plugin's, .claude/skills |
agents/*.md |
yes / yes | mcp__plugin_edakit_easyeda__<tool> |
AskUserQuestion | claude -p, claude plugin eval |
– |
| GitHub Copilot CLI (GA 2026-02-25); VS Code 1.143 runs the same runtime by default | yes, as a "legacy plugin": .claude-plugin/plugin.json and marketplace.json; enabledPlugins from .claude/settings.json |
.github/skills, .claude/skills, .agents/skills |
.github/agents/*.agent.md, .claude/agents/*.md; the task tool |
yes / yes; PascalCase events get Claude's payloads, matchers and tool names; plugin hooks get CLAUDE_PLUGIN_ROOT |
the model sees server-tool; in hook payloads not documented |
ask_user |
copilot -p --output-format json |
own key: OpenAI-compatible endpoints, Ollama – the docs' example is qwen3:8b |
| Qwen Code 0.26.5 | yes: installs Claude Code marketplace plugins and converts agents, skills, hooks, MCP servers | .qwen/skills, .agents/skills, configurable |
.qwen/agents/*.md |
yes / yes, Claude Code's events and matchers | mcp__<server>__<tool> |
ask_user_question, Claude's schema; refuses in plain -p |
qwen -p |
OpenAI, Anthropic, Gemini protocols; Ollama, vLLM, LM Studio |
| Mistral Vibe 3.0.4 | in part: skills, commands, .mcp.json; agents not, a plugin's hooks "not supported yet" |
.agents/skills, .vibe/skills |
TOML in .vibe/agents/ |
no / yes (pre_tool in hooks.toml) |
mcp_<server>.<tool> |
ask_user_question |
vibe -p |
Mistral's API, llama.cpp |
| OpenCode 1.19 / 2.2 | no | .opencode/skills, .claude/skills, .agents/skills |
.opencode/agents/*.md |
through JS/TS plugins only | <server>_<tool> |
question |
opencode run --format json |
Ollama, LM Studio, vLLM, llama.cpp |
| Goose 1.57 | hooks only (hooks/hooks.json, Open Plugins) |
.agents/skills, .claude/skills |
.agents/agents, .claude/agents |
observe only / yes | <extension>__<tool> |
none; MCP elicitation | goose run --output-format json |
Ollama, LM Studio, vLLM |
AGENTS.md is read by Copilot, Qwen Code, Vibe, OpenCode and Goose. No cross-tool standard covers sub-agents or hooks:
Agent Plugins 1.0.0 standardises skills and MCP only and calls "commands, hooks, agents, rules, and LSP servers" too
client-specific; in practice the others accept Claude Code's formats. Copilot's own documentation adds the caveat that
supporting a format "doesn't guarantee that every component works in every harness" – the probe CI.0 is there for that.
The models¶
| Model | Weights and licence | Where it runs | Agentic results, who ran them |
|---|---|---|---|
| Claude Sonnet 5.5 – through Claude Code or Copilot | closed | hosted | Terminal-Bench 4.0 70.6 % (Anthropic, 2026-09-28) |
| Qwen3-Coder-Next, 80B with 3B active | open, Apache-2.0 (per summaries) | local, or Qwen's API | SWE-bench Verified 70.6 to 71.3; Terminal-Bench 2.0 25.8 in Qwen Code, Sonnet 4.5 37.1 in the same report (Qwen, 2026-02-03) |
| Mistral Medium 3.5, 128B dense – Vibe's default | open, modified MIT (per summaries) | Mistral's API; on four GPUs by Mistral's word (per summaries) | SWE-bench Verified 77.6 % (Mistral, per summaries) |
| Devstral Small 2, 24B | open, Apache-2.0 (per summaries) | one GPU; retired on Mistral's API on 2026-03-31 (per summaries) | SWE-bench Verified 56.4 % (SWE-bench team, mini-SWE-agent) |
There is no like-for-like comparison with the current Sonnet; for edakit the comparison that counts is its own evals. Copilot hosts Claude, GPT, Gemini, Grok, MAI and Kimi models, no Qwen, Llama or Mistral; those reach Copilot through the user's own key or a local Ollama.
Self-hosting. Ollama and llama.cpp run open models on one's own machine and serve them through an OpenAI-compatible
endpoint; vLLM and LM Studio do the same. Copilot CLI finds Ollama's models by itself and needs a model with tool
calling and streaming – the docs' example is copilot --model local/qwen3:8b –; VS Code takes a custom endpoint or
Ollama through its extension; Qwen Code takes a baseUrl; Vibe has llama.cpp as a built-in provider at
127.0.0.1:8080/v1. Which model passes edakit's evals on which hardware is measured, not assumed – the first matrix
runs Qwen3-Coder-Next and Devstral Small 2 self-hosted. A model's licence is the user's matter and can restrict use:
Llama 4's use policy, for one, grants individuals and companies in the EU no rights under its Section 1(a) for its
multimodal models – support, not legal advice, nothing legally guaranteed, without any claim to correctness.
The proposal¶
Two routes¶
The plugin, made portable – for the harnesses that take it: Copilot (CLI and VS Code), Qwen Code, and Vibe for skills and MCP. One plugin, one marketplace, one source; each harness installs it its own way.
Project files, generated from the plugin – for what a harness does not take from it: the working agreements as a
marked section of AGENTS.md where there is no session-start hook (Vibe); sub-agents in Vibe's TOML; and for OpenCode,
which takes no plugin, the skills into .agents/skills, the sub-agents into .opencode/agents/ with mode: subagent,
the EasyEDA server in opencode.json with codemode: false – so that its tools stay single tools a hook sees, not
calls inside Code Mode's one tool –, and a small TypeScript plugin in .opencode/plugins/edakit/ that calls edakit
lock hook before an EasyEDA tool (ctx.tool.hook("execute.before")) and adds the working agreements to the session
(ctx.session.hook("context")), for OpenCode 2. Goose when a user asks. edakit assistant <name> --write writes them,
--check reports drift, as edakit graph json --check does for the graph; [project] assistants = ["claude",
"copilot"] in edakit.toml names a project's harnesses, new-project asks for them, and the check runs in the pre-commit
hook and CI. A harness's configuration then is text in the project's repository, written from edakit's – the yardstick.
What changes in the plugin¶
Each change with its test, the plugin working in Claude Code as before:
- Paths. The 18 reads of
${CLAUDE_PLUGIN_ROOT}/handbook/…becomeedakit handbook <section>– the section alone, which also spares a smaller model's context –, the other 9edakit root. in Claude Code these paths work today, Copilot documents no expansion in a skill's text;tests/test_references.pyresolves the new forms. - The MCP server's start. Copilot documents
${PLUGIN_ROOT}for a server's arguments, Claude Code uses${CLAUDE_PLUGIN_ROOT}; the start line takes a form both expand – which one, CI.0 finds out. - The claim's hook.
lock.pyrecognises EasyEDA's tools by their own name (easyeda_…) under every harness's prefix –mcp__plugin_edakit_easyeda__,mcp__easyeda__,easyeda-,mcp_easyeda.…–, the matcher widens with it; the hook command keeps the environment variable Copilot also sets. No wrapper around easyeda-mcp-pro – CLAUDE.md allows no self-extended MCP server. - The session.
lock.pyanddoctor.pyreadEDAKIT_SESSION, thenCLAUDE_CODE_SESSION_IDand the session field of the harness's hook input. - The question tool. decision-round and new-project name the tool by what it does and list each harness's name –
AskUserQuestion,
ask_user,ask_user_question,question–; the written list stays the fallback ("Without the tool the list alone, answered in writing"), and it is what a headless run gets. - The browser. cart and release name, beside Claude in Chrome, Chrome DevTools MCP with
--autoConnect– the user's running Chrome, after a permission dialog – or the harness's own browser. The skill's rules stay: it never orders and never pays, andedakit cart checkholds what comes back against the job and the release, whichever browser filled the form. - The agents' tools. Tool names every harness here accepts (Bash, Read, Edit, Write, WebFetch, WebSearch …); the EasyEDA tools in the form CI.0 shows Copilot and Qwen Code to map.
- new-project writes a harness's settings beside
.claude/settings.jsonfor each entry of[project] assistants– Copilot readsenabledPluginsandextraKnownMarketplacesfrom that file already.
What moves into the command line¶
edakit handbook and edakit root (above); edakit agreements --write FILE | --check, the digest the SessionStart
hook prints today as a section of an instructions file; EDAKIT_SESSION for the claim; EDAKIT_CALL_LOG, every edakit
command appending its arguments, for the evals.
Evals for every pair¶
The cases and their graders stay. A runner evals/run.py --harness H --model M scaffolds as today, runs the harness
headless – copilot -p, qwen -p, vibe -p, opencode run – and grades: regex on the files and the last message;
tool_used from EDAKIT_CALL_LOG instead of a transcript each harness writes differently; the judge with one fixed
model, so that pairs compare. claude plugin eval stays the runner for Claude Code. One case is added because the loops
are what edakit hands the model: a seeded fault fixed until edakit gate passes P, G and E – going back after a failed
stage. A pair is supported when it passes every case in two of three runs; the README lists the supported pairs with
the date and edakit's version, and a pair that passes the offline cases but not the loop as limited.
The first matrix: Copilot with Claude Sonnet and with a GPT model; Copilot and Qwen Code with Qwen3-Coder-Next self-hosted through Ollama; Vibe with Mistral Medium 3.5 through Mistral's API and with Devstral Small 2 self-hosted through llama.cpp; OpenCode with Qwen3-Coder-Next self-hosted through llama.cpp.
What stays on Claude¶
edakit's own development – the sessions in this repository, CLAUDE.md, .claude/skills/, the Action proposals on the
owner's credentials – stays as it is, and the pipeline's rules are not touched. The checks, the tool chains and the data
are the same for every harness.
Steps¶
| Step | What | Size | Waits for |
|---|---|---|---|
| CI.0 | Probe, before anything is built: the plugin as it is, in Copilot CLI, Qwen Code and Mistral Vibe at once (decision 1), and OpenCode with its files set by hand; add-led, fault-motors, a decision round and the hooks, each with a hosted and a self-hosted model; what breaks is the list for CI.1 and CI.4 | S | the confirmation |
| CI.1 | The plugin portable: items 1 to 5, 7 and 8 above, each with its test; edakit handbook, edakit root |
M | CI.0 |
| CI.2 | edakit agreements --write\|--check, EDAKIT_CALL_LOG |
S | – |
| CI.3 | The eval runner across harnesses, the loop case, the first matrix | M | CI.1, CI.2 |
| CI.4 | edakit assistant vibe\|opencode --write\|--check – Vibe's agents as TOML and the agreements in AGENTS.md; OpenCode's skills, sub-agents, MCP entry and TypeScript plugin – alongside CI.1; Goose when a user asks |
M | CI.0 |
| CI.5 | The browser for cart and release (item 6) | S–M | CI.1 |
| CI.6 | new-project asks for the assistants; project-surveyor reports a harness's files a project brings | S | CI.4 |
| CI.7 | The documentation: chapter 11 with the table of harnesses, the README's supported pairs, the glossary's "assistant", the first property of "edakit as a meta-harness" (documentation.md, decision 14) | S–M | CI.3 |
Costs and risks¶
- Moving targets. The harnesses change their formats every few months, and Copilot's documentation itself warns that a supported format does not mean every component works. CI.0 before CI.1, a test per adapter, and an adapter whose harness changes and nobody uses is dropped.
- Weaker models. The checks catch a wrong result; they do not catch a model that stops early, loops, or misreads a finding. edakit lowers what the model must know about circuits, not what it must do as an agent over a long run. The evals show it, and a pair that fails is not listed.
- The claim. Every harness in the table can stop a tool call before it runs – Claude Code, Copilot, Qwen Code, Vibe
and Goose with a hook, OpenCode through a plugin –, so the claim can follow; where a hook does not see an MCP call
(OpenCode 2 routes MCP tools through one tool,
execute, unless a server setscodemode: false– the generated entry does), parallel sessions can collide on EasyEDA. The edakit commands still claim. A documented limit. - Data and cost. A cloud harness sends the project's files to its provider; a local model keeps them on the machine and needs the hardware. The choice is the user's, and the documentation says what goes where.
- Licences. edakit bundles no model; the model's licence is the user's matter, and what the documentation says about it is information, not legal advice.
- The owner's tokens. CI.0 to CI.7 are about eight sessions, CI.4 one more per further harness.
Decisions¶
Decisions 1, 2 and 4 taken by the owner on 2026-11-01 in a decision round in Claude Code's form; the rest decided by Claude on the owner's word – "we are writing a concept … details … make a proposal" – and confirmed by the owner the same day.
| # | Question | Recommendation | Alternatives | Decision |
|---|---|---|---|---|
| 1 | The order | Copilot (CLI and VS Code) – it takes the plugin, the owner works in VS Code, and it reaches local Qwen through the user's key –; then Qwen Code; then Mistral Vibe; OpenCode and Goose when a user asks | Qwen Code first, the closest to Claude Code; all at once | the owner's choice: all at once – Copilot, Qwen Code and Mistral Vibe in parallel; Copilot first was recommended and not taken; OpenCode added by the owner the same day |
| 2 | The approach | the plugin made portable, project files generated where a harness does not take it | a generated copy per harness; a separate plugin per harness | accepted |
| 3 | Paths in the skills | edakit handbook and edakit root for every harness, Claude Code included – one plugin |
keep ${CLAUDE_PLUGIN_ROOT} and hope the others expand it |
decided by Claude on the owner's word: edakit handbook and edakit root for every harness – confirmed |
| 4 | "Llama" | read as Meta's model; the owner meant self-hosting – "I mean the LLM self-hosting, not the LLM itself" | – | self-hosting in scope, through Ollama and llama.cpp in all three harnesses, other runtimes through an OpenAI-compatible endpoint; Meta's Llama models not in scope |
| 5 | "Supported" | every case in two of three runs | three of three; a table of results without a threshold | decided by Claude: every case in two of three runs – confirmed |
| 6 | The claim | lock.py recognises EasyEDA's tools under every harness's naming |
a matcher list per harness | decided by Claude: lock.py recognises EasyEDA's tools under every harness's naming – confirmed |
| 7 | A project's harnesses | [project] assistants with generated, checked files |
per person, untracked | decided by Claude: [project] assistants with generated, checked files – confirmed |
| 8 | The words | "the assistant" for the role, the harness by name where it is meant – changes decision 4 of documentation.md and the first property of "edakit as a meta-harness" to "built on an agent harness, Claude Code first" | as today | decided by Claude: "the assistant" for the role, the harness by name – confirmed |
Decided by Claude besides, and confirmed: "all at once" are the harnesses the owner named – Copilot, Qwen Code, Mistral
Vibe, and OpenCode since the owner's addition –, Goose when a user asks; OpenCode through project files and a TypeScript
plugin for OpenCode 2, the EasyEDA server with codemode: false; Ollama and llama.cpp are the self-hosting runtimes the
evals run first.
Sources¶
- edakit at
e4b82a0:.claude-plugin/,skills/,agents/,hooks/hooks.json,edakit/agreements.py,edakit/lock.py,edakit/doctor.py,evals/,tests/test_plugin.py,tests/test_references.py, CLAUDE.md. - GitHub Docs, read from github/docs at
33b1f4a(2026-10-31): copilot/reference/copilot-cli-reference/cli-plugin-reference, cli-command-reference, cli-programmatic-reference; copilot/reference/hooks-reference; copilot/reference/custom-agents-configuration; copilot/concepts/customizations/agent-skills; copilot/how-tos/copilot-cli/customize-copilot/add-llm-models; copilot/reference/ai-models/supported-models. github/copilot-cli, changelog.md (latest entry 2026-10-27). - VS Code docs, read from microsoft/vscode-docs at
5a54a29(2026-10-30): agents/run/agent-harnesses, agent-customization/agent-plugins, agent-customization/hooks, agents/run/browser-tools; release notes 1.108 to 1.143. - Agent Skills: agentskills.io/specification (2026-08-04) and /clients (2026-08-09); agents.md (2026-03-12); Agent Plugins 1.0.0, github.com/agentplugins/agent-plugins-spec (2026-07-24).
- Qwen Code at
cea3331(2026-11-01): README, docs/users, packages/core/src/extension/claude-converter.ts, askUserQuestion.ts. OpenCode, github.com/anomalyco/opencode at4f3156a. Goose, github.com/aaif-goose/goose atb23d21c. Mistral Vibe, github.com/mistralai/mistral-vibe at338ad4b: README, CHANGELOG.md, vibe/core/plugins/_claude.py. Chrome DevTools MCP, github.com/ChromeDevTools/chrome-devtools-mcp (2026-10-30). - Models: meta-llama/llama-models – the Llama 4 USE_POLICY (its clause on the EU); SWE-bench, data/leaderboards.json (2026-09-01); Qwen3-Coder-Next technical report (2026-02-03); anthropic.com/news/claude-sonnet-5-5 (2026-09-28). Per search summaries only, not read: Mistral Medium 3.5 and the Devstral models (mistral.ai, docs.mistral.ai), Qwen's licences, Meta's Muse models.