Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
cdf6da7
Cleanup
MelbourneDeveloper Aug 3, 2026
1c46f25
More cleanup
MelbourneDeveloper Aug 3, 2026
ae7c9c1
Cleanup
MelbourneDeveloper Aug 3, 2026
6ecf627
fixes
MelbourneDeveloper Aug 3, 2026
758df2d
fixes
MelbourneDeveloper Aug 3, 2026
ed6cf1b
fixes
MelbourneDeveloper Aug 3, 2026
f80c219
fixes
MelbourneDeveloper Aug 3, 2026
3c47b7a
Fixes
MelbourneDeveloper Aug 3, 2026
f6620a5
Fixes
MelbourneDeveloper Aug 3, 2026
44ec4f5
fixes
MelbourneDeveloper Aug 3, 2026
6e446ef
restructure
MelbourneDeveloper Aug 3, 2026
294a980
fixes
MelbourneDeveloper Aug 3, 2026
51aa732
fixes
MelbourneDeveloper Aug 3, 2026
1f1aa68
fixes
MelbourneDeveloper Aug 3, 2026
3067f78
fix: restore rename correctness and make NuGet unused-detection tests…
MelbourneDeveloper Aug 3, 2026
9d94034
fix: satisfy csharpier and un-skip the SIGKILL recovery test on Windows
MelbourneDeveloper Aug 3, 2026
41d010b
fix: make the mixed-language rename test hermetic and clear the high …
MelbourneDeveloper Aug 4, 2026
561bf91
fix: build the VS Code test fixtures before the extension host launches
MelbourneDeveloper Aug 4, 2026
d6cd137
fix(fsharp): rename record types, escaped identifiers and indexers
MelbourneDeveloper Aug 4, 2026
f055581
test: apply the headless override action instead of only offering it
MelbourneDeveloper Aug 4, 2026
bc31827
test: exercise the style-rewrite analyzer chain end to end
MelbourneDeveloper Aug 4, 2026
6ede63e
test: tighten the override assertions to cover generic signature matc…
MelbourneDeveloper Aug 4, 2026
c92f09c
fix(test): stop the profiler heap-dump test racing the target's first…
MelbourneDeveloper Aug 4, 2026
dc58820
test: apply the merge-declaration refactoring instead of only offerin…
MelbourneDeveloper Aug 4, 2026
5bde4d6
test(fsharp): cover the rename engine in the sidecar suite, not just …
MelbourneDeveloper Aug 4, 2026
fb7b5ca
test(fsharp): cover the code-action engine in the sidecar suite
MelbourneDeveloper Aug 4, 2026
acee824
test(fsharp): cover indexer metadata rewriting and its refusal path
MelbourneDeveloper Aug 4, 2026
021c229
test(fsharp): close the remaining sidecar coverage gaps on the rename…
MelbourneDeveloper Aug 4, 2026
90bf071
fix(test): stop pinning an unreachable error count on the FluentValid…
MelbourneDeveloper Aug 4, 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
  •  
  •  
  •  
23 changes: 0 additions & 23 deletions .claude/settings.local.json

This file was deleted.

6 changes: 3 additions & 3 deletions .claude/skills/ci-prep/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ Read **every line** of `--log-failed` output. For each failure note the exact fi
- `ci-vsix.yml` — full VS Code suite + coverage gate (Ubuntu)
- `ci-vsix-windows.yml` — VS Code feature chunks on Windows ([DIST-CI-WIN-VSIX])
2. Parse every job and every step, then extract the ordered list of commands the CI actually runs.
3. Note any environment variables, matrix strategies, or conditional steps that affect execution. In particular the Windows VS Code matrix expands from `editors/vscode/test-chunks.json` — enumerate the chunks with `node scripts/vsix-test-chunks.mjs matrix` and run each locally as `make _test-vsix-win CHUNK=<name>`.
3. Note any environment variables, matrix strategies, or conditional steps that affect execution. In particular the Windows VS Code matrix expands from `src/editors/vscode/test-chunks.json` — enumerate the chunks with `node tools/vsix/vsix-test-chunks.mjs matrix` and run each locally as `make _test-vsix-win CHUNK=<name>`.

**Do NOT assume the steps are `make lint`, `make test`, `make build`.** The actual CI may run different commands, in a different order. Extract what the CI *actually does*.

Expand Down Expand Up @@ -80,10 +80,10 @@ For each command extracted from the CI workflow:

