@mandujs/mcp 0.38.11 → 0.39.0-beta.1
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/README.md +3 -3
- package/package.json +3 -5
- package/src/activity-adapter.ts +23 -23
- package/src/activity-monitor.ts +39 -10
- package/src/adapters/index.ts +20 -20
- package/src/adapters/monitor-adapter.ts +100 -100
- package/src/adapters/tool-adapter.ts +90 -90
- package/src/executor/index.ts +22 -22
- package/src/executor/tool-executor.ts +148 -148
- package/src/hooks/config-watcher.ts +173 -173
- package/src/hooks/index.ts +23 -23
- package/src/hooks/mcp-hooks.ts +227 -227
- package/src/index.ts +5 -5
- package/src/logging/index.ts +15 -15
- package/src/logging/mcp-transport.ts +134 -134
- package/src/new-resources.ts +2 -2
- package/src/profiles.ts +25 -54
- package/src/prompts.ts +4 -4
- package/src/registry/index.ts +13 -13
- package/src/registry/mcp-tool-registry.ts +298 -298
- package/src/resources/generated-skills/catalog.ts +36 -0
- package/src/resources/generated-skills/mandu-agent-workflow/SKILL.md +48 -0
- package/src/resources/generated-skills/mandu-contract/SKILL.md +20 -0
- package/src/resources/generated-skills/mandu-fs-routes/SKILL.md +19 -0
- package/src/resources/generated-skills/mandu-guard/SKILL.md +20 -0
- package/src/resources/generated-skills/mandu-hydration/SKILL.md +19 -0
- package/src/resources/generated-skills/mandu-testing/SKILL.md +20 -0
- package/src/resources/handlers.ts +3 -3
- package/src/resources/skills/guides.ts +49 -49
- package/src/resources/skills/index.ts +12 -12
- package/src/resources/skills/loader.ts +8 -35
- package/src/resources/skills/recipes.ts +28 -28
- package/src/server.ts +1 -1
- package/src/tools/agent.ts +479 -409
- package/src/tools/ate-exemplar.ts +92 -92
- package/src/tools/ate-flakes.ts +90 -90
- package/src/tools/ate-mutate.ts +103 -103
- package/src/tools/ate-mutation-report.ts +64 -64
- package/src/tools/ate-oracle-pending.ts +49 -49
- package/src/tools/ate-oracle-replay.ts +44 -44
- package/src/tools/ate-oracle-verdict.ts +70 -70
- package/src/tools/ate-prompt.ts +146 -146
- package/src/tools/ate-run.ts +1 -1
- package/src/tools/ate.ts +38 -38
- package/src/tools/brain.ts +6 -6
- package/src/tools/composite.ts +19 -61
- package/src/tools/contract.ts +11 -9
- package/src/tools/deploy-plan.ts +2 -2
- package/src/tools/deploy-preview.ts +316 -316
- package/src/tools/design.ts +825 -825
- package/src/tools/docs.ts +350 -350
- package/src/tools/generate.ts +4 -3
- package/src/tools/guard.ts +1 -1
- package/src/tools/history.ts +1 -1
- package/src/tools/hydration.ts +64 -64
- package/src/tools/index.ts +0 -118
- package/src/tools/kitchen.ts +72 -72
- package/src/tools/lint.ts +226 -226
- package/src/tools/loop-close.ts +175 -175
- package/src/tools/negotiate.ts +263 -263
- package/src/tools/resource.ts +1 -1
- package/src/tools/run-tests.ts +424 -424
- package/src/tools/runtime.ts +1 -1
- package/src/tools/seo.ts +1 -1
- package/src/tools/slot-validation.ts +19 -19
- package/src/tools/spec.ts +201 -201
- package/src/tools/transaction.ts +1 -1
- package/src/tx-lock.ts +73 -73
- package/src/utils/runtime-control.ts +52 -52
- package/src/utils/withWarnings.ts +1 -1
- package/src/resources/skills/mandu-agent-workflow/SKILL.md +0 -124
- package/src/resources/skills/mandu-agent-workflow/metadata.json +0 -7
- package/src/resources/skills/mandu-composition/SKILL.md +0 -131
- package/src/resources/skills/mandu-composition/metadata.json +0 -13
- package/src/resources/skills/mandu-composition/rules/_sections.md +0 -26
- package/src/resources/skills/mandu-composition/rules/_template.md +0 -77
- package/src/resources/skills/mandu-composition/rules/comp-arch-avoid-boolean-props.md +0 -146
- package/src/resources/skills/mandu-composition/rules/comp-arch-compound-components.md +0 -164
- package/src/resources/skills/mandu-composition/rules/comp-island-event.md +0 -161
- package/src/resources/skills/mandu-composition/rules/comp-island-slot-split.md +0 -167
- package/src/resources/skills/mandu-composition/rules/comp-pattern-children.md +0 -149
- package/src/resources/skills/mandu-composition/rules/comp-state-context-interface.md +0 -148
- package/src/resources/skills/mandu-composition/rules/comp-state-lift-state.md +0 -150
- package/src/resources/skills/mandu-deployment/SKILL.md +0 -135
- package/src/resources/skills/mandu-deployment/_sections.md +0 -41
- package/src/resources/skills/mandu-deployment/_template.md +0 -38
- package/src/resources/skills/mandu-deployment/metadata.json +0 -13
- package/src/resources/skills/mandu-deployment/rules/db-provider-supabase.md +0 -300
- package/src/resources/skills/mandu-deployment/rules/deploy-build-bun.md +0 -109
- package/src/resources/skills/mandu-deployment/rules/deploy-build-output.md +0 -115
- package/src/resources/skills/mandu-deployment/rules/deploy-cicd-github.md +0 -219
- package/src/resources/skills/mandu-deployment/rules/deploy-docker-bun.md +0 -150
- package/src/resources/skills/mandu-deployment/rules/deploy-docker-compose.md +0 -223
- package/src/resources/skills/mandu-deployment/rules/deploy-platform-fly.md +0 -152
- package/src/resources/skills/mandu-deployment/rules/deploy-platform-render.md +0 -179
- package/src/resources/skills/mandu-deployment/rules/deploy-platform-vercel.md +0 -140
- package/src/resources/skills/mandu-fs-routes/SKILL.md +0 -122
- package/src/resources/skills/mandu-fs-routes/metadata.json +0 -12
- package/src/resources/skills/mandu-fs-routes/rules/_sections.md +0 -36
- package/src/resources/skills/mandu-fs-routes/rules/_template.md +0 -69
- package/src/resources/skills/mandu-fs-routes/rules/routes-api-methods.md +0 -65
- package/src/resources/skills/mandu-fs-routes/rules/routes-dynamic-param.md +0 -93
- package/src/resources/skills/mandu-fs-routes/rules/routes-naming-page.md +0 -55
- package/src/resources/skills/mandu-guard/SKILL.md +0 -162
- package/src/resources/skills/mandu-guard/metadata.json +0 -12
- package/src/resources/skills/mandu-guard/rules/_sections.md +0 -36
- package/src/resources/skills/mandu-guard/rules/_template.md +0 -82
- package/src/resources/skills/mandu-guard/rules/guard-config-rules.md +0 -100
- package/src/resources/skills/mandu-guard/rules/guard-layer-direction.md +0 -76
- package/src/resources/skills/mandu-guard/rules/guard-preset-mandu.md +0 -81
- package/src/resources/skills/mandu-guard/rules/guard-validate-import.md +0 -80
- package/src/resources/skills/mandu-hydration/SKILL.md +0 -139
- package/src/resources/skills/mandu-hydration/metadata.json +0 -12
- package/src/resources/skills/mandu-hydration/rules/_sections.md +0 -31
- package/src/resources/skills/mandu-hydration/rules/_template.md +0 -72
- package/src/resources/skills/mandu-hydration/rules/hydration-data-event.md +0 -109
- package/src/resources/skills/mandu-hydration/rules/hydration-directive-use-client.md +0 -55
- package/src/resources/skills/mandu-hydration/rules/hydration-island-setup.md +0 -160
- package/src/resources/skills/mandu-hydration/rules/hydration-priority-visible.md +0 -91
- package/src/resources/skills/mandu-performance/SKILL.md +0 -125
- package/src/resources/skills/mandu-performance/metadata.json +0 -14
- package/src/resources/skills/mandu-performance/rules/_sections.md +0 -31
- package/src/resources/skills/mandu-performance/rules/_template.md +0 -64
- package/src/resources/skills/mandu-performance/rules/perf-async-defer-await.md +0 -103
- package/src/resources/skills/mandu-performance/rules/perf-async-parallel.md +0 -95
- package/src/resources/skills/mandu-performance/rules/perf-bun-file.md +0 -124
- package/src/resources/skills/mandu-performance/rules/perf-bun-serve.md +0 -125
- package/src/resources/skills/mandu-performance/rules/perf-bundle-imports.md +0 -80
- package/src/resources/skills/mandu-performance/rules/perf-bundle-island-lazy.md +0 -145
- package/src/resources/skills/mandu-performance/rules/perf-cache-react.md +0 -98
- package/src/resources/skills/mandu-performance/rules/perf-render-transitions.md +0 -154
- package/src/resources/skills/mandu-security/SKILL.md +0 -127
- package/src/resources/skills/mandu-security/metadata.json +0 -13
- package/src/resources/skills/mandu-security/rules/_sections.md +0 -31
- package/src/resources/skills/mandu-security/rules/_template.md +0 -74
- package/src/resources/skills/mandu-security/rules/sec-auth-guard.md +0 -127
- package/src/resources/skills/mandu-security/rules/sec-env-management.md +0 -133
- package/src/resources/skills/mandu-security/rules/sec-input-validate.md +0 -148
- package/src/resources/skills/mandu-security/rules/sec-protect-csrf.md +0 -146
- package/src/resources/skills/mandu-security/rules/sec-protect-headers.md +0 -138
- package/src/resources/skills/mandu-slot/SKILL.md +0 -125
- package/src/resources/skills/mandu-slot/metadata.json +0 -12
- package/src/resources/skills/mandu-slot/rules/_sections.md +0 -36
- package/src/resources/skills/mandu-slot/rules/_template.md +0 -63
- package/src/resources/skills/mandu-slot/rules/slot-basic-structure.md +0 -38
- package/src/resources/skills/mandu-slot/rules/slot-ctx-response.md +0 -56
- package/src/resources/skills/mandu-slot/rules/slot-guard-auth.md +0 -59
- package/src/resources/skills/mandu-slot/rules/slot-http-methods.md +0 -64
- package/src/resources/skills/mandu-styling/SKILL.md +0 -196
- package/src/resources/skills/mandu-styling/_sections.md +0 -43
- package/src/resources/skills/mandu-styling/_template.md +0 -32
- package/src/resources/skills/mandu-styling/metadata.json +0 -15
- package/src/resources/skills/mandu-styling/rules/style-component-compound.md +0 -235
- package/src/resources/skills/mandu-styling/rules/style-component-slots.md +0 -255
- package/src/resources/skills/mandu-styling/rules/style-component-tokens.md +0 -205
- package/src/resources/skills/mandu-styling/rules/style-island-animations.md +0 -272
- package/src/resources/skills/mandu-styling/rules/style-island-scoping.md +0 -167
- package/src/resources/skills/mandu-styling/rules/style-island-variants.md +0 -221
- package/src/resources/skills/mandu-styling/rules/style-perf-critical.md +0 -209
- package/src/resources/skills/mandu-styling/rules/style-perf-purge.md +0 -192
- package/src/resources/skills/mandu-styling/rules/style-setup-modules.md +0 -162
- package/src/resources/skills/mandu-styling/rules/style-setup-panda.md +0 -164
- package/src/resources/skills/mandu-styling/rules/style-setup-tailwind.md +0 -170
- package/src/resources/skills/mandu-styling/rules/style-tailwind-v4-gotchas.md +0 -179
- package/src/resources/skills/mandu-styling/rules/style-theme-darkmode.md +0 -229
- package/src/resources/skills/mandu-testing/SKILL.md +0 -132
- package/src/resources/skills/mandu-testing/metadata.json +0 -13
- package/src/resources/skills/mandu-testing/rules/_sections.md +0 -26
- package/src/resources/skills/mandu-testing/rules/_template.md +0 -65
- package/src/resources/skills/mandu-testing/rules/test-component-island.md +0 -195
- package/src/resources/skills/mandu-testing/rules/test-e2e-playwright.md +0 -196
- package/src/resources/skills/mandu-testing/rules/test-mock-fetch.md +0 -219
- package/src/resources/skills/mandu-testing/rules/test-slot-unit.md +0 -192
- package/src/resources/skills/mandu-ui/SKILL.md +0 -159
- package/src/resources/skills/mandu-ui/_sections.md +0 -23
- package/src/resources/skills/mandu-ui/_template.md +0 -32
- package/src/resources/skills/mandu-ui/metadata.json +0 -13
- package/src/resources/skills/mandu-ui/rules/ui-accessibility-aria.md +0 -232
- package/src/resources/skills/mandu-ui/rules/ui-accessibility-focus.md +0 -238
- package/src/resources/skills/mandu-ui/rules/ui-composition-patterns.md +0 -259
- package/src/resources/skills/mandu-ui/rules/ui-island-integration.md +0 -258
- package/src/resources/skills/mandu-ui/rules/ui-radix-patterns.md +0 -213
- package/src/resources/skills/mandu-ui/rules/ui-shadcn-setup.md +0 -209
package/src/tools/generate.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
-
import { generateManifest, loadManifest
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { generateManifest, loadManifest } from "@mandujs/core";
|
|
3
|
+
import { parseResourceSchema, generateResourceArtifacts } from "@mandujs/core/compat/resource/index";
|
|
4
|
+
import { generateRoutes, type GeneratedMap } from "@mandujs/core/compat/generator/index";
|
|
5
|
+
import { GENERATED_RELATIVE_PATHS } from "@mandujs/core/compat/paths";
|
|
5
6
|
import { getProjectPaths, readJsonFile } from "../utils/project.js";
|
|
6
7
|
import path from "path";
|
|
7
8
|
import fs from "fs/promises";
|
package/src/tools/guard.ts
CHANGED
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
type GuardPreset,
|
|
19
19
|
type Violation,
|
|
20
20
|
} from "@mandujs/core";
|
|
21
|
-
import type { GeneratedMap } from "@mandujs/core/generator";
|
|
21
|
+
import type { GeneratedMap } from "@mandujs/core/compat/generator/index";
|
|
22
22
|
import { getProjectPaths, readJsonFile, readConfig } from "../utils/project.js";
|
|
23
23
|
import fs from "fs/promises";
|
|
24
24
|
import path from "path";
|
package/src/tools/history.ts
CHANGED
package/src/tools/hydration.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
type HydrationPriority,
|
|
8
8
|
type HydrationConfig,
|
|
9
9
|
} from "@mandujs/core";
|
|
10
|
-
import { buildClientBundles, formatSize, type BundleManifest } from "@mandujs/core/bundler";
|
|
10
|
+
import { buildClientBundles, formatSize, type BundleManifest } from "@mandujs/core/compat/bundler/index";
|
|
11
11
|
import { getProjectPaths, readJsonFile, writeJsonFile } from "../utils/project.js";
|
|
12
12
|
import path from "path";
|
|
13
13
|
|
|
@@ -232,39 +232,39 @@ export function hydrationTools(projectRoot: string) {
|
|
|
232
232
|
};
|
|
233
233
|
},
|
|
234
234
|
|
|
235
|
-
"mandu.pageClientMount.list": async () => {
|
|
236
|
-
// Load manifest
|
|
237
|
-
const manifestResult = await loadManifest(paths.manifestPath);
|
|
238
|
-
if (!manifestResult.success || !manifestResult.data) {
|
|
239
|
-
return { error: manifestResult.errors };
|
|
240
|
-
}
|
|
241
|
-
const bundleManifest = await readJsonFile<BundleManifest>(
|
|
242
|
-
path.join(projectRoot, ".mandu", "manifest.json"),
|
|
243
|
-
);
|
|
244
|
-
const partialBoundaryCount = Object.keys(bundleManifest?.partials ?? {}).length;
|
|
245
|
-
|
|
246
|
-
const pageClientMounts = manifestResult.data.routes
|
|
247
|
-
.filter((route) => route.kind === "page")
|
|
248
|
-
.map((route) => {
|
|
249
|
-
const hydration = getRouteHydration(route);
|
|
250
|
-
const needsClientMount = needsHydration(route);
|
|
251
|
-
const clientBoundaryCount = route.boundaries?.length ?? 0;
|
|
252
|
-
const hasRouteLevelClientMount = needsClientMount && !!route.clientModule;
|
|
253
|
-
const warning = needsClientMount && !route.clientModule
|
|
254
|
-
? `Route has hydration strategy '${hydration.strategy}' but no clientModule; build would emit no route bundle.`
|
|
255
|
-
: null;
|
|
256
|
-
|
|
235
|
+
"mandu.pageClientMount.list": async () => {
|
|
236
|
+
// Load manifest
|
|
237
|
+
const manifestResult = await loadManifest(paths.manifestPath);
|
|
238
|
+
if (!manifestResult.success || !manifestResult.data) {
|
|
239
|
+
return { error: manifestResult.errors };
|
|
240
|
+
}
|
|
241
|
+
const bundleManifest = await readJsonFile<BundleManifest>(
|
|
242
|
+
path.join(projectRoot, ".mandu", "manifest.json"),
|
|
243
|
+
);
|
|
244
|
+
const partialBoundaryCount = Object.keys(bundleManifest?.partials ?? {}).length;
|
|
245
|
+
|
|
246
|
+
const pageClientMounts = manifestResult.data.routes
|
|
247
|
+
.filter((route) => route.kind === "page")
|
|
248
|
+
.map((route) => {
|
|
249
|
+
const hydration = getRouteHydration(route);
|
|
250
|
+
const needsClientMount = needsHydration(route);
|
|
251
|
+
const clientBoundaryCount = route.boundaries?.length ?? 0;
|
|
252
|
+
const hasRouteLevelClientMount = needsClientMount && !!route.clientModule;
|
|
253
|
+
const warning = needsClientMount && !route.clientModule
|
|
254
|
+
? `Route has hydration strategy '${hydration.strategy}' but no clientModule; build would emit no route bundle.`
|
|
255
|
+
: null;
|
|
256
|
+
|
|
257
257
|
return {
|
|
258
258
|
routeId: route.id,
|
|
259
|
-
pattern: route.pattern,
|
|
260
|
-
hasClientModule: !!route.clientModule,
|
|
261
|
-
clientModule: route.clientModule || null,
|
|
262
|
-
needsClientMount,
|
|
263
|
-
hasRouteLevelClientMount,
|
|
264
|
-
clientBoundaryCount,
|
|
265
|
-
// Backward compatibility for older agents that read `isIsland`.
|
|
266
|
-
isIsland: needsClientMount,
|
|
267
|
-
status: needsClientMount ? (route.clientModule ? "ready" : "broken") : "static",
|
|
259
|
+
pattern: route.pattern,
|
|
260
|
+
hasClientModule: !!route.clientModule,
|
|
261
|
+
clientModule: route.clientModule || null,
|
|
262
|
+
needsClientMount,
|
|
263
|
+
hasRouteLevelClientMount,
|
|
264
|
+
clientBoundaryCount,
|
|
265
|
+
// Backward compatibility for older agents that read `isIsland`.
|
|
266
|
+
isIsland: needsClientMount,
|
|
267
|
+
status: needsClientMount ? (route.clientModule ? "ready" : "broken") : "static",
|
|
268
268
|
warning,
|
|
269
269
|
hydration: {
|
|
270
270
|
strategy: hydration.strategy,
|
|
@@ -274,38 +274,38 @@ export function hydrationTools(projectRoot: string) {
|
|
|
274
274
|
};
|
|
275
275
|
});
|
|
276
276
|
|
|
277
|
-
const pageClientMountCount = pageClientMounts.filter((i) => i.needsClientMount).length;
|
|
278
|
-
const staticCount = pageClientMounts.filter((i) => !i.needsClientMount).length;
|
|
279
|
-
const activeMounts = pageClientMounts.filter((i) => i.needsClientMount);
|
|
280
|
-
const staticPages = pageClientMounts.filter((i) => !i.needsClientMount);
|
|
281
|
-
const clientBoundaryCount = pageClientMounts.reduce(
|
|
282
|
-
(count, route) => count + route.clientBoundaryCount,
|
|
283
|
-
0,
|
|
284
|
-
);
|
|
285
|
-
|
|
286
|
-
return {
|
|
287
|
-
terminology: {
|
|
288
|
-
pageClientMount:
|
|
289
|
-
"A page route whose whole page is hydrated from a route-level clientModule and route bundle.",
|
|
290
|
-
clientBoundary:
|
|
291
|
-
"A compiler-discovered nested client component marker recorded on RouteSpec.boundaries.",
|
|
292
|
-
partialBoundary:
|
|
293
|
-
"A legacy/runtime partial bundle listed in .mandu/manifest.json partials.",
|
|
294
|
-
island:
|
|
295
|
-
"Legacy umbrella term. Prefer pageClientMount, clientBoundary, or partialBoundary for precise reports.",
|
|
296
|
-
},
|
|
297
|
-
boundarySummary: {
|
|
298
|
-
clientBoundaryCount,
|
|
299
|
-
partialBoundaryCount,
|
|
300
|
-
pageClientMountCount,
|
|
301
|
-
},
|
|
302
|
-
totalPages: pageClientMounts.length,
|
|
303
|
-
pageClientMountCount,
|
|
304
|
-
clientBoundaryCount,
|
|
305
|
-
partialBoundaryCount,
|
|
306
|
-
staticCount,
|
|
307
|
-
pageClientMounts: activeMounts,
|
|
308
|
-
staticPages,
|
|
277
|
+
const pageClientMountCount = pageClientMounts.filter((i) => i.needsClientMount).length;
|
|
278
|
+
const staticCount = pageClientMounts.filter((i) => !i.needsClientMount).length;
|
|
279
|
+
const activeMounts = pageClientMounts.filter((i) => i.needsClientMount);
|
|
280
|
+
const staticPages = pageClientMounts.filter((i) => !i.needsClientMount);
|
|
281
|
+
const clientBoundaryCount = pageClientMounts.reduce(
|
|
282
|
+
(count, route) => count + route.clientBoundaryCount,
|
|
283
|
+
0,
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
return {
|
|
287
|
+
terminology: {
|
|
288
|
+
pageClientMount:
|
|
289
|
+
"A page route whose whole page is hydrated from a route-level clientModule and route bundle.",
|
|
290
|
+
clientBoundary:
|
|
291
|
+
"A compiler-discovered nested client component marker recorded on RouteSpec.boundaries.",
|
|
292
|
+
partialBoundary:
|
|
293
|
+
"A legacy/runtime partial bundle listed in .mandu/manifest.json partials.",
|
|
294
|
+
island:
|
|
295
|
+
"Legacy umbrella term. Prefer pageClientMount, clientBoundary, or partialBoundary for precise reports.",
|
|
296
|
+
},
|
|
297
|
+
boundarySummary: {
|
|
298
|
+
clientBoundaryCount,
|
|
299
|
+
partialBoundaryCount,
|
|
300
|
+
pageClientMountCount,
|
|
301
|
+
},
|
|
302
|
+
totalPages: pageClientMounts.length,
|
|
303
|
+
pageClientMountCount,
|
|
304
|
+
clientBoundaryCount,
|
|
305
|
+
partialBoundaryCount,
|
|
306
|
+
staticCount,
|
|
307
|
+
pageClientMounts: activeMounts,
|
|
308
|
+
staticPages,
|
|
309
309
|
// Backward compatibility for older clients.
|
|
310
310
|
islandCount: pageClientMountCount,
|
|
311
311
|
islands: activeMounts,
|
package/src/tools/index.ts
CHANGED
|
@@ -28,46 +28,14 @@ export { brainTools, brainToolDefinitions } from "./brain.js";
|
|
|
28
28
|
export { runtimeTools, runtimeToolDefinitions } from "./runtime.js";
|
|
29
29
|
export { seoTools, seoToolDefinitions } from "./seo.js";
|
|
30
30
|
export { projectTools, projectToolDefinitions, getDevServerState } from "./project.js";
|
|
31
|
-
export { ateTools, ateToolDefinitions, atePhase5ToolDefinitions, createAtePhase5Handlers } from "./ate.js";
|
|
32
|
-
export { ateContextTools, ateContextToolDefinitions } from "./ate-context.js";
|
|
33
|
-
export { ateRunTools, ateRunToolDefinitions } from "./ate-run.js";
|
|
34
|
-
export { ateFlakesTools, ateFlakesToolDefinitions } from "./ate-flakes.js";
|
|
35
|
-
export { atePromptTools, atePromptToolDefinitions } from "./ate-prompt.js";
|
|
36
|
-
export { ateExemplarTools, ateExemplarToolDefinitions } from "./ate-exemplar.js";
|
|
37
|
-
export { ateSaveTools, ateSaveToolDefinitions } from "./ate-save.js";
|
|
38
|
-
export { ateBoundaryProbeTools, ateBoundaryProbeToolDefinitions } from "./ate-boundary-probe.js";
|
|
39
|
-
export { ateRecallTools, ateRecallToolDefinitions } from "./ate-recall.js";
|
|
40
|
-
export { ateRememberTools, ateRememberToolDefinitions } from "./ate-remember.js";
|
|
41
|
-
export { ateCoverageTools, ateCoverageToolDefinitions } from "./ate-coverage.js";
|
|
42
|
-
// Phase C tool suite
|
|
43
|
-
export { ateMutateTools, ateMutateToolDefinitions } from "./ate-mutate.js";
|
|
44
|
-
export {
|
|
45
|
-
ateMutationReportTools,
|
|
46
|
-
ateMutationReportToolDefinitions,
|
|
47
|
-
} from "./ate-mutation-report.js";
|
|
48
|
-
export {
|
|
49
|
-
ateOraclePendingTools,
|
|
50
|
-
ateOraclePendingToolDefinitions,
|
|
51
|
-
} from "./ate-oracle-pending.js";
|
|
52
|
-
export {
|
|
53
|
-
ateOracleVerdictTools,
|
|
54
|
-
ateOracleVerdictToolDefinitions,
|
|
55
|
-
} from "./ate-oracle-verdict.js";
|
|
56
|
-
export {
|
|
57
|
-
ateOracleReplayTools,
|
|
58
|
-
ateOracleReplayToolDefinitions,
|
|
59
|
-
} from "./ate-oracle-replay.js";
|
|
60
31
|
export { resourceTools, resourceToolDefinitions } from "./resource.js";
|
|
61
32
|
export { componentTools, componentToolDefinitions } from "./component.js";
|
|
62
33
|
export { kitchenTools, kitchenToolDefinitions } from "./kitchen.js";
|
|
63
34
|
export { compositeTools, compositeToolDefinitions } from "./composite.js";
|
|
64
35
|
// Phase 14.3 — AI/agent loop-closure tool suite
|
|
65
36
|
export { runTestsTools, runTestsToolDefinitions } from "./run-tests.js";
|
|
66
|
-
export { deployPreviewTools, deployPreviewToolDefinitions } from "./deploy-preview.js";
|
|
67
|
-
export { deployPlanTools, deployPlanToolDefinitions } from "./deploy-plan.js";
|
|
68
37
|
export { designTools, designToolDefinitions } from "./design.js";
|
|
69
38
|
export { aiBriefTools, aiBriefToolDefinitions } from "./ai-brief.js";
|
|
70
|
-
export { loopCloseTools, loopCloseToolDefinitions } from "./loop-close.js";
|
|
71
39
|
// #243 — docs search/get for agents grounding answers in real framework docs
|
|
72
40
|
export { docsTools, docsToolDefinitions } from "./docs.js";
|
|
73
41
|
// #240 guardrail-default — lint run + setup for existing projects
|
|
@@ -103,48 +71,13 @@ import { brainTools, brainToolDefinitions } from "./brain.js";
|
|
|
103
71
|
import { runtimeTools, runtimeToolDefinitions } from "./runtime.js";
|
|
104
72
|
import { seoTools, seoToolDefinitions } from "./seo.js";
|
|
105
73
|
import { projectTools, projectToolDefinitions } from "./project.js";
|
|
106
|
-
import { ateTools, ateToolDefinitions, atePhase5ToolDefinitions, createAtePhase5Handlers } from "./ate.js";
|
|
107
|
-
import { ateContextTools, ateContextToolDefinitions } from "./ate-context.js";
|
|
108
|
-
import { ateRunTools, ateRunToolDefinitions } from "./ate-run.js";
|
|
109
|
-
import { ateFlakesTools, ateFlakesToolDefinitions } from "./ate-flakes.js";
|
|
110
|
-
import { atePromptTools, atePromptToolDefinitions } from "./ate-prompt.js";
|
|
111
|
-
import { ateExemplarTools, ateExemplarToolDefinitions } from "./ate-exemplar.js";
|
|
112
|
-
import { ateSaveTools, ateSaveToolDefinitions } from "./ate-save.js";
|
|
113
|
-
import {
|
|
114
|
-
ateBoundaryProbeTools,
|
|
115
|
-
ateBoundaryProbeToolDefinitions,
|
|
116
|
-
} from "./ate-boundary-probe.js";
|
|
117
|
-
import { ateRecallTools, ateRecallToolDefinitions } from "./ate-recall.js";
|
|
118
|
-
import { ateRememberTools, ateRememberToolDefinitions } from "./ate-remember.js";
|
|
119
|
-
import { ateCoverageTools, ateCoverageToolDefinitions } from "./ate-coverage.js";
|
|
120
|
-
// Phase C tool suite
|
|
121
|
-
import { ateMutateTools, ateMutateToolDefinitions } from "./ate-mutate.js";
|
|
122
|
-
import {
|
|
123
|
-
ateMutationReportTools,
|
|
124
|
-
ateMutationReportToolDefinitions,
|
|
125
|
-
} from "./ate-mutation-report.js";
|
|
126
|
-
import {
|
|
127
|
-
ateOraclePendingTools,
|
|
128
|
-
ateOraclePendingToolDefinitions,
|
|
129
|
-
} from "./ate-oracle-pending.js";
|
|
130
|
-
import {
|
|
131
|
-
ateOracleVerdictTools,
|
|
132
|
-
ateOracleVerdictToolDefinitions,
|
|
133
|
-
} from "./ate-oracle-verdict.js";
|
|
134
|
-
import {
|
|
135
|
-
ateOracleReplayTools,
|
|
136
|
-
ateOracleReplayToolDefinitions,
|
|
137
|
-
} from "./ate-oracle-replay.js";
|
|
138
74
|
import { resourceTools, resourceToolDefinitions } from "./resource.js";
|
|
139
75
|
import { componentTools, componentToolDefinitions } from "./component.js";
|
|
140
76
|
import { kitchenTools, kitchenToolDefinitions } from "./kitchen.js";
|
|
141
77
|
import { compositeTools, compositeToolDefinitions } from "./composite.js";
|
|
142
78
|
import { runTestsTools, runTestsToolDefinitions } from "./run-tests.js";
|
|
143
|
-
import { deployPreviewTools, deployPreviewToolDefinitions } from "./deploy-preview.js";
|
|
144
|
-
import { deployPlanTools, deployPlanToolDefinitions } from "./deploy-plan.js";
|
|
145
79
|
import { designTools, designToolDefinitions } from "./design.js";
|
|
146
80
|
import { aiBriefTools, aiBriefToolDefinitions } from "./ai-brief.js";
|
|
147
|
-
import { loopCloseTools, loopCloseToolDefinitions } from "./loop-close.js";
|
|
148
81
|
import { docsTools, docsToolDefinitions } from "./docs.js";
|
|
149
82
|
import { lintTools, lintToolDefinitions } from "./lint.js";
|
|
150
83
|
// Phase 18.ι — AI refactor MCP tools
|
|
@@ -207,66 +140,15 @@ export const TOOL_MODULES: ToolModule[] = [
|
|
|
207
140
|
{ category: "runtime", definitions: runtimeToolDefinitions, handlers: runtimeTools },
|
|
208
141
|
{ category: "seo", definitions: seoToolDefinitions, handlers: seoTools },
|
|
209
142
|
{ category: "project", definitions: projectToolDefinitions, handlers: projectTools, requiresServer: true },
|
|
210
|
-
// ate + ate-run accept an optional Server so notifications/progress
|
|
211
|
-
// can flow (issue #238). `acceptsServer: true` forwards the server
|
|
212
|
-
// when available but still registers when it isn't — callers that
|
|
213
|
-
// boot without an MCP transport get progress no-oped silently.
|
|
214
|
-
{ category: "ate", definitions: ateToolDefinitions, handlers: ateTools, acceptsServer: true },
|
|
215
|
-
{ category: "ate-phase5", definitions: atePhase5ToolDefinitions, handlers: createAtePhase5Handlers },
|
|
216
|
-
{ category: "ate-context", definitions: ateContextToolDefinitions, handlers: ateContextTools },
|
|
217
|
-
{ category: "ate-run", definitions: ateRunToolDefinitions, handlers: ateRunTools, acceptsServer: true },
|
|
218
|
-
{ category: "ate-flakes", definitions: ateFlakesToolDefinitions, handlers: ateFlakesTools },
|
|
219
|
-
{ category: "ate-prompt", definitions: atePromptToolDefinitions, handlers: atePromptTools },
|
|
220
|
-
{ category: "ate-exemplar", definitions: ateExemplarToolDefinitions, handlers: ateExemplarTools },
|
|
221
|
-
{ category: "ate-save", definitions: ateSaveToolDefinitions, handlers: ateSaveTools },
|
|
222
|
-
// Phase B tool suite
|
|
223
|
-
{
|
|
224
|
-
category: "ate-boundary-probe",
|
|
225
|
-
definitions: ateBoundaryProbeToolDefinitions,
|
|
226
|
-
handlers: ateBoundaryProbeTools,
|
|
227
|
-
},
|
|
228
|
-
{ category: "ate-recall", definitions: ateRecallToolDefinitions, handlers: ateRecallTools },
|
|
229
|
-
{ category: "ate-remember", definitions: ateRememberToolDefinitions, handlers: ateRememberTools },
|
|
230
|
-
{
|
|
231
|
-
category: "ate-coverage",
|
|
232
|
-
definitions: ateCoverageToolDefinitions,
|
|
233
|
-
handlers: ateCoverageTools,
|
|
234
|
-
},
|
|
235
|
-
// Phase C tool suite
|
|
236
|
-
{ category: "ate-mutate", definitions: ateMutateToolDefinitions, handlers: ateMutateTools },
|
|
237
|
-
{
|
|
238
|
-
category: "ate-mutation-report",
|
|
239
|
-
definitions: ateMutationReportToolDefinitions,
|
|
240
|
-
handlers: ateMutationReportTools,
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
category: "ate-oracle-pending",
|
|
244
|
-
definitions: ateOraclePendingToolDefinitions,
|
|
245
|
-
handlers: ateOraclePendingTools,
|
|
246
|
-
},
|
|
247
|
-
{
|
|
248
|
-
category: "ate-oracle-verdict",
|
|
249
|
-
definitions: ateOracleVerdictToolDefinitions,
|
|
250
|
-
handlers: ateOracleVerdictTools,
|
|
251
|
-
},
|
|
252
|
-
{
|
|
253
|
-
category: "ate-oracle-replay",
|
|
254
|
-
definitions: ateOracleReplayToolDefinitions,
|
|
255
|
-
handlers: ateOracleReplayTools,
|
|
256
|
-
},
|
|
257
143
|
{ category: "resource", definitions: resourceToolDefinitions, handlers: resourceTools },
|
|
258
144
|
{ category: "component", definitions: componentToolDefinitions, handlers: componentTools },
|
|
259
145
|
{ category: "kitchen", definitions: kitchenToolDefinitions, handlers: kitchenTools },
|
|
260
146
|
{ category: "composite", definitions: compositeToolDefinitions, handlers: compositeTools },
|
|
261
147
|
// Phase 14.3 — AI/agent loop-closure suite
|
|
262
148
|
{ category: "run-tests", definitions: runTestsToolDefinitions, handlers: runTestsTools },
|
|
263
|
-
{ category: "deploy-preview", definitions: deployPreviewToolDefinitions, handlers: deployPreviewTools },
|
|
264
|
-
// #250 — DeployIntent inspection / compile (Phase 1)
|
|
265
|
-
{ category: "deploy-plan", definitions: deployPlanToolDefinitions, handlers: deployPlanTools },
|
|
266
149
|
// #245 M4 — Design system discovery (DESIGN.md / Guard / component inventory)
|
|
267
150
|
{ category: "design", definitions: designToolDefinitions, handlers: designTools },
|
|
268
151
|
{ category: "ai-brief", definitions: aiBriefToolDefinitions, handlers: aiBriefTools },
|
|
269
|
-
{ category: "loop-close", definitions: loopCloseToolDefinitions, handlers: loopCloseTools },
|
|
270
152
|
{ category: "docs", definitions: docsToolDefinitions, handlers: docsTools },
|
|
271
153
|
{ category: "lint", definitions: lintToolDefinitions, handlers: lintTools },
|
|
272
154
|
// Phase 18.ι — AI refactor tools (destructive writes; dry-run by default)
|
package/src/tools/kitchen.ts
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Enables any MCP-compatible agent to read client-side errors in real-time.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
-
import { loadManduConfig } from "@mandujs/core";
|
|
9
|
-
import { getDevServerState } from "./project.js";
|
|
10
|
-
import { readRuntimeControl } from "../utils/runtime-control.js";
|
|
7
|
+
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
import { loadManduConfig } from "@mandujs/core";
|
|
9
|
+
import { getDevServerState } from "./project.js";
|
|
10
|
+
import { readRuntimeControl } from "../utils/runtime-control.js";
|
|
11
11
|
|
|
12
12
|
export const kitchenToolDefinitions: Tool[] = [
|
|
13
13
|
{
|
|
@@ -20,18 +20,18 @@ export const kitchenToolDefinitions: Tool[] = [
|
|
|
20
20
|
inputSchema: {
|
|
21
21
|
type: "object",
|
|
22
22
|
properties: {
|
|
23
|
-
clear: {
|
|
24
|
-
type: "boolean",
|
|
25
|
-
description: "Clear errors after reading (default: false)",
|
|
26
|
-
},
|
|
27
|
-
baseURL: {
|
|
28
|
-
type: "string",
|
|
29
|
-
description: "Explicit dev server URL. Overrides runtime-control/config discovery.",
|
|
30
|
-
},
|
|
31
|
-
port: {
|
|
32
|
-
type: "number",
|
|
33
|
-
description: "Explicit dev server port. Overrides runtime-control/config discovery.",
|
|
34
|
-
},
|
|
23
|
+
clear: {
|
|
24
|
+
type: "boolean",
|
|
25
|
+
description: "Clear errors after reading (default: false)",
|
|
26
|
+
},
|
|
27
|
+
baseURL: {
|
|
28
|
+
type: "string",
|
|
29
|
+
description: "Explicit dev server URL. Overrides runtime-control/config discovery.",
|
|
30
|
+
},
|
|
31
|
+
port: {
|
|
32
|
+
type: "number",
|
|
33
|
+
description: "Explicit dev server port. Overrides runtime-control/config discovery.",
|
|
34
|
+
},
|
|
35
35
|
},
|
|
36
36
|
required: [],
|
|
37
37
|
},
|
|
@@ -56,19 +56,19 @@ export const kitchenToolDefinitions: Tool[] = [
|
|
|
56
56
|
description:
|
|
57
57
|
"Include the extended diagnose report. Default true. Set false to lower latency when a11y_hints / package_export_gaps are noisy.",
|
|
58
58
|
},
|
|
59
|
-
includeDiff: {
|
|
60
|
-
type: "boolean",
|
|
61
|
-
description:
|
|
62
|
-
"Include git diff against MANDU_DIFF_BASE (default HEAD). Default true. Set false to skip when git is unavailable.",
|
|
63
|
-
},
|
|
64
|
-
baseURL: {
|
|
65
|
-
type: "string",
|
|
66
|
-
description: "Explicit dev server URL. Overrides runtime-control/config discovery.",
|
|
67
|
-
},
|
|
68
|
-
port: {
|
|
69
|
-
type: "number",
|
|
70
|
-
description: "Explicit dev server port. Overrides runtime-control/config discovery.",
|
|
71
|
-
},
|
|
59
|
+
includeDiff: {
|
|
60
|
+
type: "boolean",
|
|
61
|
+
description:
|
|
62
|
+
"Include git diff against MANDU_DIFF_BASE (default HEAD). Default true. Set false to skip when git is unavailable.",
|
|
63
|
+
},
|
|
64
|
+
baseURL: {
|
|
65
|
+
type: "string",
|
|
66
|
+
description: "Explicit dev server URL. Overrides runtime-control/config discovery.",
|
|
67
|
+
},
|
|
68
|
+
port: {
|
|
69
|
+
type: "number",
|
|
70
|
+
description: "Explicit dev server port. Overrides runtime-control/config discovery.",
|
|
71
|
+
},
|
|
72
72
|
},
|
|
73
73
|
required: [],
|
|
74
74
|
},
|
|
@@ -76,32 +76,32 @@ export const kitchenToolDefinitions: Tool[] = [
|
|
|
76
76
|
];
|
|
77
77
|
|
|
78
78
|
/**
|
|
79
|
-
* Resolve the dev server base URL. Prefers explicit args, then
|
|
80
|
-
* `.mandu/runtime-control.json` from the running dev/start process, then
|
|
81
|
-
* captured stdout, then config/default 3333. Shared by every Kitchen-backed
|
|
82
|
-
* MCP tool so they all agree on where to fetch from.
|
|
79
|
+
* Resolve the dev server base URL. Prefers explicit args, then
|
|
80
|
+
* `.mandu/runtime-control.json` from the running dev/start process, then
|
|
81
|
+
* captured stdout, then config/default 3333. Shared by every Kitchen-backed
|
|
82
|
+
* MCP tool so they all agree on where to fetch from.
|
|
83
83
|
*/
|
|
84
|
-
async function resolveDevServerBaseUrl(
|
|
85
|
-
projectRoot: string,
|
|
86
|
-
args: { baseURL?: unknown; port?: unknown } = {},
|
|
87
|
-
): Promise<string> {
|
|
88
|
-
if (typeof args.baseURL === "string" && args.baseURL.trim()) {
|
|
89
|
-
return args.baseURL.trim().replace(/\/+$/, "");
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const explicitPort = normalizePort(args.port);
|
|
93
|
-
if (explicitPort) {
|
|
94
|
-
return `http://localhost:${explicitPort}`;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const control = await readRuntimeControl(projectRoot);
|
|
98
|
-
if (control?.baseUrl) {
|
|
99
|
-
return control.baseUrl.replace(/\/+$/, "");
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
let port: number | undefined;
|
|
103
|
-
|
|
104
|
-
const serverState = getDevServerState();
|
|
84
|
+
async function resolveDevServerBaseUrl(
|
|
85
|
+
projectRoot: string,
|
|
86
|
+
args: { baseURL?: unknown; port?: unknown } = {},
|
|
87
|
+
): Promise<string> {
|
|
88
|
+
if (typeof args.baseURL === "string" && args.baseURL.trim()) {
|
|
89
|
+
return args.baseURL.trim().replace(/\/+$/, "");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const explicitPort = normalizePort(args.port);
|
|
93
|
+
if (explicitPort) {
|
|
94
|
+
return `http://localhost:${explicitPort}`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const control = await readRuntimeControl(projectRoot);
|
|
98
|
+
if (control?.baseUrl) {
|
|
99
|
+
return control.baseUrl.replace(/\/+$/, "");
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let port: number | undefined;
|
|
103
|
+
|
|
104
|
+
const serverState = getDevServerState();
|
|
105
105
|
if (serverState) {
|
|
106
106
|
for (const line of serverState.output) {
|
|
107
107
|
const portMatch = line.match(/https?:\/\/localhost:(\d+)/);
|
|
@@ -115,21 +115,21 @@ async function resolveDevServerBaseUrl(
|
|
|
115
115
|
const config = await loadManduConfig(projectRoot);
|
|
116
116
|
port = config.server?.port ?? 3333;
|
|
117
117
|
}
|
|
118
|
-
|
|
119
|
-
return `http://localhost:${port}`;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function normalizePort(value: unknown): number | undefined {
|
|
123
|
-
const raw = typeof value === "number" ? value : typeof value === "string" ? Number.parseInt(value, 10) : NaN;
|
|
124
|
-
if (!Number.isInteger(raw) || raw < 1 || raw > 65535) return undefined;
|
|
125
|
-
return raw;
|
|
126
|
-
}
|
|
118
|
+
|
|
119
|
+
return `http://localhost:${port}`;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function normalizePort(value: unknown): number | undefined {
|
|
123
|
+
const raw = typeof value === "number" ? value : typeof value === "string" ? Number.parseInt(value, 10) : NaN;
|
|
124
|
+
if (!Number.isInteger(raw) || raw < 1 || raw > 65535) return undefined;
|
|
125
|
+
return raw;
|
|
126
|
+
}
|
|
127
127
|
|
|
128
128
|
export function kitchenTools(projectRoot: string) {
|
|
129
129
|
const handlers: Record<string, (args: Record<string, unknown>) => Promise<unknown>> = {
|
|
130
|
-
"mandu.kitchen.errors": async (args: Record<string, unknown>) => {
|
|
131
|
-
const { clear = false } = args as { clear?: boolean };
|
|
132
|
-
const baseUrl = await resolveDevServerBaseUrl(projectRoot, args);
|
|
130
|
+
"mandu.kitchen.errors": async (args: Record<string, unknown>) => {
|
|
131
|
+
const { clear = false } = args as { clear?: boolean };
|
|
132
|
+
const baseUrl = await resolveDevServerBaseUrl(projectRoot, args);
|
|
133
133
|
|
|
134
134
|
try {
|
|
135
135
|
// Fetch errors from Kitchen API
|
|
@@ -185,12 +185,12 @@ export function kitchenTools(projectRoot: string) {
|
|
|
185
185
|
*/
|
|
186
186
|
"mandu.devtools.context": async (args: Record<string, unknown>) => {
|
|
187
187
|
const {
|
|
188
|
-
includeBundle = true,
|
|
189
|
-
includeDiagnose = true,
|
|
190
|
-
includeDiff = true,
|
|
191
|
-
} = args as { includeBundle?: boolean; includeDiagnose?: boolean; includeDiff?: boolean };
|
|
192
|
-
|
|
193
|
-
const baseUrl = await resolveDevServerBaseUrl(projectRoot, args);
|
|
188
|
+
includeBundle = true,
|
|
189
|
+
includeDiagnose = true,
|
|
190
|
+
includeDiff = true,
|
|
191
|
+
} = args as { includeBundle?: boolean; includeDiagnose?: boolean; includeDiff?: boolean };
|
|
192
|
+
|
|
193
|
+
const baseUrl = await resolveDevServerBaseUrl(projectRoot, args);
|
|
194
194
|
const params = new URLSearchParams();
|
|
195
195
|
if (!includeBundle) params.set("bundle", "0");
|
|
196
196
|
if (!includeDiagnose) params.set("diagnose", "0");
|