@mandujs/mcp 0.9.19 → 0.9.21

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 (122) hide show
  1. package/README.md +320 -0
  2. package/package.json +1 -1
  3. package/src/activity-monitor.ts +847 -231
  4. package/src/resources/handlers.ts +244 -0
  5. package/src/resources/skills/guides.ts +1136 -0
  6. package/src/resources/skills/index.ts +12 -0
  7. package/src/resources/skills/loader.ts +218 -0
  8. package/src/resources/skills/mandu-composition/SKILL.md +91 -0
  9. package/src/resources/skills/mandu-composition/metadata.json +13 -0
  10. package/src/resources/skills/mandu-composition/rules/_sections.md +26 -0
  11. package/src/resources/skills/mandu-composition/rules/_template.md +77 -0
  12. package/src/resources/skills/mandu-composition/rules/comp-arch-avoid-boolean-props.md +146 -0
  13. package/src/resources/skills/mandu-composition/rules/comp-arch-compound-components.md +164 -0
  14. package/src/resources/skills/mandu-composition/rules/comp-island-event.md +161 -0
  15. package/src/resources/skills/mandu-composition/rules/comp-island-slot-split.md +167 -0
  16. package/src/resources/skills/mandu-composition/rules/comp-pattern-children.md +149 -0
  17. package/src/resources/skills/mandu-composition/rules/comp-state-context-interface.md +148 -0
  18. package/src/resources/skills/mandu-composition/rules/comp-state-lift-state.md +150 -0
  19. package/src/resources/skills/mandu-deployment/SKILL.md +92 -0
  20. package/src/resources/skills/mandu-deployment/_sections.md +41 -0
  21. package/src/resources/skills/mandu-deployment/_template.md +38 -0
  22. package/src/resources/skills/mandu-deployment/metadata.json +13 -0
  23. package/src/resources/skills/mandu-deployment/rules/deploy-build-bun.md +109 -0
  24. package/src/resources/skills/mandu-deployment/rules/deploy-build-output.md +115 -0
  25. package/src/resources/skills/mandu-deployment/rules/deploy-cicd-github.md +219 -0
  26. package/src/resources/skills/mandu-deployment/rules/deploy-docker-bun.md +150 -0
  27. package/src/resources/skills/mandu-deployment/rules/deploy-docker-compose.md +223 -0
  28. package/src/resources/skills/mandu-deployment/rules/deploy-platform-fly.md +152 -0
  29. package/src/resources/skills/mandu-deployment/rules/deploy-platform-render.md +179 -0
  30. package/src/resources/skills/mandu-deployment/rules/deploy-platform-supabase.md +323 -0
  31. package/src/resources/skills/mandu-deployment/rules/deploy-platform-vercel.md +140 -0
  32. package/src/resources/skills/mandu-fs-routes/SKILL.md +82 -0
  33. package/src/resources/skills/mandu-fs-routes/metadata.json +12 -0
  34. package/src/resources/skills/mandu-fs-routes/rules/_sections.md +36 -0
  35. package/src/resources/skills/mandu-fs-routes/rules/_template.md +69 -0
  36. package/src/resources/skills/mandu-fs-routes/rules/routes-api-methods.md +65 -0
  37. package/src/resources/skills/mandu-fs-routes/rules/routes-dynamic-param.md +93 -0
  38. package/src/resources/skills/mandu-fs-routes/rules/routes-naming-page.md +55 -0
  39. package/src/resources/skills/mandu-guard/SKILL.md +129 -0
  40. package/src/resources/skills/mandu-guard/metadata.json +12 -0
  41. package/src/resources/skills/mandu-guard/rules/_sections.md +36 -0
  42. package/src/resources/skills/mandu-guard/rules/_template.md +82 -0
  43. package/src/resources/skills/mandu-guard/rules/guard-config-rules.md +100 -0
  44. package/src/resources/skills/mandu-guard/rules/guard-layer-direction.md +76 -0
  45. package/src/resources/skills/mandu-guard/rules/guard-preset-mandu.md +81 -0
  46. package/src/resources/skills/mandu-guard/rules/guard-validate-import.md +80 -0
  47. package/src/resources/skills/mandu-hydration/SKILL.md +91 -0
  48. package/src/resources/skills/mandu-hydration/metadata.json +12 -0
  49. package/src/resources/skills/mandu-hydration/rules/_sections.md +31 -0
  50. package/src/resources/skills/mandu-hydration/rules/_template.md +72 -0
  51. package/src/resources/skills/mandu-hydration/rules/hydration-data-event.md +109 -0
  52. package/src/resources/skills/mandu-hydration/rules/hydration-directive-use-client.md +55 -0
  53. package/src/resources/skills/mandu-hydration/rules/hydration-island-setup.md +113 -0
  54. package/src/resources/skills/mandu-hydration/rules/hydration-priority-visible.md +68 -0
  55. package/src/resources/skills/mandu-performance/SKILL.md +85 -0
  56. package/src/resources/skills/mandu-performance/metadata.json +14 -0
  57. package/src/resources/skills/mandu-performance/rules/_sections.md +31 -0
  58. package/src/resources/skills/mandu-performance/rules/_template.md +64 -0
  59. package/src/resources/skills/mandu-performance/rules/perf-async-defer-await.md +103 -0
  60. package/src/resources/skills/mandu-performance/rules/perf-async-parallel.md +95 -0
  61. package/src/resources/skills/mandu-performance/rules/perf-bun-file.md +124 -0
  62. package/src/resources/skills/mandu-performance/rules/perf-bun-serve.md +125 -0
  63. package/src/resources/skills/mandu-performance/rules/perf-bundle-imports.md +80 -0
  64. package/src/resources/skills/mandu-performance/rules/perf-bundle-island-lazy.md +145 -0
  65. package/src/resources/skills/mandu-performance/rules/perf-cache-react.md +98 -0
  66. package/src/resources/skills/mandu-performance/rules/perf-render-transitions.md +154 -0
  67. package/src/resources/skills/mandu-security/SKILL.md +87 -0
  68. package/src/resources/skills/mandu-security/metadata.json +13 -0
  69. package/src/resources/skills/mandu-security/rules/_sections.md +31 -0
  70. package/src/resources/skills/mandu-security/rules/_template.md +74 -0
  71. package/src/resources/skills/mandu-security/rules/sec-auth-guard.md +127 -0
  72. package/src/resources/skills/mandu-security/rules/sec-env-management.md +133 -0
  73. package/src/resources/skills/mandu-security/rules/sec-input-validate.md +148 -0
  74. package/src/resources/skills/mandu-security/rules/sec-protect-csrf.md +146 -0
  75. package/src/resources/skills/mandu-security/rules/sec-protect-headers.md +138 -0
  76. package/src/resources/skills/mandu-slot/SKILL.md +85 -0
  77. package/src/resources/skills/mandu-slot/metadata.json +12 -0
  78. package/src/resources/skills/mandu-slot/rules/_sections.md +36 -0
  79. package/src/resources/skills/mandu-slot/rules/_template.md +63 -0
  80. package/src/resources/skills/mandu-slot/rules/slot-basic-structure.md +38 -0
  81. package/src/resources/skills/mandu-slot/rules/slot-ctx-response.md +56 -0
  82. package/src/resources/skills/mandu-slot/rules/slot-guard-auth.md +59 -0
  83. package/src/resources/skills/mandu-slot/rules/slot-http-methods.md +64 -0
  84. package/src/resources/skills/mandu-styling/SKILL.md +118 -0
  85. package/src/resources/skills/mandu-styling/_sections.md +36 -0
  86. package/src/resources/skills/mandu-styling/_template.md +32 -0
  87. package/src/resources/skills/mandu-styling/metadata.json +13 -0
  88. package/src/resources/skills/mandu-styling/rules/style-component-compound.md +235 -0
  89. package/src/resources/skills/mandu-styling/rules/style-component-slots.md +255 -0
  90. package/src/resources/skills/mandu-styling/rules/style-component-tokens.md +205 -0
  91. package/src/resources/skills/mandu-styling/rules/style-island-animations.md +272 -0
  92. package/src/resources/skills/mandu-styling/rules/style-island-scoping.md +167 -0
  93. package/src/resources/skills/mandu-styling/rules/style-island-variants.md +221 -0
  94. package/src/resources/skills/mandu-styling/rules/style-perf-critical.md +209 -0
  95. package/src/resources/skills/mandu-styling/rules/style-perf-purge.md +192 -0
  96. package/src/resources/skills/mandu-styling/rules/style-setup-modules.md +162 -0
  97. package/src/resources/skills/mandu-styling/rules/style-setup-panda.md +164 -0
  98. package/src/resources/skills/mandu-styling/rules/style-setup-tailwind.md +161 -0
  99. package/src/resources/skills/mandu-styling/rules/style-theme-darkmode.md +229 -0
  100. package/src/resources/skills/mandu-testing/SKILL.md +99 -0
  101. package/src/resources/skills/mandu-testing/metadata.json +13 -0
  102. package/src/resources/skills/mandu-testing/rules/_sections.md +26 -0
  103. package/src/resources/skills/mandu-testing/rules/_template.md +65 -0
  104. package/src/resources/skills/mandu-testing/rules/test-component-island.md +195 -0
  105. package/src/resources/skills/mandu-testing/rules/test-e2e-playwright.md +196 -0
  106. package/src/resources/skills/mandu-testing/rules/test-mock-fetch.md +219 -0
  107. package/src/resources/skills/mandu-testing/rules/test-slot-unit.md +192 -0
  108. package/src/resources/skills/mandu-ui/SKILL.md +117 -0
  109. package/src/resources/skills/mandu-ui/_sections.md +23 -0
  110. package/src/resources/skills/mandu-ui/_template.md +32 -0
  111. package/src/resources/skills/mandu-ui/metadata.json +13 -0
  112. package/src/resources/skills/mandu-ui/rules/ui-accessibility-aria.md +232 -0
  113. package/src/resources/skills/mandu-ui/rules/ui-accessibility-focus.md +238 -0
  114. package/src/resources/skills/mandu-ui/rules/ui-composition-patterns.md +259 -0
  115. package/src/resources/skills/mandu-ui/rules/ui-island-integration.md +258 -0
  116. package/src/resources/skills/mandu-ui/rules/ui-radix-patterns.md +213 -0
  117. package/src/resources/skills/mandu-ui/rules/ui-shadcn-setup.md +209 -0
  118. package/src/resources/skills/recipes.ts +932 -0
  119. package/src/server.ts +3 -0
  120. package/src/tools/hydration.ts +8 -8
  121. package/src/tools/index.ts +1 -0
  122. package/src/tools/seo.ts +417 -0
