Repository navigation
Releases
mcpp-ide 1.5.0
mcpp-ide 1.5.0
Changelog
The changelog is kept by series (X.Y); each section lists its components' releases.
1.5
1.5.0
Every component is 1.5.0: the backend, mcpp-vscode, mcpp-clion and mcpp-nvim (from 1.4.0).
- Tests by the mcpp test spec (mcpp docs/specs/test.md, SPEC-017 v2.0). The backend knows no test
framework by name. A program's cases are its listing (mcpp test --cases, B3), one listing per
project, kept: a listing is asked when cases are first shown and after a build or a test, and writing
a file shows the last listing and builds nothing. Cases run by identifier (--case, P4), whatever
framework or language wrote them. A framework's name and capabilities are whatmcpp test --guide
states of it (B6). The framework table (spec/test-frameworks.json), the static reading of cases with
mtest's manifest and the settingmcpp.test.macrosare removed. - Checks and output. A case carries the checks it ran and those that failed, each failure's
statement and whether the case went on (O3), and its own output (O8). VS Code shows one message per
failed check, a diff where both sides are stated, and the failed checks on the case's line. - Test sessions (O9). Where a project's framework states a test session and its mcpp gives launches
(test-launch-records, mcpp 2026.11.10.1), a run of some cases goes through the session, started once
per project: its cases arrive as they begin and end, and a run after the first does not start
mcpp testagain.mcpp.test.session(auto,off) chooses. - Tests run beside each other. A test runs at once in a lane of its own: two tests of a project, or
a test beside a build, do not wait for each other, and cancelling one leaves the other (mcpp
2026.11.10.1 releases its build directory before tests run).mcpp.runtime.concurrencyholds only
clean and pack. - One configuration for every test command. A listing, a run and a debug launch take the profile,
the target andmcpp.task.testArgsalike. Discovery after events is debounced. Debugging some cases of
a protocol program states the protocol's variables and the selection. - CLion. A run configuration names a test and its cases; its framework field is removed. The gutter
places a case's run on the first element of the line its program lists it at. - Neovim. Signs list the cases when a file is read, when the session starts and after a run.
- Protocol.
protocol.schema.jsonstatestest/cases,test/runCases,test/caseResultand
test/caseEventby the spec;frameworkoftest/runCasesis accepted and not read.
1.4
1.4.0
Every component is 1.4.0: the backend, mcpp-vscode, mcpp-clion and mcpp-nvim (from 1.3.0).
- A run of cases through a part names its program.
test/caseResultnames the program and the part
as the record states them, astest/resultdoes. 1.3.0 named the job's filter as the program: cases
run through a part (unit/a) were reported as the programunit/a, and CLion and Neovim placed them
under a suite of that name. mcpp names a run that selects cases (--case) after the program; such a
result carries no part. - Docs. The Neovim command of the test insights is
:Mcpp test.insights.
1.3
1.3.0
Every component is 1.3.0: the backend, mcpp-vscode, mcpp-clion and mcpp-nvim (from 1.2.1, 1.2.0, 1.2.0
and 1.2.0).
- A change of the backend begins a series. The VS Code and CLion packages carry the backend, so a
change of it is a change of every package: it is released asvX.Y.0, every component atX.Y.0,
and the backend is always its series'X.Y.0.Zis an editor plugin's own patch (vscode-,
clion-,nvim-vX.Y.Z), which carries its series' backend. The release refuses abackend-vtag,
a backend that is notX.Y.0, and a plugin's patch when a path of the backend has changed since its
series' tag. Backend 1.2.1 reachedxlings install mcpp-idealone; its change, mtest's cases read
with mtest's own static manifest, is in every package of 1.3.0. - Tests as mcpp states them (design 2026-11-10). A program of several files (
[test] programs = "directory", mcpp 2026.11.9.1) is shown with its files as children, each the part of the program a
run gives a process (unit/aofunit), and a part's record is attributed to its program; 1.2 listed
unitand lost the results ofunit/aandunit/b. A case carries its file, kind, tags, expectation
and the bounds on its metrics, from mtest's manifest and the program's listing. A whole run marks every
case of a protocol program, and a run of cases reports every part's record, not only the last.
xfailpasses,xpassfails as an unexpected pass, andinvalidis errored. A failure that states
both sides is a diff in VS Code, a comparison failure in CLion, and two lines in Neovim's buffer and
quickfix item.- Live results. With mcpp's
test-case-stream(mcpp#917), each case is shown as it begins and
ends (test/caseEvent). - Metrics. With
test-metrics, a case's metrics are shown against their bounds: at the end of its
line in VS Code and Neovim, and in its output in CLion. - Test Insights (
mcpp.test.insights;test/insights,test/history). It reads the runs mcpp
keeps intarget/mtest: the last run and its counts by kind; its failures and since when; each
metric's trend against its bound; the slowest and the flaky cases; the schedule with its critical
path. VS Code shows it in a webview, CLion in the mcpp tool window (both drawwebui/tests.html),
and Neovim as text. - Older mcpp. A view that needs a feature the project's mcpp does not state is left out, and
capabilities/explainnames the feature (tests.cases,tests.parts,tests.live,
tests.metrics). - Speed. The suite types of a project's tests are read again only when its test files change.
- CLion. The test tree is ID-based, so parts that run at once report into their own suites.
- Live results. With mcpp's
- The backend's tests are mtest's (mtest 0.5.2).
tests/unit,tests/e2e,tests/ctsand
tests/benchare each one program whose files declare their cases, with nomain; the rules
goldens and the published payloads sit beside the cases that read them.tests/benchbounds the
latency of a keystroke in a manifest of 400 dependencies, of reading a test file of 2000 cases, and
of the insights over 50 runs of 400 cases. testsupport'scheckis mtest's fatal expectation, and
CI reports each run withmtest reportin the job's summary. - A deprecated command is VS Code's alone.
commands/listoffered CLion the deprecated ids VS Code keeps
for earlier releases (mcpp.checkModuleSupport,mcpp.configureClangd, ...) once mcppls 0.21 named a
CLion action for what they forward; CLion declares none of them, so they were offered and not registered. - Dependencies. The backend builds with mcpp 2026.11.9.1, mcpplibs.os 0.4.2 and
mcpplibs.mtest.manifest 0.5.2. - mcppls 0.21. mcpp-clion is built and tested against the mcppls CLion plugin 0.21.0, whose one
package serves every system (mcppls-clion-<version>.zip, since mcppls 0.0.20); the build fetched
0.0.19's package of this machine. mcppls 0.21 numbers its versions as a series and a patch (0.0.21
is released as 0.21.0); the backend reads that version, its payloads (version 5) andmcppls status
as before.
1.2
backend 1.2.1
- mtest's cases as mtest reads them. The cases of a file of mtest are read with mtest's own
static manifest (mcpplibs.mtest.manifest0.4.1) instead of a reader of the backend's: an object
(UTest parse{"parse", [] { ... }}, andSuite,CTS,E2E,Benchor a suite type derived from
one) is a case, and so is each"name"_testit declares, under its name. A suite type the project's
tests declare in a module beside them (class Fixture : public CTSintests/cts/cts.cppm) is read
fromtests/and holds in every file that uses it. A file written for mtest 0.3 or 0.4 shows its
cases before it is built, as one written for 0.2 did.
1.2.0
The first series of one version for every component: the backend, mcpp-vscode, mcpp-clion and
mcpp-nvim are 1.2.0 (from 0.2.1, 1.1.1, 0.2.1 and 0.2.1).
- One series. A version is
X.Y.Z;X.Yis shared by the backend and every plugin,Zis each
component's own patch. The backend states its series in the initialize answer, and each plugin
checks protocol 2 and its series and refuses another, naming both versions and the install that
matches. A series release is taggedvX.Y.0;backend-,vscode-,clion-andnvim-vX.Y.Z
publish one component's patch, and CI checks that every component states one series. - mcppls payloads by their specification. The backend reads
payload.jsonas mcppls's S6 states
it: version 5 (mcppls 0.0.20 and later) takes this system's entry underplatformsand starts
<runner> <server.path>; version 4 serves the oneplatformit names. A payload that does not
serve this system is refused, naming the platforms it does serve. 0.2.1 ran a version 5 payload's
bin/mcppls.okbitself and failed. CLion makes every runner a payload names executable again. - Test results as mcpp states them. Statuses follow mcpp's test records value for value:
run_failis failed, or timed out when mcpp says so;compile_failis failed and says it did not
compile;not_runis skipped with mcpp's reason;builtis skipped as built only. 0.2.1 mapped
values mcpp never writes, so every failure was "errored" and a timeout was never seen. - Cases by the test protocol. A test program that implements the mtest test protocol (mcpp
2026.11.8.1, featuretest-protocol) is listed bymcpp test --casesand its cases run by
mcpp test --case, whatever framework wrote it; each case's result, duration and first failure's
place come from mcpp's record. A f...
mcpp-ide 1.4.0
mcpp-ide 1.4.0
Changelog
The changelog is kept by series (X.Y); each section lists its components' releases.
1.4
1.4.0
Every component is 1.4.0: the backend, mcpp-vscode, mcpp-clion and mcpp-nvim (from 1.3.0).
- A run of cases through a part names its program.
test/caseResultnames the program and the part
as the record states them, astest/resultdoes. 1.3.0 named the job's filter as the program: cases
run through a part (unit/a) were reported as the programunit/a, and CLion and Neovim placed them
under a suite of that name. mcpp names a run that selects cases (--case) after the program; such a
result carries no part. - Docs. The Neovim command of the test insights is
:Mcpp test.insights.
1.3
1.3.0
Every component is 1.3.0: the backend, mcpp-vscode, mcpp-clion and mcpp-nvim (from 1.2.1, 1.2.0, 1.2.0
and 1.2.0).
- A change of the backend begins a series. The VS Code and CLion packages carry the backend, so a
change of it is a change of every package: it is released asvX.Y.0, every component atX.Y.0,
and the backend is always its series'X.Y.0.Zis an editor plugin's own patch (vscode-,
clion-,nvim-vX.Y.Z), which carries its series' backend. The release refuses abackend-vtag,
a backend that is notX.Y.0, and a plugin's patch when a path of the backend has changed since its
series' tag. Backend 1.2.1 reachedxlings install mcpp-idealone; its change, mtest's cases read
with mtest's own static manifest, is in every package of 1.3.0. - Tests as mcpp states them (design 2026-11-10). A program of several files (
[test] programs = "directory", mcpp 2026.11.9.1) is shown with its files as children, each the part of the program a
run gives a process (unit/aofunit), and a part's record is attributed to its program; 1.2 listed
unitand lost the results ofunit/aandunit/b. A case carries its file, kind, tags, expectation
and the bounds on its metrics, from mtest's manifest and the program's listing. A whole run marks every
case of a protocol program, and a run of cases reports every part's record, not only the last.
xfailpasses,xpassfails as an unexpected pass, andinvalidis errored. A failure that states
both sides is a diff in VS Code, a comparison failure in CLion, and two lines in Neovim's buffer and
quickfix item.- Live results. With mcpp's
test-case-stream(mcpp#917), each case is shown as it begins and
ends (test/caseEvent). - Metrics. With
test-metrics, a case's metrics are shown against their bounds: at the end of its
line in VS Code and Neovim, and in its output in CLion. - Test Insights (
mcpp.test.insights;test/insights,test/history). It reads the runs mcpp
keeps intarget/mtest: the last run and its counts by kind; its failures and since when; each
metric's trend against its bound; the slowest and the flaky cases; the schedule with its critical
path. VS Code shows it in a webview, CLion in the mcpp tool window (both drawwebui/tests.html),
and Neovim as text. - Older mcpp. A view that needs a feature the project's mcpp does not state is left out, and
capabilities/explainnames the feature (tests.cases,tests.parts,tests.live,
tests.metrics). - Speed. The suite types of a project's tests are read again only when its test files change.
- CLion. The test tree is ID-based, so parts that run at once report into their own suites.
- Live results. With mcpp's
- The backend's tests are mtest's (mtest 0.5.2).
tests/unit,tests/e2e,tests/ctsand
tests/benchare each one program whose files declare their cases, with nomain; the rules
goldens and the published payloads sit beside the cases that read them.tests/benchbounds the
latency of a keystroke in a manifest of 400 dependencies, of reading a test file of 2000 cases, and
of the insights over 50 runs of 400 cases. testsupport'scheckis mtest's fatal expectation, and
CI reports each run withmtest reportin the job's summary. - A deprecated command is VS Code's alone.
commands/listoffered CLion the deprecated ids VS Code keeps
for earlier releases (mcpp.checkModuleSupport,mcpp.configureClangd, ...) once mcppls 0.21 named a
CLion action for what they forward; CLion declares none of them, so they were offered and not registered. - Dependencies. The backend builds with mcpp 2026.11.9.1, mcpplibs.os 0.4.2 and
mcpplibs.mtest.manifest 0.5.2. - mcppls 0.21. mcpp-clion is built and tested against the mcppls CLion plugin 0.21.0, whose one
package serves every system (mcppls-clion-<version>.zip, since mcppls 0.0.20); the build fetched
0.0.19's package of this machine. mcppls 0.21 numbers its versions as a series and a patch (0.0.21
is released as 0.21.0); the backend reads that version, its payloads (version 5) andmcppls status
as before.
1.2
backend 1.2.1
- mtest's cases as mtest reads them. The cases of a file of mtest are read with mtest's own
static manifest (mcpplibs.mtest.manifest0.4.1) instead of a reader of the backend's: an object
(UTest parse{"parse", [] { ... }}, andSuite,CTS,E2E,Benchor a suite type derived from
one) is a case, and so is each"name"_testit declares, under its name. A suite type the project's
tests declare in a module beside them (class Fixture : public CTSintests/cts/cts.cppm) is read
fromtests/and holds in every file that uses it. A file written for mtest 0.3 or 0.4 shows its
cases before it is built, as one written for 0.2 did.
1.2.0
The first series of one version for every component: the backend, mcpp-vscode, mcpp-clion and
mcpp-nvim are 1.2.0 (from 0.2.1, 1.1.1, 0.2.1 and 0.2.1).
- One series. A version is
X.Y.Z;X.Yis shared by the backend and every plugin,Zis each
component's own patch. The backend states its series in the initialize answer, and each plugin
checks protocol 2 and its series and refuses another, naming both versions and the install that
matches. A series release is taggedvX.Y.0;backend-,vscode-,clion-andnvim-vX.Y.Z
publish one component's patch, and CI checks that every component states one series. - mcppls payloads by their specification. The backend reads
payload.jsonas mcppls's S6 states
it: version 5 (mcppls 0.0.20 and later) takes this system's entry underplatformsand starts
<runner> <server.path>; version 4 serves the oneplatformit names. A payload that does not
serve this system is refused, naming the platforms it does serve. 0.2.1 ran a version 5 payload's
bin/mcppls.okbitself and failed. CLion makes every runner a payload names executable again. - Test results as mcpp states them. Statuses follow mcpp's test records value for value:
run_failis failed, or timed out when mcpp says so;compile_failis failed and says it did not
compile;not_runis skipped with mcpp's reason;builtis skipped as built only. 0.2.1 mapped
values mcpp never writes, so every failure was "errored" and a timeout was never seen. - Cases by the test protocol. A test program that implements the mtest test protocol (mcpp
2026.11.8.1, featuretest-protocol) is listed bymcpp test --casesand its cases run by
mcpp test --case, whatever framework wrote it; each case's result, duration and first failure's
place come from mcpp's record. A file of mtest's cases shows its"name"_testliterals, named
with their suites (parsing/an empty line), before anything is built. GoogleTest, Catch2 and
doctest without the protocol are listed and run as before (spec/test-frameworks.json). - Every test's own output. Each test and each case carries its whole output, passed or not
(head and tail past 1 MiB), and a failure carries the place its output names. A case run divides
the program's output among its cases by GoogleTest's boundaries. VS Code says the output to the
test's own item and shows a failure at its place, else at the test'smainor the case's macro;
CLion sends it to the test tree, with the place first in a failure's details; Neovim writes
mcpp://tests, one section per test and case, and puts the failures in the quickfix list. - Run entries with icons. VS Code's lenses above
mainare$(play) Runand$(debug-alt) Debug, and while the active editor is a target's entry the editor title's Run menu runs and
debugs it. Neovim's sign column shows ▶ on a program's and a test'smainand on each case, and a
result turns it into ✓ or ✗. CLion logs why a file has no run entry. - The platform as one release. The payloads' platform is
openkal-platform@0.24.4, whose okrun
enters an image in its convention's floating-point state (a decimal number is read on Windows as on
the other systems), and every dependency is one release
named by its identity (mcpplibs.os = "0.4.0"); mcpp 2026.11.7.1 or later builds them. - A Run shows its build as the terminal does. Run and Debug build through a launch job: mcpp's
own narration (Compiling, Finished) appears as it is written, in place of a fixed "building" line,
and the build's steps in the status bar (CLion, VS Code while it builds for the debugger, the
Neovim statusline), as for a Build. With mcpp 2026.11.7.2 an unchanged program's launch is
described on mcpp's fast path, 0.01 s where it was 0.1 to 0.3 s, so the program starts at once.
CLion records how long the build and the program's start took inidea.log. - Windows names reach the backend in one spelling. The backend runs as an ok image, whose names
are/-separated on every system; a project root, a working directory, a parent directory or a
payload an editor names asC:\Users\x\…is read through mcpplibs.os into its generic spelling
before anything is built from it, so it is absolute and its parts are components. Found by the
backend's tests runn...
mcpp-ide 1.3.0
mcpp-ide 1.3.0
Changelog
The changelog is kept by series (X.Y); each section lists its components' releases.
1.3
1.3.0
Every component is 1.3.0: the backend, mcpp-vscode, mcpp-clion and mcpp-nvim (from 1.2.1, 1.2.0, 1.2.0
and 1.2.0).
- A change of the backend begins a series. The VS Code and CLion packages carry the backend, so a
change of it is a change of every package: it is released asvX.Y.0, every component atX.Y.0,
and the backend is always its series'X.Y.0.Zis an editor plugin's own patch (vscode-,
clion-,nvim-vX.Y.Z), which carries its series' backend. The release refuses abackend-vtag,
a backend that is notX.Y.0, and a plugin's patch when a path of the backend has changed since its
series' tag. Backend 1.2.1 reachedxlings install mcpp-idealone; its change, mtest's cases read
with mtest's own static manifest, is in every package of 1.3.0. - Tests as mcpp states them (design 2026-11-10). A program of several files (
[test] programs = "directory", mcpp 2026.11.9.1) is shown with its files as children, each the part of the program a
run gives a process (unit/aofunit), and a part's record is attributed to its program; 1.2 listed
unitand lost the results ofunit/aandunit/b. A case carries its file, kind, tags, expectation
and the bounds on its metrics, from mtest's manifest and the program's listing. A whole run marks every
case of a protocol program, and a run of cases reports every part's record, not only the last.
xfailpasses,xpassfails as an unexpected pass, andinvalidis errored. A failure that states
both sides is a diff in VS Code, a comparison failure in CLion, and two lines in Neovim's buffer and
quickfix item.- Live results. With mcpp's
test-case-stream(mcpp#917), each case is shown as it begins and
ends (test/caseEvent). - Metrics. With
test-metrics, a case's metrics are shown against their bounds: at the end of its
line in VS Code and Neovim, and in its output in CLion. - Test Insights (
mcpp.test.insights;test/insights,test/history). It reads the runs mcpp
keeps intarget/mtest: the last run and its counts by kind; its failures and since when; each
metric's trend against its bound; the slowest and the flaky cases; the schedule with its critical
path. VS Code shows it in a webview, CLion in the mcpp tool window (both drawwebui/tests.html),
and Neovim as text. - Older mcpp. A view that needs a feature the project's mcpp does not state is left out, and
capabilities/explainnames the feature (tests.cases,tests.parts,tests.live,
tests.metrics). - Speed. The suite types of a project's tests are read again only when its test files change.
- CLion. The test tree is ID-based, so parts that run at once report into their own suites.
- Live results. With mcpp's
- The backend's tests are mtest's (mtest 0.5.2).
tests/unit,tests/e2e,tests/ctsand
tests/benchare each one program whose files declare their cases, with nomain; the rules
goldens and the published payloads sit beside the cases that read them.tests/benchbounds the
latency of a keystroke in a manifest of 400 dependencies, of reading a test file of 2000 cases, and
of the insights over 50 runs of 400 cases. testsupport'scheckis mtest's fatal expectation, and
CI reports each run withmtest reportin the job's summary. - A deprecated command is VS Code's alone.
commands/listoffered CLion the deprecated ids VS Code keeps
for earlier releases (mcpp.checkModuleSupport,mcpp.configureClangd, ...) once mcppls 0.21 named a
CLion action for what they forward; CLion declares none of them, so they were offered and not registered. - Dependencies. The backend builds with mcpp 2026.11.9.1, mcpplibs.os 0.4.2 and
mcpplibs.mtest.manifest 0.5.2. - mcppls 0.21. mcpp-clion is built and tested against the mcppls CLion plugin 0.21.0, whose one
package serves every system (mcppls-clion-<version>.zip, since mcppls 0.0.20); the build fetched
0.0.19's package of this machine. mcppls 0.21 numbers its versions as a series and a patch (0.0.21
is released as 0.21.0); the backend reads that version, its payloads (version 5) andmcppls status
as before.
1.2
backend 1.2.1
- mtest's cases as mtest reads them. The cases of a file of mtest are read with mtest's own
static manifest (mcpplibs.mtest.manifest0.4.1) instead of a reader of the backend's: an object
(UTest parse{"parse", [] { ... }}, andSuite,CTS,E2E,Benchor a suite type derived from
one) is a case, and so is each"name"_testit declares, under its name. A suite type the project's
tests declare in a module beside them (class Fixture : public CTSintests/cts/cts.cppm) is read
fromtests/and holds in every file that uses it. A file written for mtest 0.3 or 0.4 shows its
cases before it is built, as one written for 0.2 did.
1.2.0
The first series of one version for every component: the backend, mcpp-vscode, mcpp-clion and
mcpp-nvim are 1.2.0 (from 0.2.1, 1.1.1, 0.2.1 and 0.2.1).
- One series. A version is
X.Y.Z;X.Yis shared by the backend and every plugin,Zis each
component's own patch. The backend states its series in the initialize answer, and each plugin
checks protocol 2 and its series and refuses another, naming both versions and the install that
matches. A series release is taggedvX.Y.0;backend-,vscode-,clion-andnvim-vX.Y.Z
publish one component's patch, and CI checks that every component states one series. - mcppls payloads by their specification. The backend reads
payload.jsonas mcppls's S6 states
it: version 5 (mcppls 0.0.20 and later) takes this system's entry underplatformsand starts
<runner> <server.path>; version 4 serves the oneplatformit names. A payload that does not
serve this system is refused, naming the platforms it does serve. 0.2.1 ran a version 5 payload's
bin/mcppls.okbitself and failed. CLion makes every runner a payload names executable again. - Test results as mcpp states them. Statuses follow mcpp's test records value for value:
run_failis failed, or timed out when mcpp says so;compile_failis failed and says it did not
compile;not_runis skipped with mcpp's reason;builtis skipped as built only. 0.2.1 mapped
values mcpp never writes, so every failure was "errored" and a timeout was never seen. - Cases by the test protocol. A test program that implements the mtest test protocol (mcpp
2026.11.8.1, featuretest-protocol) is listed bymcpp test --casesand its cases run by
mcpp test --case, whatever framework wrote it; each case's result, duration and first failure's
place come from mcpp's record. A file of mtest's cases shows its"name"_testliterals, named
with their suites (parsing/an empty line), before anything is built. GoogleTest, Catch2 and
doctest without the protocol are listed and run as before (spec/test-frameworks.json). - Every test's own output. Each test and each case carries its whole output, passed or not
(head and tail past 1 MiB), and a failure carries the place its output names. A case run divides
the program's output among its cases by GoogleTest's boundaries. VS Code says the output to the
test's own item and shows a failure at its place, else at the test'smainor the case's macro;
CLion sends it to the test tree, with the place first in a failure's details; Neovim writes
mcpp://tests, one section per test and case, and puts the failures in the quickfix list. - Run entries with icons. VS Code's lenses above
mainare$(play) Runand$(debug-alt) Debug, and while the active editor is a target's entry the editor title's Run menu runs and
debugs it. Neovim's sign column shows ▶ on a program's and a test'smainand on each case, and a
result turns it into ✓ or ✗. CLion logs why a file has no run entry. - The platform as one release. The payloads' platform is
openkal-platform@0.24.4, whose okrun
enters an image in its convention's floating-point state (a decimal number is read on Windows as on
the other systems), and every dependency is one release
named by its identity (mcpplibs.os = "0.4.0"); mcpp 2026.11.7.1 or later builds them. - A Run shows its build as the terminal does. Run and Debug build through a launch job: mcpp's
own narration (Compiling, Finished) appears as it is written, in place of a fixed "building" line,
and the build's steps in the status bar (CLion, VS Code while it builds for the debugger, the
Neovim statusline), as for a Build. With mcpp 2026.11.7.2 an unchanged program's launch is
described on mcpp's fast path, 0.01 s where it was 0.1 to 0.3 s, so the program starts at once.
CLion records how long the build and the program's start took inidea.log. - Windows names reach the backend in one spelling. The backend runs as an ok image, whose names
are/-separated on every system; a project root, a working directory, a parent directory or a
payload an editor names asC:\Users\x\…is read through mcpplibs.os into its generic spelling
before anything is built from it, so it is absolute and its parts are components. Found by the
backend's tests running as images on Windows. - No header in the backend's sources or tests. The tests share a module (
mcppide.testsupport,
intestsupport/) where they includedsupport.hpp, and a failed check names its place through
std::source_location.mcpp-ide-dev check-sources, run by CI, reports a header, a preprocessor
branch and a compile-time platform question (os::is_<platform>, which an ok image answers false)
in the backend, its tests and the test support. - The mcpp tool window beside Project. CLion's mcpp tool window is on the left, where VS Code
shows mcpp, and the first mcpp project opened puts its...
mcpp-ide 1.2.1
mcpp-ide 1.2.1
Changelog
The changelog is kept by series (X.Y); each section lists its components' releases.
1.2
backend 1.2.1
- mtest's cases as mtest reads them. The cases of a file of mtest are read with mtest's own
static manifest (mcpplibs.mtest.manifest0.4.1) instead of a reader of the backend's: an object
(UTest parse{"parse", [] { ... }}, andSuite,CTS,E2E,Benchor a suite type derived from
one) is a case, and so is each"name"_testit declares, under its name. A suite type the project's
tests declare in a module beside them (class Fixture : public CTSintests/cts/cts.cppm) is read
fromtests/and holds in every file that uses it. A file written for mtest 0.3 or 0.4 shows its
cases before it is built, as one written for 0.2 did.
1.2.0
The first series of one version for every component: the backend, mcpp-vscode, mcpp-clion and
mcpp-nvim are 1.2.0 (from 0.2.1, 1.1.1, 0.2.1 and 0.2.1).
- One series. A version is
X.Y.Z;X.Yis shared by the backend and every plugin,Zis each
component's own patch. The backend states its series in the initialize answer, and each plugin
checks protocol 2 and its series and refuses another, naming both versions and the install that
matches. A series release is taggedvX.Y.0;backend-,vscode-,clion-andnvim-vX.Y.Z
publish one component's patch, and CI checks that every component states one series. - mcppls payloads by their specification. The backend reads
payload.jsonas mcppls's S6 states
it: version 5 (mcppls 0.0.20 and later) takes this system's entry underplatformsand starts
<runner> <server.path>; version 4 serves the oneplatformit names. A payload that does not
serve this system is refused, naming the platforms it does serve. 0.2.1 ran a version 5 payload's
bin/mcppls.okbitself and failed. CLion makes every runner a payload names executable again. - Test results as mcpp states them. Statuses follow mcpp's test records value for value:
run_failis failed, or timed out when mcpp says so;compile_failis failed and says it did not
compile;not_runis skipped with mcpp's reason;builtis skipped as built only. 0.2.1 mapped
values mcpp never writes, so every failure was "errored" and a timeout was never seen. - Cases by the test protocol. A test program that implements the mtest test protocol (mcpp
2026.11.8.1, featuretest-protocol) is listed bymcpp test --casesand its cases run by
mcpp test --case, whatever framework wrote it; each case's result, duration and first failure's
place come from mcpp's record. A file of mtest's cases shows its"name"_testliterals, named
with their suites (parsing/an empty line), before anything is built. GoogleTest, Catch2 and
doctest without the protocol are listed and run as before (spec/test-frameworks.json). - Every test's own output. Each test and each case carries its whole output, passed or not
(head and tail past 1 MiB), and a failure carries the place its output names. A case run divides
the program's output among its cases by GoogleTest's boundaries. VS Code says the output to the
test's own item and shows a failure at its place, else at the test'smainor the case's macro;
CLion sends it to the test tree, with the place first in a failure's details; Neovim writes
mcpp://tests, one section per test and case, and puts the failures in the quickfix list. - Run entries with icons. VS Code's lenses above
mainare$(play) Runand$(debug-alt) Debug, and while the active editor is a target's entry the editor title's Run menu runs and
debugs it. Neovim's sign column shows ▶ on a program's and a test'smainand on each case, and a
result turns it into ✓ or ✗. CLion logs why a file has no run entry. - The platform as one release. The payloads' platform is
openkal-platform@0.24.4, whose okrun
enters an image in its convention's floating-point state (a decimal number is read on Windows as on
the other systems), and every dependency is one release
named by its identity (mcpplibs.os = "0.4.0"); mcpp 2026.11.7.1 or later builds them. - A Run shows its build as the terminal does. Run and Debug build through a launch job: mcpp's
own narration (Compiling, Finished) appears as it is written, in place of a fixed "building" line,
and the build's steps in the status bar (CLion, VS Code while it builds for the debugger, the
Neovim statusline), as for a Build. With mcpp 2026.11.7.2 an unchanged program's launch is
described on mcpp's fast path, 0.01 s where it was 0.1 to 0.3 s, so the program starts at once.
CLion records how long the build and the program's start took inidea.log. - Windows names reach the backend in one spelling. The backend runs as an ok image, whose names
are/-separated on every system; a project root, a working directory, a parent directory or a
payload an editor names asC:\Users\x\…is read through mcpplibs.os into its generic spelling
before anything is built from it, so it is absolute and its parts are components. Found by the
backend's tests running as images on Windows. - No header in the backend's sources or tests. The tests share a module (
mcppide.testsupport,
intestsupport/) where they includedsupport.hpp, and a failed check names its place through
std::source_location.mcpp-ide-dev check-sources, run by CI, reports a header, a preprocessor
branch and a compile-time platform question (os::is_<platform>, which an ok image answers false)
in the backend, its tests and the test support. - The mcpp tool window beside Project. CLion's mcpp tool window is on the left, where VS Code
shows mcpp, and the first mcpp project opened puts its button on the stripe. - Tested as it is run. The backend is distributed only as an ok image, and CI tests it as one on
every system: its tests are built as ok images of the system's architecture and run through the
platform's runner (backend-openkal). The native backend is built and tested on Linux x64, and on
every system in a manual CI run withnative.
0.2.1
mcpp-vscode 1.1.1, mcpp-clion 0.2.1 and mcpp-nvim 0.2.1.
- CLion locates the bundled backend from the plugin descriptor and checks
protocol compatibility before sending namespaced requests. Backend selection
and startup failures are recorded inidea.log. - Native settings reject non-finite and out-of-range values without partially
saving the form. Failed graph queries remain errors and can be retried. - Debug launches use the actual selected target and custom profile. With mcpp
2026.11.6.1 or later, a declareddebuggeerunner is selected without guessing
from device actions; explicit runner choices take precedence. A changed
target, profile or platform between launch descriptions is refused. - CLion requests the backend's debug launch and configures LLDB's JIT reader
for that session. The run-configuration profile field accepts custom names. - CI covers stable CLion 2026.1.5.2 and 2026.2.4.1 with the same packaged ZIP,
static compatibility checks and actual editor interactions. The hosted JCEF
check restores its temporary user-namespace policy after the test. - CLion 2026.2.4.1 can report an internal GDB variable-read cancellation after
debug stop, also reproduced without either plugin in a stock CMake project.
The stable test records its path-free fingerprint and classifies only that
exact SDK signature after all editor assertions finish. Other IDE errors
still fail the test. - Release CI submits the verified CLion ZIP to JetBrains Marketplace using the
configured token, alongside the verified VSIX sent to Open VSX. Each
destination has an independent publish job and the JetBrains response is
retained as a receipt. - VS Code and CLion check for a missing local
mcpponly on user actions that
need the build tool. One notification links to its repository; opening a
project does not trigger the notice.
0.2.0
mcpp-vscode 1.1.0, mcpp-clion 0.2.0 and mcpp-nvim 0.2.0 (mcpp design 2026-10-29 §10).
- The project's mcpp (mcpp design 2026-10-30 part 2 §4). Each project is asked in its own
directory,mcpp self env --format jsonthrough the program a version manager's shim stands for
(ormcpp.path), withXLINGS_PROJECT_DIRremoved from every run of mcpp, so a project pinned in
.xlings.jsonis described by the mcpp that builds it. A feature is turned on by what the project's
mcpp states (features, mcpp 2026.10.31.1) or, for an earlier mcpp, by a table frozen at that
release, never by comparing versions. A pinned version that is not installed ispinned-missing,
with the shim's words and its install command; an untrusted workspace's project is not asked. A
job whose envelope names another version, the editor regaining focus and a changed manifest each
make the project be asked again; never more than two at once. Methodsproject/mcpp,
project/refresh,capabilities/explain(why a feature is not offered: which party, which
capability, from which version) andreport/collect; notificationproject/mcppChanged. - The backend's lifecycle and what it says (§3). VS Code and CLion start an ended backend again
after 1, 4 and 16 seconds; a fourth end within three minutes leaves them in the degraded mode with
two actions, restarting the backend and exporting the IDE report. mcpp: Export IDE Report
(every editor; Neovim:Mcpp exportReport [path]) writes the backend, every project's mcpp,
mcppls's status, the settings in effect, recent jobs and the backend's recent log to a file the
person names.mcpp.backend.logLeveldecides what the backend writes to the editor's log. VS
Code's status item names the project's mcpp version, and its tooltip the program and whether
mcpp.pathchose it. - What mcppls says about the workspace (§5). The backend's `language...
mcpp-ide 1.2.0
mcpp-ide 1.2.0
Changelog
The changelog is kept by series (X.Y); each section lists its components' releases.
1.2
1.2.0
The first series of one version for every component: the backend, mcpp-vscode, mcpp-clion and
mcpp-nvim are 1.2.0 (from 0.2.1, 1.1.1, 0.2.1 and 0.2.1).
- One series. A version is
X.Y.Z;X.Yis shared by the backend and every plugin,Zis each
component's own patch. The backend states its series in the initialize answer, and each plugin
checks protocol 2 and its series and refuses another, naming both versions and the install that
matches. A series release is taggedvX.Y.0;backend-,vscode-,clion-andnvim-vX.Y.Z
publish one component's patch, and CI checks that every component states one series. - mcppls payloads by their specification. The backend reads
payload.jsonas mcppls's S6 states
it: version 5 (mcppls 0.0.20 and later) takes this system's entry underplatformsand starts
<runner> <server.path>; version 4 serves the oneplatformit names. A payload that does not
serve this system is refused, naming the platforms it does serve. 0.2.1 ran a version 5 payload's
bin/mcppls.okbitself and failed. CLion makes every runner a payload names executable again. - Test results as mcpp states them. Statuses follow mcpp's test records value for value:
run_failis failed, or timed out when mcpp says so;compile_failis failed and says it did not
compile;not_runis skipped with mcpp's reason;builtis skipped as built only. 0.2.1 mapped
values mcpp never writes, so every failure was "errored" and a timeout was never seen. - Cases by the test protocol. A test program that implements the mtest test protocol (mcpp
2026.11.8.1, featuretest-protocol) is listed bymcpp test --casesand its cases run by
mcpp test --case, whatever framework wrote it; each case's result, duration and first failure's
place come from mcpp's record. A file of mtest's cases shows its"name"_testliterals, named
with their suites (parsing/an empty line), before anything is built. GoogleTest, Catch2 and
doctest without the protocol are listed and run as before (spec/test-frameworks.json). - Every test's own output. Each test and each case carries its whole output, passed or not
(head and tail past 1 MiB), and a failure carries the place its output names. A case run divides
the program's output among its cases by GoogleTest's boundaries. VS Code says the output to the
test's own item and shows a failure at its place, else at the test'smainor the case's macro;
CLion sends it to the test tree, with the place first in a failure's details; Neovim writes
mcpp://tests, one section per test and case, and puts the failures in the quickfix list. - Run entries with icons. VS Code's lenses above
mainare$(play) Runand$(debug-alt) Debug, and while the active editor is a target's entry the editor title's Run menu runs and
debugs it. Neovim's sign column shows ▶ on a program's and a test'smainand on each case, and a
result turns it into ✓ or ✗. CLion logs why a file has no run entry. - The platform as one release. The payloads' platform is
openkal-platform@0.24.4, whose okrun
enters an image in its convention's floating-point state (a decimal number is read on Windows as on
the other systems), and every dependency is one release
named by its identity (mcpplibs.os = "0.4.0"); mcpp 2026.11.7.1 or later builds them. - A Run shows its build as the terminal does. Run and Debug build through a launch job: mcpp's
own narration (Compiling, Finished) appears as it is written, in place of a fixed "building" line,
and the build's steps in the status bar (CLion, VS Code while it builds for the debugger, the
Neovim statusline), as for a Build. With mcpp 2026.11.7.2 an unchanged program's launch is
described on mcpp's fast path, 0.01 s where it was 0.1 to 0.3 s, so the program starts at once.
CLion records how long the build and the program's start took inidea.log. - Windows names reach the backend in one spelling. The backend runs as an ok image, whose names
are/-separated on every system; a project root, a working directory, a parent directory or a
payload an editor names asC:\Users\x\…is read through mcpplibs.os into its generic spelling
before anything is built from it, so it is absolute and its parts are components. Found by the
backend's tests running as images on Windows. - No header in the backend's sources or tests. The tests share a module (
mcppide.testsupport,
intestsupport/) where they includedsupport.hpp, and a failed check names its place through
std::source_location.mcpp-ide-dev check-sources, run by CI, reports a header, a preprocessor
branch and a compile-time platform question (os::is_<platform>, which an ok image answers false)
in the backend, its tests and the test support. - The mcpp tool window beside Project. CLion's mcpp tool window is on the left, where VS Code
shows mcpp, and the first mcpp project opened puts its button on the stripe. - Tested as it is run. The backend is distributed only as an ok image, and CI tests it as one on
every system: its tests are built as ok images of the system's architecture and run through the
platform's runner (backend-openkal). The native backend is built and tested on Linux x64, and on
every system in a manual CI run withnative.
0.2.1
mcpp-vscode 1.1.1, mcpp-clion 0.2.1 and mcpp-nvim 0.2.1.
- CLion locates the bundled backend from the plugin descriptor and checks
protocol compatibility before sending namespaced requests. Backend selection
and startup failures are recorded inidea.log. - Native settings reject non-finite and out-of-range values without partially
saving the form. Failed graph queries remain errors and can be retried. - Debug launches use the actual selected target and custom profile. With mcpp
2026.11.6.1 or later, a declareddebuggeerunner is selected without guessing
from device actions; explicit runner choices take precedence. A changed
target, profile or platform between launch descriptions is refused. - CLion requests the backend's debug launch and configures LLDB's JIT reader
for that session. The run-configuration profile field accepts custom names. - CI covers stable CLion 2026.1.5.2 and 2026.2.4.1 with the same packaged ZIP,
static compatibility checks and actual editor interactions. The hosted JCEF
check restores its temporary user-namespace policy after the test. - CLion 2026.2.4.1 can report an internal GDB variable-read cancellation after
debug stop, also reproduced without either plugin in a stock CMake project.
The stable test records its path-free fingerprint and classifies only that
exact SDK signature after all editor assertions finish. Other IDE errors
still fail the test. - Release CI submits the verified CLion ZIP to JetBrains Marketplace using the
configured token, alongside the verified VSIX sent to Open VSX. Each
destination has an independent publish job and the JetBrains response is
retained as a receipt. - VS Code and CLion check for a missing local
mcpponly on user actions that
need the build tool. One notification links to its repository; opening a
project does not trigger the notice.
0.2.0
mcpp-vscode 1.1.0, mcpp-clion 0.2.0 and mcpp-nvim 0.2.0 (mcpp design 2026-10-29 §10).
- The project's mcpp (mcpp design 2026-10-30 part 2 §4). Each project is asked in its own
directory,mcpp self env --format jsonthrough the program a version manager's shim stands for
(ormcpp.path), withXLINGS_PROJECT_DIRremoved from every run of mcpp, so a project pinned in
.xlings.jsonis described by the mcpp that builds it. A feature is turned on by what the project's
mcpp states (features, mcpp 2026.10.31.1) or, for an earlier mcpp, by a table frozen at that
release, never by comparing versions. A pinned version that is not installed ispinned-missing,
with the shim's words and its install command; an untrusted workspace's project is not asked. A
job whose envelope names another version, the editor regaining focus and a changed manifest each
make the project be asked again; never more than two at once. Methodsproject/mcpp,
project/refresh,capabilities/explain(why a feature is not offered: which party, which
capability, from which version) andreport/collect; notificationproject/mcppChanged. - The backend's lifecycle and what it says (§3). VS Code and CLion start an ended backend again
after 1, 4 and 16 seconds; a fourth end within three minutes leaves them in the degraded mode with
two actions, restarting the backend and exporting the IDE report. mcpp: Export IDE Report
(every editor; Neovim:Mcpp exportReport [path]) writes the backend, every project's mcpp,
mcppls's status, the settings in effect, recent jobs and the backend's recent log to a file the
person names.mcpp.backend.logLeveldecides what the backend writes to the editor's log. VS
Code's status item names the project's mcpp version, and its tooltip the program and whether
mcpp.pathchose it. - What mcppls says about the workspace (§5). The backend's
languageService/statusruns
mcppls status --root <dir> --format json(mcppls 0.0.20 and later, bounded at five seconds) and
returns its capabilities, the workspace's state, engine and kit, the servers serving it, and
mcppls's actions under each editor's own id; for mcppls 0.0.18 and 0.0.19 the actions come from a
table frozen at those releases. A different answer is sent once (languageService/changed). The
command table's forwards name mcppls's action ids, andcommands/listgives each editor the id
mcppls states for it: CLion runs the mcppls plugin's action (and hides a row it does not have),
Neovim mcppls-nvim's command. VS Code reads the state and the comman...
mcpp-ide 0.2.1
Changelog
0.2.1
mcpp-vscode 1.1.1, mcpp-clion 0.2.1 and mcpp-nvim 0.2.1.
- CLion locates the bundled backend from the plugin descriptor and checks
protocol compatibility before sending namespaced requests. Backend selection
and startup failures are recorded inidea.log. - Native settings reject non-finite and out-of-range values without partially
saving the form. Failed graph queries remain errors and can be retried. - Debug launches use the actual selected target and custom profile. With mcpp
2026.11.6.1 or later, a declareddebuggeerunner is selected without guessing
from device actions; explicit runner choices take precedence. A changed
target, profile or platform between launch descriptions is refused. - CLion requests the backend's debug launch and configures LLDB's JIT reader
for that session. The run-configuration profile field accepts custom names. - CI covers stable CLion 2026.1.5.2 and 2026.2.4.1 with the same packaged ZIP,
static compatibility checks and actual editor interactions. The hosted JCEF
check restores its temporary user-namespace policy after the test. - CLion 2026.2.4.1 can report an internal GDB variable-read cancellation after
debug stop, also reproduced without either plugin in a stock CMake project.
The stable test records its path-free fingerprint and classifies only that
exact SDK signature after all editor assertions finish. Other IDE errors
still fail the test. - Release CI submits the verified CLion ZIP to JetBrains Marketplace using the
configured token, alongside the verified VSIX sent to Open VSX. Each
destination has an independent publish job and the JetBrains response is
retained as a receipt. - VS Code and CLion check for a missing local
mcpponly on user actions that
need the build tool. One notification links to its repository; opening a
project does not trigger the notice.
0.2.0
mcpp-vscode 1.1.0, mcpp-clion 0.2.0 and mcpp-nvim 0.2.0 (mcpp design 2026-10-29 §10).
- The project's mcpp (mcpp design 2026-10-30 part 2 §4). Each project is asked in its own
directory,mcpp self env --format jsonthrough the program a version manager's shim stands for
(ormcpp.path), withXLINGS_PROJECT_DIRremoved from every run of mcpp, so a project pinned in
.xlings.jsonis described by the mcpp that builds it. A feature is turned on by what the project's
mcpp states (features, mcpp 2026.10.31.1) or, for an earlier mcpp, by a table frozen at that
release, never by comparing versions. A pinned version that is not installed ispinned-missing,
with the shim's words and its install command; an untrusted workspace's project is not asked. A
job whose envelope names another version, the editor regaining focus and a changed manifest each
make the project be asked again; never more than two at once. Methodsproject/mcpp,
project/refresh,capabilities/explain(why a feature is not offered: which party, which
capability, from which version) andreport/collect; notificationproject/mcppChanged. - The backend's lifecycle and what it says (§3). VS Code and CLion start an ended backend again
after 1, 4 and 16 seconds; a fourth end within three minutes leaves them in the degraded mode with
two actions, restarting the backend and exporting the IDE report. mcpp: Export IDE Report
(every editor; Neovim:Mcpp exportReport [path]) writes the backend, every project's mcpp,
mcppls's status, the settings in effect, recent jobs and the backend's recent log to a file the
person names.mcpp.backend.logLeveldecides what the backend writes to the editor's log. VS
Code's status item names the project's mcpp version, and its tooltip the program and whether
mcpp.pathchose it. - What mcppls says about the workspace (§5). The backend's
languageService/statusruns
mcppls status --root <dir> --format json(mcppls 0.0.20 and later, bounded at five seconds) and
returns its capabilities, the workspace's state, engine and kit, the servers serving it, and
mcppls's actions under each editor's own id; for mcppls 0.0.18 and 0.0.19 the actions come from a
table frozen at those releases. A different answer is sent once (languageService/changed). The
command table's forwards name mcppls's action ids, andcommands/listgives each editor the id
mcppls states for it: CLion runs the mcppls plugin's action (and hides a row it does not have),
Neovim mcppls-nvim's command. VS Code reads the state and the commands from this answer instead of
the mcppls extension's API object and keeps only the confirmation each action needs; the state is
asked again after a job, on focus, when the project view becomes visible and, while it is visible,
at most every 30 seconds. A missing semantic kit is a row with C++ Modules: Install the Semantic
Kit. After a build nothing is forwarded by default (auto): mcppls reads mcpp's result record. - Entries (§6). The backend's
source/entriessays what a C++ file is to its project -- a
program'smain, a test's (tests/**, named as mcpp names it), or neither -- with the line of
mainread from the text, outside comments and literals. VS Code shows Run and Debug abovemain
(mcpp.codeLens.enable), at the position C++ Modules gives and otherwise at the line read, said to
be approximate; Build and Debug join Run and Test in the editor's title bar, and Run, Debug, Build
and Test are in the editor's context menu. The command table states these places (placements),
and the generator writes VS Code's menus and CLion's editor popup from it. CLion's ▶ stands on the
PSI elementmainon the line the backend read, the IDE's Build (the hammer) of an mcpp project is
mcpp build, a status bar item shows the project's mcpp and the running job with the quick menu,
and two keymaps (mcpp,mcpp (macOS)) carry VS Code's chords. - Test cases (§7).
spec/test-frameworks.jsondescribes GoogleTest, Catch2 and doctest: a test
program belongs to one when its plan holds the framework's package and its source calls the
framework's macros (mcpp.test.macrosadds a project's own).test/casesreads the cases from the
source and, after a build in a trusted workspace, from the program's own listing;test/runCases
runs some of them with the framework's filter and reads its report, each outcome sent as
test/caseResult. VS Code's Testing view has the cases under their program, located at their
macros, and the program at itsmain; CLion has a ▶ on each case and runs cases in its test tree.
Debugging a test's program is offered where the project's mcpp describes its launch (test-launch,
mcpp 2026.10.31.2). - The rules layer of mcpp.toml and build.mcpp, in the backend (§8; docs/rules.md). The session
is an LSP server, protocol 2:initializein LSP's shape with mcpp-ide's parameters in
initializationOptions, mcpp.toml's and build.mcpp's completion, hover, jumps and diagnostics as
textDocument/*(full synchronisation, UTF-16 columns), and mcpp-ide's own methods and
notifications undermcpp-ide/. The tolerant scanner, the seven manifest rules and the SPEC-007
checks are ported from mcpp-vscode 0.9's TypeScript, whose answers over a corpus at every position
are the tests' goldens (tests/rules). A table is read through the schema (a workspace table as the
table it mirrors, a platform's table under a selector as the platform's); a selector-only table is
offered with its selector; the schema's own arrays of tables are allowed; a dependency's version is
completed from mcpp's catalogue (mcpp search --format json) whenmcpp.toml.indexCompletionis
on. VS Code connects with its language client (bundled intodist/vendor); CLion over the
session's connection, through a completion contributor, an annotator, a documentation provider
and a go-to-declaration handler; Neovim with its LSP client, attached to mcpp.toml and build.mcpp
buffers. While C++ Modules serves build.mcpp (mcpplsServes) it is left the unknownSymbol rule
and the module names afterimport. One snapshot of each:spec/toml-schema.json,
spec/buildscript-api.json(mcpp 2026.10.29.1's directives). - CLion in its own components (§9). The "mcpp" tool window's Project, Libraries and Cache tabs
are native trees and lists over the backend's view models (each project's mcpp, targets, tests,
libraries, last build, artifacts and platform, and what C++ Modules says; the indexes' packages, a
package's page and adding it to the project; what mcpp keeps and the command table's cleanups with
their confirmations). A graph of the packages or the modules is the one page in JCEF
(webui/graph.html, mermaid overgraph/packagesandgraph/modules; a module opens its source),
tested in Chromium over a real backend. Settings | Tools | mcpp is a form generated from
settings/registry, with Apply, Reset and a search. The workbench that ran mcpp-vscode's pages in
JCEF, itsvscodeshim and its bridge are removed; the views' models and the settings form are
tested headless. - The declared degraded mode (§8, F15). Where the package's okrun does not run (macOS x86_64,
Windows arm64, Linux armhf) VS Code says the backend does not run on this platform and goes on
with build, run, test and the project pages, running mcpp's queries itself; an Extension Host run
in CI holds it. - mcpp-vscode 1.1.0 is mcpp-vscode 0.9.0 over the backend. 0.9.0's extension is imported with
its history (mide-plugins/vscode); every view, page, command, menu, setting and string a user
sees is 0.9.0's. What 1.0 added stays, in 0.9.0's style: debugging (mcpp.debug, themcpp
launch type), the test tree, the target picker with target-set rows, packing, build on save,
cancellable jobs. mcpp is run through the backend'smcpp/exec, mcppls through its
languageService/exec; the extension starts no other process for...
mcpp-ide 0.2.0
Changelog
0.2.0
mcpp-vscode 1.1.0, mcpp-clion 0.2.0 and mcpp-nvim 0.2.0 (mcpp design 2026-10-29 §10).
- The project's mcpp (mcpp design 2026-10-30 part 2 §4). Each project is asked in its own
directory,mcpp self env --format jsonthrough the program a version manager's shim stands for
(ormcpp.path), withXLINGS_PROJECT_DIRremoved from every run of mcpp, so a project pinned in
.xlings.jsonis described by the mcpp that builds it. A feature is turned on by what the project's
mcpp states (features, mcpp 2026.10.31.1) or, for an earlier mcpp, by a table frozen at that
release, never by comparing versions. A pinned version that is not installed ispinned-missing,
with the shim's words and its install command; an untrusted workspace's project is not asked. A
job whose envelope names another version, the editor regaining focus and a changed manifest each
make the project be asked again; never more than two at once. Methodsproject/mcpp,
project/refresh,capabilities/explain(why a feature is not offered: which party, which
capability, from which version) andreport/collect; notificationproject/mcppChanged. - The backend's lifecycle and what it says (§3). VS Code and CLion start an ended backend again
after 1, 4 and 16 seconds; a fourth end within three minutes leaves them in the degraded mode with
two actions, restarting the backend and exporting the IDE report. mcpp: Export IDE Report
(every editor; Neovim:Mcpp exportReport [path]) writes the backend, every project's mcpp,
mcppls's status, the settings in effect, recent jobs and the backend's recent log to a file the
person names.mcpp.backend.logLeveldecides what the backend writes to the editor's log. VS
Code's status item names the project's mcpp version, and its tooltip the program and whether
mcpp.pathchose it. - What mcppls says about the workspace (§5). The backend's
languageService/statusruns
mcppls status --root <dir> --format json(mcppls 0.0.20 and later, bounded at five seconds) and
returns its capabilities, the workspace's state, engine and kit, the servers serving it, and
mcppls's actions under each editor's own id; for mcppls 0.0.18 and 0.0.19 the actions come from a
table frozen at those releases. A different answer is sent once (languageService/changed). The
command table's forwards name mcppls's action ids, andcommands/listgives each editor the id
mcppls states for it: CLion runs the mcppls plugin's action (and hides a row it does not have),
Neovim mcppls-nvim's command. VS Code reads the state and the commands from this answer instead of
the mcppls extension's API object and keeps only the confirmation each action needs; the state is
asked again after a job, on focus, when the project view becomes visible and, while it is visible,
at most every 30 seconds. A missing semantic kit is a row with C++ Modules: Install the Semantic
Kit. After a build nothing is forwarded by default (auto): mcppls reads mcpp's result record. - Entries (§6). The backend's
source/entriessays what a C++ file is to its project -- a
program'smain, a test's (tests/**, named as mcpp names it), or neither -- with the line of
mainread from the text, outside comments and literals. VS Code shows Run and Debug abovemain
(mcpp.codeLens.enable), at the position C++ Modules gives and otherwise at the line read, said to
be approximate; Build and Debug join Run and Test in the editor's title bar, and Run, Debug, Build
and Test are in the editor's context menu. The command table states these places (placements),
and the generator writes VS Code's menus and CLion's editor popup from it. CLion's ▶ stands on the
PSI elementmainon the line the backend read, the IDE's Build (the hammer) of an mcpp project is
mcpp build, a status bar item shows the project's mcpp and the running job with the quick menu,
and two keymaps (mcpp,mcpp (macOS)) carry VS Code's chords. - Test cases (§7).
spec/test-frameworks.jsondescribes GoogleTest, Catch2 and doctest: a test
program belongs to one when its plan holds the framework's package and its source calls the
framework's macros (mcpp.test.macrosadds a project's own).test/casesreads the cases from the
source and, after a build in a trusted workspace, from the program's own listing;test/runCases
runs some of them with the framework's filter and reads its report, each outcome sent as
test/caseResult. VS Code's Testing view has the cases under their program, located at their
macros, and the program at itsmain; CLion has a ▶ on each case and runs cases in its test tree.
Debugging a test's program is offered where the project's mcpp describes its launch (test-launch,
mcpp 2026.10.31.2). - The rules layer of mcpp.toml and build.mcpp, in the backend (§8; docs/rules.md). The session
is an LSP server, protocol 2:initializein LSP's shape with mcpp-ide's parameters in
initializationOptions, mcpp.toml's and build.mcpp's completion, hover, jumps and diagnostics as
textDocument/*(full synchronisation, UTF-16 columns), and mcpp-ide's own methods and
notifications undermcpp-ide/. The tolerant scanner, the seven manifest rules and the SPEC-007
checks are ported from mcpp-vscode 0.9's TypeScript, whose answers over a corpus at every position
are the tests' goldens (tests/rules). A table is read through the schema (a workspace table as the
table it mirrors, a platform's table under a selector as the platform's); a selector-only table is
offered with its selector; the schema's own arrays of tables are allowed; a dependency's version is
completed from mcpp's catalogue (mcpp search --format json) whenmcpp.toml.indexCompletionis
on. VS Code connects with its language client (bundled intodist/vendor); CLion over the
session's connection, through a completion contributor, an annotator, a documentation provider
and a go-to-declaration handler; Neovim with its LSP client, attached to mcpp.toml and build.mcpp
buffers. While C++ Modules serves build.mcpp (mcpplsServes) it is left the unknownSymbol rule
and the module names afterimport. One snapshot of each:spec/toml-schema.json,
spec/buildscript-api.json(mcpp 2026.10.29.1's directives). - CLion in its own components (§9). The "mcpp" tool window's Project, Libraries and Cache tabs
are native trees and lists over the backend's view models (each project's mcpp, targets, tests,
libraries, last build, artifacts and platform, and what C++ Modules says; the indexes' packages, a
package's page and adding it to the project; what mcpp keeps and the command table's cleanups with
their confirmations). A graph of the packages or the modules is the one page in JCEF
(webui/graph.html, mermaid overgraph/packagesandgraph/modules; a module opens its source),
tested in Chromium over a real backend. Settings | Tools | mcpp is a form generated from
settings/registry, with Apply, Reset and a search. The workbench that ran mcpp-vscode's pages in
JCEF, itsvscodeshim and its bridge are removed; the views' models and the settings form are
tested headless. - The declared degraded mode (§8, F15). Where the package's okrun does not run (macOS x86_64,
Windows arm64, Linux armhf) VS Code says the backend does not run on this platform and goes on
with build, run, test and the project pages, running mcpp's queries itself; an Extension Host run
in CI holds it. - mcpp-vscode 1.1.0 is mcpp-vscode 0.9.0 over the backend. 0.9.0's extension is imported with
its history (mide-plugins/vscode); every view, page, command, menu, setting and string a user
sees is 0.9.0's. What 1.0 added stays, in 0.9.0's style: debugging (mcpp.debug, themcpp
launch type), the test tree, the target picker with target-set rows, packing, build on save,
cancellable jobs. mcpp is run through the backend'smcpp/exec, mcppls through its
languageService/exec; the extension starts no other process for mcpp or mcppls. - Parity gates against 0.9.0. The manifest's contributions and strings contain 0.9.0's exactly
(spec/states them;mcpp-ide-dev gen vscodewrites the manifest); every page's document,
rendered by the extension's generators, is byte-identical to the snapshot rendered by 0.9.0's;
the Extension Host suite runs over the bundled backend. - Backend methods.
mcpp/exec(a bounded mcpp run: timeout, output limit, truncation reported),
languageService/exec(the located mcppls with arguments),project/files(manifest, lock and
the source count 0.9.0 shows);targetsrows for target sets (set,members,label) when mcpp
is 2026.10.30.1 or later. - The mcpp logo in CLion. mcpp-clion's plugin icon and its tool window's icon are the mcpp
logo, as mcpp-vscode's and mcppls's are; the text icons (m++,m+) are removed. CI checks that
both embed the logo and that the VS Code logo is 0.9.0's. - mcpp-clion on 2026.1 through 2026.3. Trust through
TrustedProjects.isProjectTrusted, debug
sessions throughXDebuggerManager.newSessionBuilder, the debugger driver through
createDriverConfiguration(project, CPPEnvironment(toolchain)); packing is a job over the
backend'spack/formats. - mcpp 2026.11.3.1. One pack of the target set
openkalwrites the editor packages' tree and
okb (--target openkal --mode self-contained --systems all --pkg-format tar,okb); CI reads
runs_on; the Windows launcher isbin/mcpp-ide.exe. The backend is on mcpplibs.os 0.2.8 and
openkal-platform 0.23.2, ok images included (openkal 0.23: okrun places an image at a base of the
boot, keeps its data as a prepared copy and starts it from a snapshot of its initialisers; every
unit, the std module included, is compiled with frame pointers and hardening; mcpp design
2026-11-03 part 4). - CI and release. 0.9.0'...
mcpp-ide 0.1.1
Changelog
0.1.1
mcpp-vscode 1.0.1, mcpp-clion 0.1.1 and the first mcpp-nvim (0.1.1), with mcppls 0.0.19.
- mcppls is found as the command that starts it. mcppls 0.0.18 and later carry the server as an
okb that the platform's runner starts (payload.json'sserver:bin/okrun bin/mcppls.okb). The
backend ran the okb itself for--version, so the VS Code extension's mcppls was reported as not
reporting its version (permission denied), and the payload in the user data directory was looked
for asbin/mcppls. A candidate is now a payload directory, whoseserveris started as it says,
or a program;languageService/statusreports thecommandbeside theprogram. What
servernames is followed only inside the payload (a relative path with no..part), as mcppls
reads it. - VS Code: the candidate is the mcppls extension's payload directory (
MCPPLS_PAYLOAD, else
<extension>/payload), andMCPPLS_SERVER. - CLion: the candidate is the payload the mcppls CLion plugin carries (mcppls 0.0.19 ships one
package per system, each with its server), with its runner made executable again when the
plugin's install dropped the bit, andMCPPLS_SERVER. Install mcppls and Update
mcppls open Settings | Plugins, where the Marketplace gives this system's package. - CLion 2026.1 and later (since-build 261), as the mcppls plugin mcpp-clion depends on; the
Plugin Verifier checks 2026.1 and 2026.2.3, and the build loads this machine's mcppls 0.0.19
package. - The editor plugins are
mide-plugins/:mide-plugins/vscode(mcpp-vscode),
mide-plugins/clion(mcpp-clion; the protocol's editor id staysjetbrains, the IntelliJ
platform's) andmide-plugins/nvim(mcpp-nvim). The backend, the panels,spec/,protocol/and
the tests stay at the root; both earlier adapters build and test as before. - mcpp-nvim, mcpp's project features in Neovim 0.10 and later, over the same backend through
Neovim's own JSON-RPC client::Mcpp <subcommand>with completion, from the backend's command
table for the editornvim; builds, tests, cleanups and packs as jobs streamed into
mcpp://output, cancelled with:Mcpp cancel; the program in a terminal buffer; debugging through
nvim-dap when it is present; targets, toolchains, new projects and libraries through
vim.ui.selectandvim.ui.input; targets and platforms, the cache and the graphs as text in
floating windows; mcpp's diagnostics in the namespacesmcppandmcpp.toml, and
:Mcpp problemsin the quickfix list;require('mcpp').status()for the statusline. It registers
no language service: mcppls comes with mcppls-nvim (xlings install mcppls-nvim), which the plugin
names when mcppls is missing or older. The backend ismcpp-ideon PATH
(xlings install mcpp-ide) or setup()'sbackend;xlings install mcpp-ide-nviminstalls the
plugin with the backend and sets it up at Neovim's start (vim.g.mcpp_auto_start = falseopts
out). A backend that ends is said; the requests and jobs waiting on it fail, and the next command
starts another, which watches the same projects. A headless suite runs it against the backend on
Neovim 0.10.4 and 0.12.5, over the mock mcpp and over the real one. - The protocol's editor
nvim, and each row ofcommands/listnames itssubcommand(the id
aftermcpp., or the row's own:mcpp.cancelJobiscancel).spec/commands.jsonsays why an
editor is left out of a row (omitted); Neovim's table hasmcpp.problems(the actionproblems)
and the quick menu, and leaves out the settings panel and the panels' entry pages. Which rows an
editor offers is one function, shared by the backend andmcpp-ide-dev gen. - The cache inventory's rows carry their size as text (
bytesText), for an editor that shows it
as text.
0.1.0
The first release of mcpp-ide: one backend for mcpp's editor integrations, the VS Code extension
(mcpp-vscode 1.0.0, the same extension ID as before) and the CLion plugin (mcpp-clion 0.1.0).
- Backend (
mcpp-ide serve): sessions, watching, jobs, view models, cleanup plans, settings, the
command table, runtime strings, self-check; handshakes with mcpp and mcppls; targets with their
platforms. - Protocol and contract schemas, held against mcpp 2026.10.27.1's real output (target rows naming
their platform, a plan's platform and host platform, a wrapped program's launch). - Shared panels: project, targets and platforms, libraries, dependency and module graphs, cache,
pack, settings. - VS Code: tasks, Testing view, debug configurations, Problems from mcpp, mcpp.toml editing help.
- mcpp.toml and build.mcpp editing help over every table and key mcpp 2026.10.27.1 reads, each with
the release that added it:[platform]and its tables,[host], a selector's platform overrides
(platform,carrier,layers,tools,link,runners,run_under) and its ABI tables
(abi,requires_abi,feature-requires-abi),[pack]and[pack.bundle-project],[c-abi],
[kernel-abi],[runtime]and its entry tables,[hooks]and each event's table, a feature's
table,[xlings],[workspace]; the protocol 17 directives, completed by the typed API's names
(mcpp::link_driver). - CLion: run configurations with a PTY console, test tree, CLion's debugger, console links, the mcpp
tool window; depends on the mcppls CLion plugin. - One package per editor for every system: the backend as one ok-image bundle (x86_64 and aarch64
images on openkal-platform 0.17.3) with okrun for Linux x86_64/aarch64, macOS arm64 and Windows
x64; CI starts it from both packages on each of those systems. mcpp pack's package format is passed as--pkg-formatwhere mcpp offers it (--formatbefore).- The operating system through mcpplibs.os 0.2.1 (an index version), whose ok-image targets take
their C library, C++ run-time and loader from openkal-platform.
mcpp-ide 0.1.0
Changelog
0.1.0
The first release of mcpp-ide: one backend for mcpp's editor integrations, the VS Code extension
(mcpp-vscode 1.0.0, the same extension ID as before) and the CLion plugin (mcpp-clion 0.1.0).
- Backend (
mcpp-ide serve): sessions, watching, jobs, view models, cleanup plans, settings, the
command table, runtime strings, self-check; handshakes with mcpp and mcppls; targets with their
platforms. - Protocol and contract schemas, held against mcpp 2026.10.27.1's real output (target rows naming
their platform, a plan's platform and host platform, a wrapped program's launch). - Shared panels: project, targets and platforms, libraries, dependency and module graphs, cache,
pack, settings. - VS Code: tasks, Testing view, debug configurations, Problems from mcpp, mcpp.toml editing help.
- mcpp.toml and build.mcpp editing help over every table and key mcpp 2026.10.27.1 reads, each with
the release that added it:[platform]and its tables,[host], a selector's platform overrides
(platform,carrier,layers,tools,link,runners,run_under) and its ABI tables
(abi,requires_abi,feature-requires-abi),[pack]and[pack.bundle-project],[c-abi],
[kernel-abi],[runtime]and its entry tables,[hooks]and each event's table, a feature's
table,[xlings],[workspace]; the protocol 17 directives, completed by the typed API's names
(mcpp::link_driver). - CLion: run configurations with a PTY console, test tree, CLion's debugger, console links, the mcpp
tool window; depends on the mcppls CLion plugin. - One package per editor for every system: the backend as one ok-image bundle (x86_64 and aarch64
images on openkal-platform 0.17.3) with okrun for Linux x86_64/aarch64, macOS arm64 and Windows
x64; CI starts it from both packages on each of those systems. mcpp pack's package format is passed as--pkg-formatwhere mcpp offers it (--formatbefore).- The operating system through mcpplibs.os 0.2.1 (an index version), whose ok-image targets take
their C library, C++ run-time and loader from openkal-platform.