@react-spa-scaffold/mcp 1.1.3 → 1.2.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 (261) hide show
  1. package/README.md +19 -15
  2. package/dist/constants.d.ts +35 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +35 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/features/definitions/api.d.ts +3 -0
  7. package/dist/features/definitions/api.d.ts.map +1 -0
  8. package/dist/features/definitions/api.js +20 -0
  9. package/dist/features/definitions/api.js.map +1 -0
  10. package/dist/features/definitions/ci.d.ts +3 -0
  11. package/dist/features/definitions/ci.d.ts.map +1 -0
  12. package/dist/features/definitions/ci.js +25 -0
  13. package/dist/features/definitions/ci.js.map +1 -0
  14. package/dist/features/definitions/core.d.ts +3 -0
  15. package/dist/features/definitions/core.d.ts.map +1 -0
  16. package/dist/features/definitions/core.js +76 -0
  17. package/dist/features/definitions/core.js.map +1 -0
  18. package/dist/features/definitions/devtools.d.ts +3 -0
  19. package/dist/features/definitions/devtools.d.ts.map +1 -0
  20. package/dist/features/definitions/devtools.js +53 -0
  21. package/dist/features/definitions/devtools.js.map +1 -0
  22. package/dist/features/definitions/forms.d.ts +3 -0
  23. package/dist/features/definitions/forms.d.ts.map +1 -0
  24. package/dist/features/definitions/forms.js +32 -0
  25. package/dist/features/definitions/forms.js.map +1 -0
  26. package/dist/features/definitions/i18n.d.ts +3 -0
  27. package/dist/features/definitions/i18n.d.ts.map +1 -0
  28. package/dist/features/definitions/i18n.js +50 -0
  29. package/dist/features/definitions/i18n.js.map +1 -0
  30. package/dist/features/definitions/index.d.ts +15 -0
  31. package/dist/features/definitions/index.d.ts.map +1 -0
  32. package/dist/features/definitions/index.js +15 -0
  33. package/dist/features/definitions/index.js.map +1 -0
  34. package/dist/features/definitions/mobile.d.ts +3 -0
  35. package/dist/features/definitions/mobile.d.ts.map +1 -0
  36. package/dist/features/definitions/mobile.js +19 -0
  37. package/dist/features/definitions/mobile.js.map +1 -0
  38. package/dist/features/definitions/observability.d.ts +3 -0
  39. package/dist/features/definitions/observability.d.ts.map +1 -0
  40. package/dist/features/definitions/observability.js +21 -0
  41. package/dist/features/definitions/observability.js.map +1 -0
  42. package/dist/features/definitions/performance.d.ts +3 -0
  43. package/dist/features/definitions/performance.d.ts.map +1 -0
  44. package/dist/features/definitions/performance.js +28 -0
  45. package/dist/features/definitions/performance.js.map +1 -0
  46. package/dist/features/definitions/routing.d.ts +3 -0
  47. package/dist/features/definitions/routing.d.ts.map +1 -0
  48. package/dist/features/definitions/routing.js +25 -0
  49. package/dist/features/definitions/routing.js.map +1 -0
  50. package/dist/features/definitions/state.d.ts +3 -0
  51. package/dist/features/definitions/state.d.ts.map +1 -0
  52. package/dist/features/definitions/state.js +27 -0
  53. package/dist/features/definitions/state.js.map +1 -0
  54. package/dist/features/definitions/testing.d.ts +3 -0
  55. package/dist/features/definitions/testing.d.ts.map +1 -0
  56. package/dist/features/definitions/testing.js +56 -0
  57. package/dist/features/definitions/testing.js.map +1 -0
  58. package/dist/features/definitions/theming.d.ts +3 -0
  59. package/dist/features/definitions/theming.d.ts.map +1 -0
  60. package/dist/features/definitions/theming.js +27 -0
  61. package/dist/features/definitions/theming.js.map +1 -0
  62. package/dist/features/definitions/ui.d.ts +3 -0
  63. package/dist/features/definitions/ui.d.ts.map +1 -0
  64. package/dist/features/definitions/ui.js +44 -0
  65. package/dist/features/definitions/ui.js.map +1 -0
  66. package/dist/features/index.d.ts +3 -2
  67. package/dist/features/index.d.ts.map +1 -1
  68. package/dist/features/index.js +2 -1
  69. package/dist/features/index.js.map +1 -1
  70. package/dist/features/registry.d.ts +3 -9
  71. package/dist/features/registry.d.ts.map +1 -1
  72. package/dist/features/registry.js +3 -554
  73. package/dist/features/registry.js.map +1 -1
  74. package/dist/features/types.d.ts +17 -20
  75. package/dist/features/types.d.ts.map +1 -1
  76. package/dist/features/types.js +7 -1
  77. package/dist/features/types.js.map +1 -1
  78. package/dist/features/types.test.d.ts +5 -0
  79. package/dist/features/types.test.d.ts.map +1 -0
  80. package/dist/features/types.test.js +32 -0
  81. package/dist/features/types.test.js.map +1 -0
  82. package/dist/resources/docs.d.ts +2 -8
  83. package/dist/resources/docs.d.ts.map +1 -1
  84. package/dist/resources/docs.js +27 -49
  85. package/dist/resources/docs.js.map +1 -1
  86. package/dist/server.d.ts +2 -7
  87. package/dist/server.d.ts.map +1 -1
  88. package/dist/server.js +24 -57
  89. package/dist/server.js.map +1 -1
  90. package/dist/server.test.d.ts +2 -0
  91. package/dist/server.test.d.ts.map +1 -0
  92. package/dist/server.test.js +14 -0
  93. package/dist/server.test.js.map +1 -0
  94. package/dist/tools/get-example.d.ts +4 -15
  95. package/dist/tools/get-example.d.ts.map +1 -1
  96. package/dist/tools/get-example.js +3 -11
  97. package/dist/tools/get-example.js.map +1 -1
  98. package/dist/tools/get-example.test.d.ts +5 -0
  99. package/dist/tools/get-example.test.d.ts.map +1 -0
  100. package/dist/tools/get-example.test.js +63 -0
  101. package/dist/tools/get-example.test.js.map +1 -0
  102. package/dist/tools/get-features.d.ts +15 -14
  103. package/dist/tools/get-features.d.ts.map +1 -1
  104. package/dist/tools/get-features.js +12 -2
  105. package/dist/tools/get-features.js.map +1 -1
  106. package/dist/tools/get-features.test.d.ts +5 -0
  107. package/dist/tools/get-features.test.d.ts.map +1 -0
  108. package/dist/tools/get-features.test.js +45 -0
  109. package/dist/tools/get-features.test.js.map +1 -0
  110. package/dist/tools/get-file.d.ts +23 -0
  111. package/dist/tools/get-file.d.ts.map +1 -0
  112. package/dist/tools/get-file.js +53 -0
  113. package/dist/tools/get-file.js.map +1 -0
  114. package/dist/tools/get-file.test.d.ts +5 -0
  115. package/dist/tools/get-file.test.d.ts.map +1 -0
  116. package/dist/tools/get-file.test.js +63 -0
  117. package/dist/tools/get-file.test.js.map +1 -0
  118. package/dist/tools/get-scaffold.d.ts +8 -29
  119. package/dist/tools/get-scaffold.d.ts.map +1 -1
  120. package/dist/tools/get-scaffold.js +18 -24
  121. package/dist/tools/get-scaffold.js.map +1 -1
  122. package/dist/tools/get-scaffold.test.d.ts +5 -0
  123. package/dist/tools/get-scaffold.test.d.ts.map +1 -0
  124. package/dist/tools/get-scaffold.test.js +197 -0
  125. package/dist/tools/get-scaffold.test.js.map +1 -0
  126. package/dist/tools/index.d.ts +2 -0
  127. package/dist/tools/index.d.ts.map +1 -1
  128. package/dist/tools/index.js +1 -0
  129. package/dist/tools/index.js.map +1 -1
  130. package/dist/tools/registry.d.ts +13 -0
  131. package/dist/tools/registry.d.ts.map +1 -0
  132. package/dist/tools/registry.js +47 -0
  133. package/dist/tools/registry.js.map +1 -0
  134. package/dist/tools/types.d.ts +41 -0
  135. package/dist/tools/types.d.ts.map +1 -0
  136. package/dist/tools/types.js +8 -0
  137. package/dist/tools/types.js.map +1 -0
  138. package/dist/utils/cache.d.ts +25 -0
  139. package/dist/utils/cache.d.ts.map +1 -0
  140. package/dist/utils/cache.js +61 -0
  141. package/dist/utils/cache.js.map +1 -0
  142. package/dist/utils/docs.d.ts +1 -3
  143. package/dist/utils/docs.d.ts.map +1 -1
  144. package/dist/utils/docs.js +3 -8
  145. package/dist/utils/docs.js.map +1 -1
  146. package/dist/utils/docs.test.d.ts +5 -0
  147. package/dist/utils/docs.test.d.ts.map +1 -0
  148. package/dist/utils/docs.test.js +37 -0
  149. package/dist/utils/docs.test.js.map +1 -0
  150. package/dist/utils/errors.d.ts +8 -0
  151. package/dist/utils/errors.d.ts.map +1 -0
  152. package/dist/utils/errors.js +19 -0
  153. package/dist/utils/errors.js.map +1 -0
  154. package/dist/utils/examples/api-patterns.d.ts +3 -0
  155. package/dist/utils/examples/api-patterns.d.ts.map +1 -0
  156. package/dist/utils/examples/api-patterns.js +19 -0
  157. package/dist/utils/examples/api-patterns.js.map +1 -0
  158. package/dist/utils/examples/component-patterns.d.ts +3 -0
  159. package/dist/utils/examples/component-patterns.d.ts.map +1 -0
  160. package/dist/utils/examples/component-patterns.js +71 -0
  161. package/dist/utils/examples/component-patterns.js.map +1 -0
  162. package/dist/utils/examples/context-patterns.d.ts +3 -0
  163. package/dist/utils/examples/context-patterns.d.ts.map +1 -0
  164. package/dist/utils/examples/context-patterns.js +32 -0
  165. package/dist/utils/examples/context-patterns.js.map +1 -0
  166. package/dist/utils/examples/hook-patterns.d.ts +3 -0
  167. package/dist/utils/examples/hook-patterns.d.ts.map +1 -0
  168. package/dist/utils/examples/hook-patterns.js +55 -0
  169. package/dist/utils/examples/hook-patterns.js.map +1 -0
  170. package/dist/utils/examples/i18n-patterns.d.ts +3 -0
  171. package/dist/utils/examples/i18n-patterns.d.ts.map +1 -0
  172. package/dist/utils/examples/i18n-patterns.js +43 -0
  173. package/dist/utils/examples/i18n-patterns.js.map +1 -0
  174. package/dist/utils/examples/index.d.ts +12 -0
  175. package/dist/utils/examples/index.d.ts.map +1 -0
  176. package/dist/utils/examples/index.js +65 -0
  177. package/dist/utils/examples/index.js.map +1 -0
  178. package/dist/utils/examples/mobile-patterns.d.ts +3 -0
  179. package/dist/utils/examples/mobile-patterns.d.ts.map +1 -0
  180. package/dist/utils/examples/mobile-patterns.js +38 -0
  181. package/dist/utils/examples/mobile-patterns.js.map +1 -0
  182. package/dist/utils/examples/page-patterns.d.ts +3 -0
  183. package/dist/utils/examples/page-patterns.d.ts.map +1 -0
  184. package/dist/utils/examples/page-patterns.js +34 -0
  185. package/dist/utils/examples/page-patterns.js.map +1 -0
  186. package/dist/utils/examples/patterns.test.d.ts +6 -0
  187. package/dist/utils/examples/patterns.test.d.ts.map +1 -0
  188. package/dist/utils/examples/patterns.test.js +75 -0
  189. package/dist/utils/examples/patterns.test.js.map +1 -0
  190. package/dist/utils/examples/store-patterns.d.ts +3 -0
  191. package/dist/utils/examples/store-patterns.d.ts.map +1 -0
  192. package/dist/utils/examples/store-patterns.js +40 -0
  193. package/dist/utils/examples/store-patterns.js.map +1 -0
  194. package/dist/utils/examples/test-patterns.d.ts +3 -0
  195. package/dist/utils/examples/test-patterns.d.ts.map +1 -0
  196. package/dist/utils/examples/test-patterns.js +58 -0
  197. package/dist/utils/examples/test-patterns.js.map +1 -0
  198. package/dist/utils/examples/types.d.ts +17 -0
  199. package/dist/utils/examples/types.d.ts.map +1 -0
  200. package/dist/utils/examples/types.js +2 -0
  201. package/dist/utils/examples/types.js.map +1 -0
  202. package/dist/utils/examples/utility-patterns.d.ts +3 -0
  203. package/dist/utils/examples/utility-patterns.d.ts.map +1 -0
  204. package/dist/utils/examples/utility-patterns.js +77 -0
  205. package/dist/utils/examples/utility-patterns.js.map +1 -0
  206. package/dist/utils/index.d.ts +5 -3
  207. package/dist/utils/index.d.ts.map +1 -1
  208. package/dist/utils/index.js +5 -3
  209. package/dist/utils/index.js.map +1 -1
  210. package/dist/utils/paths.d.ts +13 -23
  211. package/dist/utils/paths.d.ts.map +1 -1
  212. package/dist/utils/paths.js +28 -39
  213. package/dist/utils/paths.js.map +1 -1
  214. package/dist/utils/paths.test.d.ts +2 -0
  215. package/dist/utils/paths.test.d.ts.map +1 -0
  216. package/dist/utils/paths.test.js +38 -0
  217. package/dist/utils/paths.test.js.map +1 -0
  218. package/dist/utils/scaffold/claude-md/index.d.ts +7 -0
  219. package/dist/utils/scaffold/claude-md/index.d.ts.map +1 -0
  220. package/dist/utils/scaffold/claude-md/index.js +23 -0
  221. package/dist/utils/scaffold/claude-md/index.js.map +1 -0
  222. package/dist/utils/scaffold/claude-md/sections.d.ts +16 -0
  223. package/dist/utils/scaffold/claude-md/sections.d.ts.map +1 -0
  224. package/dist/utils/scaffold/claude-md/sections.js +269 -0
  225. package/dist/utils/scaffold/claude-md/sections.js.map +1 -0
  226. package/dist/utils/scaffold/commands.d.ts +7 -0
  227. package/dist/utils/scaffold/commands.d.ts.map +1 -0
  228. package/dist/utils/scaffold/commands.js +19 -0
  229. package/dist/utils/scaffold/commands.js.map +1 -0
  230. package/dist/utils/scaffold/compute.d.ts +15 -0
  231. package/dist/utils/scaffold/compute.d.ts.map +1 -0
  232. package/dist/utils/scaffold/compute.js +63 -0
  233. package/dist/utils/scaffold/compute.js.map +1 -0
  234. package/dist/utils/scaffold/dependencies.d.ts +25 -0
  235. package/dist/utils/scaffold/dependencies.d.ts.map +1 -0
  236. package/dist/utils/scaffold/dependencies.js +101 -0
  237. package/dist/utils/scaffold/dependencies.js.map +1 -0
  238. package/dist/utils/scaffold/file-structure.d.ts +23 -0
  239. package/dist/utils/scaffold/file-structure.d.ts.map +1 -0
  240. package/dist/utils/scaffold/file-structure.js +62 -0
  241. package/dist/utils/scaffold/file-structure.js.map +1 -0
  242. package/dist/utils/scaffold/generators.d.ts +9 -0
  243. package/dist/utils/scaffold/generators.d.ts.map +1 -0
  244. package/dist/utils/scaffold/generators.js +121 -0
  245. package/dist/utils/scaffold/generators.js.map +1 -0
  246. package/dist/utils/scaffold/index.d.ts +10 -0
  247. package/dist/utils/scaffold/index.d.ts.map +1 -0
  248. package/dist/utils/scaffold/index.js +9 -0
  249. package/dist/utils/scaffold/index.js.map +1 -0
  250. package/package.json +2 -2
  251. package/templates/.github/workflows/release.yml +1 -1
  252. package/templates/e2e/tests/home.spec.ts +2 -2
  253. package/templates/e2e/tests/language.spec.ts +7 -3
  254. package/dist/utils/examples.d.ts +0 -27
  255. package/dist/utils/examples.d.ts.map +0 -1
  256. package/dist/utils/examples.js +0 -438
  257. package/dist/utils/examples.js.map +0 -1
  258. package/dist/utils/scaffold.d.ts +0 -59
  259. package/dist/utils/scaffold.d.ts.map +0 -1
  260. package/dist/utils/scaffold.js +0 -637
  261. package/dist/utils/scaffold.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/features/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC,CAAC;IACF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/features/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,oFAAoF;AACpF,eAAO,MAAM,WAAW,EAA6B,SAAS,SAAS,EAAE,CAAC;AAE1E,oCAAoC;AACpC,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAE/D,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAE7D;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,8DAA8D;AAC9D,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC,CAAC;IACF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,wDAAwD;IACxD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB"}
