@mrclrchtr/supi-lsp 11.1.0 → 11.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +42 -5
  2. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +1 -1
  3. package/node_modules/@mrclrchtr/supi-core/package.json +1 -1
  4. package/node_modules/semver/LICENSE +15 -0
  5. package/node_modules/semver/README.md +680 -0
  6. package/node_modules/semver/bin/semver.js +195 -0
  7. package/node_modules/semver/classes/comparator.js +143 -0
  8. package/node_modules/semver/classes/index.js +7 -0
  9. package/node_modules/semver/classes/range.js +577 -0
  10. package/node_modules/semver/classes/semver.js +350 -0
  11. package/node_modules/semver/functions/clean.js +8 -0
  12. package/node_modules/semver/functions/cmp.js +54 -0
  13. package/node_modules/semver/functions/coerce.js +62 -0
  14. package/node_modules/semver/functions/compare-build.js +9 -0
  15. package/node_modules/semver/functions/compare-loose.js +5 -0
  16. package/node_modules/semver/functions/compare.js +7 -0
  17. package/node_modules/semver/functions/diff.js +60 -0
  18. package/node_modules/semver/functions/eq.js +5 -0
  19. package/node_modules/semver/functions/gt.js +5 -0
  20. package/node_modules/semver/functions/gte.js +5 -0
  21. package/node_modules/semver/functions/inc.js +21 -0
  22. package/node_modules/semver/functions/lt.js +5 -0
  23. package/node_modules/semver/functions/lte.js +5 -0
  24. package/node_modules/semver/functions/major.js +5 -0
  25. package/node_modules/semver/functions/minor.js +5 -0
  26. package/node_modules/semver/functions/neq.js +5 -0
  27. package/node_modules/semver/functions/parse.js +18 -0
  28. package/node_modules/semver/functions/patch.js +5 -0
  29. package/node_modules/semver/functions/prerelease.js +8 -0
  30. package/node_modules/semver/functions/rcompare.js +5 -0
  31. package/node_modules/semver/functions/rsort.js +5 -0
  32. package/node_modules/semver/functions/satisfies.js +12 -0
  33. package/node_modules/semver/functions/sort.js +5 -0
  34. package/node_modules/semver/functions/truncate.js +48 -0
  35. package/node_modules/semver/functions/valid.js +8 -0
  36. package/node_modules/semver/index.js +93 -0
  37. package/node_modules/semver/internal/constants.js +37 -0
  38. package/node_modules/semver/internal/debug.js +11 -0
  39. package/node_modules/semver/internal/identifiers.js +29 -0
  40. package/node_modules/semver/internal/lrucache.js +42 -0
  41. package/node_modules/semver/internal/parse-options.js +17 -0
  42. package/node_modules/semver/internal/re.js +223 -0
  43. package/node_modules/semver/package.json +78 -0
  44. package/node_modules/semver/preload.js +4 -0
  45. package/node_modules/semver/range.bnf +17 -0
  46. package/node_modules/semver/ranges/gtr.js +6 -0
  47. package/node_modules/semver/ranges/intersects.js +9 -0
  48. package/node_modules/semver/ranges/ltr.js +6 -0
  49. package/node_modules/semver/ranges/max-satisfying.js +27 -0
  50. package/node_modules/semver/ranges/min-satisfying.js +26 -0
  51. package/node_modules/semver/ranges/min-version.js +63 -0
  52. package/node_modules/semver/ranges/outside.js +82 -0
  53. package/node_modules/semver/ranges/simplify.js +49 -0
  54. package/node_modules/semver/ranges/subset.js +249 -0
  55. package/node_modules/semver/ranges/to-comparators.js +10 -0
  56. package/node_modules/semver/ranges/valid.js +13 -0
  57. package/package.json +5 -3
  58. package/src/client/client.ts +23 -5
  59. package/src/config/config.ts +53 -2
  60. package/src/config/operation-support.ts +19 -4
  61. package/src/config/server-config.ts +22 -0
  62. package/src/config/typescript-launch.ts +276 -0
  63. package/src/manager/manager-project-info.ts +22 -10
  64. package/src/manager/manager.ts +52 -19
  65. package/src/provider/refactor-planning.ts +4 -3
  66. package/src/session/runtime-controller.ts +2 -2
  67. package/src/session/scanner.ts +27 -15