@@ -7,6 +7,16 @@ import {
7
7
  type SpecLock,
8
8
  } from "@mandujs/core";
9
9
  import { getProjectPaths, readJsonFile } from "../utils/project.js";
10
+ import {
11
+ getGuide,
12
+ listGuides,
13
+ getRecipe,
14
+ listRecipes,
15
+ listSkills,
16
+ getSkill,
17
+ listSkillRules,
18
+ getSkillRule,
19
+ } from "./skills/index.js";
10
20
  import path from "path";
11
21
 
12
22
  export const resourceDefinitions: Resource[] = [
@@ -52,6 +62,99 @@ export const resourceDefinitions: Resource[] = [
52
62
  description: "File watcher status (active/inactive, uptime, rule count)",
53
63
  mimeType: "application/json",
54
64
  },
65
+ // Skills - Guides
66
+ {
67
+ uri: "mandu://skills/guides",
68
+ name: "Skills Guide List",
69
+ description: "Available guide documents for learning Mandu",
70
+ mimeType: "application/json",
71
+ },
72
+ {
73
+ uri: "mandu://skills/guides/slot",
74
+ name: "Slot Guide",
75
+ description: "Guide for writing business logic with Mandu.filling() API",
76
+ mimeType: "text/markdown",
77
+ },
78
+ {
79
+ uri: "mandu://skills/guides/fs-routes",
80
+ name: "FS Routes Guide",
81
+ description: "Guide for file-system based routing patterns",
82
+ mimeType: "text/markdown",
83
+ },
84
+ {
85
+ uri: "mandu://skills/guides/hydration",
86
+ name: "Hydration Guide",
87
+ description: "Guide for Island hydration and client components",
88
+ mimeType: "text/markdown",
89
+ },
90
+ {
91
+ uri: "mandu://skills/guides/guard",
92
+ name: "Guard Guide",
93
+ description: "Guide for architecture enforcement and layer dependencies",
94
+ mimeType: "text/markdown",
95
+ },
96
+ // Skills - Recipes
97
+ {
98
+ uri: "mandu://skills/recipes",
99
+ name: "Skills Recipe List",
100
+ description: "Step-by-step recipes for common tasks",
101
+ mimeType: "application/json",
102
+ },
103
+ {
104
+ uri: "mandu://skills/recipes/add-api-route",
105
+ name: "Add API Route Recipe",
106
+ description: "Step-by-step guide to add a new REST API endpoint",
107
+ mimeType: "text/markdown",
108
+ },
109
+ {
110
+ uri: "mandu://skills/recipes/add-page",
111
+ name: "Add Page Recipe",
112
+ description: "Step-by-step guide to add a new page",
113
+ mimeType: "text/markdown",
114
+ },
115
+ {
116
+ uri: "mandu://skills/recipes/add-auth",
117
+ name: "Add Auth Recipe",
118
+ description: "Step-by-step guide to add authentication",
119
+ mimeType: "text/markdown",
120
+ },
121
+ {
122
+ uri: "mandu://skills/recipes/add-island",
123
+ name: "Add Island Recipe",
124
+ description: "Step-by-step guide to add an interactive Island component",
125
+ mimeType: "text/markdown",
126
+ },
127
+ {
128
+ uri: "mandu://skills/recipes/add-database",
129
+ name: "Add Database Recipe",
130
+ description: "Step-by-step guide to connect a database",
131
+ mimeType: "text/markdown",
132
+ },
133
+ // Agent Skills (file-based)
134
+ {
135
+ uri: "mandu://skills",
136
+ name: "Available Skills",
137
+ description: "List of all Agent Skills for learning Mandu patterns",
138
+ mimeType: "application/json",
139
+ },
140
+ {
141
+ uri: "mandu://skills/{skillId}",
142
+ name: "Skill Overview",
143
+ description: "SKILL.md content with overview and rule categories",
144
+ mimeType: "text/markdown",
145
+ },
146
+ {
147
+ uri: "mandu://skills/{skillId}/rules",
148
+ name: "Skill Rules",
149
+ description: "List of rules for a specific skill",
150
+ mimeType: "application/json",
151
+ },
152
+ {
153
+ uri: "mandu://skills/{skillId}/rules/{ruleId}",
154
+ name: "Skill Rule",
155
+ description: "Detailed rule documentation",
156
+ mimeType: "text/markdown",
157
+ },
55
158
  ];
