Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
4289170
Make config reactive
MelbourneDeveloper Jul 16, 2026
4df7286
Reactive server-side configuration + basilisk format CLI
MelbourneDeveloper Jul 16, 2026
a68745e
Merge branch 'main' into reactiveconfig
MelbourneDeveloper Jul 16, 2026
1aa6e0e
fixes
MelbourneDeveloper Jul 16, 2026
eb97b66
Fixes
MelbourneDeveloper Jul 16, 2026
5062273
Fixes
MelbourneDeveloper Jul 16, 2026
3cfb87e
Merge branch 'main' into reactiveconfig
MelbourneDeveloper Jul 16, 2026
962f2b3
fixes
MelbourneDeveloper Jul 16, 2026
6d258e6
Inference-first annotation rules: BSK-0001/0002 never fire on inferab…
MelbourneDeveloper Jul 17, 2026
7302774
Restore PyPI packaging in pyproject.toml clobbered by on-branch confi…
MelbourneDeveloper Jul 17, 2026
71eb985
Merge remote-tracking branch 'origin/main' into reactiveconfig
MelbourneDeveloper Jul 17, 2026
6b36b4e
Restamp README conformance/bench references from rebaselined CSV
MelbourneDeveloper Jul 17, 2026
21dfa7f
Stuff
MelbourneDeveloper Jul 17, 2026
1816b78
Format test_book_contract.py to satisfy ruff format gate
MelbourneDeveloper Jul 18, 2026
d38dbe4
Stage 0+1 of inference plan: bidirectional constraint engine + defini…
MelbourneDeveloper Jul 18, 2026
503cae2
Format incremental_measure example (missed by broken shell chain)
MelbourneDeveloper Jul 18, 2026
510a5a6
Stage 2 narrowing core: scoped environment, guard consumption, set op…
MelbourneDeveloper Jul 18, 2026
0139f0b
Stage 2 flow walker: branch/complement/join over resolver guards with…
MelbourneDeveloper Jul 18, 2026
db8fbea
Stage 2: match-statement per-case narrowing; check off flow checklist…
MelbourneDeveloper Jul 18, 2026
dcaf73c
Stage 2: unreachable-branch narrowing test; check off flow behaviour …
MelbourneDeveloper Jul 18, 2026
c14b96a
Stage 2 extended guards: ==/in literals, TypedDict key membership, im…
MelbourneDeveloper Jul 18, 2026
70ed088
Stage 2: Salsa-backed narrowed_uses query, attr-narrowing config knob…
MelbourneDeveloper Jul 18, 2026
6be30b7
Stage 2: inference-driven unreachable-branch reporting from Never nar…
MelbourneDeveloper Jul 18, 2026
0fe5081
Stage 2: type(x)-is narrowing with @final awareness; ifT-benchmark ba…
MelbourneDeveloper Jul 18, 2026
d0f6ebf
Stage 2 expression inference: same-module unannotated-return synthesis
MelbourneDeveloper Jul 18, 2026
c0c313e
Stage 2 expression inference: centralized builtin signatures; constru…
MelbourneDeveloper Jul 18, 2026
e974631
Stage 2 expression inference: #317 parameter inference from body cons…
MelbourneDeveloper Jul 18, 2026
b077a88
Stage 2 expression inference: same-module call-return inference with …
MelbourneDeveloper Jul 18, 2026
3f9b08c
Stage 2 expression inference: imported function/method return types
MelbourneDeveloper Jul 18, 2026
7f67666
Stage 2 expression inference: plain attribute loads via backdated cla…
MelbourneDeveloper Jul 18, 2026
61b1bac
Merge branch 'main' into reactiveconfig
MelbourneDeveloper Jul 18, 2026
7bad959
Stuff
MelbourneDeveloper Jul 18, 2026
dc04830
Merge remote-tracking branch 'origin/reactiveconfig' into reactiveconfig
MelbourneDeveloper Jul 18, 2026
193702f
Merge branch 'main' into typeshed
MelbourneDeveloper Jul 18, 2026
179134b
Docs
MelbourneDeveloper Jul 18, 2026
89f516d
fixes
MelbourneDeveloper Jul 18, 2026
976e557
typeshed
MelbourneDeveloper Jul 18, 2026
348e9f2
typeshed
MelbourneDeveloper Jul 18, 2026
3e65daa
Stuff
MelbourneDeveloper Jul 18, 2026
86066db
Spec fixes
MelbourneDeveloper Jul 18, 2026
4f064dc
fixes
MelbourneDeveloper Jul 18, 2026
5be8478
fixes
MelbourneDeveloper Jul 18, 2026
efaefa1
stuff
MelbourneDeveloper Jul 18, 2026
33d5f30
Implementation
MelbourneDeveloper Jul 18, 2026
6237740
Fixes
MelbourneDeveloper Jul 18, 2026
790a6e6
fixes
MelbourneDeveloper Jul 19, 2026
a1a233b
Stuff
MelbourneDeveloper Jul 19, 2026
4e5ca94
Stuff
MelbourneDeveloper Jul 19, 2026
2f5959a
test: negative + optional-path regression tests for contextual litera…
MelbourneDeveloper Jul 19, 2026
47a8914
fix(BSK-0050): restore never-flag-collections contract for redundant-…
MelbourneDeveloper Jul 19, 2026
bdfb327
fix(compiler): attach bundled Typeshed so stdlib imports resolve in-p…
MelbourneDeveloper Jul 19, 2026
d164703
inlay: display LiteralString as str; defer union literal check on unj…
MelbourneDeveloper Jul 19, 2026
4bef896
lint: take inlay_type_display by &str (clippy needless_pass_by_value)
MelbourneDeveloper Jul 19, 2026
76895db
docs(website): regenerate rules.json after rule doc changes (fix WEBS…
MelbourneDeveloper Jul 19, 2026
3611f32
perf(resolver): share parsed builtins.pyi index by Arc + memoize
MelbourneDeveloper Jul 19, 2026
2ca72f0
fix(nvim): gate LSP e2e on an indexed documentSymbol, not a bare resp…
MelbourneDeveloper Jul 19, 2026
fcd0477
fix(uv): widen interpreter platform-probe ceiling to 5s to kill CI flake
MelbourneDeveloper Jul 19, 2026
a7bc4ea
Merge branch 'main' into typeshed
MelbourneDeveloper Jul 19, 2026
dc753b7
Docs and UI stuff
MelbourneDeveloper Jul 19, 2026
af57b72
fixes
MelbourneDeveloper Jul 19, 2026
1c2f0a1
Fixes
MelbourneDeveloper Jul 19, 2026
fe668c3
fixes
MelbourneDeveloper Jul 19, 2026
39b08be
Fixes
MelbourneDeveloper Jul 20, 2026
46333d8
blog
abdushakoor12 Jul 20, 2026
951fe8f
fixes
MelbourneDeveloper Jul 20, 2026
bfe4056
Merge remote-tracking branch 'origin/typeshed' into typeshed
MelbourneDeveloper Jul 20, 2026
7c63bec
fixes
MelbourneDeveloper Jul 20, 2026
e641717
Fixes
MelbourneDeveloper Jul 20, 2026
adcbc0c
fixes
MelbourneDeveloper Jul 20, 2026
022c239
fixes
MelbourneDeveloper Jul 20, 2026
9494478
Deduplicate snapshot stub-source provenance selection (refs #330)
MelbourneDeveloper Jul 20, 2026
2041ec4
fixes
MelbourneDeveloper Jul 20, 2026
1a2d6b3
tests
MelbourneDeveloper Jul 20, 2026
78efe70
fixes
MelbourneDeveloper Jul 20, 2026
668ad0d
fixes
MelbourneDeveloper Jul 20, 2026
6e61072
Fix mutation gate crediting untested mutants as kills
MelbourneDeveloper Jul 20, 2026
c94e441
Reconcile mutation-ratchet spec with what the gate actually enforces
MelbourneDeveloper Jul 20, 2026
40addea
Fix config-editor webview DOM test without depending on window focus
MelbourneDeveloper Jul 20, 2026
3b94c1a
Accept pyright's real stubPath key so stub dirs stop vanishing
MelbourneDeveloper Jul 20, 2026
2729d50
Add the two spec sections eight code references point at
MelbourneDeveloper Jul 20, 2026
56ff74b
Correct two false claims about how rule config resolves
MelbourneDeveloper Jul 20, 2026
9392371
Cover the typeshed-cache-path wiring that no test reached
MelbourneDeveloper Jul 20, 2026
88ed2fa
Make the config-editor DOM test wait for consequences, not a fixed delay
MelbourneDeveloper Jul 21, 2026
82a7333
Land typeshed credential/cache fixes and unstarve the mutation gate
MelbourneDeveloper Jul 21, 2026
4146c42
Stop committing interrupted-test residue into the VSIX fixture workspace
MelbourneDeveloper Jul 21, 2026
dbb27cb
Wait for the LSP scan to prove it is alive before reading silence
MelbourneDeveloper Jul 21, 2026
8374661
Correct the mutation timeout rationale to what was measured
MelbourneDeveloper Jul 21, 2026
28b9506
Give test-rust a budget that lets the conformance gate actually run
MelbourneDeveloper Jul 21, 2026
16f5845
Ratchet the mutation baseline onto the numbers the gate now produces
MelbourneDeveloper Jul 21, 2026
475c61b
Fixes
MelbourneDeveloper Jul 21, 2026
f5cbf6b
Merge branch 'main' into typeshed
MelbourneDeveloper Jul 21, 2026
9ada1f7
spec fixes
MelbourneDeveloper Jul 21, 2026
7e057f9
fixes
MelbourneDeveloper Jul 21, 2026
62da33e
fixes
MelbourneDeveloper Jul 21, 2026
846f173
fixes
MelbourneDeveloper Jul 21, 2026
e52275d
fixes
MelbourneDeveloper Jul 21, 2026
004f5e1
fixes
MelbourneDeveloper Jul 21, 2026
8abce3a
fixes
MelbourneDeveloper Jul 21, 2026
c546b9c
fixes
MelbourneDeveloper Jul 21, 2026
a49e889
fixes
MelbourneDeveloper Jul 21, 2026
ab3e39c
stuff
MelbourneDeveloper Jul 21, 2026
98dbbb4
fixes
MelbourneDeveloper Jul 21, 2026
5af2bc8
fixes
MelbourneDeveloper Jul 21, 2026
ec2a409
fixes
MelbourneDeveloper Jul 21, 2026
1f0ead3
Split the config-editor LSP seam and delete three false doc claims
MelbourneDeveloper Jul 21, 2026
14d140c
Make the newly-gated Neovim suites pass on both matrix legs
MelbourneDeveloper Jul 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
75 changes: 62 additions & 13 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Dev container matching CI (GitHub Actions ubuntu-22.04-8-cores + dtolnay/rust-toolchain@stable)
# Pin Rust to match CI's stable channel — this is the critical version.
# 1.96.0 = current stable on the CI runners; 1.94 fails the workspace build
# Dev container matching CI (.github/workflows/ci.yml — every job runs on
# ubuntu-24.04, or vars.BIG_RUNNER, with dtolnay/rust-toolchain@stable).
# CI resolves `stable` at run time; this image pins the concrete release so a
# container rebuild is reproducible. 1.94 fails the workspace build
# (sysinfo 0.39.3 requires rustc >= 1.95).
FROM rust:1.96.0-bookworm

Expand Down Expand Up @@ -29,28 +30,41 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
libdbus-1-3 \
&& rm -rf /var/lib/apt/lists/*

# Python 3.12 (matches CI: actions/setup-python@v5 with python-version: "3.12")
# Python. CI pins 3.12 (actions/setup-python@v6 with python-version: "3.12");
# this base image is Debian bookworm, whose `python3` is 3.11. That is the one
# knowingly unsynced version here — the interpreters are NOT identical, so a
# green container run is not proof of the CI matrix.
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 \
python3-pip \
python3-venv \
&& rm -rf /var/lib/apt/lists/*

# Node 20 (matches CI: actions/setup-node@v4 with node-version: 20)
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
&& apt-get install -y --no-install-recommends nodejs=20.* \
# Node 22 (matches CI: actions/setup-node@v6 with node-version 22.x in the
# `VS Code Extension` and `Shipwright Binary Gate` jobs — the ones this container
# reproduces through `make test` / `make build`. Only the website-build job,
# which this image does not run, pins Node 20.)
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
&& apt-get install -y --no-install-recommends nodejs=22.* \
&& rm -rf /var/lib/apt/lists/*

# Rust components (matches CI: dtolnay/rust-toolchain@stable with components)
RUN rustup component add rustfmt clippy
# Rust components + targets (matches CI: dtolnay/rust-toolchain@stable with
# `rustfmt, clippy` in Lint, `llvm-tools-preview` in Rust Tests & Coverage — the
# component cargo-llvm-cov needs — and the wasm32-wasip2 target in Zed Extension)
RUN rustup component add rustfmt clippy llvm-tools-preview \
&& rustup target add wasm32-wasip2

# Rust cargo tools (pinned)
RUN cargo install cargo-llvm-cov --version 0.8.4 --locked \
&& cargo install cargo-audit --version 0.22.2 --locked

# Python packages (pinned — ruff MUST match CI and the ruff_* crate tag in
# Cargo.toml: pip install debugpy ruff==0.15.17)
RUN pip install --break-system-packages debugpy==1.8.14 ruff==0.15.17
# Cargo.toml). pytest drives the Neovim e2e harness (scripts/test-nvim.sh) and is
# pinned to CI's version; jinja2/markdown/tomlkit are the REAL python/typing
# conformance harness's own runtime deps, installed unpinned exactly as CI does.
RUN pip install --break-system-packages \
debugpy==1.8.14 ruff==0.15.17 pytest==9.1.1 \
jinja2 markdown tomlkit

# GitHub CLI (for PR creation, issue management)
RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \
Expand All @@ -66,15 +80,50 @@ RUN curl -fsSL https://raw.githubusercontent.com/nektos/act/master/install.sh |
# Claude Code CLI
RUN npm install -g @anthropic-ai/claude-code

# Lua coverage for the Neovim suite. CI runs `luarocks install --local luacov`
# into the runner's HOME; installing it system-wide here puts it on the default
# LUA_PATH, so `make _test_nvim` finds it without an `eval "$(luarocks path)"`.
RUN apt-get update && apt-get install -y --no-install-recommends luarocks \
&& luarocks install luacov \
&& rm -rf /var/lib/apt/lists/*

# Match CI environment variables
ENV CARGO_TERM_COLOR=always
ENV RUSTFLAGS="-D warnings"

# Create a non-root user so Claude Code can use --dangerously-skip-permissions
# Create a non-root user so Claude Code can use --dangerously-skip-permissions.
# It is created BEFORE the Homebrew bootstrap below because Homebrew refuses to
# install as root and its installer expects passwordless sudo.
RUN useradd -m -s /bin/bash -u 1000 dev \
&& mkdir -p /workspace \
&& chown -R dev:dev /workspace /usr/local/cargo /usr/local/rustup
&& chown -R dev:dev /workspace /usr/local/cargo /usr/local/rustup \
&& apt-get update \
&& apt-get install -y --no-install-recommends sudo git procps file build-essential \
&& echo 'dev ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/dev \
&& chmod 0440 /etc/sudoers.d/dev \
&& rm -rf /var/lib/apt/lists/*

USER dev

# Homebrew — the package manager scripts/install-deslop.sh drives, and the one
# the CI Lint job uses to install the deslop gate. That script relies on the
# runner already having brew; a Debian image has to bootstrap it.
RUN NONINTERACTIVE=1 /bin/bash -c \
"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
ENV PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:${PATH}"

# Neovim — `make test` runs the basilisk.nvim e2e suite (`make _test_nvim`) and
# scripts/audit.sh gates on it. basilisk.nvim requires 0.11+ (its health.lua
# hard-errors below that, and lua/basilisk/lsp.lua uses the 0.11-only
# vim.lsp.config/vim.lsp.enable); CI covers that floor and nightly via
# rhysd/action-setup-vim. Debian bookworm's nvim predates 0.11, so it comes from
# brew here — audit.sh re-verifies the floor before the suite runs either way.
RUN brew install neovim

# deslop duplication gate — `make lint` runs it ([CI-DESLOP]). Installed with the
# repo's own script, byte-for-byte the step the CI Lint job runs, so the CLI here
# is the same latest release CI gates on.
COPY --chown=dev:dev scripts/install-deslop.sh /tmp/install-deslop.sh
RUN bash /tmp/install-deslop.sh && rm /tmp/install-deslop.sh

WORKDIR /workspace
29 changes: 20 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,12 @@ jobs:
website/*|benchmarks/status/*|crates/basilisk-checker/src/rules/*) website=true ;;
# The conformance score + graded python/typing commit are stamped
# into these by scripts/gen_conformance_reference.py — editing
# them re-runs the website job's stamp drift guard.
README.md|README.zh.md|docs/specs/CHECKER-ARCHITECTURE-SPEC.md) website=true ;;
# them re-runs the website job's stamp drift guard. The published
# READMEs are generated from docs/readme/ ([README]), so touching
# a source OR a generated copy must re-run that guard too.
docs/readme/*|docs/specs/CHECKER-ARCHITECTURE-SPEC.md) website=true ;;
README.md|README.zh.md|README-pypi.md) website=true ;;
vscode-extension/README.md|vscode-extension/README.zh.md) website=true ;;
esac
# Route each changed path to the NARROWEST code scope that needs it.
# Pure docs / static site / benchmark tooling / CI YAML never reach a
Expand Down Expand Up @@ -174,11 +178,14 @@ jobs:
diff -u website/src/_data/rules.json /tmp/rules.json \
|| { echo "::error::rules.json is stale — run: python3 scripts/gen_rules_reference.py --data"; exit 1; }

# The README/spec quote the live score + graded python/typing commit,
# stamped by scripts/gen_conformance_reference.py on every scorer run;
# fail if the committed text drifted from conformance_report.json so a
# quoted commit can never go stale ([CHKARCH-CONFORMANCE]).
- name: Check stamped conformance references are in sync with the report
# The README source/spec quote the live score + graded python/typing
# commit, stamped by scripts/gen_conformance_reference.py on every scorer
# run; fail if the committed text drifted from conformance_report.json so
# a quoted commit can never go stale ([CHKARCH-CONFORMANCE]). The same
# command then verifies that every published README still renders from
# docs/readme/ unchanged ([README-DRIFT]) — GitHub, the VSIX (Marketplace
# AND Open VSX), and PyPI cannot drift apart or be edited in place.
- name: Check stamped conformance references and generated READMEs
run: python3 scripts/gen_conformance_reference.py --check

- name: Build site
Expand Down Expand Up @@ -548,9 +555,13 @@ jobs:
with:
python-version: "3.12"

- name: Install pytest and luarocks
- name: Install pytest, debugpy and luarocks
run: |
pip install pytest==9.1.1
# debugpy is a real dependency of this job, not a nicety: the
# tests/dap specs drive basilisk's debug adapter end to end, and
# without it every one of them fails with "debugpy not found".
# Pinned to the same version as test-vscode and the devcontainer.
pip install pytest==9.1.1 debugpy==1.8.14
sudo apt-get install -y luarocks
luarocks install --local luacov

Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ Strict-by-default Python type checker and comprehensive LSP built in **Rust**. O
- **Parser**: `ruff_python_parser` (MIT, same as Ruff)
- **Incremental**: Salsa framework — sub-10ms incremental checks
- **Formatting**: `ruff_python_formatter` crate embedded in-process ([LSPFMT-ENGINE]); import hygiene reimplemented natively on the Ruff AST ([LSPFMT-IMPORTS]). The `ruff` CLI is NOT a runtime dependency — never spawn it.
- **Parallelism**: Rayon (work-stealing, file-level)
- **Concurrency**: Tokio in the LSP server (request multiplexing + `spawn_blocking`); analysis itself is single-threaded on one dedicated large-stack thread ([LSPARCH-ARCH-STACK])
- **No Pyright/mypy/Node.js** — zero TypeScript or Python runtime

## Migration to `lspkit`
Expand Down
17 changes: 16 additions & 1 deletion Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ members = [
"crates/basilisk-checker",
"crates/basilisk-cli",
"crates/basilisk-stubs",
"crates/basilisk-typeshed-fetch",
"crates/basilisk-config",
"crates/basilisk-lsp",
"crates/basilisk-mojo",
Expand Down Expand Up @@ -73,6 +74,7 @@ basilisk-checker = { path = "crates/basilisk-checker" }
basilisk-lsp = { path = "crates/basilisk-lsp" }
basilisk-compiler = { path = "crates/basilisk-compiler" }
basilisk-stubs = { path = "crates/basilisk-stubs" }
basilisk-typeshed-fetch = { path = "crates/basilisk-typeshed-fetch" }
basilisk-config = { path = "crates/basilisk-config" }
basilisk-common = { path = "crates/basilisk-common" }
basilisk-buildinfo = { path = "crates/basilisk-buildinfo" }
Expand Down
16 changes: 15 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ test: _audit
echo -e '\n\033[0;32m✓ All tests passed.\033[0m'

## lint: Run all linters/analyzers (read-only). Does NOT format.
lint: _lint_rust _lint_vsix _lint_deslop
lint: _lint_rust _lint_vsix _lint_deslop _lint_docs

## fmt: Format all code in-place
fmt: _fmt_rust _fmt_python _fmt_vsix
Expand Down Expand Up @@ -396,6 +396,7 @@ _lint_rust:
cargo check --workspace --all-targets && \
cargo clippy --workspace --all-targets -- -D warnings && \
cargo audit && \
bash scripts/check-dependency-shape.sh && \
echo -e '\033[0;32m✓ Rust lint passed\033[0m'

_lint_vsix:
Expand All @@ -411,6 +412,19 @@ _lint_deslop:
deslop . && \
echo -e '\033[0;32m✓ Deslop duplication gate passed\033[0m'

# Generated-documentation drift gates. The published READMEs (GitHub, the VSIX
# on both Marketplace and Open VSX, PyPI) are rendered from docs/readme/
# ([README]), and the diagnostic reference data is generated from the checker
# rule sources ([WEBSITE-ERROR-PAGES-DRIFT]) — editing either output by hand,
# or editing a source without regenerating, fails here as it does in CI.
_lint_docs:
@echo -e '\033[1m\033[0;36m▶ Checking generated documentation\033[0m' && \
python3 scripts/gen_readmes.py --check && \
python3 scripts/gen_rules_reference.py --data /tmp/basilisk-rules.json && \
diff -u website/src/_data/rules.json /tmp/basilisk-rules.json > /dev/null || \
{ echo 'rules.json is stale — run: python3 scripts/gen_rules_reference.py --data'; exit 1; } && \
echo -e '\033[0;32m✓ Generated documentation is in sync\033[0m'

_fmt_rust:
@echo -e '\033[1m\033[0;36m▶ Formatting Rust\033[0m' && \
cargo fmt --all && \
Expand Down
Loading
Loading