march-cli 0.1.24 → 0.1.26
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.
- package/bin/march.mjs +13 -13
- package/package.json +49 -49
- package/src/agent/command-exec-tool.mjs +172 -172
- package/src/agent/context-stats-tool.mjs +57 -57
- package/src/agent/editing/diff-apply.mjs +28 -28
- package/src/agent/editing/diff-format.mjs +57 -57
- package/src/agent/editing/lsp-report.mjs +69 -69
- package/src/agent/file-edit-tool.mjs +250 -250
- package/src/agent/file-tools/read-file-tool.mjs +112 -112
- package/src/agent/file-tools/read-image-tool.mjs +76 -76
- package/src/agent/model-payload-dumper.mjs +208 -208
- package/src/agent/pi-session/pi-session-sidecar-failure.mjs +10 -10
- package/src/agent/provider/payload-messages.mjs +138 -138
- package/src/agent/runner/codex-large-context-guard.mjs +87 -87
- package/src/agent/runner/codex-transport-compression.mjs +180 -180
- package/src/agent/runner/codex-transport-debug.mjs +113 -113
- package/src/agent/runner/codex-websocket-event-debug.mjs +130 -130
- package/src/agent/runner/fast-model.mjs +36 -36
- package/src/agent/runner/runner-cleanup.mjs +12 -12
- package/src/agent/runner/runner-init.mjs +15 -15
- package/src/agent/runner/runner-session-state.mjs +40 -40
- package/src/agent/runner/runner-utils.mjs +24 -24
- package/src/agent/runner.mjs +299 -299
- package/src/agent/runtime/ipc/ipc-peer.mjs +99 -99
- package/src/agent/runtime/ipc/process-ipc-transport.mjs +16 -16
- package/src/agent/runtime/remote-runner-client.mjs +73 -73
- package/src/agent/runtime/remote-ui-client.mjs +20 -20
- package/src/agent/runtime/runner-ipc-target.mjs +125 -125
- package/src/agent/runtime/runner-process-client.mjs +47 -47
- package/src/agent/runtime/runner-process-entry.mjs +11 -11
- package/src/agent/runtime/runner-process-factory.mjs +111 -108
- package/src/agent/runtime/runner-runtime-host.mjs +79 -79
- package/src/agent/runtime/runtime-factory.mjs +42 -42
- package/src/agent/runtime/runtime-host.mjs +34 -34
- package/src/agent/runtime/ui-event-bridge.mjs +95 -95
- package/src/agent/screen-tools/list-windows-tool.mjs +39 -39
- package/src/agent/screen-tools/screen-tool.mjs +49 -49
- package/src/agent/screen-tools/windows-screen.mjs +133 -133
- package/src/agent/session/session-auto-name.mjs +41 -41
- package/src/agent/session/session-binding.mjs +12 -12
- package/src/agent/session/session-options.mjs +47 -47
- package/src/agent/tool-names.mjs +1 -1
- package/src/agent/tool-result.mjs +3 -3
- package/src/agent/tool-summary.mjs +112 -112
- package/src/agent/tools.mjs +58 -58
- package/src/agent/turn/turn-events.mjs +111 -111
- package/src/agent/turn/turn-logging.mjs +30 -30
- package/src/agent/turn/turn-runner.mjs +196 -196
- package/src/agent/vision-capability.mjs +14 -14
- package/src/auth/login-command.mjs +90 -90
- package/src/auth/storage.mjs +34 -34
- package/src/cli/args.mjs +96 -79
- package/src/cli/commands/copy-command.mjs +87 -87
- package/src/cli/commands/export-command.mjs +206 -206
- package/src/cli/commands/extensions-command.mjs +53 -53
- package/src/cli/commands/help-command.mjs +7 -7
- package/src/cli/commands/model-command.mjs +141 -141
- package/src/cli/commands/paste-image-command.mjs +43 -43
- package/src/cli/commands/provider-command.mjs +59 -59
- package/src/cli/commands/status-command.mjs +196 -194
- package/src/cli/commands/thinking-command.mjs +87 -87
- package/src/cli/fallback-ui.mjs +156 -156
- package/src/cli/input/attachment-tokens.mjs +20 -20
- package/src/cli/input/autocomplete.mjs +74 -74
- package/src/cli/input/external-editor.mjs +39 -39
- package/src/cli/input/file-search/index.mjs +160 -160
- package/src/cli/input/history-store.mjs +35 -35
- package/src/cli/input/image-clipboard.mjs +55 -55
- package/src/cli/input/keybinding-dispatch.mjs +76 -76
- package/src/cli/input/keybindings.mjs +96 -96
- package/src/cli/input/mode-state.mjs +43 -43
- package/src/cli/input/prompt-templates.mjs +84 -84
- package/src/cli/input/select-with-keyboard.mjs +86 -86
- package/src/cli/permissions.mjs +103 -103
- package/src/cli/repl-commands.mjs +86 -86
- package/src/cli/repl-loop.mjs +183 -183
- package/src/cli/selector-list.mjs +21 -21
- package/src/cli/session/pi-session-switch-command.mjs +41 -41
- package/src/cli/session/session-command.mjs +23 -23
- package/src/cli/session/session-list-command.mjs +68 -68
- package/src/cli/session/session-name-command.mjs +26 -26
- package/src/cli/session/session-source-command.mjs +89 -89
- package/src/cli/session/session-switch-command.mjs +1 -1
- package/src/cli/shell/shell-command.mjs +55 -55
- package/src/cli/shell/shell-drawer-controls.mjs +33 -33
- package/src/cli/shell/shell-drawer.mjs +192 -192
- package/src/cli/shell/shell-split-layout.mjs +70 -70
- package/src/cli/slash-commands.mjs +192 -192
- package/src/cli/startup/create-runtime-runner.mjs +61 -61
- package/src/cli/startup/runtime-close.mjs +23 -23
- package/src/cli/startup/startup-banner.mjs +71 -71
- package/src/cli/startup/startup-session.mjs +51 -51
- package/src/cli/status-line-updater.mjs +75 -75
- package/src/cli/tool-output.mjs +9 -9
- package/src/cli/tui/editor/external-editor-runner.mjs +24 -24
- package/src/cli/tui/input/mouse-selection-controller.mjs +91 -91
- package/src/cli/tui/input/mouse-tracking.mjs +20 -20
- package/src/cli/tui/layout/main-pane-layout.mjs +47 -47
- package/src/cli/tui/layout/safe-render-boundary.mjs +46 -46
- package/src/cli/tui/markdown-renderer.mjs +285 -285
- package/src/cli/tui/output/scroll-state.mjs +79 -79
- package/src/cli/tui/output/text-line-renderer.mjs +50 -50
- package/src/cli/tui/output/tool-card-renderer.mjs +59 -59
- package/src/cli/tui/output/visible-lines.mjs +8 -8
- package/src/cli/tui/output-buffer.mjs +293 -293
- package/src/cli/tui/permission-request-ui.mjs +18 -18
- package/src/cli/tui/recall-rendering.mjs +28 -25
- package/src/cli/tui/render/render-scheduler.mjs +26 -26
- package/src/cli/tui/render/stream-delta-buffer.mjs +46 -46
- package/src/cli/tui/select/editor-select-list.mjs +111 -111
- package/src/cli/tui/selection-screen.mjs +269 -269
- package/src/cli/tui/status/retry-status.mjs +72 -72
- package/src/cli/tui/status/spinner-status.mjs +42 -42
- package/src/cli/tui/status/status-bar.mjs +225 -225
- package/src/cli/tui/syntax/highlighting.mjs +260 -260
- package/src/cli/tui/syntax/languages.mjs +91 -91
- package/src/cli/tui/syntax/tree-sitter/bash.highlights.scm +261 -261
- package/src/cli/tui/syntax/tree-sitter/c.highlights.scm +341 -341
- package/src/cli/tui/syntax/tree-sitter/cpp.highlights.scm +268 -268
- package/src/cli/tui/syntax/tree-sitter/csharp.highlights.scm +577 -577
- package/src/cli/tui/syntax/tree-sitter/css.highlights.scm +109 -109
- package/src/cli/tui/syntax/tree-sitter/diff.highlights.scm +49 -49
- package/src/cli/tui/syntax/tree-sitter/go.highlights.scm +254 -254
- package/src/cli/tui/syntax/tree-sitter/html.highlights.scm +13 -13
- package/src/cli/tui/syntax/tree-sitter/java.highlights.scm +330 -330
- package/src/cli/tui/syntax/tree-sitter/json.highlights.scm +38 -38
- package/src/cli/tui/syntax/tree-sitter/php.highlights.scm +203 -203
- package/src/cli/tui/syntax/tree-sitter/python.highlights.scm +137 -137
- package/src/cli/tui/syntax/tree-sitter/ruby.highlights.scm +309 -309
- package/src/cli/tui/syntax/tree-sitter/rust.highlights.scm +531 -531
- package/src/cli/tui/syntax/tree-sitter/toml.highlights.scm +39 -39
- package/src/cli/tui/syntax/tree-sitter/tsx.highlights.scm +35 -35
- package/src/cli/tui/syntax/tree-sitter/typescript.highlights.scm +35 -35
- package/src/cli/tui/syntax/tree-sitter/yaml.highlights.scm +99 -99
- package/src/cli/tui/tool-rendering.mjs +87 -87
- package/src/cli/tui/tui-diff-rendering.mjs +157 -157
- package/src/cli/tui/tui-handlers.mjs +111 -111
- package/src/cli/tui/tui-input-controller.mjs +61 -61
- package/src/cli/tui/ui-theme.mjs +157 -157
- package/src/cli/ui.mjs +297 -297
- package/src/config/config-json.mjs +108 -84
- package/src/config/dotenv.mjs +20 -20
- package/src/config/features.mjs +75 -75
- package/src/config/loader.mjs +156 -143
- package/src/config/settings-command.mjs +97 -97
- package/src/context/engine.mjs +199 -198
- package/src/context/injections.mjs +26 -26
- package/src/context/profiles.mjs +39 -39
- package/src/context/project-context.mjs +20 -20
- package/src/context/session-status.mjs +25 -17
- package/src/context/shell-layers.mjs +23 -23
- package/src/context/system-core/base.md +51 -50
- package/src/context/system-core/prompts/deepseek-v4-pro.md +3 -3
- package/src/context/system-core/prompts/default.md +3 -3
- package/src/context/system-core.mjs +35 -35
- package/src/debug/logger.mjs +141 -141
- package/src/debug/model-context-dumper.mjs +52 -52
- package/src/extensions/discovery.mjs +40 -40
- package/src/extensions/lifecycle-adapter.mjs +210 -210
- package/src/extensions/lifecycle-manifest.mjs +69 -69
- package/src/image-gen/index.mjs +7 -7
- package/src/image-gen/provider.mjs +231 -231
- package/src/image-gen/tool.mjs +84 -84
- package/src/lsp/client.mjs +257 -257
- package/src/lsp/diagnostic-store.mjs +42 -42
- package/src/lsp/diagnostics-format.mjs +72 -72
- package/src/lsp/managed-node-server.mjs +99 -99
- package/src/lsp/path-match.mjs +10 -10
- package/src/lsp/server-definitions.mjs +188 -188
- package/src/lsp/servers.mjs +165 -165
- package/src/lsp/service.mjs +110 -110
- package/src/lsp/status-message.mjs +9 -9
- package/src/lsp/typescript-project-resolver.mjs +186 -186
- package/src/main.mjs +294 -299
- package/src/mcp/client.mjs +195 -195
- package/src/mcp/config.mjs +130 -130
- package/src/mcp/index.mjs +48 -48
- package/src/mcp/tools.mjs +98 -98
- package/src/memory/command.mjs +120 -0
- package/src/memory/markdown/markdown-delete.mjs +23 -23
- package/src/memory/markdown/markdown-format.mjs +128 -128
- package/src/memory/markdown/markdown-recall.mjs +28 -28
- package/src/memory/markdown/ripgrep.mjs +16 -16
- package/src/memory/markdown/sqlite-index.mjs +87 -87
- package/src/memory/markdown-store.mjs +272 -286
- package/src/memory/markdown-tools.mjs +174 -103
- package/src/memory/remote/client.mjs +68 -0
- package/src/memory/remote/config.mjs +52 -0
- package/src/memory/remote/server.mjs +99 -0
- package/src/memory/search.mjs +183 -0
- package/src/network/environment.mjs +131 -131
- package/src/notification/desktop-notifier.mjs +262 -262
- package/src/platform/open-file.mjs +28 -28
- package/src/platform/spawn-command.mjs +27 -27
- package/src/provider/accept-command.mjs +89 -89
- package/src/provider/command.mjs +21 -21
- package/src/provider/config-command.mjs +129 -129
- package/src/provider/custom-provider.mjs +113 -113
- package/src/provider/hosted-tools.mjs +111 -111
- package/src/provider/presets.mjs +72 -72
- package/src/provider/share-command.mjs +79 -79
- package/src/provider/share-payload.mjs +52 -52
- package/src/session/attachment-display.mjs +16 -16
- package/src/session/attachment-references.mjs +65 -65
- package/src/session/attachments.mjs +140 -140
- package/src/session/persist.mjs +1 -1
- package/src/session/pi-manager.mjs +34 -34
- package/src/session/session-utils.mjs +16 -16
- package/src/session/sidecar-sync.mjs +19 -19
- package/src/session/sidecar.mjs +69 -69
- package/src/session/transcript.mjs +83 -83
- package/src/session/tree.mjs +42 -42
- package/src/shell/cli-runtime.mjs +11 -11
- package/src/shell/hints.mjs +12 -12
- package/src/shell/node-pty-adapter.mjs +81 -81
- package/src/shell/runtime-state.mjs +126 -126
- package/src/shell/runtime.mjs +252 -252
- package/src/shell/screen-buffer.mjs +136 -136
- package/src/shell/tool-read.mjs +74 -74
- package/src/shell/tools.mjs +299 -299
- package/src/supergrok/actions/image-generate.mjs +60 -60
- package/src/supergrok/actions/search.mjs +78 -78
- package/src/supergrok/auth.mjs +36 -36
- package/src/supergrok/constants.mjs +18 -18
- package/src/supergrok/oauth-provider.mjs +278 -278
- package/src/supergrok/provider.mjs +35 -35
- package/src/supergrok/response.mjs +76 -76
- package/src/supergrok/tool.mjs +61 -61
- package/src/text/ansi.mjs +3 -3
- package/src/web/config-command.mjs +43 -43
- package/src/web/fetch.mjs +78 -78
- package/src/web/presets.mjs +16 -16
- package/src/web/search.mjs +83 -83
- package/src/web/tools.mjs +107 -107
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
import { sameLspPath } from "./path-match.mjs";
|
|
2
|
-
|
|
3
|
-
const MAX_DIAGNOSTICS = 20;
|
|
4
|
-
|
|
5
|
-
export function formatLspDiagnostics({ snapshot } = {}) {
|
|
6
|
-
const diagnostics = snapshot?.diagnostics ?? [];
|
|
7
|
-
if (diagnostics.length === 0) return "[diagnostics]";
|
|
8
|
-
|
|
9
|
-
const sorted = [...diagnostics].sort((a, b) => severityRank(a.severity) - severityRank(b.severity));
|
|
10
|
-
|
|
11
|
-
const counts = countSeverities(diagnostics);
|
|
12
|
-
const lines = ["[diagnostics]", "source: lsp"];
|
|
13
|
-
if (snapshot?.status) lines.push(`status: ${snapshot.status}`);
|
|
14
|
-
lines.push(`summary: ${formatSummary(counts)}${diagnostics.length > MAX_DIAGNOSTICS ? `, showing ${MAX_DIAGNOSTICS} of ${diagnostics.length}` : ""}`);
|
|
15
|
-
lines.push("");
|
|
16
|
-
for (const diagnostic of sorted.slice(0, MAX_DIAGNOSTICS)) {
|
|
17
|
-
lines.push(formatDiagnostic(diagnostic));
|
|
18
|
-
}
|
|
19
|
-
return lines.join("\n");
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function formatLspDiagnosticsForPath({ snapshot, path } = {}) {
|
|
23
|
-
const targetPath = String(path ?? "");
|
|
24
|
-
if (!targetPath) return "";
|
|
25
|
-
const diagnostics = (snapshot?.diagnostics ?? []).filter((diagnostic) => sameLspPath(diagnostic.path, targetPath));
|
|
26
|
-
if (diagnostics.length === 0) return "";
|
|
27
|
-
return formatLspDiagnostics({
|
|
28
|
-
snapshot: {
|
|
29
|
-
...snapshot,
|
|
30
|
-
diagnostics,
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function formatDiagnostic(diagnostic) {
|
|
36
|
-
const severity = formatSeverity(diagnostic.severity);
|
|
37
|
-
const line = (diagnostic.range?.start?.line ?? 0) + 1;
|
|
38
|
-
const col = (diagnostic.range?.start?.character ?? 0) + 1;
|
|
39
|
-
const code = diagnostic.code == null ? "" : ` ${diagnostic.code}`;
|
|
40
|
-
const source = diagnostic.source ?? diagnostic.serverId ?? "lsp";
|
|
41
|
-
return `- ${severity} ${source} ${diagnostic.path}:${line}:${col}${code}\n ${singleLine(diagnostic.message ?? "")}`;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function countSeverities(diagnostics) {
|
|
45
|
-
const counts = { error: 0, warning: 0, info: 0, hint: 0 };
|
|
46
|
-
for (const diagnostic of diagnostics) counts[formatSeverity(diagnostic.severity)]++;
|
|
47
|
-
return counts;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function formatSummary(counts) {
|
|
51
|
-
return [
|
|
52
|
-
[counts.error, "errors"],
|
|
53
|
-
[counts.warning, "warnings"],
|
|
54
|
-
[counts.info, "info"],
|
|
55
|
-
[counts.hint, "hints"],
|
|
56
|
-
].filter(([count]) => count > 0).map(([count, label]) => `${count} ${label}`).join(", ") || "0 diagnostics";
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function formatSeverity(severity) {
|
|
60
|
-
if (severity === 2) return "warning";
|
|
61
|
-
if (severity === 3) return "info";
|
|
62
|
-
if (severity === 4) return "hint";
|
|
63
|
-
return "error";
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function severityRank(severity) {
|
|
67
|
-
return { error: 0, warning: 1, info: 2, hint: 3 }[formatSeverity(severity)] ?? 4;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function singleLine(text) {
|
|
71
|
-
return String(text).replace(/\s+/g, " ").trim();
|
|
72
|
-
}
|
|
1
|
+
import { sameLspPath } from "./path-match.mjs";
|
|
2
|
+
|
|
3
|
+
const MAX_DIAGNOSTICS = 20;
|
|
4
|
+
|
|
5
|
+
export function formatLspDiagnostics({ snapshot } = {}) {
|
|
6
|
+
const diagnostics = snapshot?.diagnostics ?? [];
|
|
7
|
+
if (diagnostics.length === 0) return "[diagnostics]";
|
|
8
|
+
|
|
9
|
+
const sorted = [...diagnostics].sort((a, b) => severityRank(a.severity) - severityRank(b.severity));
|
|
10
|
+
|
|
11
|
+
const counts = countSeverities(diagnostics);
|
|
12
|
+
const lines = ["[diagnostics]", "source: lsp"];
|
|
13
|
+
if (snapshot?.status) lines.push(`status: ${snapshot.status}`);
|
|
14
|
+
lines.push(`summary: ${formatSummary(counts)}${diagnostics.length > MAX_DIAGNOSTICS ? `, showing ${MAX_DIAGNOSTICS} of ${diagnostics.length}` : ""}`);
|
|
15
|
+
lines.push("");
|
|
16
|
+
for (const diagnostic of sorted.slice(0, MAX_DIAGNOSTICS)) {
|
|
17
|
+
lines.push(formatDiagnostic(diagnostic));
|
|
18
|
+
}
|
|
19
|
+
return lines.join("\n");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function formatLspDiagnosticsForPath({ snapshot, path } = {}) {
|
|
23
|
+
const targetPath = String(path ?? "");
|
|
24
|
+
if (!targetPath) return "";
|
|
25
|
+
const diagnostics = (snapshot?.diagnostics ?? []).filter((diagnostic) => sameLspPath(diagnostic.path, targetPath));
|
|
26
|
+
if (diagnostics.length === 0) return "";
|
|
27
|
+
return formatLspDiagnostics({
|
|
28
|
+
snapshot: {
|
|
29
|
+
...snapshot,
|
|
30
|
+
diagnostics,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function formatDiagnostic(diagnostic) {
|
|
36
|
+
const severity = formatSeverity(diagnostic.severity);
|
|
37
|
+
const line = (diagnostic.range?.start?.line ?? 0) + 1;
|
|
38
|
+
const col = (diagnostic.range?.start?.character ?? 0) + 1;
|
|
39
|
+
const code = diagnostic.code == null ? "" : ` ${diagnostic.code}`;
|
|
40
|
+
const source = diagnostic.source ?? diagnostic.serverId ?? "lsp";
|
|
41
|
+
return `- ${severity} ${source} ${diagnostic.path}:${line}:${col}${code}\n ${singleLine(diagnostic.message ?? "")}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function countSeverities(diagnostics) {
|
|
45
|
+
const counts = { error: 0, warning: 0, info: 0, hint: 0 };
|
|
46
|
+
for (const diagnostic of diagnostics) counts[formatSeverity(diagnostic.severity)]++;
|
|
47
|
+
return counts;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function formatSummary(counts) {
|
|
51
|
+
return [
|
|
52
|
+
[counts.error, "errors"],
|
|
53
|
+
[counts.warning, "warnings"],
|
|
54
|
+
[counts.info, "info"],
|
|
55
|
+
[counts.hint, "hints"],
|
|
56
|
+
].filter(([count]) => count > 0).map(([count, label]) => `${count} ${label}`).join(", ") || "0 diagnostics";
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function formatSeverity(severity) {
|
|
60
|
+
if (severity === 2) return "warning";
|
|
61
|
+
if (severity === 3) return "info";
|
|
62
|
+
if (severity === 4) return "hint";
|
|
63
|
+
return "error";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function severityRank(severity) {
|
|
67
|
+
return { error: 0, warning: 1, info: 2, hint: 3 }[formatSeverity(severity)] ?? 4;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function singleLine(text) {
|
|
71
|
+
return String(text).replace(/\s+/g, " ").trim();
|
|
72
|
+
}
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { spawnCommand } from "../platform/spawn-command.mjs";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
|
|
6
|
-
const DEFAULT_CACHE_ROOT = join(homedir(), ".march", "lsp", "node");
|
|
7
|
-
|
|
8
|
-
const MANAGED_PACKAGES = {
|
|
9
|
-
"typescript-language-server": ["typescript-language-server", "typescript"],
|
|
10
|
-
"vue-language-server": ["@vue/language-server", "typescript"],
|
|
11
|
-
"pyright-langserver": ["pyright"],
|
|
12
|
-
"vscode-json-language-server": ["vscode-langservers-extracted"],
|
|
13
|
-
"vscode-html-language-server": ["vscode-langservers-extracted"],
|
|
14
|
-
"vscode-css-language-server": ["vscode-langservers-extracted"],
|
|
15
|
-
"docker-langserver": ["dockerfile-language-server-nodejs"],
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const installs = new Map();
|
|
19
|
-
|
|
20
|
-
export function getManagedNodeLspRoot() {
|
|
21
|
-
return process.env.MARCH_LSP_NODE_ROOT || DEFAULT_CACHE_ROOT;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export async function ensureManagedNodeCommand(name) {
|
|
25
|
-
if (!MANAGED_PACKAGES[name]) return null;
|
|
26
|
-
const root = getManagedNodeLspRoot();
|
|
27
|
-
const existing = findManagedBin(name, root);
|
|
28
|
-
if (existing) return { command: existing, root, installed: false };
|
|
29
|
-
|
|
30
|
-
await ensureManagedPackages(name, root);
|
|
31
|
-
const command = findManagedBin(name, root);
|
|
32
|
-
if (!command) throw new Error(`managed install did not provide ${name}`);
|
|
33
|
-
return { command, root, installed: true };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export async function ensureManagedTypeScript() {
|
|
37
|
-
const root = getManagedNodeLspRoot();
|
|
38
|
-
if (findManagedTypeScriptServer()) return { root, installed: false };
|
|
39
|
-
await installPackages(root, ["typescript"]);
|
|
40
|
-
if (!findManagedTypeScriptServer()) throw new Error("managed install did not provide typescript");
|
|
41
|
-
return { root, installed: true };
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function findManagedTypeScriptServer() {
|
|
45
|
-
const root = getManagedNodeLspRoot();
|
|
46
|
-
const tsserver = join(root, "node_modules", "typescript", "lib", "tsserver.js");
|
|
47
|
-
return existsSync(tsserver) ? tsserver : null;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function findManagedTypeScriptSdk() {
|
|
51
|
-
const root = getManagedNodeLspRoot();
|
|
52
|
-
const lib = join(root, "node_modules", "typescript", "lib");
|
|
53
|
-
return existsSync(join(lib, "tsserverlibrary.js")) || existsSync(join(lib, "tsserver.js")) ? lib : null;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async function ensureManagedPackages(name, root) {
|
|
57
|
-
const key = `${root}:${name}`;
|
|
58
|
-
if (!installs.has(key)) {
|
|
59
|
-
installs.set(key, installPackages(root, MANAGED_PACKAGES[name]).finally(() => installs.delete(key)));
|
|
60
|
-
}
|
|
61
|
-
return await installs.get(key);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async function installPackages(root, packages) {
|
|
65
|
-
mkdirSync(root, { recursive: true });
|
|
66
|
-
const packageJson = join(root, "package.json");
|
|
67
|
-
if (!existsSync(packageJson)) writeFileSync(packageJson, JSON.stringify({ private: true, name: "march-managed-lsp" }, null, 2));
|
|
68
|
-
const npm = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
69
|
-
await run(npm, ["install", "--no-audit", "--no-fund", "--save-exact", ...packages], { cwd: root });
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function findManagedBin(name, root) {
|
|
73
|
-
for (const bin of platformCommandNames(name)) {
|
|
74
|
-
const candidate = join(root, "node_modules", ".bin", bin);
|
|
75
|
-
if (existsSync(candidate)) return candidate;
|
|
76
|
-
}
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function platformCommandNames(name) {
|
|
81
|
-
if (process.platform !== "win32") return [name];
|
|
82
|
-
return [`${name}.cmd`, `${name}.exe`, name];
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function run(command, args, { cwd }) {
|
|
86
|
-
return new Promise((resolve, reject) => {
|
|
87
|
-
const child = spawnCommand(command, args, { cwd, stdio: ["ignore", "ignore", "pipe"], windowsHide: true });
|
|
88
|
-
let stderr = "";
|
|
89
|
-
child.stderr.on("data", (chunk) => {
|
|
90
|
-
stderr += chunk.toString("utf8");
|
|
91
|
-
if (stderr.length > 4000) stderr = stderr.slice(-4000);
|
|
92
|
-
});
|
|
93
|
-
child.on("error", reject);
|
|
94
|
-
child.on("exit", (code) => {
|
|
95
|
-
if (code === 0) resolve();
|
|
96
|
-
else reject(new Error(`${command} ${args.join(" ")} failed with exit ${code}${stderr ? `: ${stderr.trim()}` : ""}`));
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
}
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { spawnCommand } from "../platform/spawn-command.mjs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
|
|
6
|
+
const DEFAULT_CACHE_ROOT = join(homedir(), ".march", "lsp", "node");
|
|
7
|
+
|
|
8
|
+
const MANAGED_PACKAGES = {
|
|
9
|
+
"typescript-language-server": ["typescript-language-server", "typescript"],
|
|
10
|
+
"vue-language-server": ["@vue/language-server", "typescript"],
|
|
11
|
+
"pyright-langserver": ["pyright"],
|
|
12
|
+
"vscode-json-language-server": ["vscode-langservers-extracted"],
|
|
13
|
+
"vscode-html-language-server": ["vscode-langservers-extracted"],
|
|
14
|
+
"vscode-css-language-server": ["vscode-langservers-extracted"],
|
|
15
|
+
"docker-langserver": ["dockerfile-language-server-nodejs"],
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const installs = new Map();
|
|
19
|
+
|
|
20
|
+
export function getManagedNodeLspRoot() {
|
|
21
|
+
return process.env.MARCH_LSP_NODE_ROOT || DEFAULT_CACHE_ROOT;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export async function ensureManagedNodeCommand(name) {
|
|
25
|
+
if (!MANAGED_PACKAGES[name]) return null;
|
|
26
|
+
const root = getManagedNodeLspRoot();
|
|
27
|
+
const existing = findManagedBin(name, root);
|
|
28
|
+
if (existing) return { command: existing, root, installed: false };
|
|
29
|
+
|
|
30
|
+
await ensureManagedPackages(name, root);
|
|
31
|
+
const command = findManagedBin(name, root);
|
|
32
|
+
if (!command) throw new Error(`managed install did not provide ${name}`);
|
|
33
|
+
return { command, root, installed: true };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function ensureManagedTypeScript() {
|
|
37
|
+
const root = getManagedNodeLspRoot();
|
|
38
|
+
if (findManagedTypeScriptServer()) return { root, installed: false };
|
|
39
|
+
await installPackages(root, ["typescript"]);
|
|
40
|
+
if (!findManagedTypeScriptServer()) throw new Error("managed install did not provide typescript");
|
|
41
|
+
return { root, installed: true };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function findManagedTypeScriptServer() {
|
|
45
|
+
const root = getManagedNodeLspRoot();
|
|
46
|
+
const tsserver = join(root, "node_modules", "typescript", "lib", "tsserver.js");
|
|
47
|
+
return existsSync(tsserver) ? tsserver : null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function findManagedTypeScriptSdk() {
|
|
51
|
+
const root = getManagedNodeLspRoot();
|
|
52
|
+
const lib = join(root, "node_modules", "typescript", "lib");
|
|
53
|
+
return existsSync(join(lib, "tsserverlibrary.js")) || existsSync(join(lib, "tsserver.js")) ? lib : null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function ensureManagedPackages(name, root) {
|
|
57
|
+
const key = `${root}:${name}`;
|
|
58
|
+
if (!installs.has(key)) {
|
|
59
|
+
installs.set(key, installPackages(root, MANAGED_PACKAGES[name]).finally(() => installs.delete(key)));
|
|
60
|
+
}
|
|
61
|
+
return await installs.get(key);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function installPackages(root, packages) {
|
|
65
|
+
mkdirSync(root, { recursive: true });
|
|
66
|
+
const packageJson = join(root, "package.json");
|
|
67
|
+
if (!existsSync(packageJson)) writeFileSync(packageJson, JSON.stringify({ private: true, name: "march-managed-lsp" }, null, 2));
|
|
68
|
+
const npm = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
69
|
+
await run(npm, ["install", "--no-audit", "--no-fund", "--save-exact", ...packages], { cwd: root });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function findManagedBin(name, root) {
|
|
73
|
+
for (const bin of platformCommandNames(name)) {
|
|
74
|
+
const candidate = join(root, "node_modules", ".bin", bin);
|
|
75
|
+
if (existsSync(candidate)) return candidate;
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function platformCommandNames(name) {
|
|
81
|
+
if (process.platform !== "win32") return [name];
|
|
82
|
+
return [`${name}.cmd`, `${name}.exe`, name];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function run(command, args, { cwd }) {
|
|
86
|
+
return new Promise((resolve, reject) => {
|
|
87
|
+
const child = spawnCommand(command, args, { cwd, stdio: ["ignore", "ignore", "pipe"], windowsHide: true });
|
|
88
|
+
let stderr = "";
|
|
89
|
+
child.stderr.on("data", (chunk) => {
|
|
90
|
+
stderr += chunk.toString("utf8");
|
|
91
|
+
if (stderr.length > 4000) stderr = stderr.slice(-4000);
|
|
92
|
+
});
|
|
93
|
+
child.on("error", reject);
|
|
94
|
+
child.on("exit", (code) => {
|
|
95
|
+
if (code === 0) resolve();
|
|
96
|
+
else reject(new Error(`${command} ${args.join(" ")} failed with exit ${code}${stderr ? `: ${stderr.trim()}` : ""}`));
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
package/src/lsp/path-match.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { normalize } from "node:path";
|
|
2
|
-
|
|
3
|
-
export function sameLspPath(left, right) {
|
|
4
|
-
return lspPathKey(left) === lspPathKey(right);
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export function lspPathKey(path) {
|
|
8
|
-
const normalized = normalize(String(path ?? ""));
|
|
9
|
-
return process.platform === "win32" ? normalized.toLowerCase() : normalized;
|
|
10
|
-
}
|
|
1
|
+
import { normalize } from "node:path";
|
|
2
|
+
|
|
3
|
+
export function sameLspPath(left, right) {
|
|
4
|
+
return lspPathKey(left) === lspPathKey(right);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function lspPathKey(path) {
|
|
8
|
+
const normalized = normalize(String(path ?? ""));
|
|
9
|
+
return process.platform === "win32" ? normalized.toLowerCase() : normalized;
|
|
10
|
+
}
|