From c985f9f9eb7397e158db77a69173f2f49d7c4052 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 11 Sep 2026 14:20:44 -0400 Subject: [PATCH 1/2] Pin the language server the plugin delivers: idfkit-lsp 0.2.0 idfkit-lsp reached PyPI for the first time today, so the entry that resolved nothing on a clean machine (#17) now names a version, and two installs separated by a release run the same server (FR-015). --prerelease=allow is needed while idfkit-lsp depends on idfkit 1.0.0rc1: uv takes a pre-release of an indirect dependency only when told to. It sits after the pin so the level stays at args[1], where the consumer register reads it. Verified: this exact command imports the server at 0.2.0 and serves stdio. --- .lsp.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.lsp.json b/.lsp.json index 5ccd0a7..742c3d1 100644 --- a/.lsp.json +++ b/.lsp.json @@ -1,7 +1,14 @@ { "idfkit": { "command": "uvx", - "args": ["--from", "idfkit-lsp", "python", "-m", "idfkit_lsp"], + "args": [ + "--from", + "idfkit-lsp==0.2.0", + "--prerelease=allow", + "python", + "-m", + "idfkit_lsp" + ], "extensionToLanguage": { ".py": "python" } From 81b58c8d3769cee2a9483cc8868e96f4eb7ed87e Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 11 Sep 2026 14:21:53 -0400 Subject: [PATCH 2/2] Keep .lsp.json compact, and say in AGENTS.md that the language server is pinned The previous commit spread the args array over seven lines where this file, like .mcp.json, keeps it on one; only the pin and the flag change. AGENTS.md still said the entry was unpinned until idfkit-lsp published, which it now has. --- .lsp.json | 9 +-------- AGENTS.md | 12 +++++++----- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/.lsp.json b/.lsp.json index 742c3d1..a8c767a 100644 --- a/.lsp.json +++ b/.lsp.json @@ -1,14 +1,7 @@ { "idfkit": { "command": "uvx", - "args": [ - "--from", - "idfkit-lsp==0.2.0", - "--prerelease=allow", - "python", - "-m", - "idfkit_lsp" - ], + "args": ["--from", "idfkit-lsp==0.2.0", "--prerelease=allow", "python", "-m", "idfkit_lsp"], "extensionToLanguage": { ".py": "python" } diff --git a/AGENTS.md b/AGENTS.md index a449c3e..879ffa6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,7 +26,7 @@ idfkit package, not here. | Slash commands | `commands/*.md` | Yes | | Context hooks | `hooks/hooks.json`, `scripts/*.sh` | Yes | | MCP server wiring | `.mcp.json` (`uvx idfkit-mcp@`, pinned) | Yes, by review | -| LSP wiring | `.lsp.json` (`uvx --from idfkit-lsp`, unpinned until idfkit-lsp publishes) | Yes, by review | +| LSP wiring | `.lsp.json` (`uvx --from idfkit-lsp== --prerelease=allow`, pinned) | Yes, by review | | Claude plugin / marketplace | `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json` | Yes | ## Discovery contract @@ -71,10 +71,12 @@ depending on `idfkit-mcp` and `idfkit-lsp`, and adopting in wave 2 after them. version: an unpinned `uvx idfkit-mcp` runs whatever is newest on the day, so a release would reach users unreviewed. The user still types no version; the level is committed here. The idfkit level follows from that release's own pin. -- **`.lsp.json` cannot be pinned yet.** idfkit-lsp has never been published to - PyPI, so today that entry resolves nothing on a clean machine. The register - records it as a `not-yet` lag on idfkit/idfkit-plugin#17. Pin it as - `uvx --from idfkit-lsp==X.Y.Z` in the change that follows the first release. +- **`.lsp.json` pins idfkit-lsp exactly** (`--from idfkit-lsp==X.Y.Z`), on the + same terms as `.mcp.json`. `--prerelease=allow` follows the pin while + idfkit-lsp depends on a pre-release of idfkit, because uv installs a + pre-release of an indirect dependency only when told to. Keep the flag after + the pin, so the level stays at `args[1]` where the consumer register reads it, + and drop it once idfkit-lsp depends on a stable idfkit. - **Both files are CODEOWNERS-reviewed**, because changing either changes what every user runs. - **The self-check.** The `consumer-register` job in `tests.yml` calls