- **Rust clippy violations**: Fix the code. Never add `#[allow(clippy::...)]` without an extraordinary justification.
- **Rust fmt**: Run `cargo fmt` to auto-fix, then verify with `cargo fmt --check`.
- **TypeScript prettier**: Run `cd editors/vscode && npx prettier@3 --write 'src/**/*.ts'` to auto-fix.
- **TypeScript prettier**: Run `cd src/editors/vscode && npx prettier@3 --write 'src/**/*.ts'` to auto-fix.
- **TypeScript ESLint**: Fix lint errors in the source. Never add `// eslint-disable`.
- **TypeScript tsc**: Fix type errors. Never use `any` to silence a type error.
- **.NET csharpier**: Run `dotnet csharpier sidecars/` to auto-fix.
- **.NET csharpier**: Run `dotnet csharpier src/sidecars/` to auto-fix.
- **.NET build warnings**: Fix the actual warning in the source code.

### Hard constraints
Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/code-dedup/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Carefully search for duplicate code, duplicate tests, and dead code across the r
Before touching ANY code, verify these conditions. If any fail, stop and report why.

1. Run `make test` — all tests must pass. If tests fail, stop. Do not dedup a broken codebase.
2. Run `make test` — tests are fail-fast AND enforce the coverage threshold from `coverage-thresholds.json`. If anything fails, stop and fix it before deduping.
2. Run `make test` — tests are fail-fast AND enforce the coverage threshold from `.config/coverage/thresholds.json`. If anything fails, stop and fix it before deduping.
3. Verify the project uses **static typing**. Check for:
- Rust, C#, F#: typed by default — proceed
- TypeScript: `tsconfig.json` must have `"strict": true` — proceed
Expand All @@ -38,7 +38,7 @@ Dedup Progress:

Before deciding what to touch, understand what is tested.

1. Run `make test` to confirm green baseline. `make test` is fail-fast AND enforces the coverage threshold from `coverage-thresholds.json`. It exits non-zero on any test failure OR coverage shortfall.
1. Run `make test` to confirm green baseline. `make test` is fail-fast AND enforces the coverage threshold from `.config/coverage/thresholds.json`. It exits non-zero on any test failure OR coverage shortfall.
2. Note the current coverage percentage per project — this is the floor. It must not drop.
3. Identify which files/modules have coverage and which do not. Only files WITH coverage are candidates for dedup.

Expand Down
20 changes: 10 additions & 10 deletions .claude/skills/upgrade-packages/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ Scan the repo for these package ecosystems:
| Marker File | Ecosystem | Location |
|---|---|---|
| `Cargo.toml` (workspace) | Rust (cargo) | Repo root |
| `package.json` / `package-lock.json` | Node.js (npm) | `editors/vscode/` |
| `*.csproj` / `*.fsproj` / `Directory.Build.props` | C#/F# (.NET / NuGet) | `sidecars/SharpLsp.Sidecars.sln` |
| `package.json` / `package-lock.json` | Node.js (npm) | `src/editors/vscode/` |
| `*.csproj` / `*.fsproj` / `.config/dotnet/common.props` | C#/F# (.NET / NuGet) | `src/sidecars/SharpLsp.Sidecars.sln` |

## Step 2 — List Outdated Packages

Expand All @@ -40,16 +40,16 @@ If `cargo-outdated` is not installed: `cargo install cargo-outdated`

### Node.js (npm)
```bash
npm outdated --prefix editors/vscode
npm outdated --prefix src/editors/vscode
```

**Read the docs:** https://docs.npmjs.com/cli/v10/commands/npm-update

### C#/.NET (NuGet)
```bash
dotnet list sidecars/SharpLsp.Sidecars.sln package --outdated
dotnet list src/sidecars/SharpLsp.Sidecars.sln package --outdated
```
For transitive dependencies too: `dotnet list sidecars/SharpLsp.Sidecars.sln package --outdated --include-transitive`
For transitive dependencies too: `dotnet list src/sidecars/SharpLsp.Sidecars.sln package --outdated --include-transitive`

**Read the docs:** https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-list-package

Expand All @@ -75,20 +75,20 @@ For workspace members, run from workspace root.

