@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.
Files changed (183) hide show
  1. package/README.md +3 -3
  2. package/package.json +3 -5
  3. package/src/activity-adapter.ts +23 -23
  4. package/src/activity-monitor.ts +39 -10
  5. package/src/adapters/index.ts +20 -20
  6. package/src/adapters/monitor-adapter.ts +100 -100
  7. package/src/adapters/tool-adapter.ts +90 -90
  8. package/src/executor/index.ts +22 -22
  9. package/src/executor/tool-executor.ts +148 -148
  10. package/src/hooks/config-watcher.ts +173 -173
  11. package/src/hooks/index.ts +23 -23
  12. package/src/hooks/mcp-hooks.ts +227 -227
  13. package/src/index.ts +5 -5
  14. package/src/logging/index.ts +15 -15
  15. package/src/logging/mcp-transport.ts +134 -134
  16. package/src/new-resources.ts +2 -2
  17. package/src/profiles.ts +25 -54
  18. package/src/prompts.ts +4 -4
  19. package/src/registry/index.ts +13 -13
  20. package/src/registry/mcp-tool-registry.ts +298 -298
  21. package/src/resources/generated-skills/catalog.ts +36 -0
  22. package/src/resources/generated-skills/mandu-agent-workflow/SKILL.md +48 -0
  23. package/src/resources/generated-skills/mandu-contract/SKILL.md +20 -0
  24. package/src/resources/generated-skills/mandu-fs-routes/SKILL.md +19 -0
  25. package/src/resources/generated-skills/mandu-guard/SKILL.md +20 -0
  26. package/src/resources/generated-skills/mandu-hydration/SKILL.md +19 -0
  27. package/src/resources/generated-skills/mandu-testing/SKILL.md +20 -0
  28. package/src/resources/handlers.ts +3 -3
  29. package/src/resources/skills/guides.ts +49 -49
  30. package/src/resources/skills/index.ts +12 -12
  31. package/src/resources/skills/loader.ts +8 -35
  32. package/src/resources/skills/recipes.ts +28 -28
  33. package/src/server.ts +1 -1
  34. package/src/tools/agent.ts +479 -409
  35. package/src/tools/ate-exemplar.ts +92 -92
  36. package/src/tools/ate-flakes.ts +90 -90
  37. package/src/tools/ate-mutate.ts +103 -103
  38. package/src/tools/ate-mutation-report.ts +64 -64
  39. package/src/tools/ate-oracle-pending.ts +49 -49
  40. package/src/tools/ate-oracle-replay.ts +44 -44
  41. package/src/tools/ate-oracle-verdict.ts +70 -70
  42. package/src/tools/ate-prompt.ts +146 -146
  43. package/src/tools/ate-run.ts +1 -1
  44. package/src/tools/ate.ts +38 -38
  45. package/src/tools/brain.ts +6 -6
  46. package/src/tools/composite.ts +19 -61
  47. package/src/tools/contract.ts +11 -9
  48. package/src/tools/deploy-plan.ts +2 -2
  49. package/src/tools/deploy-preview.ts +316 -316
  50. package/src/tools/design.ts +825 -825
  51. package/src/tools/docs.ts +350 -350
  52. package/src/tools/generate.ts +4 -3
  53. package/src/tools/guard.ts +1 -1
  54. package/src/tools/history.ts +1 -1
  55. package/src/tools/hydration.ts +64 -64
  56. package/src/tools/index.ts +0 -118
  57. package/src/tools/kitchen.ts +72 -72
  58. package/src/tools/lint.ts +226 -226
  59. package/src/tools/loop-close.ts +175 -175
  60. package/src/tools/negotiate.ts +263 -263
  61. package/src/tools/resource.ts +1 -1
  62. package/src/tools/run-tests.ts +424 -424
  63. package/src/tools/runtime.ts +1 -1
  64. package/src/tools/seo.ts +1 -1
  65. package/src/tools/slot-validation.ts +19 -19
  66. package/src/tools/spec.ts +201 -201
  67. package/src/tools/transaction.ts +1 -1
  68. package/src/tx-lock.ts +73 -73
  69. package/src/utils/runtime-control.ts +52 -52
  70. package/src/utils/withWarnings.ts +1 -1
  71. package/src/resources/skills/mandu-agent-workflow/SKILL.md +0 -124
  72. package/src/resources/skills/mandu-agent-workflow/metadata.json +0 -7
  73. package/src/resources/skills/mandu-composition/SKILL.md +0 -131
  74. package/src/resources/skills/mandu-composition/metadata.json +0 -13
  75. package/src/resources/skills/mandu-composition/rules/_sections.md +0 -26
  76. package/src/resources/skills/mandu-composition/rules/_template.md +0 -77
  77. package/src/resources/skills/mandu-composition/rules/comp-arch-avoid-boolean-props.md +0 -146
  78. package/src/resources/skills/mandu-composition/rules/comp-arch-compound-components.md +0 -164
  79. package/src/resources/skills/mandu-composition/rules/comp-island-event.md +0 -161
  80. package/src/resources/skills/mandu-composition/rules/comp-island-slot-split.md +0 -167
  81. package/src/resources/skills/mandu-composition/rules/comp-pattern-children.md +0 -149
  82. package/src/resources/skills/mandu-composition/rules/comp-state-context-interface.md +0 -148
  83. package/src/resources/skills/mandu-composition/rules/comp-state-lift-state.md +0 -150
  84. package/src/resources/skills/mandu-deployment/SKILL.md +0 -135
  85. package/src/resources/skills/mandu-deployment/_sections.md +0 -41
  86. package/src/resources/skills/mandu-deployment/_template.md +0 -38
  87. package/src/resources/skills/mandu-deployment/metadata.json +0 -13
  88. package/src/resources/skills/mandu-deployment/rules/db-provider-supabase.md +0 -300
  89. package/src/resources/skills/mandu-deployment/rules/deploy-build-bun.md +0 -109
  90. package/src/resources/skills/mandu-deployment/rules/deploy-build-output.md +0 -115
  91. package/src/resources/skills/mandu-deployment/rules/deploy-cicd-github.md +0 -219
  92. package/src/resources/skills/mandu-deployment/rules/deploy-docker-bun.md +0 -150
  93. package/src/resources/skills/mandu-deployment/rules/deploy-docker-compose.md +0 -223
  94. package/src/resources/skills/mandu-deployment/rules/deploy-platform-fly.md +0 -152
  95. package/src/resources/skills/mandu-deployment/rules/deploy-platform-render.md +0 -179
  96. package/src/resources/skills/mandu-deployment/rules/deploy-platform-vercel.md +0 -140
  97. package/src/resources/skills/mandu-fs-routes/SKILL.md +0 -122
  98. package/src/resources/skills/mandu-fs-routes/metadata.json +0 -12
  99. package/src/resources/skills/mandu-fs-routes/rules/_sections.md +0 -36
  100. package/src/resources/skills/mandu-fs-routes/rules/_template.md +0 -69
  101. package/src/resources/skills/mandu-fs-routes/rules/routes-api-methods.md +0 -65
  102. package/src/resources/skills/mandu-fs-routes/rules/routes-dynamic-param.md +0 -93
  103. package/src/resources/skills/mandu-fs-routes/rules/routes-naming-page.md +0 -55
  104. package/src/resources/skills/mandu-guard/SKILL.md +0 -162
  105. package/src/resources/skills/mandu-guard/metadata.json +0 -12
  106. package/src/resources/skills/mandu-guard/rules/_sections.md +0 -36
  107. package/src/resources/skills/mandu-guard/rules/_template.md +0 -82
  108. package/src/resources/skills/mandu-guard/rules/guard-config-rules.md +0 -100
  109. package/src/resources/skills/mandu-guard/rules/guard-layer-direction.md +0 -76
  110. package/src/resources/skills/mandu-guard/rules/guard-preset-mandu.md +0 -81
  111. package/src/resources/skills/mandu-guard/rules/guard-validate-import.md +0 -80
  112. package/src/resources/skills/mandu-hydration/SKILL.md +0 -139
  113. package/src/resources/skills/mandu-hydration/metadata.json +0 -12
  114. package/src/resources/skills/mandu-hydration/rules/_sections.md +0 -31
  115. package/src/resources/skills/mandu-hydration/rules/_template.md +0 -72
  116. package/src/resources/skills/mandu-hydration/rules/hydration-data-event.md +0 -109
  117. package/src/resources/skills/mandu-hydration/rules/hydration-directive-use-client.md +0 -55
  118. package/src/resources/skills/mandu-hydration/rules/hydration-island-setup.md +0 -160
  119. package/src/resources/skills/mandu-hydration/rules/hydration-priority-visible.md +0 -91
  120. package/src/resources/skills/mandu-performance/SKILL.md +0 -125
  121. package/src/resources/skills/mandu-performance/metadata.json +0 -14
  122. package/src/resources/skills/mandu-performance/rules/_sections.md +0 -31
  123. package/src/resources/skills/mandu-performance/rules/_template.md +0 -64
  124. package/src/resources/skills/mandu-performance/rules/perf-async-defer-await.md +0 -103
  125. package/src/resources/skills/mandu-performance/rules/perf-async-parallel.md +0 -95
  126. package/src/resources/skills/mandu-performance/rules/perf-bun-file.md +0 -124
  127. package/src/resources/skills/mandu-performance/rules/perf-bun-serve.md +0 -125
  128. package/src/resources/skills/mandu-performance/rules/perf-bundle-imports.md +0 -80
  129. package/src/resources/skills/mandu-performance/rules/perf-bundle-island-lazy.md +0 -145
  130. package/src/resources/skills/mandu-performance/rules/perf-cache-react.md +0 -98
  131. package/src/resources/skills/mandu-performance/rules/perf-render-transitions.md +0 -154
  132. package/src/resources/skills/mandu-security/SKILL.md +0 -127
  133. package/src/resources/skills/mandu-security/metadata.json +0 -13
  134. package/src/resources/skills/mandu-security/rules/_sections.md +0 -31
  135. package/src/resources/skills/mandu-security/rules/_template.md +0 -74
  136. package/src/resources/skills/mandu-security/rules/sec-auth-guard.md +0 -127
  137. package/src/resources/skills/mandu-security/rules/sec-env-management.md +0 -133
  138. package/src/resources/skills/mandu-security/rules/sec-input-validate.md +0 -148
  139. package/src/resources/skills/mandu-security/rules/sec-protect-csrf.md +0 -146
  140. package/src/resources/skills/mandu-security/rules/sec-protect-headers.md +0 -138
  141. package/src/resources/skills/mandu-slot/SKILL.md +0 -125
  142. package/src/resources/skills/mandu-slot/metadata.json +0 -12
  143. package/src/resources/skills/mandu-slot/rules/_sections.md +0 -36
  144. package/src/resources/skills/mandu-slot/rules/_template.md +0 -63
  145. package/src/resources/skills/mandu-slot/rules/slot-basic-structure.md +0 -38
  146. package/src/resources/skills/mandu-slot/rules/slot-ctx-response.md +0 -56
  147. package/src/resources/skills/mandu-slot/rules/slot-guard-auth.md +0 -59
  148. package/src/resources/skills/mandu-slot/rules/slot-http-methods.md +0 -64
  149. package/src/resources/skills/mandu-styling/SKILL.md +0 -196
  150. package/src/resources/skills/mandu-styling/_sections.md +0 -43
  151. package/src/resources/skills/mandu-styling/_template.md +0 -32
  152. package/src/resources/skills/mandu-styling/metadata.json +0 -15
  153. package/src/resources/skills/mandu-styling/rules/style-component-compound.md +0 -235
  154. package/src/resources/skills/mandu-styling/rules/style-component-slots.md +0 -255
  155. package/src/resources/skills/mandu-styling/rules/style-component-tokens.md +0 -205
  156. package/src/resources/skills/mandu-styling/rules/style-island-animations.md +0 -272
  157. package/src/resources/skills/mandu-styling/rules/style-island-scoping.md +0 -167
  158. package/src/resources/skills/mandu-styling/rules/style-island-variants.md +0 -221
  159. package/src/resources/skills/mandu-styling/rules/style-perf-critical.md +0 -209
  160. package/src/resources/skills/mandu-styling/rules/style-perf-purge.md +0 -192
  161. package/src/resources/skills/mandu-styling/rules/style-setup-modules.md +0 -162
  162. package/src/resources/skills/mandu-styling/rules/style-setup-panda.md +0 -164
  163. package/src/resources/skills/mandu-styling/rules/style-setup-tailwind.md +0 -170
  164. package/src/resources/skills/mandu-styling/rules/style-tailwind-v4-gotchas.md +0 -179
  165. package/src/resources/skills/mandu-styling/rules/style-theme-darkmode.md +0 -229
  166. package/src/resources/skills/mandu-testing/SKILL.md +0 -132
  167. package/src/resources/skills/mandu-testing/metadata.json +0 -13
  168. package/src/resources/skills/mandu-testing/rules/_sections.md +0 -26
  169. package/src/resources/skills/mandu-testing/rules/_template.md +0 -65
  170. package/src/resources/skills/mandu-testing/rules/test-component-island.md +0 -195
  171. package/src/resources/skills/mandu-testing/rules/test-e2e-playwright.md +0 -196
  172. package/src/resources/skills/mandu-testing/rules/test-mock-fetch.md +0 -219
  173. package/src/resources/skills/mandu-testing/rules/test-slot-unit.md +0 -192
  174. package/src/resources/skills/mandu-ui/SKILL.md +0 -159
  175. package/src/resources/skills/mandu-ui/_sections.md +0 -23
  176. package/src/resources/skills/mandu-ui/_template.md +0 -32
  177. package/src/resources/skills/mandu-ui/metadata.json +0 -13
  178. package/src/resources/skills/mandu-ui/rules/ui-accessibility-aria.md +0 -232
  179. package/src/resources/skills/mandu-ui/rules/ui-accessibility-focus.md +0 -238
  180. package/src/resources/skills/mandu-ui/rules/ui-composition-patterns.md +0 -259
  181. package/src/resources/skills/mandu-ui/rules/ui-island-integration.md +0 -258
  182. package/src/resources/skills/mandu-ui/rules/ui-radix-patterns.md +0 -213
  183. package/src/resources/skills/mandu-ui/rules/ui-shadcn-setup.md +0 -209
@@ -1,7 +1,8 @@
1
1
  import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
- import { generateManifest, loadManifest, parseResourceSchema, generateResourceArtifacts } from "@mandujs/core";
3
- import { generateRoutes, type GeneratedMap } from "@mandujs/core/generator";
4
- import { GENERATED_RELATIVE_PATHS } from "@mandujs/core/paths";
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";
@@ -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";
@@ -4,7 +4,7 @@ import {
4
4
  pruneHistory,
5
5
  getChangeStats,
6
6
  readSnapshotById,
7
- } from "@mandujs/core/change";
7
+ } from "@mandujs/core/compat/change/index";
8
8
 
9
9
  export const historyToolDefinitions: Tool[] = [
10
10
  {
@@ -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,
@@ -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)
@@ -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");