56
159
 
57
160
  type ResourceHandler = (params: Record<string, string>) => Promise<unknown>;
@@ -224,5 +327,146 @@ export function resourceHandlers(
224
327
  startedAt: status.startedAt?.toISOString() || null,
225
328
  };
226
329
  },
330
+
331
+ // Skills - Guides
332
+ "mandu://skills/guides": async () => {
333
+ return {
334
+ guides: listGuides(),
335
+ usage: "Read a specific guide with mandu://skills/guides/{id}",
336
+ };
337
+ },
338
+
339
+ "mandu://skills/guides/slot": async () => {
340
+ const content = getGuide("slot");
341
+ return { id: "slot", content };
342
+ },
343
+
344
+ "mandu://skills/guides/fs-routes": async () => {
345
+ const content = getGuide("fs-routes");
346
+ return { id: "fs-routes", content };
347
+ },
348
+
349
+ "mandu://skills/guides/hydration": async () => {
350
+ const content = getGuide("hydration");
351
+ return { id: "hydration", content };
352
+ },
353
+
354
+ "mandu://skills/guides/guard": async () => {
355
+ const content = getGuide("guard");
356
+ return { id: "guard", content };
357
+ },
358
+
359
+ // Skills - Recipes
360
+ "mandu://skills/recipes": async () => {
361
+ return {
362
+ recipes: listRecipes(),
363
+ usage: "Read a specific recipe with mandu://skills/recipes/{id}",
364
+ };
365
+ },
366
+
367
+ "mandu://skills/recipes/add-api-route": async () => {
368
+ const content = getRecipe("add-api-route");
369
+ return { id: "add-api-route", content };
370
+ },
371
+
372
+ "mandu://skills/recipes/add-page": async () => {
373
+ const content = getRecipe("add-page");
374
+ return { id: "add-page", content };
375
+ },
376
+
377
+ "mandu://skills/recipes/add-auth": async () => {
378
+ const content = getRecipe("add-auth");
379
+ return { id: "add-auth", content };
380
+ },
381
+
382
+ "mandu://skills/recipes/add-island": async () => {
383
+ const content = getRecipe("add-island");
384
+ return { id: "add-island", content };
385
+ },
386
+
387
+ "mandu://skills/recipes/add-database": async () => {
388
+ const content = getRecipe("add-database");
389
+ return { id: "add-database", content };
390
+ },
391
+
392
+ // Agent Skills (file-based)
393
+ "mandu://skills": async () => {
394
+ return {
395
+ skills: listSkills(),
396
+ usage: {
397
+ overview: "Read skill overview with mandu://skills/{skillId}",
398
+ rules: "List rules with mandu://skills/{skillId}/rules",
399
+ rule: "Read specific rule with mandu://skills/{skillId}/rules/{ruleId}",
400
+ },
401
+ availableSkills: [
402
+ "mandu-slot",
403
+ "mandu-fs-routes",
404
+ "mandu-hydration",
405
+ "mandu-guard",
406
+ ],
407
+ };
408
+ },
409
+
410
+ "mandu://skills/{skillId}": async (params: Record<string, string>) => {
411
+ const { skillId } = params;
412
+ if (!skillId) {
413
+ return { error: "skillId parameter is required" };
414
+ }
415
+
416
+ const skill = await getSkill(skillId);
417
+ if (!skill) {
418
+ return { error: `Skill not found: ${skillId}` };
419
+ }
420
+
421
+ const rules = await listSkillRules(skillId);
422
+
423
+ return {
424
+ id: skillId,
425
+ meta: skill.meta,
426
+ content: skill.content,
427
+ rulesCount: rules.length,
428
+ rulesUri: `mandu://skills/${skillId}/rules`,
429
+ };
430
+ },
431
+
432
+ "mandu://skills/{skillId}/rules": async (params: Record<string, string>) => {
433
+ const { skillId } = params;
434
+ if (!skillId) {
435
+ return { error: "skillId parameter is required" };
436
+ }
437
+
438
+ const rules = await listSkillRules(skillId);
439
+ if (rules.length === 0) {
440
+ return { error: `No rules found for skill: ${skillId}` };
441
+ }
442
+
443
+ return {
444
+ skillId,
445
+ count: rules.length,
446
+ rules: rules.map((r) => ({
447
+ ...r,
448
+ uri: `mandu://skills/${skillId}/rules/${r.id}`,
449
+ })),
450
+ };
451
+ },
452
+
453
+ "mandu://skills/{skillId}/rules/{ruleId}": async (params: Record<string, string>) => {
454
+ const { skillId, ruleId } = params;
455
+ if (!skillId || !ruleId) {
456
+ return { error: "skillId and ruleId parameters are required" };
457
+ }
458
+
459
+ const rule = await getSkillRule(skillId, ruleId);
460
+ if (!rule) {
461
+ return { error: `Rule not found: ${skillId}/${ruleId}` };
462
+ }
463
+
464
+ return {
465
+ skillId,
466
+ ruleId,
467
+ meta: rule.meta,
468
+ content: rule.content,
469
+ };
470
+ },
227
471
  };
228
472
  }