package/README.md CHANGED
@@ -20,7 +20,7 @@ npm install @mrclrchtr/supi-lsp
20
20
 
21
21
  ## Language-server support
22
22
 
23
- SuPi provides 13 built-in server definitions. All are enabled unless `lsp.servers.<key>.enabled` is `false`. Install the language servers yourself; SuPi does not download or install them. Built-in commands must be on `PATH`; a configured absolute command path is also supported. Code Intelligence starts the runtime only for trusted projects.
23
+ SuPi provides 13 built-in server definitions. All are enabled unless `lsp.servers.<key>.enabled` is `false`. Install the language servers yourself; SuPi does not download or install them. Built-in commands must be on `PATH`, except project-local native TypeScript; a configured absolute command path is also supported. Code Intelligence starts the runtime only for trusted projects.
24
24
 
25
25
  ### Built-in route matrix
26
26
 
@@ -28,7 +28,7 @@ This matrix describes the default routing configuration, not a live test or a gu
28
28
 
29
29
  | Language / config key | Default command and arguments | File extensions | Root markers for automatic discovery |
30
30
  |---|---|---|---|
31
- | TypeScript / JavaScript — `typescript` | `typescript-language-server --stdio` | `.ts`, `.tsx`, `.js`, `.jsx`, `.mts`, `.cts`, `.mjs`, `.cjs` | `tsconfig.json`, `jsconfig.json`, `package.json` |
31
+ | TypeScript / JavaScript — `typescript` | Project-local native `tsc --lsp --stdio`, otherwise `typescript-language-server --stdio` | `.ts`, `.tsx`, `.js`, `.jsx`, `.mts`, `.cts`, `.mjs`, `.cjs` | `tsconfig.json`, `jsconfig.json`, `package.json` |
32
32
  | Python — `python` | `pyright-langserver --stdio` | `.py`, `.pyi` | `pyproject.toml`, `setup.py`, `setup.cfg`, `requirements.txt`, `pyrightconfig.json` |
33
33
  | Rust — `rust` | `rust-analyzer` | `.rs` | `Cargo.toml` |
34
34
  | Go — `go` | `gopls serve` | `.go`, `.mod` | `go.mod`, `go.sum` |
@@ -59,7 +59,7 @@ A configured route is not a ready server. Features depend on the active server,
59
59
  | Hover, definitions, references, implementations, document/workspace symbols | Supported through the server's corresponding LSP methods; availability and coverage differ by server. |
60
60
  | Diagnostics | Native pull, the eligible TypeScript request adapter, or ambient push. Push observation alone cannot confirm that a file is clean. See the diagnostic policy below. |
61
61
  | `rename_symbol` | Requires server rename support and validated text edits; uses `prepareRename` when advertised. |
62
- | `update_imports` / `delete_dead_code` | Requires matching `source.organizeImports` / `source.removeUnused` code actions that produce validated text edits. |
62
+ | `update_imports` / `delete_dead_code` | Requires matching `source.organizeImports` / (`source.removeUnused` or `source.removeUnusedImports`) code actions that produce validated text edits. Imports-only advertisement reports limited support, not arbitrary unused-declaration removal. |
63
63
  | `extract_function` / `extract_variable` | Unavailable for all languages: standard LSP code actions do not provide a safe exact extraction-name contract. |
64
64
 
65
65
  The [operation-support model](src/config/operation-support.ts) separates server advertisement from SuPi planning limits. A server can advertise an action that SuPi cannot safely turn into a plan.
@@ -72,6 +72,40 @@ Pyright remains the default Python server, but the audited server lacks implemen
72
72
 
73
73
  JDTLS acceptance uses a compatible pinned JDK and isolated writable `-data` and `-configuration` directories. Keep test workspaces separate from personal JDTLS state. The [capability baseline](../../docs/conventions/code-language-baseline.md) defines the operation and evidence requirements.
74
74
 