@@ -1,5 +1,11 @@
1
1
  /**
2
2
  * Type definitions for feature modules
3
3
  */
4
- export {};
4
+ import { FEATURE } from '../constants.js';
5
+ /** All valid feature IDs derived from FEATURE constant (single source of truth). */
6
+ export const FEATURE_IDS = Object.values(FEATURE);
7
+ /** Type guard to check if a string is a valid FeatureId. */
8
+ export function isFeatureId(value) {
9
+ return FEATURE_IDS.includes(value);
10
+ }
5
11
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/features/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/features/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,oFAAoF;AACpF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAyB,CAAC;AAK1E,4DAA4D;AAC5D,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAQ,WAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for feature type definitions.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../../src/features/types.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Tests for feature type definitions.
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { FEATURE } from '../constants.js';
6
+ import { FEATURE_IDS, isFeatureId } from './types.js';
7
+ describe('FEATURE_IDS', () => {
8
+ it('is derived from FEATURE constant', () => {
9
+ expect(FEATURE_IDS).toEqual(Object.values(FEATURE));
10
+ });
11
+ it('contains expected features', () => {
12
+ expect(FEATURE_IDS).toContain('core');
13
+ expect(FEATURE_IDS).toContain('routing');
14
+ expect(FEATURE_IDS).toContain('testing');
15
+ });
16
+ it('has 14 features', () => {
17
+ expect(FEATURE_IDS).toHaveLength(14);
18
+ });
19
+ });
20
+ describe('isFeatureId', () => {
21
+ it('returns true for valid feature IDs', () => {
22
+ expect(isFeatureId('core')).toBe(true);
23
+ expect(isFeatureId('routing')).toBe(true);
24
+ expect(isFeatureId('theming')).toBe(true);
25
+ });
26
+ it('returns false for invalid feature IDs', () => {
27
+ expect(isFeatureId('invalid')).toBe(false);
28
+ expect(isFeatureId('')).toBe(false);
29
+ expect(isFeatureId('CORE')).toBe(false);
30
+ });
31
+ });
32
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/features/types.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,9 +1,5 @@
1
1
  /**
2
- * Documentation resources
3
- *
4
- * Reads actual documentation files from the react-spa-scaffold repository
5
- * to ensure MCP resources stay in sync with the real docs.
6
- * Uses in-memory caching to avoid repeated disk reads.
2
+ * Documentation resources - reads docs from react-spa-scaffold repository.
7
3
  */
