Repository navigation
chore: sync MCP servers, agent instructions, SDK and tooling with FSharp.Azure.Cosmos - #21
Merged
Merged
Conversation
The EditorConfig specification does not support inline comments, so a strict parser reads `indent_style = space # default=space` as the value `space # default=space` and the `[*]` header with a comment after it as a different glob. The bare `http://EditorConfig.org` line was neither a comment nor a setting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nfig
`.editorconfig` asked for CRLF in `.cmd`, `.bat` and `.ps1` files while
`.gitattributes` left them to `text=auto`, so the checkout and the editor
disagreed on one platform and files showed up modified without any content
change.
* `.cmd` and `.bat` are CRLF in every checkout, as `cmd.exe` misreads labels
and `goto` in LF batch files.
* `.ps1` and `.psm1` are LF in both files, which keeps a
`#!/usr/bin/env pwsh` shebang working on Linux. PowerShell on Windows
reads LF too.
* Remove the space in the `[*.{ps1, psm1}]` glob, which made the `psm1`
pattern match nothing.
The index is already LF, so no file content changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Pin the SDK to `10.0.401` in `global.json`. * Install the latest `10.0` SDK in the dev container instead of `10.0.300`, which is older than the pinned one and would fail SDK resolution. * Move the starship dev container feature from the retired `devcontainers-contrib` namespace to `devcontainers-extra`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The README still asked for the .NET 6 SDK, while `global.json` pins `10.0.401` and the projects use F# 10. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
xperiandri
commented
Oct 2, 2026
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The new raw test command fails for checkout paths containing spaces because project and results paths are unquoted.
Review effort: Balanced
Findings: 1
What changed in this PR
Synchronizes developer tooling, MCP configuration, SDK versions, formatting, and MSTest infrastructure with FSharp.Azure.Cosmos.
Changes:
- Adds shared agent and MCP configuration.
- Upgrades the SDK, tools, Fantomas configuration, and reformats F# sources.
- Migrates tests and coverage to Microsoft.Testing.Platform and fixes concurrent formatting.
| File | Description |
|---|---|
.claude/scripts/github-mcp-headers.ps1 |
Supplies GitHub MCP authentication headers. |
.config/dotnet-tools.json |
Upgrades and adds local tools. |
.devcontainer/devcontainer.json |
Updates container features and SDK. |
.editorconfig |
Updates Fantomas and line-ending settings. |
.gitattributes |
Defines script line endings. |
.github/copilot-instructions.md |
Expands shared coding guidance. |
.github/prompts/create-pr-description.prompt.md |
Adds description-formatting guidance. |
.github/workflows/publish_ci.yml |
Removes obsolete AltCover note. |
.github/workflows/publish_release.yml |
Removes obsolete AltCover note. |
.gitignore |
Ignores the generated skills link. |
.mcp.json |
Registers MCP servers for supported agents. |
AGENTS.md |
Points agents to shared instructions. |
CLAUDE.md |
Points Claude Code to shared instructions. |
Directory.Build.targets |
Adds skills linking and serialized formatting. |
Directory.Packages.props |
Migrates to the MSTest metapackage. |
FSharp.Control.R3.slnx |
Adds MCP configuration as a solution item. |
README.md |
Documents updated SDK, test, and coverage behavior. |
build/Changelog.fs |
Applies Fantomas formatting. |
build/build.fs |
Migrates test and coverage orchestration. |
global.json |
Pins the SDK and selects MTP. |
src/FSharp.Control.R3/AsyncObservable.fs |
Applies Fantomas 8 formatting. |
src/FSharp.Control.R3/Observable.fs |
Applies Fantomas 8 formatting. |
src/FSharp.Control.R3/TaskObservable.fs |
Applies Fantomas 8 formatting. |
tests/FSharp.Control.R3.Tests/BuilderTests.fs |
Applies Fantomas 8 formatting. |
tests/FSharp.Control.R3.Tests/FSharp.Control.R3.Tests.fsproj |
Enables the MSTest runner and configuration. |
tests/FSharp.Control.R3.Tests/ObservableTests.fs |
Applies Fantomas 8 formatting. |
tests/FSharp.Control.R3.Tests/testconfig.json |
Enables method-level parallel testing. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
1 of 6 tasks
* Run `dotnet test` on Microsoft.Testing.Platform (`global.json`) with the MSTest runner enabled in the test project. * Reference the `MSTest` metapackage instead of `MSTest.TestAdapter`, `MSTest.TestFramework` and `Microsoft.NET.Test.Sdk`. * Replace AltCover with the Microsoft.Testing.Platform code coverage extension: `DotnetTest` runs `dotnet test --project` for each test project and writes Cobertura reports to `TestResults`, which `GenerateCoverageReport` turns into HTML and merged Cobertura reports. * Run tests in parallel at method level, configured in `testconfig.json`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Remove unnecessary `sprintf` calls: interpolate the `dotnet watch` command, pass the tool command as is and use `failwithf`. * Prefix the bump version commit with `release:` to follow Conventional Commits. * Keep the current latest entry when publishing to GitHub with an empty changelog instead of failing on `LatestEntry`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* `dotnet-reportgenerator-globaltool` `5.3.11` -> `5.4.7` * `fsharp-analyzers` `0.27.0` -> `0.31.0` * Write `"rollForward": false` for every tool, as `dotnet tool update` does. It is the default, so tools keep running on the runtime they target. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Three `.editorconfig` settings this version no longer recognizes: - `fsharp_semicolon_at_end_of_line` and `fsharp_max_dot_get_expression_width` are dropped with no replacement. - `fsharp_keep_indent_in_branch` is renamed to `fsharp_experimental_keep_indent_in_branch`. F# files now get `end_of_line=lf`, which matches the eol `.gitattributes` stores them with, so formatting on Windows no longer flips them to CRLF. The remaining `.editorconfig` comments are corrected to the defaults and examples of this version. Two formatting differences from 6.3.16 show up in this repository: - Tight parens on a call whose callee is not a plain dotted name, e.g. one carrying a type application (`ValueTask<'r>(...)`, `Assert.AreEqual<int>(4, i)`) or a method call on a record copy expression. Deliberate and permanent since 8.0.0-alpha-018 (fsprojects/fantomas#3425): `fsharp_space_before_uppercase_invocation` only gets a say when the whole callee is a plain dotted name, and no `.editorconfig` option restores the old spacing here. - A computation expression that would push a member line past `max_line_length` moves below the `=` instead of overflowing the line (`AsyncObservable.toLookup`). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Formatting only, produced by `dotnet fantomas .`; a second run leaves the tree unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* `F#` – FsLangMCP semantic F# server backed by the compiler and FSAC, run as the pinned `fslangmcp` local tool * `GitHub` – code search in dependency repositories * `Microsoft Docs` – official Microsoft and Azure documentation `.mcp.json` lists them under `servers` for VS Code / GitHub Copilot and under `mcpServers` for Claude Code. In Claude Code the `GitHub` server authenticates through `.claude/scripts/github-mcp-headers.ps1`, which reuses the GitHub token stored by Git Credential Manager, because the server does not support the OAuth dynamic client registration Claude Code needs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* `CLAUDE.md` imports the shared Copilot instructions, and `AGENTS.md` points other agents to them, so every agent follows a single source of truth. * `Directory.Build.targets` links `.claude/skills` to `.github/skills` on design-time builds, so Claude Code discovers the repository skills once they exist. Git cannot store a Windows junction, and a committed symlink only checks out as a real link with `core.symlinks=true` plus Developer Mode, so the link is created locally and git-ignored. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bring the instructions in line with FSharp.Azure.Cosmos: * Document when to prefer each MCP server from `.mcp.json`: FsLangMCP for semantic F# work, GitHub for code search in dependency repositories and Microsoft Docs for official documentation. * Restructure the F# guidelines into language and tooling, asynchrony and cancellation, values and collections, and functions, lambdas and strings. * Adopt the `voption`, `StringComparison` and span guidance from the dotnet/fsharp instructions, `IcedTasks` CE guidance (this library does not reference `IcedTasks` yet and needs maintainer sign-off before adding it), `ToLookup` over `Seq.groupBy`, the nullness warning suppression order, the XML doc comment `<summary>` rules and `open` statement sorting. * Prefer MSTest `Assert.Contains` and `Assert.HasCount` style assertions and running tests with `--no-build` and trx results. * Ask the PR description prompt to wrap names and versions into backticks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…work The library targets `netstandard2.0` and `net8.0`, and MSBuild builds both target frameworks in parallel. The `Format` target ran in each of them, so two Fantomas processes rewrote the same files at once: some files failed to format because they were "being used by another process", and touching the shared marker file could fail the build with MSB3371. Every build of a project now calls `Format` on one dedicated instance of the project without a target framework. MSBuild runs a target once per project instance, so each project is formatted once per build, whether it is built from the solution, as a project reference or on its own. Design-time builds still skip formatting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
xperiandri
force-pushed
the
mcp-and-tooling-updates
branch
from
October 2, 2026 23:03
725a547 to
50702aa
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Proposed Changes
Ports the MCP, agent instruction, SDK and tooling changes made in
FSharp.Azure.Cosmossince the last sync..mcp.jsonregisters theF#(FsLangMCP),GitHubandMicrosoft DocsMCP servers for both VS Code / GitHub Copilot and Claude Code,CLAUDE.mdandAGENTS.mdpoint every agent to the shared Copilot instructions, and those instructions adopt the latest F# guidelines (voption,StringComparisonand spans, XML doc comments,opensorting, MSTest assertions). The .NET SDK moves to10.0.401,Fantomasto8.0.5with the tree reformatted,ReportGeneratorto5.4.7andFSharp.Analyzersto0.31.0. Tests run onMicrosoft.Testing.Platformwith theMSTestmetapackage, and its code coverage extension replacesAltCover.Directory.Build.targetsnow formats each project once per build instead of once per target framework, which fixes concurrentFantomasruns of thenetstandard2.0andnet8.0builds failing on locked files or withMSB3371.Types of changes
What types of changes does your code introduce to FSharp.Control.R3?
Put an
xin the boxes that applyChecklist
Put an
xin the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your code.build.cmd(clean, restore, build, test, pack) andbuild.cmd CheckFormatCodesucceedFantomasto rewrite files in repeated buildsFurther comments
FSharp.Azure.Cosmoscommits and keep the R3 specifics:max_line_length=150, the project-specific instruction sections and the doubleFantomaspass.testconfig.jsonturns on method-level test parallelization, which the tests did not have before.Fantomas8.0.5changes two things here: tight parens on calls whose callee is not a plain dotted name (e.g.ValueTask<'r>(...)), and a computation expression that would overflowmax_line_lengthmoves below the=(AsyncObservable.toLookup).GitHubMCP server authenticates with the token stored by Git Credential Manager (.claude/scripts/github-mcp-headers.ps1), because the server does not support the OAuth dynamic client registration Claude Code needs.ToolUpdatetarget (dotnet tool update --allon build) and the FAKEDotnetToolRestoretarget, as theToolRestoretarget already restores tools during restore.Directory.Packages.props, the test project and the regrouped test files; keep its test layout and rerunFantomas.🤖 Generated with Claude Code