75
+ ### TypeScript compiler selection
76
+
77
+ The default TypeScript route prefers a project-local stable native TS7 server. Native launches use the selected package's declared `tsc` Node launcher with `--lsp --stdio`; neither TLS nor a global native executable is required. Legacy compiler launches still require `typescript-language-server` (TLS) on PATH. Nothing is installed automatically.
78
+
79
+ | Configuration | Launch policy |
80
+ |---|---|
81
+ | No explicit launch fields | Prefer stable native TS7 as `typescript`, then as `@typescript/native`. Otherwise use legacy `typescript`, or—only if absent—`@typescript/typescript6`. If all are absent, retain TLS's existing lookup. |
82
+ | `lsp.servers.typescript.typescriptPackage` | Resolve exactly this installed package name/alias. No arbitrary alias scan, package subpath, URL, or filesystem-path selector. |
83
+ | Explicit `command` **or** `args` | Manual launch, including inherited values equal to defaults. No automatic compiler selection or initialization-option injection. |
84
+ | Explicit `initializationOptions.tsserver.path` | Use the configured path without automatic compiler selection. |
85
+ | Package selector plus any explicit launch field above | Configuration conflict; the failure identifies fields and their configuration origins when available. Remove one side and reload. |
86
+
87
+ For example, select a compiler installed as `my-ts6` without changing the TLS command:
88
+
89
+ ```json
90
+ { "lsp": { "servers": { "typescript": { "typescriptPackage": "my-ts6" } } } }
91
+ ```
92
+
93
+ - Resolve packages using the route root's normal Node package search paths, including hoisted and symlinked packages. A package whose actual identity is `@typescript/typescript6`, including one installed as `typescript` or another alias, resolves `@typescript/old` from the wrapper's dependency graph. Pass the underlying implementation's actual `lib/tsserver.js` through `initializationOptions.tsserver.path`; preserve other initialization options.
94
+ - Native-first precedence deliberately replaces canonical-package-first selection: a native `@typescript/native` alias wins over legacy `typescript`. This alias must resolve to the stable native `typescript` package, not legacy TS or the old preview package. Other aliases require `typescriptPackage`.
95
+ - A consulted broken symlink, malformed manifest, missing compiler version, unsupported identity/major, or prerelease is an error, not absence. Stable TS7 releases are eligible without a patch allowlist; unknown native majors and preview/nightly packages require manual launch. Do not inspect lower-priority packages after a native winner. Only the winner's launch files are validated, so a legacy loser's missing `tsserver.js` does not block a healthy native alias.
96
+ - Never fall back after resolution or startup failure of the selected package. Manual launches receive no automatic initialization-option injection.
97
+ - Discovery, missing-server warnings, lazy starts, and recovery use the same policy. Every actual start/retry resolves fresh package files using the active settings snapshot. Installing or repairing a compiler can be followed by explicit health refresh; changing settings requires reload/restart. Healthy clients do not hot-swap.
98
+ - `code_health` and `/supi-ci-status` show the `native` or `tsserver` backend and resolved compiler version when known, separately from wrapper version. Manual/legacy-fallback launches have no inferred compiler identity. Missing versions remain unknown. Selection failures identify the package/root and a corrective action.
99
+ - Topmost-root collapsing remains unchanged. Mixed nested backends, Windows live qualification, dependency watchers, performance benchmarking, and full TLS/native feature parity are outside this change. Existing legacy TLS support is not deliberately removed.
100
+
101
+ Focused qualification pins native TypeScript **7.0.2**, TLS **6.0.2**, ordinary TypeScript **6.0.3**, and `@typescript/typescript6` **6.0.2** backed by `@typescript/old` → TypeScript **6.0.3**. The wrapper's dependency range does not guarantee that compiler version; the lockfile and [prerequisite pins](../../scripts/language-baseline/pins.json) fix these combinations. SuPi retains TS6 for its compiler-API dependency and legacy-server tests. Workspace typechecking and declaration builds use the native TS7 launcher directly to avoid ambiguity between the installed `tsc` binaries.
102
+
103
+ The required [Linux/macOS CI matrix](../../.github/workflows/ci.yml) keeps [selection/layout tests](__tests__/unit/typescript-launch.test.ts), [real native lifecycle tests](__tests__/integration/workspace-runtime.integration.typescript-native.test.ts), and [wrapper lifecycle tests](__tests__/integration/workspace-runtime.integration.typescript-launch.test.ts) separate from the [public TS/JS semantic matrix](../supi-code-intelligence/__tests__/acceptance/language-baseline-harness.ts). Required missing/unavailable behavior fails rather than skips. The matrix covers hover, definitions, references, meaningful implementations, document/workspace symbols, confirmed error → clean diagnostics, refresh, cross-file invalidation, Unicode-safe rename plan/apply and stale-plan rejection, and precise organize-imports. The TypeScript public matrix also checks unused-import removal, unchanged source during planning, stale-plan rejection, and preservation of unrelated text; native support is imports-only. Native TSX/JSX and module suffixes receive routing/synchronization checks rather than duplicate matrices. Existing stale-result and edit-safety suites remain in place.
104
+
105
+ [Bounded config comparisons](__tests__/integration/typescript-config-coverage.test.ts) compare TS6 and native TS7 `--showConfig` root-file coverage for TS/JS defaults, include/exclude, `allowJs`/`checkJs`, inherited patterns (including late-created files), and separate referenced projects. These cases found no false exclusion; filtering is unchanged. **Config coverage state is not TypeScript program membership**: imports may bring excluded files into a program, and references do not merge root-file lists.
106
+
107
+ Native `delete_dead_code` consumes `source.removeUnusedImports` through the same safe plan/apply workflow ([#554](https://github.com/mrclrchtr/supi/issues/554)). This mapping removes unused imports only: operation support reports `server: advertised`, `supi: limited`, with an imports-only reason. It does not qualify arbitrary unused-declaration removal. Extraction remains unavailable ([#467](https://github.com/mrclrchtr/supi/issues/467)); no TLS/native feature-parity claim is made. Only the pinned combinations are tested, not every stable TS7 release. Focused qualification passed on macOS arm64 (Node 24.22.1) and Linux arm64 (Debian container, Node 24.22.0), including the native/TS6 public TS/JS matrix. The unused-import follow-up has local macOS arm64 verification only; its Linux verification remains pending. The pinned Linux/macOS CI jobs remain pending until they run; this is not a qualification claim for the complete multi-language baseline.
108
+
75
109
  ### Java startup and project JDKs
76
110
 
77
111
  The JDK that starts JDTLS can differ from the JDK that builds your project. Set a compatible server runtime through the Java route without changing the shell or project compiler:
@@ -253,8 +287,11 @@ Disable one language with `lsp.servers.<language>.enabled: false`. Use `/supi-ci
253
287
  - negotiated operation support in project-server status
254
288
 
255
289
  Operation-specific planners request `source.organizeImports` for import updates and
256
- `source.removeUnused` for dead-code removal. They match the returned `CodeAction.kind`,
257
- not its title. Edit-only actions are validated before planning. Command actions,
290
+ both `source.removeUnused` and `source.removeUnusedImports` for dead-code removal.
291
+ These distinct kinds are alternatives, not parent/child kinds; either exact kind
292
+ or its dotted descendants can match the returned `CodeAction.kind`, never its title.
293
+ An imports-only advertisement reports a SuPi limitation rather than general
294
+ unused-declaration support. Edit-only actions are validated before planning. Command actions,
258
295
  resource operations, snippets, annotations, malformed actions, and stale responses
259
296
  stay unavailable. Distinct matching plans return an ambiguous result instead of
260
297
  selecting the first action. Rename uses `prepareRename` when the server advertises
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-code-runtime",
3
- "version": "11.1.0",
3
+ "version": "11.2.0",
4
4
  "description": "Shared workspace context and capability contracts for code intelligence",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrclrchtr/supi-core",
3
- "version": "11.1.0",
3
+ "version": "11.2.0",
4
4
  "description": "Shared settings, configuration, reporting, and session infrastructure",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -0,0 +1,15 @@
1
+ The ISC License
2
+
3
+ Copyright (c) Isaac Z. Schlueter and Contributors
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
15
+ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.