8
4
  /**
9
5
  * Get list of all available documentation resources
@@ -14,9 +10,7 @@ export declare function getDocumentationResources(): {
14
10
  description: string;
15
11
  mimeType: string;
16
12
  }[];
17
- /**
18
- * Read documentation content for a resource URI (cached)
19
- */
13
+ /** Read documentation content for a resource URI (cached, parallel). */
20
14
  export declare function readDocumentation(uri: string): Promise<string | null>;
21
15
  /**
22
16
  * Check if a URI is a valid documentation resource
@@ -1 +1 @@
1
- {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/resources/docs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuDH;;GAEG;AACH,wBAAgB,yBAAyB;;;;;IAOxC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiC3E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C"}
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/resources/docs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkDH;;GAEG;AACH,wBAAgB,yBAAyB;;;;;IAOxC;AAED,wEAAwE;AACxE,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiB3E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C"}
@@ -1,47 +1,39 @@
1
1
  /**
2
- * Documentation resources
3
- *
4
- * Reads actual documentation files from the react-spa-scaffold repository
5
- * to ensure MCP resources stay in sync with the real docs.
6
- * Uses in-memory caching to avoid repeated disk reads.
2
+ * Documentation resources - reads docs from react-spa-scaffold repository.
7
3
  */
8
4
  import { readFile } from 'fs/promises';