### Node.js (npm)
```bash
npm update --prefix editors/vscode # semver-compatible
npm update --prefix src/editors/vscode # semver-compatible
# --major flag:
npx npm-check-updates -u --packageFile editors/vscode/package.json && npm install --prefix editors/vscode
npx npm-check-updates -u --packageFile src/editors/vscode/package.json && npm install --prefix src/editors/vscode
```

### C#/.NET (NuGet)
```bash
dotnet outdated --upgrade sidecars/SharpLsp.Sidecars.sln
dotnet outdated --upgrade src/sidecars/SharpLsp.Sidecars.sln
```
If `dotnet-outdated` tool is not installed: `dotnet tool install -g dotnet-outdated-tool`

**Read the docs:** https://github.com/dotnet-outdated/dotnet-outdated

Shared NuGet package versions live in `Directory.Build.props` — check there first and update centrally when possible, rather than editing individual `.csproj`/`.fsproj` files.
Shared NuGet package versions live in `.config/dotnet/common.props` — check there first and update centrally when possible, rather than editing individual `.csproj`/`.fsproj` files.

## Step 5 — Verify the upgrade

Expand Down Expand Up @@ -125,6 +125,6 @@ Provide a summary:
- **Never modify lockfiles manually** (`Cargo.lock`, `package-lock.json`) — let the package manager regenerate them
- **Keep `Cargo.lock` changes** in the same commit as `Cargo.toml` changes
- **Keep `package-lock.json` changes** in the same commit as `package.json` changes
- **`Directory.Build.props`** is the source of truth for shared .NET package versions — update there first
- **`.config/dotnet/common.props`** is the source of truth for shared .NET package versions — update there first
- **If stuck after 3 attempts**, revert and report — do not loop forever
- **Commit nothing** — leave changes in the working tree for the user to review
8 changes: 4 additions & 4 deletions .claude/skills/website-audit/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ Audit Progress:

- Check the outputted HTML/CSS/JavaScript AFTER the website is generated by the static content generator.
- Don't just check the static content before the website is generated.
- Fix issues at the core where the static content templates are stored - not in the outputted HTML (e.g. `website/_site/`)
- Fix issues at the core where the static content templates are stored - not in the outputted HTML (e.g. `src/website/_site/`)
- Never manually edit the generated website content directly

The SharpLsp website is in `website/` and uses Eleventy as the static site generator. Brand color: `#19d078` (green).
The SharpLsp website is in `src/website/` and uses Eleventy as the static site generator. Brand color: `#19d078` (green).

## Step 1 — Read guidelines

Expand All @@ -43,7 +43,7 @@ Fetch and read each of these before auditing. These are the authoritative refere

If the repo has a business plan doc, take it into account.

Identify the website source files in the repo. The framework is Eleventy — templates, metadata, and content live in `website/`.
Identify the website source files in the repo. The framework is Eleventy — templates, metadata, and content live in `src/website/`.

## Step 2 — Audit AI search readiness

