@mandujs/mcp 0.12.2 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +367 -367
  2. package/package.json +2 -2
  3. package/src/activity-monitor.ts +847 -847
  4. package/src/adapters/index.ts +20 -20
  5. package/src/adapters/monitor-adapter.ts +100 -100
  6. package/src/adapters/tool-adapter.ts +88 -88
  7. package/src/executor/error-handler.ts +250 -250
  8. package/src/executor/index.ts +22 -22
  9. package/src/executor/tool-executor.ts +148 -148
  10. package/src/hooks/config-watcher.ts +174 -174
  11. package/src/hooks/index.ts +23 -23
  12. package/src/hooks/mcp-hooks.ts +227 -227
  13. package/src/index.ts +106 -106
  14. package/src/logging/index.ts +15 -15
  15. package/src/logging/mcp-transport.ts +134 -134
  16. package/src/registry/index.ts +13 -13
  17. package/src/registry/mcp-tool-registry.ts +298 -298
  18. package/src/resources/skills/guides.ts +1136 -1136
  19. package/src/resources/skills/index.ts +12 -12
  20. package/src/resources/skills/loader.ts +218 -218
  21. package/src/resources/skills/mandu-composition/SKILL.md +91 -91
  22. package/src/resources/skills/mandu-composition/metadata.json +13 -13
  23. package/src/resources/skills/mandu-composition/rules/_sections.md +26 -26
  24. package/src/resources/skills/mandu-composition/rules/_template.md +77 -77
  25. package/src/resources/skills/mandu-composition/rules/comp-arch-avoid-boolean-props.md +146 -146
  26. package/src/resources/skills/mandu-composition/rules/comp-arch-compound-components.md +164 -164
  27. package/src/resources/skills/mandu-composition/rules/comp-island-event.md +161 -161
  28. package/src/resources/skills/mandu-composition/rules/comp-island-slot-split.md +167 -167
  29. package/src/resources/skills/mandu-composition/rules/comp-pattern-children.md +149 -149
  30. package/src/resources/skills/mandu-composition/rules/comp-state-context-interface.md +148 -148
  31. package/src/resources/skills/mandu-composition/rules/comp-state-lift-state.md +150 -150
  32. package/src/resources/skills/mandu-deployment/SKILL.md +92 -92
  33. package/src/resources/skills/mandu-deployment/_sections.md +41 -41
  34. package/src/resources/skills/mandu-deployment/_template.md +38 -38
  35. package/src/resources/skills/mandu-deployment/metadata.json +13 -13
  36. package/src/resources/skills/mandu-deployment/rules/deploy-build-bun.md +109 -109
  37. package/src/resources/skills/mandu-deployment/rules/deploy-build-output.md +115 -115
  38. package/src/resources/skills/mandu-deployment/rules/deploy-cicd-github.md +219 -219
  39. package/src/resources/skills/mandu-deployment/rules/deploy-docker-bun.md +150 -150
  40. package/src/resources/skills/mandu-deployment/rules/deploy-docker-compose.md +223 -223
  41. package/src/resources/skills/mandu-deployment/rules/deploy-platform-fly.md +152 -152
  42. package/src/resources/skills/mandu-deployment/rules/deploy-platform-render.md +179 -179
  43. package/src/resources/skills/mandu-deployment/rules/deploy-platform-supabase.md +323 -323
  44. package/src/resources/skills/mandu-deployment/rules/deploy-platform-vercel.md +140 -140
  45. package/src/resources/skills/mandu-fs-routes/SKILL.md +82 -82
  46. package/src/resources/skills/mandu-fs-routes/metadata.json +12 -12
  47. package/src/resources/skills/mandu-fs-routes/rules/_sections.md +36 -36
  48. package/src/resources/skills/mandu-fs-routes/rules/_template.md +69 -69
  49. package/src/resources/skills/mandu-fs-routes/rules/routes-api-methods.md +65 -65
  50. package/src/resources/skills/mandu-fs-routes/rules/routes-dynamic-param.md +93 -93
  51. package/src/resources/skills/mandu-fs-routes/rules/routes-naming-page.md +55 -55
  52. package/src/resources/skills/mandu-guard/SKILL.md +129 -129
  53. package/src/resources/skills/mandu-guard/metadata.json +12 -12
  54. package/src/resources/skills/mandu-guard/rules/_sections.md +36 -36
  55. package/src/resources/skills/mandu-guard/rules/_template.md +82 -82
  56. package/src/resources/skills/mandu-guard/rules/guard-config-rules.md +100 -100
  57. package/src/resources/skills/mandu-guard/rules/guard-layer-direction.md +76 -76
  58. package/src/resources/skills/mandu-guard/rules/guard-preset-mandu.md +81 -81
  59. package/src/resources/skills/mandu-guard/rules/guard-validate-import.md +80 -80
  60. package/src/resources/skills/mandu-hydration/SKILL.md +91 -91
  61. package/src/resources/skills/mandu-hydration/metadata.json +12 -12
  62. package/src/resources/skills/mandu-hydration/rules/_sections.md +31 -31
  63. package/src/resources/skills/mandu-hydration/rules/_template.md +72 -72
  64. package/src/resources/skills/mandu-hydration/rules/hydration-data-event.md +109 -109
  65. package/src/resources/skills/mandu-hydration/rules/hydration-directive-use-client.md +55 -55
  66. package/src/resources/skills/mandu-hydration/rules/hydration-island-setup.md +113 -113
  67. package/src/resources/skills/mandu-hydration/rules/hydration-priority-visible.md +68 -68
  68. package/src/resources/skills/mandu-performance/SKILL.md +85 -85
  69. package/src/resources/skills/mandu-performance/metadata.json +14 -14
  70. package/src/resources/skills/mandu-performance/rules/_sections.md +31 -31
  71. package/src/resources/skills/mandu-performance/rules/_template.md +64 -64
  72. package/src/resources/skills/mandu-performance/rules/perf-async-defer-await.md +103 -103
  73. package/src/resources/skills/mandu-performance/rules/perf-async-parallel.md +95 -95
  74. package/src/resources/skills/mandu-performance/rules/perf-bun-file.md +124 -124
  75. package/src/resources/skills/mandu-performance/rules/perf-bun-serve.md +125 -125
  76. package/src/resources/skills/mandu-performance/rules/perf-bundle-imports.md +80 -80
  77. package/src/resources/skills/mandu-performance/rules/perf-bundle-island-lazy.md +145 -145
  78. package/src/resources/skills/mandu-performance/rules/perf-cache-react.md +98 -98
  79. package/src/resources/skills/mandu-performance/rules/perf-render-transitions.md +154 -154
  80. package/src/resources/skills/mandu-security/SKILL.md +87 -87
  81. package/src/resources/skills/mandu-security/metadata.json +13 -13
  82. package/src/resources/skills/mandu-security/rules/_sections.md +31 -31
  83. package/src/resources/skills/mandu-security/rules/_template.md +74 -74
  84. package/src/resources/skills/mandu-security/rules/sec-auth-guard.md +127 -127
  85. package/src/resources/skills/mandu-security/rules/sec-env-management.md +133 -133
  86. package/src/resources/skills/mandu-security/rules/sec-input-validate.md +148 -148
  87. package/src/resources/skills/mandu-security/rules/sec-protect-csrf.md +146 -146
  88. package/src/resources/skills/mandu-security/rules/sec-protect-headers.md +138 -138
  89. package/src/resources/skills/mandu-slot/SKILL.md +85 -85
  90. package/src/resources/skills/mandu-slot/metadata.json +12 -12
  91. package/src/resources/skills/mandu-slot/rules/_sections.md +36 -36
  92. package/src/resources/skills/mandu-slot/rules/_template.md +63 -63
  93. package/src/resources/skills/mandu-slot/rules/slot-basic-structure.md +38 -38
  94. package/src/resources/skills/mandu-slot/rules/slot-ctx-response.md +56 -56
  95. package/src/resources/skills/mandu-slot/rules/slot-guard-auth.md +59 -59
  96. package/src/resources/skills/mandu-slot/rules/slot-http-methods.md +64 -64
  97. package/src/resources/skills/mandu-styling/SKILL.md +154 -154
  98. package/src/resources/skills/mandu-styling/_sections.md +43 -43
  99. package/src/resources/skills/mandu-styling/_template.md +32 -32
  100. package/src/resources/skills/mandu-styling/metadata.json +15 -15
  101. package/src/resources/skills/mandu-styling/rules/style-component-compound.md +235 -235
  102. package/src/resources/skills/mandu-styling/rules/style-component-slots.md +255 -255
  103. package/src/resources/skills/mandu-styling/rules/style-component-tokens.md +205 -205
  104. package/src/resources/skills/mandu-styling/rules/style-island-animations.md +272 -272
  105. package/src/resources/skills/mandu-styling/rules/style-island-scoping.md +167 -167
  106. package/src/resources/skills/mandu-styling/rules/style-island-variants.md +221 -221
  107. package/src/resources/skills/mandu-styling/rules/style-perf-critical.md +209 -209
  108. package/src/resources/skills/mandu-styling/rules/style-perf-purge.md +192 -192
  109. package/src/resources/skills/mandu-styling/rules/style-setup-modules.md +162 -162
  110. package/src/resources/skills/mandu-styling/rules/style-setup-panda.md +164 -164
  111. package/src/resources/skills/mandu-styling/rules/style-setup-tailwind.md +170 -170
  112. package/src/resources/skills/mandu-styling/rules/style-tailwind-v4-gotchas.md +179 -179
  113. package/src/resources/skills/mandu-styling/rules/style-theme-darkmode.md +229 -229
  114. package/src/resources/skills/mandu-testing/SKILL.md +99 -99
  115. package/src/resources/skills/mandu-testing/metadata.json +13 -13
  116. package/src/resources/skills/mandu-testing/rules/_sections.md +26 -26
  117. package/src/resources/skills/mandu-testing/rules/_template.md +65 -65
  118. package/src/resources/skills/mandu-testing/rules/test-component-island.md +195 -195
  119. package/src/resources/skills/mandu-testing/rules/test-e2e-playwright.md +196 -196
  120. package/src/resources/skills/mandu-testing/rules/test-mock-fetch.md +219 -219
  121. package/src/resources/skills/mandu-testing/rules/test-slot-unit.md +192 -192
  122. package/src/resources/skills/mandu-ui/SKILL.md +117 -117
  123. package/src/resources/skills/mandu-ui/_sections.md +23 -23
  124. package/src/resources/skills/mandu-ui/_template.md +32 -32
  125. package/src/resources/skills/mandu-ui/metadata.json +13 -13
  126. package/src/resources/skills/mandu-ui/rules/ui-accessibility-aria.md +232 -232
  127. package/src/resources/skills/mandu-ui/rules/ui-accessibility-focus.md +238 -238
  128. package/src/resources/skills/mandu-ui/rules/ui-composition-patterns.md +259 -259
  129. package/src/resources/skills/mandu-ui/rules/ui-island-integration.md +258 -258
  130. package/src/resources/skills/mandu-ui/rules/ui-radix-patterns.md +213 -213
  131. package/src/resources/skills/mandu-ui/rules/ui-shadcn-setup.md +209 -209
  132. package/src/resources/skills/recipes.ts +932 -932
  133. package/src/tools/generate.ts +7 -4
  134. package/src/tools/guard.ts +17 -4
  135. package/src/tools/hydration.ts +10 -10
  136. package/src/tools/project.ts +334 -334
  137. package/src/tools/runtime.ts +497 -497
  138. package/src/tools/seo.ts +417 -417
  139. package/src/tools/spec.ts +80 -159
  140. package/src/utils/project.ts +22 -12
  141. package/src/utils/withWarnings.ts +83 -83
