feat(vscode): lint through an editor-shipped worker and bridge define.lint() - #14
Merged
Conversation
…e move - Remove docs/tickets/lint-worker-bridge.md: the ADR carries the decision, the ticket was working material. - Restore the note explaining why rslint.json stays in the lint watch list. - Drop dead surface left by the move into the worker (unused package name, exported factory type, default cwd) and fold the dropped-legacy-key constants in the settings migration. - Fix the rstack floor rationale in versionCheck.ts and the worker cwd in CONTEXT.md (folder root, not config root).
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 73fa62741a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
This was referenced Aug 18, 2026
fi3ework
added a commit
that referenced
this pull request
Aug 18, 2026
* chore(vscode): remove the legacy settings migration Drop `migration.ts`, its tests, the `rstack.migrateSettings` command (manifest entry, palette registration and status-bar hover action) and the activation-time prompt with its `rstack.migration.dismissed` state. Pre-1.0 the extension owes no compatibility to earlier states, and the migration only served users of the two retired standalone extensions; keeping it meant every settings change carried a mapping-table update plus tests for a one-off flow, and the table already had to model dropped features (`rslint.binPath` / `customBinPath`, #14). The README keeps a one-paragraph note telling standalone-extension users to re-enter their settings under `rstack.*` and re-bind keybindings; AGENTS.md's namespace adaptation and pre-1.0 rule are reworded so no migration is implied. Closes #15 * docs(adr): stop describing rstest.nodeExecutable as migrated ADR 0001 and 0002 said the standalone Rstest extension's `rstest.nodeExecutable` "migrates to" `rstack.nodeExecutable`; the migration was removed in #15, so the parentheticals now state only that the legacy key had the same role.
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.
Summary
Rslint's language server is two halves — the Go
rslint --lspprocess, and a JS host that evaluates configs and runs plugin rules on the Go server's reverse requests. Until now that host lived in the extension host (VS Code Node runtime, meaningless cwd), which is also whydefine.lint()inrstack.config.*could not be bridged without a generated shim.This PR ships a lint worker: a vscode-free Node script, one per workspace folder, run on the User Node runtime (same preflight, floor and
rstack.nodeExecutableescape hatch as the test worker andrs fmt --lsp) with its cwd at the folder root. The worker spawns the Go server from the resolved@rslint/core, proxies LSP over stdio, and answersrslint/loadConfigs/activateConfigs/commitConfigs/abortConfigs/pluginLintitself. The extension host keeps only the language client.rslint.config.*anywhere in the folder,rstack.config.*at its root): the worker is pinned to rstack's own shipped shim (<rstack>/dist/rslintConfig.js) through the protocol-2configPathofrslint/configRefresh. Diagnostics matchrs lintin a terminal; the E2E suite asserts exactly that, and thatdefine.lintruns outside the extension host and off the VS Code Node runtime. No generated shim, no Rstack config semantics in the editor.rstack.config.*lights nothing (root only, asrs lintreads its cwd).rs lint:rstackfrom the folder root →@rslint/corefrom rstack's directory → the binary via that core'sresolveRslintBinary().rstack.rslint.corePath(the setting the standalone Rslint extension moved to) overrides the core hop;binPath/customBinPathare removed and surfaced as dropped in the settings migration;rslint.corePathmigrates.protocolVersionandconfigPath); a native ↔ bridged flip restarts the folder's runtime.@rslint/core >= 0.8.0,rstack >= 0.6.1toolchain-wide.^22.18.0 || >=23.6.0) it never had; this closes the lint entry on ADR 0001's debt list.Docs: new
docs/adr/0003-lint-through-editor-worker.md; ADR 0001 amended;CONTEXT.md(Ownership, Lint worker, Bridged/Native folder);packages/vscode/AGENTS.mdadaptation #7 and gotchas; READMEs. The per-document runtime model from the standalone extension's latest refactor is deliberately out of scope (#13).Related Links
TODO(rstack-bridge)markers; supersedes feat(vscode): lint bridged folders from rstack.config via a generated shim #10.Test plan
pnpm lint(rs lint --type-check): 0 errors, 0 type errors, 0 warningspnpm test:unit: 24 files / 217 tests passedVSCODE_CLI=1 pnpm test:e2e lint vscode smoke: smoke OK;vscodeexit 0; all 10 lint suites exit 0 (9 ported + newRstack lint bridge)Checklist