Expand Down Expand Up @@ -184,4 +184,4 @@ Summarize the audit results:
- **One step at a time** — complete each step before moving to the next.
- **Preserve existing content** — improve structure and metadata without rewriting the author's voice.
- **No keyword stuffing** — keywords must read naturally in context.
- **Respect the framework** — edit Eleventy templates/configs in `website/`, not generated output files in `website/_site/`.
- **Respect the framework** — edit Eleventy templates/configs in `src/website/`, not generated output files in `src/website/_site/`.
File renamed without changes.
File renamed without changes.
54 changes: 54 additions & 0 deletions .config/dotnet/common.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<Project>
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Version>0.1.0</Version>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsAsErrors>IDE0301;IDE0063;IDE0005;MSB3243</WarningsAsErrors>
<WarningLevel>9999</WarningLevel>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<AnalysisMode>All</AnalysisMode>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<!-- Null reference warnings as errors -->
<WarningsAsErrors>$(WarningsAsErrors);CS8600;CS8601;CS8602;CS8603;CS8604;CS8605;CS8618;CS8619;CS8625;CS8629;CS8631;CS8633;CS8634;CS8638;CS8643;CS8644;CS8645;CS8653;CS8654;CS8655;CS8667;CS8714;CS8762;CS8764;CS8765;CS8766;CS8767;CS8768;CS8769;CS8770;CS8774;CS8775;CS8776;CS8777;CS8794;CS8795;CS8796;CS8797;CS8798;CS8847;EXHAUSTION001</WarningsAsErrors>
<!-- IDE errors -->
<WarningsAsErrors>$(WarningsAsErrors);IDE0001;IDE0042;IDE0051;IDE0052;IDE0056;IDE0060;IDE0022;IDE0002;IDE0130;IDE0060;IDE0002</WarningsAsErrors>
<!-- Performance critical rules as errors -->
<WarningsAsErrors>$(WarningsAsErrors);CA1805;CA1806;CA1810;CA1812;CA1813;CA1814;CA1815;CA1816;CA1819;CA1820;CA1821;CA1822;CA1823;CA1824;CA1825;CA1826;CA1827;CA1828;CA1829;CA1830;CA1831;CA1832;CA1833;CA1834;CA1835;CA1836;CA1837;CA1838;CA1839;CA1840;CA1841;CA1842;CA1843;CA1844;CA1845;CA1846;CA1847;CA1849;CA1850;CA1851;CA1852;CA1853;CA1854;CA1855;CA1856;CA1857;CA1858;CA1859;CA1860;CA1861;CA1862;CA1863;CA1864;CA1865;CA1866;CA1867;CA1868;CA1869;CA1870</WarningsAsErrors>
<!-- Security rules as errors -->
<WarningsAsErrors>$(WarningsAsErrors);CA2100;CA2101;CA2102;CA2103;CA2104;CA2105;CA2106;CA2107;CA2108;CA2109;CA2110;CA2111;CA2112;CA2113;CA2114;CA2115;CA2116;CA2117;CA2118;CA2119;CA2120;CA2121;CA2122;CA2123;CA2124;CA2125;CA2126;CA2127;CA2128;CA2129;CA2130;CA2131;CA2132;CA2133;CA2134;CA2135;CA2136;CA2137;CA2138;CA2139;CA2140;CA2141;CA2142;CA2143;CA2144;CA2145;CA2146;CA2147;CA2148;CA2149;CA2150;CA2151;CA2152;CA2153;CA2154;CA2155;CA2156;CA2157;CA2158;CA2159;CA2160</WarningsAsErrors>
<!-- Design rules as errors -->
<WarningsAsErrors>$(WarningsAsErrors);IDE0004;SYSLIB1045;CA1000;CA1001;CA1003;CA1005;CA1008;CA1010;CA1012;CA1018;CA1019;CA1021;CA1024;CA1027;CA1028;CA1030;CA1031;CA1032;CA1033;CA1036;CA1040;CA1041;CA1043;CA1044;CA1045;CA1046;CA1047;CA1048;CA1049;CA1050;CA1051;CA1052;CA1053;CA1054;CA1055;CA1056;CA1057;CA1058;CA1059;CA1060;CA1061;CA1063;CA1064;CA1065;CA1066;CA1067;CA1068;CA1069;CA1070</WarningsAsErrors>
<!-- Async/await rules as errors -->
<WarningsAsErrors>$(WarningsAsErrors);VSTHRD001;VSTHRD002;VSTHRD003;VSTHRD004;VSTHRD005;VSTHRD006;VSTHRD010;VSTHRD011;VSTHRD012;VSTHRD100;VSTHRD101;VSTHRD102;VSTHRD103;VSTHRD104;VSTHRD105;VSTHRD106;VSTHRD107;VSTHRD108;VSTHRD109;VSTHRD110;VSTHRD111;VSTHRD112;VSTHRD114;VSTHRD200</WarningsAsErrors>
</PropertyGroup>

<ItemGroup>
<!-- Microsoft .NET Analyzers -->
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.301">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="5.6.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="5.6.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="5.6.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<!-- The BannedApiAnalyzers package is referenced repo-wide, but its RS0030
rule stays dormant until src/sidecars/config/BannedSymbols.txt is supplied. That is done
in src/sidecars/Directory.Build.props, deliberately NOT here: the list
encodes sidecar rules, and test fixtures must stay free to block a
thread on purpose. -->