@@ -1,5 +1,5 @@
1
1
  import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
- import { loadManifest, generateRoutes, type GeneratedMap } from "@mandujs/core";
2
+ import { loadManifest, generateRoutes, generateManifest, GENERATED_RELATIVE_PATHS, type GeneratedMap } from "@mandujs/core";
3
3
  import { getProjectPaths, readJsonFile } from "../utils/project.js";
4
4
 
5
5
  export const generateToolDefinitions: Tool[] = [
@@ -36,7 +36,10 @@ export function generateTools(projectRoot: string) {
36
36
  mandu_generate: async (args: Record<string, unknown>) => {
37
37
  const { dryRun } = args as { dryRun?: boolean };
38
38
 
39
- // Load manifest
39
+ // Regenerate manifest from FS Routes first
40
+ const fsResult = await generateManifest(projectRoot);
41
+
42
+ // Load the freshly generated manifest
40
43
  const manifestResult = await loadManifest(paths.manifestPath);
41
44
  if (!manifestResult.success || !manifestResult.data) {
42
45
  return { error: manifestResult.errors };
@@ -50,11 +53,11 @@ export function generateTools(projectRoot: string) {
50
53
 
51
54
  for (const route of routes) {
52
55
  // Server handler
53
- wouldCreate.push(`apps/server/generated/routes/${route.id}.route.ts`);
56
+ wouldCreate.push(`${GENERATED_RELATIVE_PATHS.serverRoutes}/${route.id}.route.ts`);
54
57
 
55
58
  // Page component (for page kind)
56
59
  if (route.kind === "page") {
57
- wouldCreate.push(`apps/web/generated/routes/${route.id}.route.tsx`);
60
+ wouldCreate.push(`${GENERATED_RELATIVE_PATHS.webRoutes}/${route.id}.route.tsx`);
58
61
  }
59
62
 
60
63
  // Slot file (only if not exists)
@@ -303,6 +303,11 @@ export const guardToolDefinitions: Tool[] = [
303
303
  enum: ["auth", "crud", "api", "ui", "integration", "data", "util", "config", "other"],
304
304
  description: "Feature category (auto-detected if not specified)",
305
305
  },
306
+ preset: {
307
+ type: "string",
308
+ enum: ["fsd", "clean", "hexagonal", "atomic", "cqrs", "mandu"],
309
+ description: "Architecture preset (default: mandu). Use 'cqrs' for Command/Query separation.",
310
+ },
306
311
  },
307
312
  required: ["intent"],
308
313
  },
@@ -332,6 +337,11 @@ export const guardToolDefinitions: Tool[] = [
332
337
  type: "boolean",
333
338
  description: "If true, overwrite existing files (default: false)",
334
339
  },
340
+ preset: {
341
+ type: "string",
342
+ enum: ["fsd", "clean", "hexagonal", "atomic", "cqrs", "mandu"],
343
+ description: "Architecture preset (default: mandu)",
344
+ },
335
345
  },
336
346
  required: ["intent"],
337
347
  },
@@ -437,7 +447,7 @@ export function guardTools(projectRoot: string) {
437
447
  switch (error.errorType) {
438
448
  case "SPEC_ERROR":
439
449
  analysis.category = "Specification Error";
440
- analysis.fixLocation = error.fix?.file || "spec/routes.manifest.json";
450
+ analysis.fixLocation = error.fix?.file || ".mandu/routes.manifest.json";
441
451
  analysis.actions = [
442
452
  "Check the spec file for JSON syntax errors",
443
453
  "Validate route IDs are unique",
@@ -966,11 +976,12 @@ Mandu.filling()
966
976
  // ═══════════════════════════════════════════════════════════════════════════
967
977
 
968
978
  mandu_negotiate: async (args: Record<string, unknown>) => {
969
- const { intent, requirements, constraints, category } = args as {
979
+ const { intent, requirements, constraints, category, preset } = args as {
970
980
  intent: string;
971
981
  requirements?: string[];
972
982
  constraints?: string[];
973
983
  category?: FeatureCategory;
984
+ preset?: GuardPreset;
974
985
  };
975
986
 
976
987
  if (!intent) {
@@ -985,6 +996,7 @@ Mandu.filling()
985
996
  requirements,
986
997
  constraints,
987
998
  category,
999
+ preset,
988
1000
  };
989
1001
 
990
1002
  const result = await negotiate(request, projectRoot);
@@ -1029,11 +1041,12 @@ Mandu.filling()
1029
1041
  },
1030
1042
 
1031
1043
  mandu_generate_scaffold: async (args: Record<string, unknown>) => {
1032
- const { intent, category, dryRun = false, overwrite = false } = args as {
1044
+ const { intent, category, dryRun = false, overwrite = false, preset } = args as {
1033
1045
  intent: string;
1034
1046
  category?: FeatureCategory;
1035
1047
  dryRun?: boolean;
1036
1048
  overwrite?: boolean;
1049
+ preset?: GuardPreset;
1037
1050
  };
1038
1051
 
1039
1052
  if (!intent) {
@@ -1044,7 +1057,7 @@ Mandu.filling()
1044
1057
  }
1045
1058
 
1046
1059
  // 먼저 협상하여 구조 계획 얻기
1047
- const plan = await negotiate({ intent, category }, projectRoot);
1060
+ const plan = await negotiate({ intent, category, preset }, projectRoot);
1048
1061
 
1049
1062
  if (!plan.approved) {
1050
1063
  return {
@@ -318,8 +318,8 @@ export function hydrationTools(projectRoot: string) {
318
318
  };
319
319
  }
320
320
 
321
- // Create client slot file in apps/web/components/ (not spec/slots/)
322
- const clientModulePath = `apps/web/components/${routeId}.client.tsx`;
321
+ // Create client slot file in spec/slots/
322
+ const clientModulePath = `spec/slots/${routeId}.client.tsx`;
323
323
  const clientFilePath = path.join(projectRoot, clientModulePath);
324
324
 
325
325
  // Check if file already exists
@@ -378,19 +378,19 @@ function generateClientSlotTemplate(routeId: string, slotModule?: string): strin
378
378
  .map((s) => s.charAt(0).toUpperCase() + s.slice(1))
379
379
  .join("");
380
380
 
381
- const typeImport = slotModule
382
- ? `// Import types from server slot if needed (adjust path to your project)
383
- // import type { LoaderData } from "../../../spec/slots/${routeId}.slot";
384
-
385
- `
386
- : "";
381
+ const typeImport = slotModule
382
+ ? `// Import types from server slot if needed (adjust path to your project)
383
+ // import type { LoaderData } from "../../../spec/slots/${routeId}.slot";
384
+
385
+ `
386
+ : "";
387
387
 
388
388
  return `/**
389
389
  * ${pascalCase} Client Slot
390
390
  * 브라우저에서 실행되는 클라이언트 로직
391
391
  */
392
392
 
393
- import { ManduClient } from "@mandujs/core/client";
393
+ import { ManduClient } from "@mandujs/core/client";
394
394
  import { useState, useCallback } from "react";
395
395
 
396
396
  ${typeImport}// 서버에서 전달받는 데이터 타입
@@ -399,7 +399,7 @@ interface ServerData {
399
399
  [key: string]: unknown;
400
400
  }
401
401
 
402
- export default ManduClient.island<ServerData>({
402
+ export default ManduClient.island<ServerData>({
403
403
  /**
404
404
  * Setup Phase
405
405
  * - 서버 데이터를 받아 클라이언트 상태 초기화