5
+ import { DOCS_URI } from '../constants.js';
6
+ import { createCache } from '../utils/cache.js';
9
7
  import { resolveTemplatePath } from '../utils/paths.js';
10
- // Simple in-memory cache for documentation content
11
- const cache = new Map();
12
- /**
13
- * Documentation file mapping
14
- *
15
- * Maps resource URIs to actual files in the repository.
16
- * Add new entries here to expose additional documentation.
17
- */
8
+ const docsCache = createCache();
9
+ /** Documentation file mapping - maps URIs to repository files. */
18
10
  const DOCS_MAP = {
19
- 'docs://conventions': {
11
+ [DOCS_URI.CONVENTIONS]: {
20
12
  files: ['docs/CODING_STANDARDS.md', 'docs/COMPONENT_GUIDELINES.md'],
21
13
  name: 'Coding Conventions',
22
- description: 'Coding standards, naming conventions, and component patterns for react-spa-scaffold projects',
14
+ description: 'Coding standards, naming conventions, and component patterns',
23
15
  },
24
- 'docs://architecture': {
16
+ [DOCS_URI.ARCHITECTURE]: {
25
17
  files: ['docs/ARCHITECTURE.md'],
26
18
  name: 'Architecture Overview',
27
- description: 'Technology stack, data flow, and architectural decisions for react-spa-scaffold',
19
+ description: 'Technology stack, data flow, and architectural decisions',
28
20
  },
29
- 'docs://testing': {
21
+ [DOCS_URI.TESTING]: {
30
22
  files: ['docs/TESTING.md', 'docs/E2E_TESTING.md'],
31
23
  name: 'Testing Guide',
32
24
  description: 'Unit testing with Vitest and E2E testing with Playwright',
33
25
  },
34
- 'docs://i18n': {
26
+ [DOCS_URI.I18N]: {
35
27
  files: ['docs/INTERNATIONALIZATION.md'],
36
28
  name: 'Internationalization',
37
29
  description: 'LinguiJS setup, Trans component usage, and translation workflow',
38
30
  },
39
- 'docs://api': {
31
+ [DOCS_URI.API]: {
40
32
  files: ['docs/API_REFERENCE.md'],
41
33
  name: 'API Reference',
42
34
  description: 'API client utilities, hooks, and data fetching patterns',
43
35
  },
44
- 'docs://claude': {
36
+ [DOCS_URI.CLAUDE]: {
45
37
  files: ['CLAUDE.md'],
46
38
  name: 'Claude AI Guidance',
47
39
  description: 'AI assistant instructions and project-specific guidance',
@@ -58,37 +50,23 @@ export function getDocumentationResources() {
58
50
  mimeType: 'text/markdown',
59
51
  }));
60
52
  }
61
- /**
62
- * Read documentation content for a resource URI (cached)
63
- */
53
+ /** Read documentation content for a resource URI (cached, parallel). */
64
54
  export async function readDocumentation(uri) {
65
55
  const doc = DOCS_MAP[uri];
66
- if (!doc) {
56
+ if (!doc)
67
57
  return null;
68
- }
69
- // Return cached content if available
70
- if (cache.has(uri)) {
71
- return cache.get(uri);
72
- }
73
- const contents = [];
74
- for (const file of doc.files) {
75
- const fullPath = resolveTemplatePath(file);
76
- try {
77
- const content = await readFile(fullPath, 'utf-8');
78
- contents.push(content);
79
- }
80
- catch {
81
- // File might not exist
82
- contents.push(`<!-- File not found: ${file} -->\n`);
83
- }
84
- }
85
- // Join multiple files with a separator
86
- const result = contents.length > 1 ? contents.join('\n\n---\n\n') : contents[0] || null;
87
- // Cache the result
88
- if (result) {
89
- cache.set(uri, result);
90
- }
91
- return result;
58
+ return docsCache.getOrSet(uri, async () => {
59
+ const contents = await Promise.all(doc.files.map(async (file) => {
60
+ const fullPath = resolveTemplatePath(file);
61
+ try {
62
+ return await readFile(fullPath, 'utf-8');
63
+ }
64
+ catch {
65
+ return `<!-- File not found: ${file} -->\n`;
66
+ }
67
+ }));
68
+ return contents.length > 1 ? contents.join('\n\n---\n\n') : (contents[0] ?? '');
69
+ });
92
70
  }
93
71
  /**
94
72
  * Check if a URI is a valid documentation resource
@@ -1 +1 @@
1
- {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/resources/docs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/resources/docs.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,12 +1,7 @@
1
1
  /**
2
- * MCP Server for react-spa-scaffold scaffolding
3
- *
4
- * This server provides tools and resources for AI agents to scaffold
5
- * new projects based on the react-spa-scaffold template.
2
+ * MCP Server for react-spa-scaffold scaffolding.
6
3
  */
7
4
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
- /**
9
- * Create and configure the MCP server
10
- */
5
+ /** Creates and configures the MCP server. */
11
6
  export declare function createServer(): Server;
12
7
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AA2DnE;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAoFrC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AA0CnE,6CAA6C;AAC7C,wBAAgB,YAAY,IAAI,MAAM,CA0DrC"}
package/dist/server.js CHANGED
@@ -1,17 +1,12 @@
1
1
  /**
2
- * MCP Server for react-spa-scaffold scaffolding
3
- *
4
- * This server provides tools and resources for AI agents to scaffold
5
- * new projects based on the react-spa-scaffold template.
2
+ * MCP Server for react-spa-scaffold scaffolding.
6
3
  */
7
4
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
5
  import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
9
- import { getFeatures, getFeaturesToolDefinition, getScaffold, getScaffoldSchema, getScaffoldToolDefinition, getExample, getExampleSchema, getExampleToolDefinition, } from './tools/index.js';
10
- import { getDocumentationResources, readDocumentation, isValidDocumentationUri } from './resources/index.js';
6
+ // Direct imports - flattened for faster startup
7
+ import { TOOL_REGISTRY, getToolDefinitions } from './tools/registry.js';
8
+ import { getDocumentationResources, readDocumentation, isValidDocumentationUri } from './resources/docs.js';
11
9
  import { VERSION } from './version.js';
12
- // ═══════════════════════════════════════════════════════════════════════════
13
- // Response Helpers
14
- // ═══════════════════════════════════════════════════════════════════════════
15
10
  function jsonResponse(data) {
16
11
  return {
17
12
  content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
@@ -23,9 +18,6 @@ function errorResponse(message) {
23
18
  isError: true,
24
19
  };
25
20
  }
26
- // ═══════════════════════════════════════════════════════════════════════════
27
- // Server Instructions
28
- // ═══════════════════════════════════════════════════════════════════════════
29
21
  const SERVER_INSTRUCTIONS = `
30
22
  react-spa-scaffold MCP Server - Project Scaffolding Assistant
31
23
 
@@ -41,63 +33,38 @@ Tips:
41
33
  - Theming feature automatically includes state (requires Zustand)
42
34
  - Check docs://conventions before generating code
43
35
  `.trim();
44
- /**
45
- * Create and configure the MCP server
46
- */
36
+ /** Creates and configures the MCP server. */
47
37
  export function createServer() {
48
- const server = new Server({
49
- name: 'react-spa-scaffold-mcp',
50
- version: VERSION,
51
- }, {
52
- capabilities: {
53
- tools: {},
54
- resources: {},
55
- },
56
- instructions: SERVER_INSTRUCTIONS,
57
- });
58
- // ═══════════════════════════════════════════════════════════════════════
59
- // TOOLS
60
- // ═══════════════════════════════════════════════════════════════════════
61
- server.setRequestHandler(ListToolsRequestSchema, async () => {
62
- return {
63
- tools: [getFeaturesToolDefinition, getScaffoldToolDefinition, getExampleToolDefinition],
64
- };
65
- });
38
+ const server = new Server({ name: 'react-spa-scaffold-mcp', version: VERSION }, { capabilities: { tools: {}, resources: {} }, instructions: SERVER_INSTRUCTIONS });
39
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
40
+ tools: getToolDefinitions(),
41
+ }));
66
42
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
67
43
  const { name, arguments: args } = request.params;
44
+ const toolConfig = TOOL_REGISTRY[name];
45
+ if (!toolConfig) {
46
+ return errorResponse(`Unknown tool: ${name}`);
47
+ }
68
48
  try {
69
- switch (name) {
70
- case 'get_features':
71
- return jsonResponse(getFeatures());
72
- case 'get_scaffold': {
73
- const parsed = getScaffoldSchema.safeParse(args);
74
- if (!parsed.success) {
75
- return errorResponse(`Invalid input: ${parsed.error.message}`);
76
- }
77
- return jsonResponse(await getScaffold(parsed.data));
49
+ if (toolConfig.schema) {
50
+ const parsed = toolConfig.schema.safeParse(args);
51
+ if (!parsed.success) {
52
+ return errorResponse(`Invalid input: ${parsed.error.message}`);
78
53
  }
79
- case 'get_example': {
80
- const parsed = getExampleSchema.safeParse(args);
81
- if (!parsed.success) {
82
- return errorResponse(`Invalid input: ${parsed.error.message}`);
83
- }
84
- return jsonResponse(await getExample(parsed.data));
85
- }
86
- default:
87
- return errorResponse(`Unknown tool: ${name}`);
54
+ const result = await toolConfig.handler(parsed.data);
55
+ return jsonResponse(result);
88
56
  }
57
+ const result = await toolConfig.handler();
58
+ return jsonResponse(result);
89
59
  }
90
60
  catch (error) {
91
61
  const message = error instanceof Error ? error.message : String(error);
92
62
  return errorResponse(`Error executing ${name}: ${message}`);
93
63
  }
94
64
  });
95
- // ═══════════════════════════════════════════════════════════════════════
96
- // RESOURCES
97
- // ═══════════════════════════════════════════════════════════════════════
98
- server.setRequestHandler(ListResourcesRequestSchema, async () => {
99
- return { resources: getDocumentationResources() };
100
- });
65
+ server.setRequestHandler(ListResourcesRequestSchema, async () => ({
66
+ resources: getDocumentationResources(),
67
+ }));
101
68
  server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
102
69
  const { uri } = request.params;
103
70
  if (!isValidDocumentationUri(uri)) {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAE5C,gDAAgD;AAChD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,SAAS,YAAY,CAAC,IAAa;IACjC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;CAc3B,CAAC,IAAI,EAAE,CAAC;AAET,6CAA6C;AAC7C,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,OAAO,EAAE,EACpD,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAClF,CAAC;IAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5D,KAAK,EAAE,kBAAkB,EAAE;KAC5B,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,aAAa,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,aAAa,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjE,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;YAC1C,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,aAAa,CAAC,mBAAmB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAChE,SAAS,EAAE,yBAAyB,EAAE;KACvC,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAE/B,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SAC9D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { createServer } from './server.js';
3
+ describe('MCP server', () => {
4
+ it('creates server instance', () => {
5
+ const server = createServer();
6
+ expect(server).toBeDefined();
7
+ });
8
+ it('has correct server name and version', () => {
9
+ const server = createServer();
10
+ // @ts-expect-error - accessing internal server info
11
+ expect(server._serverInfo?.name).toBe('react-spa-scaffold-mcp');
12
+ });
13
+ });
14
+ //# sourceMappingURL=server.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,oDAAoD;QACpD,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -6,6 +6,8 @@
6
6
  * that matches react-spa-scaffold conventions.
7
7
  */
8
8
  import { z } from 'zod';
9
+ import type { ToolDefinition } from './types.js';
10
+ /** Zod schema for get_example input - single source of truth. */
9
11
  export declare const getExampleSchema: z.ZodObject<{
10
12
  pattern: z.ZodEnum<{
11
13
  [x: string]: string;
@@ -31,19 +33,6 @@ export declare function getExample(input: GetExampleInput): Promise<{
31
33
  error?: undefined;
32
34
  hint?: undefined;
33
35
  }>;
34
- export declare const getExampleToolDefinition: {
35
- name: string;
36
- description: string;
37
- inputSchema: {
38
- type: "object";
39
- properties: {
40
- pattern: {
41
- type: "string";
42
- description: string;
43
- enum: [string, ...string[]];
44
- };
45
- };
46
- required: string[];
47
- };
48
- };
36
+ /** Tool definition derived from Zod schema (Zod v4 native). */
37
+ export declare const getExampleToolDefinition: ToolDefinition;
49
38
  //# sourceMappingURL=get-example.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-example.d.ts","sourceRoot":"","sources":["../../src/tools/get-example.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,gBAAgB;;;;iBAI3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;;;;;;;;GAoBtD;AAwBD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;CAoCpC,CAAC"}
1
+ {"version":3,"file":"get-example.d.ts","sourceRoot":"","sources":["../../src/tools/get-example.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,iEAAiE;AACjE,eAAO,MAAM,gBAAgB;;;;iBAI3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe;;;;;;;;;;;;;;;;;;GAoBtD;AAwBD,+DAA+D;AAC/D,eAAO,MAAM,wBAAwB,EAAE,cA0BtC,CAAC"}
@@ -8,6 +8,7 @@
8
8
  import { z } from 'zod';
9
9
  import { getCodeExample, getAvailablePatterns } from '../utils/index.js';
10
10
  const AVAILABLE_PATTERNS = getAvailablePatterns();
11
+ /** Zod schema for get_example input - single source of truth. */
11
12
  export const getExampleSchema = z.object({
12
13
  pattern: z.enum(AVAILABLE_PATTERNS, {
13
14
  error: `Invalid pattern. Available: ${AVAILABLE_PATTERNS.join(', ')}`,
@@ -51,6 +52,7 @@ function generateUsageHint(pattern) {
51
52
  };
52
53
  return hints[pattern] || 'Follow the file path shown in the example';
53
54
  }
55
+ /** Tool definition derived from Zod schema (Zod v4 native). */
54
56
  export const getExampleToolDefinition = {
55
57
  name: 'get_example',
56
58
  description: `Get real code example for a specific pattern type.
@@ -76,16 +78,6 @@ Each example includes:
76
78
  - Actual working code
77
79
  - Key points explaining the pattern
78
80
  - File path where it should be placed`,
79
- inputSchema: {
80
- type: 'object',
81
- properties: {
82
- pattern: {
83
- type: 'string',
84
- description: 'Pattern type to get example for',
85
- enum: AVAILABLE_PATTERNS,
86
- },
87
- },
88
- required: ['pattern'],
89
- },
81
+ inputSchema: z.toJSONSchema(getExampleSchema),
90
82
  };
91
83
  //# sourceMappingURL=get-example.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-example.js","sourceRoot":"","sources":["../../src/tools/get-example.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,kBAAkB,GAAG,oBAAoB,EAA2B,CAAC;AAE3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAClC,KAAK,EAAE,+BAA+B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACtE,CAAC;CACH,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,uCAAuC,OAAO,EAAE;YACvD,IAAI,EAAE,gEAAgE;SACvE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GAA2B;QACpC,cAAc,EAAE,sDAAsD;QACtE,kBAAkB,EAAE,oEAAoE;QACxF,kBAAkB,EAAE,iCAAiC;QACrD,YAAY,EAAE,2CAA2C;QACzD,YAAY,EAAE,mDAAmD;QACjE,WAAW,EAAE,0DAA0D;QACvE,aAAa,EAAE,uCAAuC;QACtD,eAAe,EAAE,8CAA8C;QAC/D,gBAAgB,EAAE,+CAA+C;QACjE,kBAAkB,EAAE,wDAAwD;QAC5E,gBAAgB,EAAE,4EAA4E;QAC9F,WAAW,EAAE,uDAAuD;QACpE,YAAY,EAAE,4DAA4D;QAC1E,aAAa,EAAE,8BAA8B;QAC7C,YAAY,EAAE,+BAA+B;KAC9C,CAAC;IAEF,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,2CAA2C,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;sCAsBuB;IACpC,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAiB;gBACvB,WAAW,EAAE,iCAAiC;gBAC9C,IAAI,EAAE,kBAAkB;aACzB;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;CACF,CAAC"}
1
+ {"version":3,"file":"get-example.js","sourceRoot":"","sources":["../../src/tools/get-example.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzE,MAAM,kBAAkB,GAAG,oBAAoB,EAA2B,CAAC;AAE3E,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAClC,KAAK,EAAE,+BAA+B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACtE,CAAC;CACH,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE1B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,uCAAuC,OAAO,EAAE;YACvD,IAAI,EAAE,gEAAgE;SACvE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GAA2B;QACpC,cAAc,EAAE,sDAAsD;QACtE,kBAAkB,EAAE,oEAAoE;QACxF,kBAAkB,EAAE,iCAAiC;QACrD,YAAY,EAAE,2CAA2C;QACzD,YAAY,EAAE,mDAAmD;QACjE,WAAW,EAAE,0DAA0D;QACvE,aAAa,EAAE,uCAAuC;QACtD,eAAe,EAAE,8CAA8C;QAC/D,gBAAgB,EAAE,+CAA+C;QACjE,kBAAkB,EAAE,wDAAwD;QAC5E,gBAAgB,EAAE,4EAA4E;QAC9F,WAAW,EAAE,uDAAuD;QACpE,YAAY,EAAE,4DAA4D;QAC1E,aAAa,EAAE,8BAA8B;QAC7C,YAAY,EAAE,+BAA+B;KAC9C,CAAC;IAEF,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,2CAA2C,CAAC;AACvE,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,MAAM,wBAAwB,GAAmB;IACtD,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;sCAsBuB;IACpC,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAkC;CAC/E,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for get_example tool
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=get-example.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-example.test.d.ts","sourceRoot":"","sources":["../../src/tools/get-example.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Tests for get_example tool
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { getExample, getExampleSchema } from './get-example.js';
6
+ describe('get_example tool', () => {
7
+ it('rejects unknown pattern via schema', () => {
8
+ const result = getExampleSchema.safeParse({ pattern: 'unknown-pattern' });
9
+ expect(result.success).toBe(false);
10
+ if (!result.success) {
11
+ expect(result.error.message).toContain('Invalid pattern');
12
+ }
13
+ });
14
+ it('returns code for valid pattern', async () => {
15
+ const result = await getExample({ pattern: 'zustand-store' });
16
+ expect(result).not.toHaveProperty('error');
17
+ expect(result).toHaveProperty('code');
18
+ expect(result).toHaveProperty('filePath');
19
+ expect(result).toHaveProperty('description');
20
+ expect(result).toHaveProperty('keyPoints');
21
+ });
22
+ it('returns usage hint', async () => {
23
+ const result = await getExample({ pattern: 'zustand-store' });
24
+ expect(result).toHaveProperty('usage');
25
+ expect(typeof result.usage).toBe('string');
26
+ });
27
+ it('returns actual code content', async () => {
28
+ const result = await getExample({ pattern: 'hook-state' });
29
+ expect(result.code).toBeTruthy();
30
+ expect(result.code?.length).toBeGreaterThan(50);
31
+ });
32
+ it('works for component patterns', async () => {
33
+ const result = await getExample({ pattern: 'component-ui' });
34
+ expect(result).not.toHaveProperty('error');
35
+ expect(result.code).toContain('export');
36
+ });
37
+ it('works for test patterns', async () => {
38
+ const result = await getExample({ pattern: 'test-component' });
39
+ expect(result).not.toHaveProperty('error');
40
+ expect(result.code).toContain('describe');
41
+ });
42
+ it('works for mobile-context pattern', async () => {
43
+ const result = await getExample({ pattern: 'mobile-context' });
44
+ expect(result).not.toHaveProperty('error');
45
+ expect(result.code).toContain('MobileProvider');
46
+ expect(result.code).toContain('useMobileContext');
47
+ expect(result.filePath).toBe('src/contexts/mobileContext.tsx');
48
+ });
49
+ it('works for use-media-query pattern', async () => {
50
+ const result = await getExample({ pattern: 'use-media-query' });
51
+ expect(result).not.toHaveProperty('error');
52
+ expect(result.code).toContain('BREAKPOINTS');
53
+ expect(result.code).toContain('useMediaQuery');
54
+ expect(result.filePath).toBe('src/hooks/useMediaQuery.ts');
55
+ });
56
+ it('works for use-touch-sizes pattern', async () => {
57
+ const result = await getExample({ pattern: 'use-touch-sizes' });
58
+ expect(result).not.toHaveProperty('error');
59
+ expect(result.code).toContain('useTouchSizes');
60
+ expect(result.filePath).toBe('src/hooks/useTouchSizes.ts');
61
+ });
62
+ });
63
+ //# sourceMappingURL=get-example.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-example.test.js","sourceRoot":"","sources":["../../src/tools/get-example.test.ts"],"names":[],"mappings":"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"}
@@ -5,26 +5,27 @@
5
5
  * AI agents use this to understand what features are available
6
6
  * and present options to users.
7
7
  */
8
+ import type { ToolDefinition } from './types.js';
9
+ /** Feature summary returned by get_features tool. */
8
10
  export interface FeatureSummary {
9
11
  id: string;
10
12
  name: string;
11
13
  description: string;
12
14
  required: boolean;
13
15
  includes: string[];
14
- hasOptions: boolean;
15
- options?: Record<string, {
16
- description: string;
17
- default: boolean;
18
- }>;
19
16
  }
17
+ /**
18
+ * Lists all available features for scaffolding.
19
+ *
20
+ * @returns Array of feature summaries with id, name, description, required flag, and includes
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const features = getFeatures();
25
+ * // [{ id: 'core', name: 'Core', required: true, ... }, ...]
26
+ * ```
27
+ */
20
28
  export declare function getFeatures(): FeatureSummary[];
21
- export declare const getFeaturesToolDefinition: {
22
- name: string;
23
- description: string;
24
- inputSchema: {
25
- type: "object";
26
- properties: {};
27
- required: string[];
28
- };
29
- };
29
+ /** Tool definition for get_features - no input required. */
30
+ export declare const getFeaturesToolDefinition: ToolDefinition;
30
31
  //# sourceMappingURL=get-features.d.ts.map