<PackageReference Include="Outcome" Version="1.0.0" />
<PackageReference Include="Exhaustion" Version="1.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>
22 changes: 15 additions & 7 deletions .deslop.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,22 @@ max_duplication_percent = 20.0
# gitignore-style globs, matched relative to this file.
exclude = [
# Example / sample projects (test input, not codebase).
"examples/**",
"src/examples/**",
# Test-input fixtures (sample sources consumed by the suites).
"tests/fixtures/**",
"editors/vscode/test-fixtures/**",
"src/sharplsp/tests/fixtures/**",
"src/editors/vscode/test-fixtures/**",
# Rust end-to-end test suite (coarse e2e request/response scaffolding).
"tests/**",
"src/sharplsp/tests/**",
# .NET sidecar test projects.
"sidecars/SharpLsp.Sidecar.CSharp.Tests/**",
"sidecars/SharpLsp.Sidecar.FSharp.Tests/**",
"sidecars/SharpLsp.Sidecar.Common.Tests/**",
"src/sidecars/SharpLsp.Sidecar.CSharp.Tests/**",
"src/sidecars/SharpLsp.Sidecar.FSharp.Tests/**",
"src/sidecars/SharpLsp.Sidecar.Common.Tests/**",
# Sequestered formatting implementation — not shipped. The Rust module is
# behind `cfg(feature = "formatting")` (off by default) and the Roslyn
# resolver is unreachable because the host never sends the request. Its
# three handlers are deliberately parallel in shape, which would otherwise
# inflate the production duplication score for code we do not ship.
# See docs/formatting/README.md.
"src/sharplsp/src/formatting.rs",
"src/sidecars/SharpLsp.Sidecar.CSharp/Workspace/FormattingResolver.cs",
]
2 changes: 1 addition & 1 deletion .devcontainer/setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ cargo install cargo-llvm-cov
dotnet tool restore

# VS Code extension dependencies
cd editors/vscode && npm ci && cd ../..
cd src/editors/vscode && npm ci && cd ../../..

echo "==> Setup complete."
6 changes: 3 additions & 3 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -356,13 +356,13 @@ dotnet_diagnostic.CA2329.severity = error
dotnet_diagnostic.CA2330.severity = error

#------------------------------------------------------------------------------
# BannedApiAnalyzers (RSxxxx) — activates the banned-symbol list in BannedSymbols.txt
# BannedApiAnalyzers (RSxxxx) — activates the list in src/sidecars/config/BannedSymbols.txt
#------------------------------------------------------------------------------

# RS0030: A symbol banned in BannedSymbols.txt is used (nondeterministic time,
# RS0030: A symbol banned in src/sidecars/config/BannedSymbols.txt is used (nondeterministic time,
# thread-blocking). Error so `-warnaserror` fails the build on any banned use.
dotnet_diagnostic.RS0030.severity = error
# RS0031: A type banned in BannedSymbols.txt is used.
# RS0031: A type banned in src/sidecars/config/BannedSymbols.txt is used.
dotnet_diagnostic.RS0031.severity = error

#------------------------------------------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions .github/codeql/codeql-config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Shared CodeQL configuration for the PR, weekly, and gated release scans
# (referenced by .github/workflows/codeql.yml). [GITHUB-CODE-SCANNING]
# (referenced by .github/workflows/codeql.yml). [DIST-CI-SECURITY]
#
# Test code is never shipped: the VSIX bundles dist/extension.js (esbuild output
# of src/, excluding src/test) and the Rust/.NET binaries — never the TypeScript
Expand All @@ -14,4 +14,4 @@ queries:

paths-ignore:
- '**/*.test.ts'
- editors/vscode/src/test
- src/editors/vscode/src/test
8 changes: 4 additions & 4 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ updates:

# ── Rust: Zed extension crate ───────────────────────────────────────
- package-ecosystem: cargo
directory: "/editors/zed"
directory: "/src/editors/zed"
target-branch: "dependabot-upgrades"
schedule:
interval: weekly
Expand All @@ -51,7 +51,7 @@ updates:

# ── .NET: C#/F# sidecars solution ───────────────────────────────────
- package-ecosystem: nuget
directory: "/sidecars"
directory: "/src/sidecars"
target-branch: "dependabot-upgrades"
schedule:
interval: weekly
Expand All @@ -62,7 +62,7 @@ updates:

# ── npm: VS Code extension ──────────────────────────────────────────
- package-ecosystem: npm
directory: "/editors/vscode"
directory: "/src/editors/vscode"
target-branch: "dependabot-upgrades"
schedule:
interval: weekly
Expand All @@ -73,7 +73,7 @@ updates:

# ── npm: website ────────────────────────────────────────────────────
- package-ecosystem: npm
directory: "/website"
directory: "/src/website"
target-branch: "dependabot-upgrades"
schedule:
interval: weekly
Expand Down
Loading
Loading