@react-spa-scaffold/mcp 1.2.1 → 2.1.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 (161) hide show
  1. package/README.md +39 -127
  2. package/dist/features/definitions/api.d.ts.map +1 -1
  3. package/dist/features/definitions/api.js +1 -11
  4. package/dist/features/definitions/api.js.map +1 -1
  5. package/dist/features/definitions/ci.d.ts.map +1 -1
  6. package/dist/features/definitions/ci.js +0 -11
  7. package/dist/features/definitions/ci.js.map +1 -1
  8. package/dist/features/definitions/core.d.ts.map +1 -1
  9. package/dist/features/definitions/core.js +2 -15
  10. package/dist/features/definitions/core.js.map +1 -1
  11. package/dist/features/definitions/devtools.d.ts.map +1 -1
  12. package/dist/features/definitions/devtools.js +1 -15
  13. package/dist/features/definitions/devtools.js.map +1 -1
  14. package/dist/features/definitions/forms.d.ts.map +1 -1
  15. package/dist/features/definitions/forms.js +1 -10
  16. package/dist/features/definitions/forms.js.map +1 -1
  17. package/dist/features/definitions/i18n.d.ts.map +1 -1
  18. package/dist/features/definitions/i18n.js +2 -15
  19. package/dist/features/definitions/i18n.js.map +1 -1
  20. package/dist/features/definitions/mobile.d.ts.map +1 -1
  21. package/dist/features/definitions/mobile.js +0 -10
  22. package/dist/features/definitions/mobile.js.map +1 -1
  23. package/dist/features/definitions/observability.d.ts.map +1 -1
  24. package/dist/features/definitions/observability.js +2 -13
  25. package/dist/features/definitions/observability.js.map +1 -1
  26. package/dist/features/definitions/performance.d.ts.map +1 -1
  27. package/dist/features/definitions/performance.js +2 -14
  28. package/dist/features/definitions/performance.js.map +1 -1
  29. package/dist/features/definitions/routing.d.ts.map +1 -1
  30. package/dist/features/definitions/routing.js +1 -10
  31. package/dist/features/definitions/routing.js.map +1 -1
  32. package/dist/features/definitions/state.d.ts.map +1 -1
  33. package/dist/features/definitions/state.js +1 -12
  34. package/dist/features/definitions/state.js.map +1 -1
  35. package/dist/features/definitions/testing.d.ts.map +1 -1
  36. package/dist/features/definitions/testing.js +1 -17
  37. package/dist/features/definitions/testing.js.map +1 -1
  38. package/dist/features/definitions/theming.d.ts.map +1 -1
  39. package/dist/features/definitions/theming.js +0 -9
  40. package/dist/features/definitions/theming.js.map +1 -1
  41. package/dist/features/definitions/ui.d.ts.map +1 -1
  42. package/dist/features/definitions/ui.js +2 -16
  43. package/dist/features/definitions/ui.js.map +1 -1
  44. package/dist/features/types.d.ts +2 -4
  45. package/dist/features/types.d.ts.map +1 -1
  46. package/dist/server.js +6 -6
  47. package/dist/tools/add-features.d.ts +44 -0
  48. package/dist/tools/add-features.d.ts.map +1 -0
  49. package/dist/tools/add-features.js +157 -0
  50. package/dist/tools/add-features.js.map +1 -0
  51. package/dist/tools/add-features.test.d.ts +5 -0
  52. package/dist/tools/add-features.test.d.ts.map +1 -0
  53. package/dist/tools/add-features.test.js +170 -0
  54. package/dist/tools/add-features.test.js.map +1 -0
  55. package/dist/tools/get-features.d.ts +1 -2
  56. package/dist/tools/get-features.d.ts.map +1 -1
  57. package/dist/tools/get-features.js +1 -2
  58. package/dist/tools/get-features.js.map +1 -1
  59. package/dist/tools/get-features.test.js +6 -2
  60. package/dist/tools/get-features.test.js.map +1 -1
  61. package/dist/tools/get-file.d.ts +1 -1
  62. package/dist/tools/get-file.d.ts.map +1 -1
  63. package/dist/tools/get-file.js +12 -8
  64. package/dist/tools/get-file.js.map +1 -1
  65. package/dist/tools/get-scaffold.d.ts +3 -4
  66. package/dist/tools/get-scaffold.d.ts.map +1 -1
  67. package/dist/tools/get-scaffold.js +58 -29
  68. package/dist/tools/get-scaffold.js.map +1 -1
  69. package/dist/tools/get-scaffold.test.js +25 -10
  70. package/dist/tools/get-scaffold.test.js.map +1 -1
  71. package/dist/tools/index.d.ts +2 -1
  72. package/dist/tools/index.d.ts.map +1 -1
  73. package/dist/tools/index.js +2 -1
  74. package/dist/tools/index.js.map +1 -1
  75. package/dist/tools/registry.js +8 -8
  76. package/dist/tools/registry.js.map +1 -1
  77. package/dist/utils/index.d.ts +0 -1
  78. package/dist/utils/index.d.ts.map +1 -1
  79. package/dist/utils/index.js +0 -1
  80. package/dist/utils/index.js.map +1 -1
  81. package/dist/utils/scaffold/compute.js +1 -1
  82. package/dist/utils/scaffold/compute.js.map +1 -1
  83. package/dist/utils/scaffold/dependencies.d.ts +15 -2
  84. package/dist/utils/scaffold/dependencies.d.ts.map +1 -1
  85. package/dist/utils/scaffold/dependencies.js +15 -8
  86. package/dist/utils/scaffold/dependencies.js.map +1 -1
  87. package/dist/utils/scaffold/file-structure.d.ts +12 -0
  88. package/dist/utils/scaffold/file-structure.d.ts.map +1 -1
  89. package/dist/utils/scaffold/file-structure.js +23 -0
  90. package/dist/utils/scaffold/file-structure.js.map +1 -1
  91. package/dist/utils/scaffold/generators.d.ts.map +1 -1
  92. package/dist/utils/scaffold/generators.js +10 -0
  93. package/dist/utils/scaffold/generators.js.map +1 -1
  94. package/dist/utils/scaffold/index.d.ts +3 -2
  95. package/dist/utils/scaffold/index.d.ts.map +1 -1
  96. package/dist/utils/scaffold/index.js +1 -1
  97. package/dist/utils/scaffold/index.js.map +1 -1
  98. package/package.json +1 -1
  99. package/templates/e2e/tests/language.spec.ts +2 -1
  100. package/templates/src/contexts/queryContext.tsx +1 -2
  101. package/templates/src/lib/storage.ts +1 -1
  102. package/dist/tools/get-example.d.ts +0 -38
  103. package/dist/tools/get-example.d.ts.map +0 -1
  104. package/dist/tools/get-example.js +0 -83
  105. package/dist/tools/get-example.js.map +0 -1
  106. package/dist/tools/get-example.test.d.ts +0 -5
  107. package/dist/tools/get-example.test.d.ts.map +0 -1
  108. package/dist/tools/get-example.test.js +0 -63
  109. package/dist/tools/get-example.test.js.map +0 -1
  110. package/dist/utils/examples/api-patterns.d.ts +0 -3
  111. package/dist/utils/examples/api-patterns.d.ts.map +0 -1
  112. package/dist/utils/examples/api-patterns.js +0 -19
  113. package/dist/utils/examples/api-patterns.js.map +0 -1
  114. package/dist/utils/examples/component-patterns.d.ts +0 -3
  115. package/dist/utils/examples/component-patterns.d.ts.map +0 -1
  116. package/dist/utils/examples/component-patterns.js +0 -71
  117. package/dist/utils/examples/component-patterns.js.map +0 -1
  118. package/dist/utils/examples/context-patterns.d.ts +0 -3
  119. package/dist/utils/examples/context-patterns.d.ts.map +0 -1
  120. package/dist/utils/examples/context-patterns.js +0 -32
  121. package/dist/utils/examples/context-patterns.js.map +0 -1
  122. package/dist/utils/examples/hook-patterns.d.ts +0 -3
  123. package/dist/utils/examples/hook-patterns.d.ts.map +0 -1
  124. package/dist/utils/examples/hook-patterns.js +0 -55
  125. package/dist/utils/examples/hook-patterns.js.map +0 -1
  126. package/dist/utils/examples/i18n-patterns.d.ts +0 -3
  127. package/dist/utils/examples/i18n-patterns.d.ts.map +0 -1
  128. package/dist/utils/examples/i18n-patterns.js +0 -43
  129. package/dist/utils/examples/i18n-patterns.js.map +0 -1
  130. package/dist/utils/examples/index.d.ts +0 -12
  131. package/dist/utils/examples/index.d.ts.map +0 -1
  132. package/dist/utils/examples/index.js +0 -65
  133. package/dist/utils/examples/index.js.map +0 -1
  134. package/dist/utils/examples/mobile-patterns.d.ts +0 -3
  135. package/dist/utils/examples/mobile-patterns.d.ts.map +0 -1
  136. package/dist/utils/examples/mobile-patterns.js +0 -38
  137. package/dist/utils/examples/mobile-patterns.js.map +0 -1
  138. package/dist/utils/examples/page-patterns.d.ts +0 -3
  139. package/dist/utils/examples/page-patterns.d.ts.map +0 -1
  140. package/dist/utils/examples/page-patterns.js +0 -34
  141. package/dist/utils/examples/page-patterns.js.map +0 -1
  142. package/dist/utils/examples/patterns.test.d.ts +0 -6
  143. package/dist/utils/examples/patterns.test.d.ts.map +0 -1
  144. package/dist/utils/examples/patterns.test.js +0 -75
  145. package/dist/utils/examples/patterns.test.js.map +0 -1
  146. package/dist/utils/examples/store-patterns.d.ts +0 -3
  147. package/dist/utils/examples/store-patterns.d.ts.map +0 -1
  148. package/dist/utils/examples/store-patterns.js +0 -40
  149. package/dist/utils/examples/store-patterns.js.map +0 -1
  150. package/dist/utils/examples/test-patterns.d.ts +0 -3
  151. package/dist/utils/examples/test-patterns.d.ts.map +0 -1
  152. package/dist/utils/examples/test-patterns.js +0 -58
  153. package/dist/utils/examples/test-patterns.js.map +0 -1
  154. package/dist/utils/examples/types.d.ts +0 -17
  155. package/dist/utils/examples/types.d.ts.map +0 -1
  156. package/dist/utils/examples/types.js +0 -2
  157. package/dist/utils/examples/types.js.map +0 -1
  158. package/dist/utils/examples/utility-patterns.d.ts +0 -3
  159. package/dist/utils/examples/utility-patterns.d.ts.map +0 -1
  160. package/dist/utils/examples/utility-patterns.js +0 -77
  161. package/dist/utils/examples/utility-patterns.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"compute.js","sourceRoot":"","sources":["../../../src/utils/scaffold/compute.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExG,KAAK,UAAU,qBAAqB;IAClC,MAAM,IAAI,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,gBAA0B,EAC1B,cAAsB,QAAQ;IAE9B,kCAAkC;IAClC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;IAEtE,2DAA2D;IAC3D,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxD,qBAAqB,EAAE;QACvB,iBAAiB,CAAC,gBAAgB,CAAC;KACpC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAI,iBAAiB,CAAC,OAAkC,IAAI,EAAE,CAAC;IAC5E,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;IAE/D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,kBAAkB;IAClB,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,CAAC,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC;IACpF,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAEzD,0CAA0C;IAC1C,MAAM,WAAW,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAErD,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,gBAAgB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7F,OAAO;QACL,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE;QACnF,SAAS;QACT,WAAW;QACX,aAAa;QACb,QAAQ;QACR,UAAU;QACV,KAAK;QACL,QAAQ;QACR,IAAI;KACL,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"compute.js","sourceRoot":"","sources":["../../../src/utils/scaffold/compute.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExG,KAAK,UAAU,qBAAqB;IAClC,MAAM,IAAI,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,gBAA0B,EAC1B,cAAsB,QAAQ;IAE9B,kCAAkC;IAClC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;IAEtE,2DAA2D;IAC3D,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxD,qBAAqB,EAAE;QACvB,iBAAiB,CAAC,gBAAgB,CAAC;KACpC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAI,iBAAiB,CAAC,OAAkC,IAAI,EAAE,CAAC;IAC5E,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;IAE/D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,kBAAkB;IAClB,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAC,CAAC,4CAA4C;IACtG,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAEzD,0CAA0C;IAC1C,MAAM,WAAW,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAErD,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,gBAAgB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7F,OAAO;QACL,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE;QACnF,SAAS;QACT,WAAW;QACX,aAAa;QACb,QAAQ;QACR,UAAU;QACV,KAAK;QACL,QAAQ;QACR,IAAI;KACL,CAAC;AACJ,CAAC"}
@@ -2,11 +2,24 @@
2
2
  * Dependency resolution - merges features and resolves versions from package.json.
3
3
  */
4
4
  import type { FeatureId } from '../../features/types.js';
5
+ /** Options for resolving feature dependencies */
6
+ export interface ResolveFeatureDependenciesOptions {
7
+ /**
8
+ * Whether to auto-include the 'core' feature.
9
+ * - true (default): For new projects (get_scaffold)
10
+ * - false: For extending existing projects (add_features)
11
+ */
12
+ includeCore?: boolean;
13
+ }
5
14
  /**
6
15
  * Resolves feature dependencies and auto-includes required features.
7
- * Core is always included. Dependencies declared via `requires` field are resolved recursively.
16
+ * Dependencies declared via `requires` field are resolved recursively.
17
+ *
18
+ * @param selectedFeatures - Features to include
19
+ * @param options - Configuration options
20
+ * @param options.includeCore - Whether to auto-include 'core' feature (default: true)
8
21
  */
9
- export declare function resolveFeatureDependencies(selectedFeatures: string[]): FeatureId[];
22
+ export declare function resolveFeatureDependencies(selectedFeatures: string[], options?: ResolveFeatureDependenciesOptions): FeatureId[];
10
23
  /** Result of merging dependencies with any warnings. */
11
24
  export interface MergeDependenciesResult {
12
25
  dependencies: Record<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/dependencies.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAwBzD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CA2BlF;AAED,wDAAwD;AACxD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAuCjG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAW5E"}
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/dependencies.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAwBzD,iDAAiD;AACjD,MAAM,WAAW,iCAAiC;IAChD;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,OAAO,GAAE,iCAAsC,GAC9C,SAAS,EAAE,CA8Bb;AAED,wDAAwD;AACxD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAuCjG;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAW5E"}
@@ -20,9 +20,14 @@ async function getSourceDependencies() {
20
20
  }
21
21
  /**
22
22
  * Resolves feature dependencies and auto-includes required features.
23
- * Core is always included. Dependencies declared via `requires` field are resolved recursively.
23
+ * Dependencies declared via `requires` field are resolved recursively.
24
+ *
25
+ * @param selectedFeatures - Features to include
26
+ * @param options - Configuration options
27
+ * @param options.includeCore - Whether to auto-include 'core' feature (default: true)
24
28
  */
25
- export function resolveFeatureDependencies(selectedFeatures) {
29
+ export function resolveFeatureDependencies(selectedFeatures, options = {}) {
30
+ const { includeCore = true } = options;
26
31
  const resolved = new Set();
27
32
  function addWithDeps(featureId) {
28
33
  if (resolved.has(featureId))
@@ -36,8 +41,10 @@ export function resolveFeatureDependencies(selectedFeatures) {
36
41
  }
37
42
  }
38
43
  }
39
- // Always include core first
40
- resolved.add('core');
44
+ // Include core first (for new project scaffolding)
45
+ if (includeCore) {
46
+ resolved.add('core');
47
+ }
41
48
  // Add selected features with their dependencies
42
49
  for (const featureId of selectedFeatures) {
43
50
  if (isFeatureId(featureId)) {
@@ -57,8 +64,8 @@ export async function mergeDependencies(featureIds) {
57
64
  const sourcePkg = await getSourceDependencies();
58
65
  for (const featureId of featureIds) {
59
66
  const feature = FEATURES[featureId];
60
- if (feature.dependencyNames) {
61
- for (const name of feature.dependencyNames) {
67
+ if (feature.dependencies) {
68
+ for (const name of feature.dependencies) {
62
69
  if (sourcePkg.dependencies[name]) {
63
70
  dependencies[name] = sourcePkg.dependencies[name];
64
71
  }
@@ -67,8 +74,8 @@ export async function mergeDependencies(featureIds) {
67
74
  }
68
75
  }
69
76
  }
70
- if (feature.devDependencyNames) {
71
- for (const name of feature.devDependencyNames) {
77
+ if (feature.devDependencies) {
78
+ for (const name of feature.devDependencies) {
72
79
  if (sourcePkg.devDependencies[name]) {
73
80
  devDependencies[name] = sourcePkg.devDependencies[name];
74
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../src/utils/scaffold/dependencies.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../src/utils/scaffold/dependencies.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,18 @@ import type { FeatureId } from '../../features/types.js';
12
12
  * their source files.
13
13
  */
14
14
  export declare function computeFileStructure(featureIds: FeatureId[]): string[];
15
+ /** Result of collecting feature files */
16
+ export interface CollectFeatureFilesResult {
17
+ /** Source files from all features */
18
+ files: string[];
19
+ /** Test files from all features */
20
+ testFiles: string[];
21
+ }
22
+ /**
23
+ * Collect files and testFiles separately from selected features.
24
+ * Useful for add_features where files and tests are returned separately.
25
+ */
26
+ export declare function collectFeatureFiles(featureIds: FeatureId[]): CollectFeatureFilesResult;
15
27
  /**
16
28
  * Get config files needed for selected features
17
29
  */
@@ -1 +1 @@
1
- {"version":3,"file":"file-structure.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/file-structure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAqBtE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAahE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS/E"}
1
+ {"version":3,"file":"file-structure.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/file-structure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAqBtE;AAED,yCAAyC;AACzC,MAAM,WAAW,yBAAyB;IACxC,qCAAqC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mCAAmC;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,yBAAyB,CAsBtF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAahE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS/E"}
@@ -31,6 +31,29 @@ export function computeFileStructure(featureIds) {
31
31
  }
32
32
  return Array.from(files).sort();
33
33
  }
34
+ /**
35
+ * Collect files and testFiles separately from selected features.
36
+ * Useful for add_features where files and tests are returned separately.
37
+ */
38
+ export function collectFeatureFiles(featureIds) {
39
+ const files = new Set();
40
+ const testFiles = new Set();
41
+ for (const featureId of featureIds) {
42
+ const feature = FEATURES[featureId];
43
+ for (const file of feature.files) {
44
+ files.add(file);
45
+ }
46
+ if (feature.testFiles) {
47
+ for (const file of feature.testFiles) {
48
+ testFiles.add(file);
49
+ }
50
+ }
51
+ }
52
+ return {
53
+ files: Array.from(files).sort(),
54
+ testFiles: Array.from(testFiles).sort(),
55
+ };
56
+ }
34
57
  /**
35
58
  * Get config files needed for selected features
36
59
  */
@@ -1 +1 @@
1
- {"version":3,"file":"file-structure.js","sourceRoot":"","sources":["../../../src/utils/scaffold/file-structure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAAuB;IAC1D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEpD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpC,8BAA8B;QAC9B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QAED,2DAA2D;QAC3D,IAAI,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACrC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAuB;IACpD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IAC5D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;QAC7D,OAAO,sBAAsB,UAAU,+DAA+D,CAAC;IACzG,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"file-structure.js","sourceRoot":"","sources":["../../../src/utils/scaffold/file-structure.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/generators.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAgClE;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAwE7D;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,IAAI,MAAM,CAazC"}
1
+ {"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/generators.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CA4ClE;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAwE7D;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,IAAI,MAAM,CAazC"}
@@ -8,12 +8,14 @@ export { generateClaudeMd } from './claude-md/index.js';
8
8
  /** Generate vite-env.d.ts content based on selected features. */
9
9
  export function generateViteEnvDts(featureIds) {
10
10
  const sections = [];
11
+ // Module declaration for i18n .po files
11
12
  if (featureIds.includes(FEATURE.I18N)) {
12
13
  sections.push(`declare module '*.po' {
13
14
  import type { Messages } from '@lingui/core';
14
15
  export const messages: Messages;
15
16
  }`);
16
17
  }
18
+ // Custom app environment variables
17
19
  const envVars = [' readonly VITE_APP_NAME: string;', ' readonly VITE_APP_URL: string;'];
18
20
  if (featureIds.includes(FEATURE.API)) {
19
21
  envVars.push(' readonly VITE_API_URL: string;');
@@ -22,6 +24,13 @@ export function generateViteEnvDts(featureIds) {
22
24
  envVars.push(' readonly VITE_SENTRY_DSN: string;');
23
25
  envVars.push(' readonly VITE_SENTRY_ENABLED: string;');
24
26
  }
27
+ if (featureIds.includes(FEATURE.PERFORMANCE)) {
28
+ envVars.push(' readonly VITE_PERF_TEST: string;');
29
+ }
30
+ // Vite built-in env vars (always required for TypeScript)
31
+ envVars.push(" readonly MODE: 'development' | 'production' | 'test';");
32
+ envVars.push(' readonly DEV: boolean;');
33
+ envVars.push(' readonly PROD: boolean;');
25
34
  sections.push(`/// <reference types="vite/client" />
26
35
 
27
36
  interface ImportMetaEnv {
@@ -30,6 +39,7 @@ ${envVars.join('\n')}
30
39
 
31
40
  interface ImportMeta {
32
41
  readonly env: ImportMetaEnv;
42
+ readonly hot?: import('vite/types/hot.d.ts').ViteHotContext;
33
43
  }`);
34
44
  return sections.join('\n\n') + '\n';
35
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../src/utils/scaffold/generators.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,UAAuB;IACxD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC;;;EAGhB,CAAC,CAAC;IACF,CAAC;IAED,MAAM,OAAO,GAAa,CAAC,mCAAmC,EAAE,kCAAkC,CAAC,CAAC;IAEpG,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAC1D,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;;;EAGd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;EAKlB,CAAC,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACtC,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,UAAuB;IACnD,MAAM,YAAY,GAAa;QAC7B,gDAAgD;QAChD,8CAA8C;KAC/C,CAAC;IACF,MAAM,SAAS,GAAa;QAC1B,mDAAmD;QACnD,iDAAiD;KAClD,CAAC;IAEF,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,YAAY,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/C,YAAY,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QACrE,YAAY,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QACnE,SAAS,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACxE,SAAS,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAClF,CAAC;IAED,2CAA2C;IAC3C,YAAY,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IACnG,YAAY,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACxD,YAAY,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACzD,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAClD,SAAS,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAChD,SAAS,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAElD,OAAO;;;;;;;;EAQP,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;EAWvB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBrB,CAAC;AACF,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;;;;;;CAWR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"generators.js","sourceRoot":"","sources":["../../../src/utils/scaffold/generators.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@
2
2
  * Scaffold utilities - re-exports for convenient importing.
3
3
  */
4
4
  export { resolveFeatureDependencies, mergeDependencies, mergeScripts } from './dependencies.js';
5
- export type { MergeDependenciesResult } from './dependencies.js';
6
- export { computeFileStructure, getConfigFiles, readConfigFileContent } from './file-structure.js';
5
+ export type { MergeDependenciesResult, ResolveFeatureDependenciesOptions } from './dependencies.js';
6
+ export { collectFeatureFiles, computeFileStructure, getConfigFiles, readConfigFileContent } from './file-structure.js';
7
+ export type { CollectFeatureFilesResult } from './file-structure.js';
7
8
  export { getSetupCommands } from './commands.js';
8
9
  export { generateClaudeMd, generateViteEnvDts, generateEnvTs, generateRoutesTs } from './generators.js';
9
10
  export { computeScaffold } from './compute.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChG,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChG,YAAY,EAAE,uBAAuB,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvH,YAAY,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * Scaffold utilities - re-exports for convenient importing.
3
3
  */
4
4
  export { resolveFeatureDependencies, mergeDependencies, mergeScripts } from './dependencies.js';
5
- export { computeFileStructure, getConfigFiles, readConfigFileContent } from './file-structure.js';
5
+ export { collectFeatureFiles, computeFileStructure, getConfigFiles, readConfigFileContent } from './file-structure.js';
6
6
  export { getSetupCommands } from './commands.js';
7
7
  export { generateClaudeMd, generateViteEnvDts, generateEnvTs, generateRoutesTs } from './generators.js';
8
8
  export { computeScaffold } from './compute.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/scaffold/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhG,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/scaffold/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhG,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEvH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-spa-scaffold/mcp",
3
- "version": "1.2.1",
3
+ "version": "2.1.0",
4
4
  "description": "MCP server for scaffolding projects based on react-spa-scaffold template",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -25,7 +25,8 @@ test.describe('Language Switcher', () => {
25
25
  // Wait for dropdown to fully appear before clicking
26
26
  const menuItem = page.getByRole('menuitem', { name: 'Español' });
27
27
  await expect(menuItem).toBeVisible();
28
- await menuItem.click();
28
+ // Use force:true because language change triggers re-render during click
29
+ await menuItem.click({ force: true });
29
30
 
30
31
  // Dropdown should close - other options not visible
31
32
  await expect(page.getByRole('menuitem', { name: 'Deutsch' })).not.toBeVisible();
@@ -3,8 +3,7 @@ import { type ReactNode, useState } from 'react';
3
3
 
4
4
  /**
5
5
  * Create QueryClient with optimized defaults.
6
- * Using a function ensures each provider instance gets its own client,
7
- * which is important for SSR and testing.
6
+ * Using a function ensures each provider instance gets its own client
8
7
  */
9
8
  function createQueryClient() {
10
9
  return new QueryClient({
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Type-safe localStorage abstraction with SSR safety and error handling.
2
+ * Type-safe localStorage abstraction with error handling.
3
3
  */
4
4
 
5
5
  import { STORAGE_KEYS } from './storageKeys';
@@ -1,38 +0,0 @@
1
- /**
2
- * get_example tool
3
- *
4
- * Returns real code examples for specific pattern types.
5
- * AI agents use this to understand how to generate code
6
- * that matches react-spa-scaffold conventions.
7
- */
8
- import { z } from 'zod';
9
- import type { ToolDefinition } from './types.js';
10
- /** Zod schema for get_example input - single source of truth. */
11
- export declare const getExampleSchema: z.ZodObject<{
12
- pattern: z.ZodEnum<{
13
- [x: string]: string;
14
- }>;
15
- }, z.core.$strip>;
16
- export type GetExampleInput = z.infer<typeof getExampleSchema>;
17
- export declare function getExample(input: GetExampleInput): Promise<{
18
- error: string;
19
- hint: string;
20
- pattern?: undefined;
21
- description?: undefined;
22
- filePath?: undefined;
23
- keyPoints?: undefined;
24
- code?: undefined;
25
- usage?: undefined;
26
- } | {
27
- pattern: string;
28
- description: string;
29
- filePath: string;
30
- keyPoints: string[];
31
- code: string;
32
- usage: string;
33
- error?: undefined;
34
- hint?: undefined;
35
- }>;
36
- /** Tool definition derived from Zod schema (Zod v4 native). */
37
- export declare const getExampleToolDefinition: ToolDefinition;
38
- //# sourceMappingURL=get-example.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,83 +0,0 @@
1
- /**
2
- * get_example tool
3
- *
4
- * Returns real code examples for specific pattern types.
5
- * AI agents use this to understand how to generate code
6
- * that matches react-spa-scaffold conventions.
7
- */
8
- import { z } from 'zod';
9
- import { getCodeExample, getAvailablePatterns } from '../utils/index.js';
10
- const AVAILABLE_PATTERNS = getAvailablePatterns();
11
- /** Zod schema for get_example input - single source of truth. */
12
- export const getExampleSchema = z.object({
13
- pattern: z.enum(AVAILABLE_PATTERNS, {
14
- error: `Invalid pattern. Available: ${AVAILABLE_PATTERNS.join(', ')}`,
15
- }),
16
- });
17
- export async function getExample(input) {
18
- const { pattern } = input;
19
- const example = await getCodeExample(pattern);
20
- if (!example) {
21
- return {
22
- error: `Could not load example for pattern: ${pattern}`,
23
- hint: 'Ensure MCP server is running from react-spa-scaffold directory',
24
- };
25
- }
26
- return {
27
- pattern: example.pattern,
28
- description: example.description,
29
- filePath: example.filePath,
30
- keyPoints: example.keyPoints,
31
- code: example.code,
32
- usage: generateUsageHint(pattern),
33
- };
34
- }
35
- function generateUsageHint(pattern) {
36
- const hints = {
37
- 'component-ui': 'Place in src/components/ui/ with kebab-case filename',
38
- 'component-shared': 'Create subdirectory in src/components/shared/ with index.ts barrel',
39
- 'component-layout': 'Place in src/components/layout/',
40
- 'hook-state': 'Place in src/hooks/ with useXxx.ts naming',
41
- 'hook-query': 'Place in src/hooks/ - define fetchFn outside hook',
42
- 'hook-form': 'Place in src/hooks/ - import schema from lib/validations',
43
- 'hook-effect': 'Place in src/hooks/ - no return value',
44
- 'zustand-store': 'Place in src/stores/ with xxxStore.ts naming',
45
- 'page-component': 'Place in src/pages/ with XxxPage named export',
46
- 'context-provider': 'Place in src/contexts/ - export both Provider and hook',
47
- 'test-component': 'Co-locate with component: ComponentName.test.tsx next to ComponentName.tsx',
48
- 'test-hook': 'Co-locate with hook: useXxx.test.ts next to useXxx.ts',
49
- 'test-store': 'Co-locate with store: xxxStore.test.ts next to xxxStore.ts',
50
- 'msw-handler': 'Place in src/mocks/handlers/',
51
- 'zod-schema': 'Add to src/lib/validations.ts',
52
- };
53
- return hints[pattern] || 'Follow the file path shown in the example';
54
- }
55
- /** Tool definition derived from Zod schema (Zod v4 native). */
56
- export const getExampleToolDefinition = {
57
- name: 'get_example',
58
- description: `Get real code example for a specific pattern type.
59
-
60
- Returns actual code from the react-spa-scaffold repository, not templates.
61
- Use this to understand exact patterns when generating new files.
62
-
63
- Available patterns:
64
- - Components: component-ui, component-shared, component-layout
65
- - Hooks: hook-state, hook-query, hook-form, hook-effect, use-language-hook
66
- - Store: zustand-store
67
- - Pages: page-component, lazy-page
68
- - Context: context-provider, query-provider
69
- - API: api-client
70
- - Tests: test-component, test-hook, test-store, msw-handler
71
- - Validation: zod-schema, form-error-component
72
- - i18n: trans-component, t-function, language-switcher
73
- - Utils: storage-utility
74
- - Theme: theme-toggle
75
- - SEO: seo-component
76
-
77
- Each example includes:
78
- - Actual working code
79
- - Key points explaining the pattern
80
- - File path where it should be placed`,
81
- inputSchema: z.toJSONSchema(getExampleSchema),
82
- };
83
- //# sourceMappingURL=get-example.js.map
@@ -1 +0,0 @@
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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for get_example tool
3
- */
4
- export {};
5
- //# sourceMappingURL=get-example.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-example.test.d.ts","sourceRoot":"","sources":["../../src/tools/get-example.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,63 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-example.test.js","sourceRoot":"","sources":["../../src/tools/get-example.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { PatternMap } from './types.js';
2
- export declare const apiPatterns: PatternMap;
3
- //# sourceMappingURL=api-patterns.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-patterns.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/api-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,WAAW,EAAE,UAiBzB,CAAC"}
@@ -1,19 +0,0 @@
1
- export const apiPatterns = {
2
- 'api-client': {
3
- file: 'src/lib/api.ts',
4
- description: 'Typed API client with error handling',
5
- keyPoints: [
6
- 'Custom ApiClientError class',
7
- 'Generic request function',
8
- 'AbortController for timeout',
9
- 'Error parsing from response JSON',
10
- 'Methods object (get, post, put, patch, delete)',
11
- ],
12
- },
13
- 'use-query-hook': {
14
- file: 'src/hooks/useExampleQuery.ts',
15
- description: 'TanStack Query data fetching hook',
16
- keyPoints: ['useQuery with typed response', 'queryKey for cache management', 'Separate fetch function'],
17
- },
18
- };
19
- //# sourceMappingURL=api-patterns.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-patterns.js","sourceRoot":"","sources":["../../../src/utils/examples/api-patterns.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAe;IACrC,YAAY,EAAE;QACZ,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,sCAAsC;QACnD,SAAS,EAAE;YACT,6BAA6B;YAC7B,0BAA0B;YAC1B,6BAA6B;YAC7B,kCAAkC;YAClC,gDAAgD;SACjD;KACF;IACD,gBAAgB,EAAE;QAChB,IAAI,EAAE,8BAA8B;QACpC,WAAW,EAAE,mCAAmC;QAChD,SAAS,EAAE,CAAC,8BAA8B,EAAE,+BAA+B,EAAE,yBAAyB,CAAC;KACxG;CACF,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { PatternMap } from './types.js';
2
- export declare const componentPatterns: PatternMap;
3
- //# sourceMappingURL=component-patterns.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"component-patterns.d.ts","sourceRoot":"","sources":["../../../src/utils/examples/component-patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,iBAAiB,EAAE,UAqE/B,CAAC"}