artempyanykh/marksman
62.9
Adequate · 22 September 2026
13.3k
lines of production code
F#
primary language
6
measurements over time
What this system is
This system is a Markdown language server built on .NET 9 and F\#, providing core language server protocol capabilities such as diagnostics, completion, and symbol resolution. It features a custom parser and incremental connection graph to efficiently track references between documents, headings, and tags. The server supports various Markdown conventions, including loose link reference definitions, and offers code actions for managing missing files and tables of contents.
Features
Add Windows and Unix scripts to build and run the server
New batch and shell scripts are provided to simplify building and launching the marksman server. The Windows script (marksman-server.bat) invokes the build process and runs the server with verbose logging, while the Unix script (marksman-server.sh) resolves the script's location to support symlinks, builds the project, and executes the server. An install script is also added to copy the published .NET 9 binary to a local bin directory.
scripts · high confidence
Initial project scaffolding and build configuration
The repository is initialized with the core build infrastructure for the Marksman Markdown language server. This includes a Makefile for building, testing, and publishing self-contained binaries across Linux, macOS, and Windows, along with a .NET 9 SDK constraint in global.json. The project structure is defined by a solution file containing the main server, tests, benchmarks, and dependencies, while code style and linting are standardized via .editorconfig and fsharplint.json. Documentation is established with a README detailing editor integrations and an AGENTS.md file outlining coding guidelines.
(repo-wide) · high confidence
Initial release of the Ionide Language Server Protocol library
This change introduces the core \Ionide.LanguageServerProtocol\ library, providing the foundational types, JSON-RPC handling, and client/server interfaces required for LSP communication. It includes strict JSON converters to ensure type-safe parsing of LSP messages, a logging abstraction via FsLibLog, and the \ILspClient\ and \ILspServer\ interfaces that define the supported LSP capabilities such as text synchronization, diagnostics, code actions, and workspace operations.
LanguageServerProtocol · high confidence
Removals
Removed Rust LSP server implementation
The Rust-based LSP server code has been removed from the project. This includes the deletion of the main entry point (src/main.rs), the note data structures (src/note.rs), and the markdown parsing logic (src/parsing.rs).
src · high confidence
Behavioural changes
7 commits (0 fixes) modifying assets
A change to existing behaviour in assets — 7 commits, 13 files.
assets · medium confidence · unverified
Marksman core engine rewritten with custom AST, CST, and incremental connection graph
The Marksman LSP server has been rebuilt from the ground up, replacing the previous Markdig-based parser with a custom AST and Concrete Syntax Tree (CST) implementation. This new core introduces a document connection graph (Conn) that tracks references between documents, headings, and tags, enabling more precise and incremental updates for diagnostics, completion, and symbol resolution. The rewrite also adds a new configuration system (Config.fs) to control features like wiki-link completion styles, text sync modes, and markdown file extensions, while introducing new code actions for creating missing files and updating tables of contents.
Marksman · high confidence
Support for link reference definitions without explicit URLs
The Markdown parser now allows link references to be resolved even when the corresponding reference definition does not specify a URL. Previously, such references were ignored or treated as plain text; now, the parser generates a link inline using the reference label itself as the destination URL. This change enables the use of shortcut and collapsed reference links in scenarios where the reference definition is present but lacks a target URL, improving compatibility with loose Markdown conventions.
MarkdigPatches · high confidence
Test coverage
Add benchmarks for connection updates and diagnostics calculation; Initial test suite for core language server features.
Dependencies
Migration from Rust to .NET 9 and removal of Rust server
The project has migrated its primary implementation from Rust to .NET 9, replacing the Rust-based server with a new F\#/.NET codebase. This change removes the Rust dependencies (Cargo.toml, Cargo.lock) and introduces new .NET project files (Marksman.fsproj, LanguageServerProtocol.fsproj, etc.) targeting net9.0. Key dependencies now include Markdig 0.43.0 for markdown parsing, FSharp.SystemCommandLine 2.0.0 for CLI handling, and a vendored LanguageServerProtocol library. The Rust version of the server is no longer supported.
(dependencies) · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 57 → 63 (+6.3)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 91 → 90 (-1.0)
- Architecture 96 → 96 (+0.0)
- Maturity 54 → 55 (+1.2)
- Readiness 56 → 56 (+0.2)
- Security 49 → 76 (+26.7)
Resolved (30)
- Dependency hygiene not measured — no packages were read
- Duplicated block (11 lines × 2) (LanguageServerProtocol/LanguageServerProtocol.fs)
- Duplicated block (13 lines × 2) (Marksman/Compl.fs)
- Duplicated block (9 lines × 2) (Marksman/Compl.fs)
- High CVE: MessagePack 2.5.192
- High CVE: MessagePack 2.5.192
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- Medium CVE: MessagePack 2.5.192
- Medium CVE: MessagePack 2.5.192
- Medium CVE: MessagePack 2.5.192
- Medium CVE: MessagePack 2.5.192
- Medium CVE: MessagePack 2.5.192
- Medium CVE: MessagePack 2.5.192
- …and 10 more
New (15)
- Documentation: no installation or build instructions (docs/install.md)
- Duplicated block (10 lines × 2) (Marksman/Conn.fs)
- Duplicated block (10 lines × 3) (Marksman/Conn.fs)
- Duplicated block (11–13 lines × 2) (LanguageServerProtocol/LanguageServerProtocol.fs)
- Duplicated block (13 lines × 2) (Marksman/Compl.fs)
- Duplicated block (7–10 lines × 2) (Marksman/Compl.fs)
- End-of-life runtime: .NET net9.0
- FileTooLong: Marksman/Conn.fs (Marksman/Conn.fs)
- High CVE: MessagePack 2.5.192
- MethodTooLong: PatchedLinkInlineParser.TryProcessLinkOrImage (MarkdigPatches/PatchedLinkInlineParser.cs)
- No ADRs found
- No checksums published for release artifacts
- No dependency advisory monitoring
- TooManyMethods: LspClient (LanguageServerProtocol/Client.fs)
- redundant comment (MarkdigPatches/PatchedLinkInlineParser.cs)
Changes since last survey
- 17 commits — 17 feature/other, 0 fixes
By area
- Marksman/Conn.fs — 6 commits
- Benchmarks/Benchmarks.fsproj — 2 commits
- Benchmarks/ConnectionUpdates.fs — 2 commits
- Marksman/Diag.fs — 2 commits
- (root) — 1 commit
- Benchmarks/DiagnosticUpdates.fs — 1 commit
- Marksman/Folder.fs — 1 commit
- Tests/ServerTests.fs — 1 commit
- plans/incremental-diagnostics.md — 1 commit
Notable commits
- change: bench: Measure diagnostics calculation baseline
- change: docs: Plan incremental diagnostics work
- change: feat: Calculate diagnostics incrementally
- change: misc: Add AGENTS.md with guidelines
- change: misc: Fix formatting
- change: perf: Avoid collecting unchanged documents for diagnostics
- change: perf: Compare reference resolutions in one pass
- change: perf: Reduce folder document comparison cost
- change: perf: Skip unchanged connection computation partitions
- change: refactor: Derive connection invalidation from document changes
- change: refactor: Make incremental connection graph dependencies explicit
- change: refactor: Prepare diagnostics for incremental updates
- change: refactor: Prepare snapshot-based diagnostics updates
- change: refactor: Share connection graph views and orphan cleanup
- change: refactor: Share definition selector logic
- change: refactor: Simplify connection computation scheduling
- change: test: Cover diagnostics publication behavior
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
artempyanykh/marksman was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 22 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 5cee45b225224e8d85a797157444949ffb6e726d — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-821afab8930d.