Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
5a99736
feat(languageservice): read mcppls payloads by mcppls S6, versions 4 …
Sunrisepeak Nov 7, 2026
9a813fa
feat: one series for the backend and every plugin, 1.2
Sunrisepeak Nov 7, 2026
ced8cd3
ci(release): a tag publishes its components (D15)
Sunrisepeak Nov 7, 2026
c0ab66e
feat(tests): mcpp's test statuses value for value; every result with …
Sunrisepeak Nov 7, 2026
f10ad62
feat(vscode): run entries with icons; each test's own output and plac…
Sunrisepeak Nov 7, 2026
ca90ae6
feat(clion, nvim): each test's own output, place and sign (D16)
Sunrisepeak Nov 7, 2026
581c020
build: the platform as the series ^0.24 in mcpp.lock, os ^0.3.1 (A4)
Sunrisepeak Nov 7, 2026
29c0a13
docs: 1.2.0, the series rule, and the release by tag
Sunrisepeak Nov 7, 2026
a6d4322
ci: the backend's tests run as ok images on every system
Sunrisepeak Nov 7, 2026
46c4828
ci: build with mcpp 2026.11.7.1
Sunrisepeak Nov 7, 2026
fd1be76
feat: a Run builds through a launch job, with mcpp's narration and pr…
Sunrisepeak Nov 7, 2026
ffbe8e2
fix: editor and host names in one spelling; this-file commands from s…
Sunrisepeak Nov 7, 2026
6ee6a77
build: openkal-platform 0.24.3 as one release
Sunrisepeak Nov 7, 2026
6c039ca
ci: the backend's native rows from a computed matrix
Sunrisepeak Nov 7, 2026
3e807cb
fix(clion): the plugin's version through the public plugin API
Sunrisepeak Nov 7, 2026
7766690
fix(clion): the plugin's version from its class loader alone; no inte…
Sunrisepeak Nov 7, 2026
cee40b0
ci: build with mcpp 2026.11.7.2
Sunrisepeak Nov 7, 2026
ae9d2f5
build: every dependency one release, named by its identity
Sunrisepeak Nov 7, 2026
42ec706
fix(clion): the no-JCEF explanation wraps in the left tool window and…
Sunrisepeak Nov 7, 2026
1262726
test(clion): the no-JCEF graph check reports what the window shows wh…
Sunrisepeak Nov 7, 2026
f5686ac
test: a test-support module in place of support.hpp; check-sources re…
Sunrisepeak Nov 7, 2026
d34c9d7
ci(clion): the no-JCEF window report is kept with the stable results
Sunrisepeak Nov 7, 2026
18beb61
test(clion): the no-JCEF graph is asked for once the project's layout…
Sunrisepeak Nov 7, 2026
82bac75
fix(clion): the tool window's stripe button is placed as it is regist…
Sunrisepeak Nov 7, 2026
d5ced7a
test(clion): the no-JCEF graph test reports which window is on screen…
Sunrisepeak Nov 7, 2026
d829b47
test(clion): the no-JCEF graph test waits for the Project window to b…
Sunrisepeak Nov 7, 2026
7746927
test(clion): the IDE tests act once the IDE has settled, and wait for…
Sunrisepeak Nov 7, 2026
91b1437
ci: a pull request runs the jobs of the components it changes; a plug…
Sunrisepeak Nov 7, 2026
ddda724
The platform is openkal-platform 0.24.4
Sunrisepeak Nov 7, 2026
cfc482a
os 0.4.0; the source check names os::on<P> for a platform module
Sunrisepeak Nov 7, 2026
ddf5995
tests by the test protocol: listed by mcpp test --cases, run by --cas…
Sunrisepeak Nov 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/components.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# The components of this repository, by path (README "Versions"; .github/scripts/changes.sh). One
# `<component>\t<pattern>` line each; a pattern is a shell `case` glob over the path from the
# repository's root, in which `*` crosses `/`. The first line that matches a path names its component;
# a path no line matches, and the component `all`, run every job.
#
# `@core <component>`: the component whose change reaches every other (each plugin is tested over it).
@core backend
# backend: the program every editor package carries, its protocol, the editors' declarations spec/
# generates, the graph page, and their tests.
backend src/*
backend protocol/*
backend spec/*
backend webui/*
backend testsupport/*
backend tests/*
backend mcpp.toml
backend mcpp.lock
backend build.mcpp
# The editor plugins, each tested over the backend of the change it is made against.
vscode mide-plugins/vscode/*
clion mide-plugins/clion/*
nvim mide-plugins/nvim/*
# What only people read.
docs docs/*
docs agents/*
docs *.md
docs LICENSE
# The workflows, the scripts and the pins every job runs with.
all .github/*
80 changes: 80 additions & 0 deletions .github/scripts/changes.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#!/usr/bin/env bash
# The components a change reaches, from .github/components.tsv (README "Versions").
#
# changes.sh <changed-paths-file> prints `<component>=true|false`, `full=`, each flag, and `digest=`
#
# EVENT, BASE_REF and HEAD_REF (the workflow's event and a pull request's branches) decide a full run:
# anything but a pull request, and a pull request from or into a release branch, reaches every component.
# Otherwise each path reaches the component of the first line of the table that matches it; a path no
# line matches, or one of `all`, reaches every component; and a change of the `@core` component reaches
# every other, since each is tested over it. A `@flag` is a pull request's question: true when a changed
# path matches it, or when the pull request is from or into a release branch; false for any other event.
#
# `digest` names the core's inputs (the blobs of every path of the core and of `all`), so a run that built
# the core from the same inputs can lend what it built to a run that did not change them.
set -euo pipefail
root="$(cd "$(dirname "$0")/../.." && pwd)"
table="$root/.github/components.tsv"
changed="${1:?the file of changed paths}"

rows=(); flags=(); core=""; components=()
while IFS= read -r line; do
case "$line" in ''|'#'*) continue ;; esac
case "$line" in
@core$'\t'*) core="${line#*$'\t'}" ;;
@flag\ *) flags+=("${line#@flag }") ;;
*) rows+=("$line")
name="${line%%$'\t'*}"
[ "$name" = all ] || [[ " ${components[*]} " == *" $name "* ]] || components+=("$name") ;;
esac
done < "$table"

declare -A reached=() flagged=() printed=()
full=false
release=false
case "${EVENT:-}" in pull_request) ;; *) full=true ;; esac
case "${BASE_REF:-}" in release/*) full=true; release=true ;; esac
case "${HEAD_REF:-}" in release/*) full=true; release=true ;; esac

while IFS= read -r path; do
[ -n "$path" ] || continue
component=""
for row in "${rows[@]}"; do
name="${row%%$'\t'*}"; pattern="${row#*$'\t'}"
# shellcheck disable=SC2254
case "$path" in $pattern) component="$name"; break ;; esac
done
if [ -z "$component" ] || [ "$component" = all ]; then
echo "every component: $path" >&2
full=true
else
reached[$component]=true
fi
for flag in "${flags[@]}"; do
name="${flag%%$'\t'*}"; pattern="${flag#*$'\t'}"
# shellcheck disable=SC2254
case "$path" in $pattern) flagged[$name]=true ;; esac
done
done < "$changed"

if [ "$full" = true ] || { [ -n "$core" ] && [ "${reached[$core]:-}" = true ]; }; then
for c in "${components[@]}"; do reached[$c]=true; done
fi
for c in "${components[@]}"; do echo "$c=${reached[$c]:-false}"; done
echo "full=$full"
for flag in "${flags[@]}"; do
name="${flag%%$'\t'*}"
[ "$release" = true ] && flagged[$name]=true
[ "${EVENT:-}" = pull_request ] || flagged[$name]=false
[ -n "${printed[$name]:-}" ] && continue
printed[$name]=1
echo "$name=${flagged[$name]:-false}"
done

# The core's inputs: every tracked path the table gives to the core or to `all`.
mapfile -t inputs < <(for row in "${rows[@]}"; do
name="${row%%$'\t'*}"; pattern="${row#*$'\t'}"
if [ "$name" = "$core" ] || [ "$name" = all ]; then echo "${pattern%%\**}"; fi
done | sort -u)
digest=$(cd "$root" && git ls-files -s -- "${inputs[@]}" | sha256sum | cut -c1-24)
echo "digest=$digest"
57 changes: 57 additions & 0 deletions .github/scripts/release-plan.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/usr/bin/env bash
# release-plan.sh [TAG] -- the components a release tag publishes, and its version (design 2026-11-07, D15).
#
# A version is X.Y.Z: X.Y, the series, is shared by the backend and every editor plugin; Z is each
# component's own patch. Two kinds of tag:
#
# vX.Y.0 a series release: every component, each at X.Y.0
# <component>-vX.Y.Z one component's patch: backend, vscode, clion or nvim, at X.Y.Z
#
# Prints `components=...`, `version=...` and `title=...` for $GITHUB_OUTPUT. Without a tag it only
# checks that every component states one series and the backend's two statements agree (CI).
set -euo pipefail
root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
declare -A version
version[backend]="$(sed -n 's/^version *= *"\(.*\)"/\1/p' "$root/mcpp.toml" | head -1)"
version[vscode]="$(sed -n 's/^ "version": "\(.*\)",$/\1/p' "$root/mide-plugins/vscode/package.json" | head -1)"
version[clion]="$(sed -n 's/^pluginVersion *= *\(.*\)$/\1/p' "$root/mide-plugins/clion/gradle.properties" | head -1)"
version[nvim]="$(sed -n "s/^M.version = '\(.*\)'$/\1/p" "$root/mide-plugins/nvim/lua/mcpp/session.lua" | head -1)"
backend_source="$(sed -n 's/^inline constexpr std::string_view kVersion = "\(.*\)";$/\1/p' "$root/src/server.cppm" | head -1)"
series_source="$(sed -n 's/^inline constexpr std::string_view kSeries = "\(.*\)";$/\1/p' "$root/src/server.cppm" | head -1)"
fail() { echo "release-plan: $*" >&2; exit 1; }
series() { [[ "$1" =~ ^([0-9]+)\.([0-9]+)\.[0-9]+$ ]] && echo "${BASH_REMATCH[1]}.${BASH_REMATCH[2]}"; }

for c in backend vscode clion nvim; do
[ -n "${version[$c]}" ] && [ -n "$(series "${version[$c]}")" ] || fail "$c states no X.Y.Z version (${version[$c]:-none})"
done
[ "$backend_source" = "${version[backend]}" ] || fail "src/server.cppm says $backend_source and mcpp.toml ${version[backend]}"
the_series="$(series "${version[backend]}")"
[ "$series_source" = "$the_series" ] || fail "src/server.cppm's kSeries is $series_source, the backend's series $the_series"
for c in vscode clion nvim; do
[ "$(series "${version[$c]}")" = "$the_series" ] \
|| fail "$c is ${version[$c]}, of another series than the backend's ${version[backend]}"
done

tag="${1:-}"
if [ -z "$tag" ]; then
echo "one series $the_series: backend ${version[backend]}, vscode ${version[vscode]}, clion ${version[clion]}, nvim ${version[nvim]}"
exit 0
fi
if [[ "$tag" =~ ^v([0-9]+\.[0-9]+\.0)$ ]]; then
v="${BASH_REMATCH[1]}"
for c in backend vscode clion nvim; do
[ "${version[$c]}" = "$v" ] || fail "the series release $tag needs every component at $v; $c is ${version[$c]}"
done
echo "components=backend vscode clion nvim"
echo "version=$v"
echo "title=mcpp-ide $v"
elif [[ "$tag" =~ ^(backend|vscode|clion|nvim)-v([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then
c="${BASH_REMATCH[1]}"; v="${BASH_REMATCH[2]}"
[ "${version[$c]}" = "$v" ] || fail "the tag $tag names $c $v, and $c is ${version[$c]}"
declare -A names=([backend]=mcpp-ide [vscode]=mcpp-vscode [clion]=mcpp-clion [nvim]=mcpp-nvim)
echo "components=$c"
echo "version=$v"
echo "title=${names[$c]} $v"
else
fail "$tag is neither vX.Y.0 nor <backend|vscode|clion|nvim>-vX.Y.Z"
fi
37 changes: 37 additions & 0 deletions .github/scripts/test_changes.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env bash
# The classification of .github/scripts/changes.sh, on lists of paths.
set -euo pipefail
here="$(cd "$(dirname "$0")" && pwd)"
failures=0
check() { # check <description> <event> <expected key=value...> -- <paths...>
local what="$1" event="$2"; shift 2
local want=()
while [ "$1" != -- ]; do want+=("$1"); shift; done
shift
local list; list=$(mktemp)
printf '%s\n' "$@" > "$list"
local base=main
[ "$event" = pull_request_release ] && { event=pull_request; base=release/1.2.0; }
local got; got=$(EVENT="$event" BASE_REF="$base" HEAD_REF=topic bash "$here/changes.sh" "$list" 2>/dev/null)
rm -f "$list"
for kv in "${want[@]}"; do
if ! grep -qx "$kv" <<<"$got"; then
echo "FAIL: $what: wanted $kv, got: $(tr '\n' ' ' <<<"$got")"
failures=$((failures + 1))
fi
done
}
check "a plugin alone" pull_request backend=false clion=true vscode=false nvim=false full=false -- mide-plugins/clion/src/main/kotlin/X.kt
check "its README is the plugin's" pull_request vscode=true docs=false backend=false -- mide-plugins/vscode/README.md
check "documentation alone" pull_request docs=true backend=false vscode=false -- docs/x.md README.md
check "the backend reaches every plugin" pull_request backend=true vscode=true clion=true nvim=true -- src/main.cpp
check "spec/ is the backend's" pull_request backend=true vscode=true -- spec/test-frameworks.json
check "a workflow reaches everything" pull_request full=true backend=true -- .github/workflows/ci.yml
check "a path of no component reaches everything" pull_request full=true -- newdir/x
check "a push reaches everything" push full=true backend=true -- docs/x.md
check "a release branch reaches everything" pull_request_release full=true -- docs/x.md
list=$(mktemp); echo docs/x.md > "$list"
d=$(EVENT=pull_request bash "$here/changes.sh" "$list" 2>/dev/null | sed -n 's/^digest=//p'); rm -f "$list"
[ "${#d}" -eq 24 ] || { echo "FAIL: no digest"; failures=$((failures + 1)); }
[ "$failures" -eq 0 ] && echo "test_changes: every case held"
exit "$failures"
4 changes: 2 additions & 2 deletions .github/versions.env
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# The versions CI builds and tests with, in one file; .github/actions/setup-mcpp exports them.
# The published bootstrap; the project explicitly selects platform 0.24.
MCPP_VERSION=2026.11.5.1
MCPP_VERSION=2026.11.7.2
# A ref of mcpp-community/mcpp CI builds mcpp from and uses instead, for a contract not yet released.
# Empty: the release above is used.
MCPP_SOURCE_REF=
# The LLVM the backend builds with on macOS and Windows (the targets mcpp reaches there with it).
LLVM_VERSION=23.1.3
# The xlings mcpp 2026.11.5.1 bundles, which reads the current index.
# The xlings mcpp 2026.11.7.2 bundles, which reads the current index.
XLINGS_VERSION=v2026.10.26.1
# The oldest VS Code the extension supports (engines.vscode), which its tests run in.
VSCODE_VERSION=1.91.0
Loading
Loading