@savvy-web/mcp 3.4.20 → 3.4.22
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/errors.js +1 -1
- package/index.d.ts +16 -15
- package/main.d.ts +1 -1
- package/main.js +2 -2
- package/package.json +10 -10
- package/runtime.js +3 -2
- package/server.js +14 -28
- package/toolkit.js +1 -1
- package/tools/biome-check.js +14 -12
- package/tools/changeset-inspect.js +1 -1
- package/tools/changeset-validate.js +1 -1
- package/tools/repos-inspect.js +1 -1
- package/tools/repos-manage.js +2 -2
- package/tools/turbo-inspect.js +1 -1
- package/version.js +1 -1
package/errors.js
CHANGED
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Distribution } from "@effected/
|
|
2
|
-
import { ToolRefusal } from "@effected/mcp";
|
|
1
|
+
import { Distribution } from "@effected/kit";
|
|
2
|
+
import { ToolRefusal } from "@effected/mcp-kit";
|
|
3
3
|
import { FileSystem, Layer, Path, Schema, Stdio } from "effect";
|
|
4
4
|
import { ToolDiscovery } from "@effected/commands";
|
|
5
5
|
import { Git } from "@effected/git";
|
|
@@ -71,7 +71,7 @@ export type McpToolError = typeof McpToolError.Type;
|
|
|
71
71
|
* `gitmodules` mode can read `.gitmodules` through the ambient service
|
|
72
72
|
* (mirroring `Repos.ReposDrift.check`) rather than a bare `node:fs` import —
|
|
73
73
|
* {@link makeSilkRuntimeLayer} passes both through onto its own output via an
|
|
74
|
-
* `Effect.context`
|
|
74
|
+
* `Effect.context` layer narrowed with `Context.pick`, so they survive `main.ts`'s
|
|
75
75
|
* `Layer.provide(NodeServices.layer)` instead of being fully discharged by
|
|
76
76
|
* it. `ChildProcessSpawner` is passed through the same way, and `Git` (from the
|
|
77
77
|
* kit graph) plus the shared `ToolDiscovery` are exposed, because
|
|
@@ -128,7 +128,7 @@ interface ServerOptions {
|
|
|
128
128
|
}
|
|
129
129
|
/**
|
|
130
130
|
* The whole server as one layer: the ten-tool toolkit, the silk-effects
|
|
131
|
-
* runtime discharging its dependencies, over `@effected/mcp`'s
|
|
131
|
+
* runtime discharging its dependencies, over `@effected/mcp-kit`'s
|
|
132
132
|
* `McpStdio.layer`.
|
|
133
133
|
*
|
|
134
134
|
* `McpStdio.layer` is `McpServer.layerStdio` with the kit's default
|
|
@@ -142,8 +142,9 @@ export declare const ServerLayer: (cwd: string, options?: ServerOptions) => Laye
|
|
|
142
142
|
/**
|
|
143
143
|
* The `biome_check` tool value. Mutating when `write`/`unsafe` is set, so it is
|
|
144
144
|
* annotated non-read-only and non-idempotent. `dependencies` lists what the
|
|
145
|
-
* handler yields: `Git` (worktree containment), `
|
|
146
|
-
* binary) and core's
|
|
145
|
+
* handler yields: `Git` (worktree containment), `FileSystem` and `Path`
|
|
146
|
+
* (`PathContainment`), `ToolDiscovery` (the Biome binary) and core's
|
|
147
|
+
* `ChildProcessSpawner` (`Run.collect`).
|
|
147
148
|
*/
|
|
148
149
|
declare const biomeCheckTool: Tool.Tool<"biome_check", {
|
|
149
150
|
readonly parameters: Schema.Struct<{
|
|
@@ -175,7 +176,7 @@ declare const biomeCheckTool: Tool.Tool<"biome_check", {
|
|
|
175
176
|
}>;
|
|
176
177
|
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof ToolRefusal]>;
|
|
177
178
|
readonly failureMode: "error";
|
|
178
|
-
}, ChildProcessSpawner.ChildProcessSpawner | Git | ToolDiscovery>;
|
|
179
|
+
}, ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem | Git | Path.Path | ToolDiscovery>;
|
|
179
180
|
/** The `changeset_deps_detect` tool value. */
|
|
180
181
|
declare const changesetDepsDetectTool: Tool.Tool<"changeset_deps_detect", {
|
|
181
182
|
readonly parameters: Schema.Struct<{
|
|
@@ -203,7 +204,7 @@ declare const changesetDepsDetectTool: Tool.Tool<"changeset_deps_detect", {
|
|
|
203
204
|
readonly packages: Schema.$Array<Schema.String>;
|
|
204
205
|
}>>;
|
|
205
206
|
}>;
|
|
206
|
-
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
|
|
207
|
+
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
|
|
207
208
|
readonly failureMode: "error";
|
|
208
209
|
}, Changesets.DepsRegen | WorkspaceRoot>;
|
|
209
210
|
/** The `changeset_deps_regen` tool value. Mutating: not read-only, not idempotent. */
|
|
@@ -227,7 +228,7 @@ declare const changesetDepsRegenTool: Tool.Tool<"changeset_deps_regen", {
|
|
|
227
228
|
}>>;
|
|
228
229
|
readonly dryRun: Schema.Boolean;
|
|
229
230
|
}>;
|
|
230
|
-
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
|
|
231
|
+
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
|
|
231
232
|
readonly failureMode: "error";
|
|
232
233
|
}, Changesets.DepsRegen | WorkspaceRoot>;
|
|
233
234
|
/** The `changeset_inspect` tool value. */
|
|
@@ -301,7 +302,7 @@ declare const changesetInspectTool: Tool.Tool<"changeset_inspect", {
|
|
|
301
302
|
}>, Schema.Null]>;
|
|
302
303
|
}>>;
|
|
303
304
|
}>]>;
|
|
304
|
-
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
|
|
305
|
+
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
|
|
305
306
|
readonly failureMode: "error";
|
|
306
307
|
}, Changesets.BranchAnalyzer | Changesets.ConfigInspector | WorkspaceRoot>;
|
|
307
308
|
/** The `changeset_preview` tool value. */
|
|
@@ -328,7 +329,7 @@ declare const changesetPreviewTool: Tool.Tool<"changeset_preview", {
|
|
|
328
329
|
}>>;
|
|
329
330
|
}>>;
|
|
330
331
|
}>;
|
|
331
|
-
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
|
|
332
|
+
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
|
|
332
333
|
readonly failureMode: "error";
|
|
333
334
|
}, Changesets.ReleasePlanner | WorkspaceRoot>;
|
|
334
335
|
/** The `changeset_validate` tool value. */
|
|
@@ -412,7 +413,7 @@ declare const reposInspectTool: Tool.Tool<"repos_inspect", {
|
|
|
412
413
|
}>>;
|
|
413
414
|
readonly parseError: Schema.optionalKey<Schema.String>;
|
|
414
415
|
}>]>;
|
|
415
|
-
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
|
|
416
|
+
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
|
|
416
417
|
readonly failureMode: "error";
|
|
417
418
|
}, FileSystem.FileSystem | Path.Path | Repos.ReposConfigStore | Repos.ReposDrift | Repos.ReposManager | WorkspaceRoot>;
|
|
418
419
|
/**
|
|
@@ -421,7 +422,7 @@ declare const reposInspectTool: Tool.Tool<"repos_inspect", {
|
|
|
421
422
|
* call is rejected as invalid parameters before the handler runs. Mutating:
|
|
422
423
|
* not read-only, not idempotent.
|
|
423
424
|
*/
|
|
424
|
-
declare const reposManageTool: import("@effected/mcp").UnionTool<"repos_manage", Schema.Union<readonly [Schema.Struct<{
|
|
425
|
+
declare const reposManageTool: import("@effected/mcp-kit").UnionTool<"repos_manage", Schema.Union<readonly [Schema.Struct<{
|
|
425
426
|
readonly action: Schema.Literal<"sync">;
|
|
426
427
|
readonly cwd: Schema.optionalKey<Schema.String>;
|
|
427
428
|
}>, Schema.Struct<{
|
|
@@ -617,7 +618,7 @@ declare const turboInspectTool: Tool.Tool<"turbo_inspect", {
|
|
|
617
618
|
readonly dependents: Schema.$Array<Schema.String>;
|
|
618
619
|
}>;
|
|
619
620
|
}>]>;
|
|
620
|
-
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
|
|
621
|
+
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
|
|
621
622
|
readonly failureMode: "error";
|
|
622
623
|
}, Turbo.TurboInspector | WorkspaceRoot>;
|
|
623
624
|
/**
|
|
@@ -652,7 +653,7 @@ declare const workspaceInfoTool: Tool.Tool<"workspace_info", {
|
|
|
652
653
|
readonly fixed: Schema.$Array<Schema.String>;
|
|
653
654
|
}>>;
|
|
654
655
|
}>;
|
|
655
|
-
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
|
|
656
|
+
readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
|
|
656
657
|
readonly failureMode: "error";
|
|
657
658
|
}, SilkWorkspaceAnalyzer | WorkspaceRoot>;
|
|
658
659
|
/**
|
package/main.d.ts
CHANGED
package/main.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { McpGuard } from "@effected/mcp/guard";
|
|
1
|
+
import { McpGuard } from "@effected/mcp-kit/guard";
|
|
2
2
|
|
|
3
3
|
// src/main.ts
|
|
4
4
|
/**
|
|
@@ -21,7 +21,7 @@ const main = (options = {}) => McpGuard.run({
|
|
|
21
21
|
const NodeRuntime = await import("@effect/platform-node/NodeRuntime");
|
|
22
22
|
const NodeServices = await import("@effect/platform-node/NodeServices");
|
|
23
23
|
const { Layer } = await import("effect");
|
|
24
|
-
const { LaunchContext } = await import("@effected/
|
|
24
|
+
const { LaunchContext } = await import("@effected/kit");
|
|
25
25
|
const { ServerLayer } = await import("./server.js");
|
|
26
26
|
return {
|
|
27
27
|
layer: ServerLayer(LaunchContext.projectDir({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@savvy-web/mcp",
|
|
3
|
-
"version": "3.4.
|
|
3
|
+
"version": "3.4.22",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "The savvy MCP server — Silk Suite tooling and library knowledge for coding agents",
|
|
6
6
|
"homepage": "https://github.com/savvy-web/systems/tree/main/packages/mcp",
|
|
@@ -36,14 +36,14 @@
|
|
|
36
36
|
"savvy-mcp": "bin/savvy-mcp.js"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@effect/platform-node": "~4.1.
|
|
40
|
-
"@effected/commands": "^0.
|
|
41
|
-
"@effected/
|
|
42
|
-
"@effected/
|
|
43
|
-
"@effected/mcp": "^0.
|
|
44
|
-
"@effected/templates": "^0.
|
|
45
|
-
"@effected/workspaces": "^0.
|
|
46
|
-
"@savvy-web/silk-effects": "^11.0.
|
|
47
|
-
"effect": "~4.1.
|
|
39
|
+
"@effect/platform-node": "~4.1.2",
|
|
40
|
+
"@effected/commands": "^0.20.0",
|
|
41
|
+
"@effected/git": "^0.30.0",
|
|
42
|
+
"@effected/kit": "^0.13.0",
|
|
43
|
+
"@effected/mcp-kit": "^0.14.0",
|
|
44
|
+
"@effected/templates": "^0.18.0",
|
|
45
|
+
"@effected/workspaces": "^0.43.0",
|
|
46
|
+
"@savvy-web/silk-effects": "^11.0.2",
|
|
47
|
+
"effect": "~4.1.2"
|
|
48
48
|
}
|
|
49
49
|
}
|
package/runtime.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Effect, Layer } from "effect";
|
|
1
|
+
import { Context, Effect, FileSystem, Layer, Path } from "effect";
|
|
2
2
|
import { ToolDiscovery } from "@effected/commands";
|
|
3
3
|
import { Workspaces } from "@effected/workspaces";
|
|
4
4
|
import { ChangesetConfig, ChangesetConfigReader, Changesets, Repos, SilkPublishability, SilkWorkspaceAnalyzer, Turbo } from "@savvy-web/silk-effects";
|
|
5
|
+
import { ChildProcessSpawner } from "effect/process";
|
|
5
6
|
|
|
6
7
|
// src/runtime.ts
|
|
7
8
|
/**
|
|
@@ -72,7 +73,7 @@ const makeSilkRuntimeLayer = (cwd) => {
|
|
|
72
73
|
* `repos_inspect`'s drift mode resolves it directly.
|
|
73
74
|
*/
|
|
74
75
|
const repos = Layer.mergeAll(Repos.ReposConfigStore.layer, Repos.ReposManager.layer.pipe(Layer.provide(Repos.ReposConfigStore.layer), Layer.provide(Repos.ReposLockdown.layer)), Repos.ReposDrift.layer.pipe(Layer.provide(Repos.ReposConfigStore.layer)));
|
|
75
|
-
const platformPassthrough = Layer.effectContext(Effect.context());
|
|
76
|
+
const platformPassthrough = Layer.effectContext(Effect.map(Effect.context(), Context.pick(FileSystem.FileSystem, Path.Path, ChildProcessSpawner.ChildProcessSpawner)));
|
|
76
77
|
return Layer.mergeAll(SilkWorkspaceAnalyzer.layer.pipe(Layer.provide(analyzerDeps)), Turbo.TurboInspector.layer.pipe(Layer.provide(toolDiscovery)), toolDiscovery, inspectorAndAnalyzer, depsRegen, repos, platformPassthrough).pipe(Layer.provideMerge(kitGraph));
|
|
77
78
|
};
|
|
78
79
|
|
package/server.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { makeSilkRuntimeLayer } from "./runtime.js";
|
|
2
2
|
import { SilkToolkit, ToolsLayer } from "./toolkit.js";
|
|
3
3
|
import { CURRENT_MCP_VERSION } from "./version.js";
|
|
4
|
-
import { McpStdio, McpToolkit } from "@effected/mcp";
|
|
5
|
-
import {
|
|
6
|
-
import { distributionSuffix } from "@effected/
|
|
7
|
-
import { McpServer } from "effect/ai";
|
|
4
|
+
import { McpStdio, McpToolkit } from "@effected/mcp-kit";
|
|
5
|
+
import { Layer, Option } from "effect";
|
|
6
|
+
import { distributionSuffix } from "@effected/kit";
|
|
8
7
|
|
|
9
8
|
// src/server.ts
|
|
10
9
|
/**
|
|
@@ -27,34 +26,21 @@ const SERVER_INSTRUCTIONS = [
|
|
|
27
26
|
"Every successful result is a typed object in structuredContent (content[0].text carries the same object as JSON). A failure is an isError result whose content[0].text carries the message and remediation, with no structuredContent. Every tool takes an optional cwd; omit it to use the server's project directory."
|
|
28
27
|
].join("\n");
|
|
29
28
|
/**
|
|
30
|
-
* Discharges every tool's declared `dependencies`. Since effect 4.1 a service a
|
|
31
|
-
* tool lists in `dependencies` is a per-request `McpRequest<"Requires", S>`
|
|
32
|
-
* requirement that only MCP middleware or the transport can meet;
|
|
33
|
-
* `Layer.provide` no longer does. The silk runtime is built ONCE (it holds the
|
|
34
|
-
* process-lifetime `ConfigInspector`, #229), so the middleware captures its
|
|
35
|
-
* context when the layer is built and provides that same context to every
|
|
36
|
-
* request.
|
|
37
|
-
*
|
|
38
|
-
* `Effect.context` captures the whole layer-build context, not only
|
|
39
|
-
* `McpServices` (also `Scope`, `Clock`, `Console`, `McpServer`, the memo map),
|
|
40
|
-
* and `Effect.provideContext` merges it OVER the request's context. Probed on
|
|
41
|
-
* 4.1.1: a handler finalizer still runs at the end of its own request, and no
|
|
42
|
-
* request-scoped key (`McpRequestContext`, log level, parent span) is in the
|
|
43
|
-
* build context today. Core's own registration capture filters those keys
|
|
44
|
-
* (`omitRequestServices`); this capture does not, so do not build this layer
|
|
45
|
-
* inside a span or under a request-level reference.
|
|
46
|
-
*/
|
|
47
|
-
const RuntimeMiddleware = McpServer.middleware()(Effect.map(Effect.context(), (context) => (effect) => Effect.provideContext(effect, context)));
|
|
48
|
-
/**
|
|
49
29
|
* The toolkit registration as a layer: `McpToolkit.layer` with the handlers
|
|
50
|
-
* bound to `cwd`
|
|
51
|
-
* dependencies. Passed to `McpStdio.layer` as `registrations`, so it builds
|
|
30
|
+
* bound to `cwd`. Passed to `McpStdio.layer` as `registrations`, so it builds
|
|
52
31
|
* before the first request.
|
|
32
|
+
*
|
|
33
|
+
* Since effect 4.1 a service a tool lists in `dependencies` is a per-request
|
|
34
|
+
* `McpRequest<"Requires", S>` requirement that only MCP middleware or the
|
|
35
|
+
* transport can meet; `Layer.provide` no longer does.
|
|
36
|
+
* `McpToolkit.provideLifetime` is that middleware: the silk runtime is built
|
|
37
|
+
* ONCE (it holds the process-lifetime `ConfigInspector`, #229), and every
|
|
38
|
+
* request gets what the runtime layer outputs and nothing else.
|
|
53
39
|
*/
|
|
54
|
-
const SilkToolsLayer = (cwd) => McpToolkit.layer(SilkToolkit, { strict: "annotated" }).pipe(Layer.provide(ToolsLayer(cwd)), Layer.provide(
|
|
40
|
+
const SilkToolsLayer = (cwd) => McpToolkit.layer(SilkToolkit, { strict: "annotated" }).pipe(Layer.provide(ToolsLayer(cwd)), Layer.provide(McpToolkit.provideLifetime(makeSilkRuntimeLayer(cwd))));
|
|
55
41
|
/**
|
|
56
42
|
* The whole server as one layer: the ten-tool toolkit, the silk-effects
|
|
57
|
-
* runtime discharging its dependencies, over `@effected/mcp`'s
|
|
43
|
+
* runtime discharging its dependencies, over `@effected/mcp-kit`'s
|
|
58
44
|
* `McpStdio.layer`.
|
|
59
45
|
*
|
|
60
46
|
* `McpStdio.layer` is `McpServer.layerStdio` with the kit's default
|
|
@@ -70,6 +56,6 @@ const ServerLayer = (cwd, options = {}) => McpStdio.layer({
|
|
|
70
56
|
description: "Structured Silk Suite workspace tools: workspace, turbo, biome, changesets and vendored repos.",
|
|
71
57
|
instructions: SERVER_INSTRUCTIONS,
|
|
72
58
|
registrations: SilkToolsLayer(cwd)
|
|
73
|
-
})
|
|
59
|
+
});
|
|
74
60
|
|
|
75
61
|
export { SERVER_INSTRUCTIONS, ServerLayer };
|
package/toolkit.js
CHANGED
|
@@ -9,7 +9,7 @@ import { handleReposManage, reposManageTool } from "./tools/repos-manage.js";
|
|
|
9
9
|
import { handleTurboInspect, turboInspectTool } from "./tools/turbo-inspect.js";
|
|
10
10
|
import { handleWorkspaceInfo, workspaceInfoTool } from "./tools/workspace-info.js";
|
|
11
11
|
import { Effect } from "effect";
|
|
12
|
-
import { Exclusive } from "@effected/
|
|
12
|
+
import { Exclusive } from "@effected/kit";
|
|
13
13
|
import { Toolkit } from "effect/ai";
|
|
14
14
|
|
|
15
15
|
// src/toolkit.ts
|
package/tools/biome-check.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { BiomeFailed, McpToolError } from "../errors.js";
|
|
2
|
-
import { ToolFailure, ToolRefusal } from "@effected/mcp";
|
|
3
|
-
import { Effect, Option, Schema } from "effect";
|
|
2
|
+
import { ToolFailure, ToolRefusal } from "@effected/mcp-kit";
|
|
3
|
+
import { Effect, FileSystem, Option, Path, Schema } from "effect";
|
|
4
4
|
import { Run, Tool, ToolDiscovery } from "@effected/commands";
|
|
5
|
+
import { ChildProcess, ChildProcessSpawner } from "effect/process";
|
|
6
|
+
import { PathContainment } from "@effected/kit";
|
|
5
7
|
import { Tool as Tool$1 } from "effect/ai";
|
|
6
8
|
import { realpathSync } from "node:fs";
|
|
7
|
-
import { relative, resolve
|
|
9
|
+
import { relative, resolve } from "node:path";
|
|
8
10
|
import { Git, TreeIdentity } from "@effected/git";
|
|
9
|
-
import { ChildProcess, ChildProcessSpawner } from "effect/process";
|
|
10
11
|
|
|
11
12
|
// src/tools/biome-check.ts
|
|
12
13
|
/**
|
|
@@ -127,9 +128,8 @@ const buildBiomeResult = (params) => {
|
|
|
127
128
|
};
|
|
128
129
|
};
|
|
129
130
|
/**
|
|
130
|
-
* Canonicalize a
|
|
131
|
-
*
|
|
132
|
-
* tree). Also applied to a sibling worktree's `TreeIdentity.toplevel`, so the
|
|
131
|
+
* Canonicalize a working directory, falling back to lexical resolution when it
|
|
132
|
+
* does not exist. Also applied to a sibling worktree's `TreeIdentity.toplevel`, so the
|
|
133
133
|
* containment root is spelled the same way as the realpath'd caller paths.
|
|
134
134
|
*/
|
|
135
135
|
const canonicalize = (p) => {
|
|
@@ -168,7 +168,7 @@ const treeIdentity = (git, dir) => git.treeIdentity(dir).pipe(Effect.orElseSucce
|
|
|
168
168
|
* @returns the directory tree to contain to, or `Option.none` to reject
|
|
169
169
|
*/
|
|
170
170
|
const resolveContainmentRoot = Effect.fn("biome_check.resolveContainmentRoot")(function* (root, cwd) {
|
|
171
|
-
if (
|
|
171
|
+
if (yield* PathContainment.isWithin(root, cwd)) return Option.some(root);
|
|
172
172
|
const git = yield* Git;
|
|
173
173
|
const from = yield* treeIdentity(git, cwd);
|
|
174
174
|
if (Option.isNone(from)) return Option.none();
|
|
@@ -244,12 +244,11 @@ const runBiomeCheck = Effect.fn("biome_check.run")(function* (args, fallbackCwd,
|
|
|
244
244
|
const contained = yield* resolveContainmentRoot(root, cwd);
|
|
245
245
|
if (Option.isNone(contained)) return yield* ToolRefusal.refuse(`cwd escapes the workspace root: ${ToolFailure.truncate(args.cwd ?? fallbackCwd)}.`, CONTAINMENT_REMEDIATION);
|
|
246
246
|
const containmentRoot = contained.value;
|
|
247
|
-
const within = (abs) => abs === containmentRoot || abs.startsWith(`${containmentRoot}${sep}`);
|
|
248
247
|
const rawPaths = args.paths && args.paths.length > 0 ? args.paths : ["."];
|
|
249
248
|
const paths = [];
|
|
250
249
|
for (const p of rawPaths) {
|
|
251
250
|
const lexical = resolve(cwd, p);
|
|
252
|
-
if (!
|
|
251
|
+
if (!(yield* PathContainment.isWithin(containmentRoot, lexical))) return yield* ToolRefusal.refuse(`path escapes the workspace root: ${ToolFailure.truncate(p)}.`, CONTAINMENT_REMEDIATION);
|
|
253
252
|
paths.push(relative(cwd, lexical) || ".");
|
|
254
253
|
}
|
|
255
254
|
const doWrite = Boolean(args.write || args.unsafe);
|
|
@@ -295,8 +294,9 @@ const BiomeCheckParams = Schema.Struct({
|
|
|
295
294
|
/**
|
|
296
295
|
* The `biome_check` tool value. Mutating when `write`/`unsafe` is set, so it is
|
|
297
296
|
* annotated non-read-only and non-idempotent. `dependencies` lists what the
|
|
298
|
-
* handler yields: `Git` (worktree containment), `
|
|
299
|
-
* binary) and core's
|
|
297
|
+
* handler yields: `Git` (worktree containment), `FileSystem` and `Path`
|
|
298
|
+
* (`PathContainment`), `ToolDiscovery` (the Biome binary) and core's
|
|
299
|
+
* `ChildProcessSpawner` (`Run.collect`).
|
|
300
300
|
*/
|
|
301
301
|
const biomeCheckTool = Tool$1.make("biome_check", {
|
|
302
302
|
description: "Run Biome over a path and get structured diagnostics back. mode=check (default; lint + format + organize-imports) or mode=lint. Set write=true to apply safe fixes (--write), unsafe=true for unsafe fixes (--write --unsafe). Severities match the project's Biome config (what `biome check` reports); set strict=true to surface project warnings as errors, each marked with its originalSeverity. Prefer this over shelling out to biome; the LSP already covers files you've edited. Returns a typed object in structuredContent (content[] carries the same object as JSON). NOTE: with write/unsafe this tool MUTATES files (git-reversible).",
|
|
@@ -305,6 +305,8 @@ const biomeCheckTool = Tool$1.make("biome_check", {
|
|
|
305
305
|
failure: McpToolError,
|
|
306
306
|
dependencies: [
|
|
307
307
|
Git,
|
|
308
|
+
FileSystem.FileSystem,
|
|
309
|
+
Path.Path,
|
|
308
310
|
ToolDiscovery,
|
|
309
311
|
ChildProcessSpawner.ChildProcessSpawner
|
|
310
312
|
]
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { McpToolError, mapEngineError } from "../errors.js";
|
|
2
|
-
import { ToolOutputSchema } from "@effected/mcp";
|
|
2
|
+
import { ToolOutputSchema } from "@effected/mcp-kit";
|
|
3
3
|
import { Effect, Schema } from "effect";
|
|
4
4
|
import { WorkspaceRoot } from "@effected/workspaces";
|
|
5
5
|
import { Changesets } from "@savvy-web/silk-effects";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { McpToolError, mapEngineError } from "../errors.js";
|
|
2
|
-
import { ToolFailure, ToolRefusal } from "@effected/mcp";
|
|
2
|
+
import { ToolFailure, ToolRefusal } from "@effected/mcp-kit";
|
|
3
3
|
import { Data, Effect, Schema } from "effect";
|
|
4
4
|
import { WorkspaceRoot } from "@effected/workspaces";
|
|
5
5
|
import { Changesets } from "@savvy-web/silk-effects";
|
package/tools/repos-inspect.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { McpToolError, mapEngineError } from "../errors.js";
|
|
2
|
-
import { ToolOutputSchema } from "@effected/mcp";
|
|
2
|
+
import { ToolOutputSchema } from "@effected/mcp-kit";
|
|
3
3
|
import { Effect, FileSystem, Option, Path, Result, Schema } from "effect";
|
|
4
4
|
import { WorkspaceRoot } from "@effected/workspaces";
|
|
5
5
|
import { Repos } from "@savvy-web/silk-effects";
|
package/tools/repos-manage.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { McpToolError, mapEngineError } from "../errors.js";
|
|
2
|
-
import { McpToolkit, ToolOutputSchema, ToolRefusal } from "@effected/mcp";
|
|
2
|
+
import { McpToolkit, ToolOutputSchema, ToolRefusal } from "@effected/mcp-kit";
|
|
3
3
|
import { Effect, Result, Schema } from "effect";
|
|
4
4
|
import { WorkspaceRoot } from "@effected/workspaces";
|
|
5
5
|
import { Repos } from "@savvy-web/silk-effects";
|
|
@@ -10,7 +10,7 @@ import { Tool } from "effect/ai";
|
|
|
10
10
|
* The `repos_manage` MCP tool: one action-discriminated mutating tool
|
|
11
11
|
* covering `sync`, `pin`, `add`, `note`, `remove`, `rename`, `restore`, and
|
|
12
12
|
* `deregister` against the vendored `.repos/` submodules. Its parameters are
|
|
13
|
-
* a `Schema.Union` of one struct per action, served by `@effected/mcp`'s
|
|
13
|
+
* a `Schema.Union` of one struct per action, served by `@effected/mcp-kit`'s
|
|
14
14
|
* `McpToolkit.unionTool` as a strict `oneOf` keyed by `action`; the handler
|
|
15
15
|
* receives the decoded member. Mutating — no `readOnlyHint`.
|
|
16
16
|
*
|
package/tools/turbo-inspect.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { McpToolError, mapEngineError } from "../errors.js";
|
|
2
|
-
import { ToolOutputSchema } from "@effected/mcp";
|
|
2
|
+
import { ToolOutputSchema } from "@effected/mcp-kit";
|
|
3
3
|
import { Effect, Schema } from "effect";
|
|
4
4
|
import { WorkspaceRoot } from "@effected/workspaces";
|
|
5
5
|
import { Turbo } from "@savvy-web/silk-effects";
|