devendra-skill-package 1.0.2

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 (223) hide show
  1. package/.github/skills/boiler-project-generator/SKILL.md +103 -0
  2. package/.github/skills/boiler-project-generator/assets/templates/android/README.md +3 -0
  3. package/.github/skills/boiler-project-generator/assets/templates/angular/README.md +3 -0
  4. package/.github/skills/boiler-project-generator/assets/templates/flutter/README.md +3 -0
  5. package/.github/skills/boiler-project-generator/assets/templates/ios/README.md +3 -0
  6. package/.github/skills/boiler-project-generator/assets/templates/react/README.md +3 -0
  7. package/.github/skills/boiler-project-generator/assets/templates/react-native/README.md +3 -0
  8. package/.github/skills/boiler-project-generator/assets/templates/react-native/api-setup.ts +76 -0
  9. package/.github/skills/boiler-project-generator/assets/templates/react-native/component-primary-button.tsx +29 -0
  10. package/.github/skills/boiler-project-generator/assets/templates/react-native/env-config.env +4 -0
  11. package/.github/skills/boiler-project-generator/assets/templates/react-native/feature-auth-screen.tsx +45 -0
  12. package/.github/skills/boiler-project-generator/assets/templates/react-native/feature-dashboard-screen.tsx +45 -0
  13. package/.github/skills/boiler-project-generator/assets/templates/react-native/feature-profile-screen.tsx +45 -0
  14. package/.github/skills/boiler-project-generator/assets/templates/react-native/hook-use-app-boot.ts +11 -0
  15. package/.github/skills/boiler-project-generator/assets/templates/react-native/navigation-setup.tsx +25 -0
  16. package/.github/skills/boiler-project-generator/assets/templates/react-native/project-structure.md +24 -0
  17. package/.github/skills/boiler-project-generator/assets/templates/react-native/redux-hooks.ts +5 -0
  18. package/.github/skills/boiler-project-generator/assets/templates/react-native/redux-session-slice.ts +29 -0
  19. package/.github/skills/boiler-project-generator/assets/templates/react-native/redux-store.ts +15 -0
  20. package/.github/skills/boiler-project-generator/assets/templates/react-native/theme-index.ts +23 -0
  21. package/.github/skills/boiler-project-generator/assets/templates/react-native/utils-helpers.ts +7 -0
  22. package/.github/skills/boiler-project-generator/metadata.yaml +29 -0
  23. package/.github/skills/boiler-project-generator/references/android.md +19 -0
  24. package/.github/skills/boiler-project-generator/references/angular.md +14 -0
  25. package/.github/skills/boiler-project-generator/references/flutter.md +17 -0
  26. package/.github/skills/boiler-project-generator/references/ios.md +17 -0
  27. package/.github/skills/boiler-project-generator/references/react-native.md +103 -0
  28. package/.github/skills/boiler-project-generator/references/react.md +17 -0
  29. package/.github/skills/boiler-project-generator/scripts/angular.js +43 -0
  30. package/.github/skills/boiler-project-generator/scripts/generate-project.mjs +107 -0
  31. package/.github/skills/boiler-project-generator/scripts/init.js +105 -0
  32. package/.github/skills/boiler-project-generator/scripts/react-native.js +1041 -0
  33. package/.github/skills/boiler-project-generator/scripts/react.js +32 -0
  34. package/.github/skills/clean-architecture-generator/SKILL.md +235 -0
  35. package/.github/skills/clean-architecture-generator/references/architecture-core.md +126 -0
  36. package/.github/skills/clean-architecture-generator/references/platform-angular.md +374 -0
  37. package/.github/skills/clean-architecture-generator/references/platform-flutter.md +366 -0
  38. package/.github/skills/clean-architecture-generator/references/platform-react-native.md +590 -0
  39. package/.github/skills/clean-architecture-generator/references/platform-react.md +261 -0
  40. package/.github/skills/code-test-coverage-analyzer/SKILL.md +1358 -0
  41. package/.github/skills/code-test-coverage-analyzer/assets/config-questionnaire.md +118 -0
  42. package/.github/skills/code-test-coverage-analyzer/assets/conflict-resolution-protocol.md +99 -0
  43. package/.github/skills/code-test-coverage-analyzer/assets/coverage-calculation-rules.md +294 -0
  44. package/.github/skills/code-test-coverage-analyzer/assets/multi-strategy-search.md +145 -0
  45. package/.github/skills/code-test-coverage-analyzer/assets/output-file-contracts.md +651 -0
  46. package/.github/skills/code-test-coverage-analyzer/assets/status-definitions.md +273 -0
  47. package/.github/skills/code-test-coverage-analyzer/examples/example-invocation.md +208 -0
  48. package/.github/skills/code-test-coverage-analyzer/references/android-patterns.md +229 -0
  49. package/.github/skills/code-test-coverage-analyzer/references/angular-patterns.md +177 -0
  50. package/.github/skills/code-test-coverage-analyzer/references/backend-patterns.md +383 -0
  51. package/.github/skills/code-test-coverage-analyzer/references/flutter-patterns.md +254 -0
  52. package/.github/skills/code-test-coverage-analyzer/references/ios-patterns.md +228 -0
  53. package/.github/skills/code-test-coverage-analyzer/references/react-native-patterns.md +431 -0
  54. package/.github/skills/code-test-coverage-analyzer/references/react-patterns.md +206 -0
  55. package/.github/skills/code-test-coverage-analyzer/scripts/detect-platform.ps1 +261 -0
  56. package/.github/skills/code-test-coverage-analyzer/scripts/scan-repository.ps1 +242 -0
  57. package/.github/skills/code-test-coverage-analyzer/templates/brd-compliance-row.md +107 -0
  58. package/.github/skills/code-test-coverage-analyzer/templates/test-case-row.md +130 -0
  59. package/.github/skills/code-test-coverage-analyzer/templates/user-story-compliance-row.md +170 -0
  60. package/.github/skills/custom-font-integrator/SKILL.md +373 -0
  61. package/.github/skills/custom-font-integrator/assets/FontTestScreen.js +150 -0
  62. package/.github/skills/custom-font-integrator/references/example-info-plist.xml +21 -0
  63. package/.github/skills/custom-font-integrator/scripts/setup-fonts.sh +99 -0
  64. package/.github/skills/encryption-decryption-utility/Instructions.md +282 -0
  65. package/.github/skills/encryption-decryption-utility/README.md +222 -0
  66. package/.github/skills/encryption-decryption-utility/SKILL.md +645 -0
  67. package/.github/skills/encryption-decryption-utility/assets/encryption-config-template.json +13 -0
  68. package/.github/skills/encryption-decryption-utility/assets/platform-matrix.json +180 -0
  69. package/.github/skills/encryption-decryption-utility/metadata.yaml +51 -0
  70. package/.github/skills/encryption-decryption-utility/references/android-crypto.md +157 -0
  71. package/.github/skills/encryption-decryption-utility/references/angular-crypto.md +130 -0
  72. package/.github/skills/encryption-decryption-utility/references/approach-1-webcrypto.md +95 -0
  73. package/.github/skills/encryption-decryption-utility/references/approach-2-rsa-aes-cbc.md +111 -0
  74. package/.github/skills/encryption-decryption-utility/references/approach-3-aes-sharedkey.md +114 -0
  75. package/.github/skills/encryption-decryption-utility/references/architecture.md +233 -0
  76. package/.github/skills/encryption-decryption-utility/references/backend-alignment.md +506 -0
  77. package/.github/skills/encryption-decryption-utility/references/dependency-guidance.md +234 -0
  78. package/.github/skills/encryption-decryption-utility/references/ec-implementation.md +832 -0
  79. package/.github/skills/encryption-decryption-utility/references/error-handling-playbook.md +234 -0
  80. package/.github/skills/encryption-decryption-utility/references/flutter-crypto.md +105 -0
  81. package/.github/skills/encryption-decryption-utility/references/ios-crypto.md +338 -0
  82. package/.github/skills/encryption-decryption-utility/references/native-rsa-implementation.md +373 -0
  83. package/.github/skills/encryption-decryption-utility/references/node-crypto.md +86 -0
  84. package/.github/skills/encryption-decryption-utility/references/react-crypto.md +105 -0
  85. package/.github/skills/encryption-decryption-utility/references/react-native-crypto.md +1001 -0
  86. package/.github/skills/encryption-decryption-utility/references/react-web-crypto.md +668 -0
  87. package/.github/skills/encryption-decryption-utility/references/security-checklist.md +176 -0
  88. package/.github/skills/encryption-decryption-utility/references/web-crypto.md +74 -0
  89. package/.github/skills/encryption-decryption-utility/scripts/detect.js +128 -0
  90. package/.github/skills/encryption-decryption-utility/scripts/install.js +1713 -0
  91. package/.github/skills/encryption-decryption-utility/scripts/setup.js +800 -0
  92. package/.github/skills/encryption-decryption-utility/template.md +241 -0
  93. package/.github/skills/encryption-decryption-utility/templates/config-questionnaire.md +467 -0
  94. package/.github/skills/encryption-decryption-utility/templates/delivery-checklist.md +206 -0
  95. package/.github/skills/encryption-decryption-utility/templates/implementation-plan.md +304 -0
  96. package/.github/skills/feature-generator/SKILL.MD +2741 -0
  97. package/.github/skills/feature-generator/assets/fingerprint-schema.json +385 -0
  98. package/.github/skills/feature-generator/assets/spec-template.md +172 -0
  99. package/.github/skills/feature-generator/assets/transform-rules.json +82 -0
  100. package/.github/skills/feature-generator/references/api-envelope-patterns.md +327 -0
  101. package/.github/skills/feature-generator/references/screen-logic-patterns.md +399 -0
  102. package/.github/skills/feature-generator/references/state-library-patterns.md +464 -0
  103. package/.github/skills/figma-ui-mapper/README.md +34 -0
  104. package/.github/skills/figma-ui-mapper/SKILL.md +101 -0
  105. package/.github/skills/figma-ui-mapper/assets/templates/component-map-template.md +30 -0
  106. package/.github/skills/figma-ui-mapper/assets/templates/generation-report-template.md +49 -0
  107. package/.github/skills/figma-ui-mapper/metadata.yaml +22 -0
  108. package/.github/skills/figma-ui-mapper/references/android.md +11 -0
  109. package/.github/skills/figma-ui-mapper/references/angular.md +18 -0
  110. package/.github/skills/figma-ui-mapper/references/capacitor.md +18 -0
  111. package/.github/skills/figma-ui-mapper/references/common.md +23 -0
  112. package/.github/skills/figma-ui-mapper/references/expo.md +18 -0
  113. package/.github/skills/figma-ui-mapper/references/flutter.md +18 -0
  114. package/.github/skills/figma-ui-mapper/references/frameworks/angular/rules.md +23 -0
  115. package/.github/skills/figma-ui-mapper/references/frameworks/capacitor/rules.md +23 -0
  116. package/.github/skills/figma-ui-mapper/references/frameworks/expo/rules.md +23 -0
  117. package/.github/skills/figma-ui-mapper/references/frameworks/flutter/rules.md +23 -0
  118. package/.github/skills/figma-ui-mapper/references/frameworks/ionic/rules.md +23 -0
  119. package/.github/skills/figma-ui-mapper/references/frameworks/kotlin-multiplatform/rules.md +23 -0
  120. package/.github/skills/figma-ui-mapper/references/frameworks/native-android/rules.md +23 -0
  121. package/.github/skills/figma-ui-mapper/references/frameworks/native-ios/rules.md +23 -0
  122. package/.github/skills/figma-ui-mapper/references/frameworks/next/rules.md +23 -0
  123. package/.github/skills/figma-ui-mapper/references/frameworks/nuxt/rules.md +23 -0
  124. package/.github/skills/figma-ui-mapper/references/frameworks/react/rules.md +19 -0
  125. package/.github/skills/figma-ui-mapper/references/frameworks/react-native/rules.md +23 -0
  126. package/.github/skills/figma-ui-mapper/references/frameworks/svelte/rules.md +23 -0
  127. package/.github/skills/figma-ui-mapper/references/frameworks/vue/rules.md +23 -0
  128. package/.github/skills/figma-ui-mapper/references/ionic.md +18 -0
  129. package/.github/skills/figma-ui-mapper/references/ios.md +11 -0
  130. package/.github/skills/figma-ui-mapper/references/kotlin-multiplatform.md +18 -0
  131. package/.github/skills/figma-ui-mapper/references/native-android.md +18 -0
  132. package/.github/skills/figma-ui-mapper/references/native-ios.md +18 -0
  133. package/.github/skills/figma-ui-mapper/references/next.md +18 -0
  134. package/.github/skills/figma-ui-mapper/references/nuxt.md +18 -0
  135. package/.github/skills/figma-ui-mapper/references/react-figma-guideline.md +21 -0
  136. package/.github/skills/figma-ui-mapper/references/react-native.md +18 -0
  137. package/.github/skills/figma-ui-mapper/references/react.md +18 -0
  138. package/.github/skills/figma-ui-mapper/references/script-usage.md +46 -0
  139. package/.github/skills/figma-ui-mapper/references/svelte.md +18 -0
  140. package/.github/skills/figma-ui-mapper/references/vue.md +18 -0
  141. package/.github/skills/figma-ui-mapper/references/workflow.md +74 -0
  142. package/.github/skills/figma-ui-mapper/scripts/generate-page-through-figma.js +635 -0
  143. package/.github/skills/figma-ui-mapper/scripts/generate-react-page-through-figma.js +4 -0
  144. package/.github/skills/frontend-task-breakdown/SKILL.md +734 -0
  145. package/.github/skills/md-file-converter/SKILL.md +291 -0
  146. package/.github/skills/md-file-converter/config/formats.json +114 -0
  147. package/.github/skills/md-file-converter/extractors/extract-docx.sh +120 -0
  148. package/.github/skills/md-file-converter/extractors/extract-eml.py +108 -0
  149. package/.github/skills/md-file-converter/extractors/extract-pdf.sh +97 -0
  150. package/.github/skills/md-file-converter/extractors/extract-pptx.py +143 -0
  151. package/.github/skills/md-file-converter/extractors/extract-xlsx.py +175 -0
  152. package/.github/skills/md-file-converter/scripts/check-tools.sh +47 -0
  153. package/.github/skills/md-file-converter/scripts/extract-archive.sh +83 -0
  154. package/.github/skills/md-file-converter/scripts/extract-ocr.sh +77 -0
  155. package/.github/skills/md-file-converter/scripts/get-metadata.sh +57 -0
  156. package/.github/skills/md-file-converter/templates/output.md +73 -0
  157. package/.github/skills/md-file-converter/templates/unsupported-object.md +6 -0
  158. package/.github/skills/mockAPI-contract-generator/SKILL.md +607 -0
  159. package/.github/skills/test-case-validator/CHANGELOG.md +155 -0
  160. package/.github/skills/test-case-validator/CONFIGURATION.md +130 -0
  161. package/.github/skills/test-case-validator/EXAMPLES.md +50 -0
  162. package/.github/skills/test-case-validator/QUALITY_SCORING.md +98 -0
  163. package/.github/skills/test-case-validator/README.md +111 -0
  164. package/.github/skills/test-case-validator/REPORT_TEMPLATE.md +116 -0
  165. package/.github/skills/test-case-validator/SKILL.md +209 -0
  166. package/.github/skills/test-case-validator/SYSTEM_PROMPT.md +127 -0
  167. package/.github/skills/test-case-validator/TRACEABILITY_ENGINE.md +152 -0
  168. package/.github/skills/test-case-validator/VALIDATION_RULES.md +411 -0
  169. package/.github/skills/test-case-validator/config/default.config.yaml +62 -0
  170. package/.github/skills/test-case-validator/docs/ARCHITECTURE.md +66 -0
  171. package/.github/skills/test-case-validator/docs/EXTENDING.md +85 -0
  172. package/.github/skills/test-case-validator/docs/FAQ.md +88 -0
  173. package/.github/skills/test-case-validator/docs/VERSIONING.md +55 -0
  174. package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/input-brd.md +43 -0
  175. package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/input-test-cases.csv +9 -0
  176. package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/input-user-story.md +29 -0
  177. package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/output-report.md +303 -0
  178. package/.github/skills/test-case-validator/examples/example-2-automated-frontend-suite/input-spec.md +43 -0
  179. package/.github/skills/test-case-validator/examples/example-2-automated-frontend-suite/input-test-files-index.md +56 -0
  180. package/.github/skills/test-case-validator/examples/example-2-automated-frontend-suite/output-report.md +274 -0
  181. package/.github/skills/test-case-validator/prompts/00-applicability-resolution.md +61 -0
  182. package/.github/skills/test-case-validator/prompts/01-extraction-user-story.md +58 -0
  183. package/.github/skills/test-case-validator/prompts/02-extraction-brd.md +64 -0
  184. package/.github/skills/test-case-validator/prompts/03-extraction-test-cases.md +92 -0
  185. package/.github/skills/test-case-validator/prompts/04-traceability-matrix.md +41 -0
  186. package/.github/skills/test-case-validator/prompts/05-coverage-analysis.md +46 -0
  187. package/.github/skills/test-case-validator/prompts/06-missing-scenario-detection.md +32 -0
  188. package/.github/skills/test-case-validator/prompts/07-duplicate-detection.md +36 -0
  189. package/.github/skills/test-case-validator/prompts/08-risk-analysis.md +39 -0
  190. package/.github/skills/test-case-validator/prompts/09-gated-wiring-validation.md +53 -0
  191. package/.github/skills/test-case-validator/prompts/10-observation-report.md +56 -0
  192. package/.github/skills/test-case-validator/prompts/11-final-report-assembly.md +57 -0
  193. package/.github/skills/test-case-validator/templates/coverage-table.md +25 -0
  194. package/.github/skills/test-case-validator/templates/executive-summary.md +38 -0
  195. package/.github/skills/test-case-validator/templates/final-summary-block.md +87 -0
  196. package/.github/skills/test-case-validator/templates/observation-entry.md +41 -0
  197. package/.github/skills/test-case-validator/templates/rtm-row.md +25 -0
  198. package/.github/skills/validation-engine-builder/README.md +50 -0
  199. package/.github/skills/validation-engine-builder/SKILL.md +241 -0
  200. package/.github/skills/validation-engine-builder/references/core.md +158 -0
  201. package/.github/skills/validation-engine-builder/references/platform-angular.md +166 -0
  202. package/.github/skills/validation-engine-builder/references/platform-flutter.md +118 -0
  203. package/.github/skills/validation-engine-builder/references/platform-react-native.md +170 -0
  204. package/.github/skills/validation-engine-builder/references/platform-react.md +94 -0
  205. package/.github/skills/validation-engine-builder/scripts/apply-to-project.js +80 -0
  206. package/.github/skills/validation-engine-builder/scripts/generate-angular.js +271 -0
  207. package/.github/skills/validation-engine-builder/scripts/generate-flutter.js +298 -0
  208. package/.github/skills/validation-engine-builder/scripts/generate-react-native.js +217 -0
  209. package/.github/skills/validation-engine-builder/scripts/generate-react.js +163 -0
  210. package/.github/skills/validation-engine-builder/scripts/install-deps.js +53 -0
  211. package/.github/skills/validation-engine-builder/scripts/shared/detect-platform.js +68 -0
  212. package/.github/skills/validation-engine-builder/scripts/shared/npm-deps.js +103 -0
  213. package/.github/skills/validation-engine-builder/scripts/shared/rhf-hook.js +43 -0
  214. package/.github/skills/validation-engine-builder/scripts/shared/ts-messages-regex.js +62 -0
  215. package/.github/skills/validation-engine-builder/scripts/shared/util.js +44 -0
  216. package/.github/skills/validation-engine-builder/scripts/shared/yup-schemas.js +80 -0
  217. package/.github/skills/validation-engine-builder/template.md +73 -0
  218. package/.github/skills/validation-engine-builder/templates/messages.json +22 -0
  219. package/.github/skills/validation-engine-builder/templates/regex.json +16 -0
  220. package/.github/skills/validation-engine-builder/templates/schemas.json +48 -0
  221. package/bin/index.js +145 -0
  222. package/package.json +22 -0
  223. package/readme.md +0 -0
@@ -0,0 +1,464 @@
1
+ # State Library Patterns Reference
2
+
3
+ Used by Phase 5 of feature-generator to generate the state layer.
4
+ Select the section matching `fingerprint.stateLib`.
5
+
6
+ Phase 5.1 (Redux Toolkit) is fully detailed in SKILL.MD. This file covers:
7
+ - Redux Toolkit direct-import pattern (alternative to thunk-extra)
8
+ - Zustand
9
+ - MobX
10
+ - Context API
11
+
12
+ ---
13
+
14
+ ## Redux Toolkit — thunk-extra pattern
15
+
16
+ **When**: `fingerprint.stateLib = "redux-toolkit"` AND `fingerprint.thunkPattern = "thunk-extra"`
17
+
18
+ See SKILL.MD Phase 5.1. This is the primary RTK pattern. Use cases are injected
19
+ via `{ extra }` in the thunk. The store config file wires them as `extraArgument`.
20
+
21
+ ### Reducer key constraint
22
+
23
+ The new slice name MUST NOT collide with existing keys in `fingerprint.reducerMapKeys`.
24
+ If `reducerKey` is already taken, append a suffix: `<reducerKey>Feature`.
25
+
26
+ ### DI instruction comment (always add to diBootstrap.ts)
27
+
28
+ ```typescript
29
+ // To activate this feature:
30
+ // In <fingerprint.storeConfigFile>, add to middleware extraArgument:
31
+ //
32
+ // fetch<ScreenName>UseCase: fetch<ScreenName>UseCase
33
+ //
34
+ // Then add the reducer to the configureStore reducer map:
35
+ //
36
+ // <reducerKey>: <sliceName>Reducer
37
+ ```
38
+
39
+ ---
40
+
41
+ ## Redux Toolkit — direct-import pattern
42
+
43
+ **When**: `fingerprint.stateLib = "redux-toolkit"` AND `fingerprint.thunkPattern = "direct-import"`
44
+
45
+ The use case instance is imported directly into the slice file. No `extra` argument is used.
46
+
47
+ ### Slice template
48
+
49
+ ```typescript
50
+ import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
51
+ import type { PayloadAction } from '@reduxjs/toolkit'; // only when slice uses PayloadAction in reducers
52
+ import type { <ScreenName>Item } from '<relative-path-to-domainModel>';
53
+ // Direct import — no thunk-extra injection
54
+ import { fetch<ScreenName>UseCase } from '<relative-path-to-diBootstrap>';
55
+
56
+ export interface <ScreenName>State {
57
+ items: <ScreenName>Item[];
58
+ isLoading: boolean;
59
+ isRefreshing: boolean;
60
+ error: string | null;
61
+ isAuthError: boolean;
62
+ }
63
+
64
+ const initialState: <ScreenName>State = {
65
+ items: [],
66
+ isLoading: false,
67
+ isRefreshing: false,
68
+ error: null,
69
+ isAuthError: false,
70
+ };
71
+
72
+ export const fetch<ScreenName>Thunk = createAsyncThunk(
73
+ '<sliceName>/fetch',
74
+ async (params: { clientCode: number; sessionId: string }, { rejectWithValue }) => {
75
+ try {
76
+ // No 'extra' — use case imported directly above
77
+ const result = await fetch<ScreenName>UseCase.execute(params);
78
+ if (!result.ok) {
79
+ return rejectWithValue({ message: result.error ?? 'Unknown error', isAuthError: false });
80
+ }
81
+ return result.data;
82
+ } catch (err: unknown) {
83
+ const apiErr = err as { statusCode?: number; message?: string };
84
+ return rejectWithValue({
85
+ message: apiErr.message ?? 'Unexpected error',
86
+ isAuthError: apiErr.statusCode === 401,
87
+ });
88
+ }
89
+ },
90
+ );
91
+
92
+ const <sliceName>Slice = createSlice({
93
+ name: '<sliceName>',
94
+ initialState,
95
+ reducers: {
96
+ reset<ScreenName>: () => initialState,
97
+ },
98
+ extraReducers: (builder) => {
99
+ builder
100
+ .addCase(fetch<ScreenName>Thunk.pending, (state) => {
101
+ state.isLoading = true;
102
+ state.error = null;
103
+ state.isAuthError = false;
104
+ })
105
+ .addCase(fetch<ScreenName>Thunk.fulfilled, (state, action) => {
106
+ state.isLoading = false;
107
+ state.items = action.payload ?? [];
108
+ })
109
+ .addCase(fetch<ScreenName>Thunk.rejected, (state, action) => {
110
+ state.isLoading = false;
111
+ const payload = action.payload as { message: string; isAuthError: boolean };
112
+ state.error = payload?.message ?? 'Failed to load';
113
+ state.isAuthError = payload?.isAuthError ?? false;
114
+ });
115
+ },
116
+ });
117
+
118
+ export const { reset<ScreenName> } = <sliceName>Slice.actions;
119
+ export default <sliceName>Slice.reducer;
120
+ ```
121
+
122
+ ### Notes
123
+
124
+ - The diBootstrap.ts exports the use case instance that is imported here.
125
+ - This pattern creates a circular-dependency risk if the diBootstrap also imports from the slice.
126
+ If detected, switch to thunk-extra and log a WARN.
127
+
128
+ ---
129
+
130
+ ## Zustand
131
+
132
+ **When**: `fingerprint.stateLib = "zustand"`
133
+
134
+ Detect the Zustand version from package.json (`"zustand": "^4.x"` vs `"^5.x"`).
135
+ Read 1-2 existing store files to determine whether the project uses:
136
+ - Slice pattern (multiple `create()` calls combined)
137
+ - Single store (one `create()` with nested state)
138
+ - Immer middleware
139
+
140
+ ### Single store template (v4, no immer)
141
+
142
+ ```typescript
143
+ import { create } from 'zustand';
144
+ import type { <ScreenName>Item } from '<relative-path-to-domainModel>';
145
+ import { fetch<ScreenName>UseCase } from '<relative-path-to-diBootstrap>';
146
+
147
+ export interface <ScreenName>Store {
148
+ items: <ScreenName>Item[];
149
+ isLoading: boolean;
150
+ error: string | null;
151
+ fetch<ScreenName>: (params: { clientCode: number; sessionId: string }) => Promise<void>;
152
+ reset: () => void;
153
+ }
154
+
155
+ const initialState = {
156
+ items: [] as <ScreenName>Item[],
157
+ isLoading: false,
158
+ error: null as string | null,
159
+ };
160
+
161
+ export const use<ScreenName>Store = create<<ScreenName>Store>()((set) => ({
162
+ ...initialState,
163
+
164
+ fetch<ScreenName>: async (params) => {
165
+ set({ isLoading: true, error: null });
166
+ try {
167
+ // ----- result-wrapper (fingerprint.returnTypeStyle = "result-wrapper") -----
168
+ const result = await fetch<ScreenName>UseCase.execute(params);
169
+ if (!result.ok) {
170
+ set({ isLoading: false, error: result.error ?? 'Failed to load' });
171
+ return;
172
+ }
173
+ set({ isLoading: false, items: result.data ?? [] });
174
+
175
+ // ----- custom-type (fingerprint.returnTypeStyle = "custom-type") -----
176
+ // const result = await fetch<ScreenName>UseCase.execute(params);
177
+ // set({ isLoading: false, items: result.<primaryField> ?? [] });
178
+
179
+ // ----- direct-promise (fingerprint.returnTypeStyle = "direct-promise") -----
180
+ // const items = await fetch<ScreenName>UseCase.execute(params);
181
+ // set({ isLoading: false, items });
182
+ } catch (err: unknown) {
183
+ const apiErr = err as { message?: string };
184
+ set({ isLoading: false, error: apiErr.message ?? 'Unexpected error' });
185
+ }
186
+ },
187
+
188
+ reset: () => set(initialState),
189
+ }));
190
+ ```
191
+
192
+ ### Single store template (v4, with immer middleware)
193
+
194
+ If existing stores use `immer`, wrap `create` with the immer middleware:
195
+
196
+ ```typescript
197
+ import { create } from 'zustand';
198
+ import { immer } from 'zustand/middleware/immer';
199
+ // ... rest same as above but use draft mutations inside set callbacks
200
+ ```
201
+
202
+ ### Slice pattern (v4)
203
+
204
+ > `<screenNameCamelCase>` = camelCase of the screen name (e.g. `TransactionHistory` → `transactionHistory`).
205
+ > Use this as a property prefix to avoid collisions when multiple slices share a single Zustand store.
206
+
207
+ If the project combines multiple slices, generate a slice function and merge:
208
+
209
+ ```typescript
210
+ import type { StateCreator } from 'zustand';
211
+ import type { <ScreenName>Item } from '<relative-path-to-domainModel>';
212
+
213
+ export interface <ScreenName>Slice {
214
+ <screenNameCamelCase>Items: <ScreenName>Item[];
215
+ <screenNameCamelCase>Loading: boolean;
216
+ <screenNameCamelCase>Error: string | null;
217
+ fetch<ScreenName>: (params: { clientCode: number; sessionId: string }) => Promise<void>;
218
+ }
219
+
220
+ export const create<ScreenName>Slice: StateCreator<<ScreenName>Slice> = (set) => ({
221
+ <screenNameCamelCase>Items: [],
222
+ <screenNameCamelCase>Loading: false,
223
+ <screenNameCamelCase>Error: null,
224
+
225
+ fetch<ScreenName>: async (params) => {
226
+ set({ <screenNameCamelCase>Loading: true, <screenNameCamelCase>Error: null });
227
+ // ... same async logic
228
+ },
229
+ });
230
+ ```
231
+
232
+ ### Selector pattern for Zustand
233
+
234
+ Do NOT generate a separate selectors file for Zustand.
235
+ Selectors are inline in the component using `use<ScreenName>Store`:
236
+
237
+ ```typescript
238
+ // In the screen component:
239
+ const items = use<ScreenName>Store((state) => state.items);
240
+ const isLoading = use<ScreenName>Store((state) => state.isLoading);
241
+ ```
242
+
243
+ ---
244
+
245
+ ## MobX
246
+
247
+ **When**: `fingerprint.stateLib = "mobx"`
248
+
249
+ Detect whether the project uses `makeAutoObservable` (MobX 6+) or `@observable`
250
+ decorators (MobX 4/5 with legacy decorator support).
251
+
252
+ ### Store class template (MobX 6 — makeAutoObservable)
253
+
254
+ ```typescript
255
+ import { makeAutoObservable, runInAction } from 'mobx';
256
+ import type { <ScreenName>Item } from '<relative-path-to-domainModel>';
257
+ import { fetch<ScreenName>UseCase } from '<relative-path-to-diBootstrap>';
258
+
259
+ export class <ScreenName>Store {
260
+ items: <ScreenName>Item[] = [];
261
+ isLoading = false;
262
+ error: string | null = null;
263
+
264
+ constructor() {
265
+ makeAutoObservable(this);
266
+ }
267
+
268
+ async fetch<ScreenName>(params: { clientCode: number; sessionId: string }): Promise<void> {
269
+ this.isLoading = true;
270
+ this.error = null;
271
+ try {
272
+ // ----- result-wrapper (fingerprint.returnTypeStyle = "result-wrapper") -----
273
+ const result = await fetch<ScreenName>UseCase.execute(params);
274
+ runInAction(() => {
275
+ if (!result.ok) {
276
+ this.error = result.error ?? 'Failed to load';
277
+ } else {
278
+ this.items = result.data ?? [];
279
+ }
280
+ this.isLoading = false;
281
+ });
282
+
283
+ // ----- custom-type (fingerprint.returnTypeStyle = "custom-type") -----
284
+ // const result = await fetch<ScreenName>UseCase.execute(params);
285
+ // runInAction(() => { this.items = result.<primaryField> ?? []; this.isLoading = false; });
286
+
287
+ // ----- direct-promise (fingerprint.returnTypeStyle = "direct-promise") -----
288
+ // const items = await fetch<ScreenName>UseCase.execute(params);
289
+ // runInAction(() => { this.items = items; this.isLoading = false; });
290
+ } catch (err: unknown) {
291
+ runInAction(() => {
292
+ const apiErr = err as { message?: string };
293
+ this.error = apiErr.message ?? 'Unexpected error';
294
+ this.isLoading = false;
295
+ });
296
+ }
297
+ }
298
+
299
+ reset(): void {
300
+ this.items = [];
301
+ this.isLoading = false;
302
+ this.error = null;
303
+ }
304
+ }
305
+
306
+ export const <screenNameCamelCase>Store = new <ScreenName>Store();
307
+ ```
308
+
309
+ ### Notes for MobX
310
+
311
+ - Do NOT generate a Redux slice, selectors file, or thunk.
312
+ - The screen component accesses store via the singleton exported above, wrapped in `observer()`.
313
+ - Do NOT generate a separate selectors file — computed values are class getters:
314
+
315
+ ```typescript
316
+ get hasItems(): boolean {
317
+ return this.items.length > 0;
318
+ }
319
+ ```
320
+
321
+ ---
322
+
323
+ ## Context API
324
+
325
+ **When**: `fingerprint.stateLib = "context-api"`
326
+
327
+ Detect whether the project uses `useReducer + createContext` or `useState + createContext`.
328
+ Read existing context files before generating.
329
+
330
+ ### useReducer + createContext template
331
+
332
+ ```typescript
333
+ import React, { createContext, useContext, useReducer, type ReactNode } from 'react';
334
+ import type { <ScreenName>Item } from '<relative-path-to-domainModel>';
335
+ import { fetch<ScreenName>UseCase } from '<relative-path-to-diBootstrap>';
336
+
337
+ // ---- State shape ----
338
+
339
+ interface <ScreenName>State {
340
+ items: <ScreenName>Item[];
341
+ isLoading: boolean;
342
+ error: string | null;
343
+ }
344
+
345
+ const initialState: <ScreenName>State = {
346
+ items: [],
347
+ isLoading: false,
348
+ error: null,
349
+ };
350
+
351
+ // ---- Actions ----
352
+
353
+ type <ScreenName>Action =
354
+ | { type: 'FETCH_START' }
355
+ | { type: 'FETCH_SUCCESS'; payload: <ScreenName>Item[] }
356
+ | { type: 'FETCH_ERROR'; payload: string }
357
+ | { type: 'RESET' };
358
+
359
+ // ---- Reducer ----
360
+
361
+ function <screenNameCamelCase>Reducer(
362
+ state: <ScreenName>State,
363
+ action: <ScreenName>Action,
364
+ ): <ScreenName>State {
365
+ switch (action.type) {
366
+ case 'FETCH_START':
367
+ return { ...state, isLoading: true, error: null };
368
+ case 'FETCH_SUCCESS':
369
+ return { ...state, isLoading: false, items: action.payload };
370
+ case 'FETCH_ERROR':
371
+ return { ...state, isLoading: false, error: action.payload };
372
+ case 'RESET':
373
+ return initialState;
374
+ default:
375
+ return state;
376
+ }
377
+ }
378
+
379
+ // ---- Context ----
380
+
381
+ interface <ScreenName>ContextValue {
382
+ state: <ScreenName>State;
383
+ fetch<ScreenName>: (params: { clientCode: number; sessionId: string }) => Promise<void>;
384
+ reset: () => void;
385
+ }
386
+
387
+ const <ScreenName>Context = createContext<<ScreenName>ContextValue | null>(null);
388
+
389
+ // ---- Provider ----
390
+
391
+ export function <ScreenName>Provider({ children }: { children: ReactNode }): React.JSX.Element {
392
+ const [state, dispatch] = useReducer(<screenNameCamelCase>Reducer, initialState);
393
+
394
+ async function fetch<ScreenName>(params: { clientCode: number; sessionId: string }): Promise<void> {
395
+ dispatch({ type: 'FETCH_START' });
396
+ try {
397
+ // ----- result-wrapper (fingerprint.returnTypeStyle = "result-wrapper") -----
398
+ const result = await fetch<ScreenName>UseCase.execute(params);
399
+ if (!result.ok) {
400
+ dispatch({ type: 'FETCH_ERROR', payload: result.error ?? 'Failed to load' });
401
+ return;
402
+ }
403
+ dispatch({ type: 'FETCH_SUCCESS', payload: result.data ?? [] });
404
+
405
+ // ----- custom-type (fingerprint.returnTypeStyle = "custom-type") -----
406
+ // const result = await fetch<ScreenName>UseCase.execute(params);
407
+ // dispatch({ type: 'FETCH_SUCCESS', payload: result.<primaryField> ?? [] });
408
+
409
+ // ----- direct-promise (fingerprint.returnTypeStyle = "direct-promise") -----
410
+ // const items = await fetch<ScreenName>UseCase.execute(params);
411
+ // dispatch({ type: 'FETCH_SUCCESS', payload: items });
412
+ } catch (err: unknown) {
413
+ const apiErr = err as { message?: string };
414
+ dispatch({ type: 'FETCH_ERROR', payload: apiErr.message ?? 'Unexpected error' });
415
+ }
416
+ }
417
+
418
+ function reset(): void {
419
+ dispatch({ type: 'RESET' });
420
+ }
421
+
422
+ return (
423
+ <{ScreenName}Context.Provider value={{ state, fetch<ScreenName>, reset }}>
424
+ {children}
425
+ </{ScreenName}Context.Provider>
426
+ );
427
+ }
428
+
429
+ // ---- Hook ----
430
+
431
+ export function use<ScreenName>Context(): <ScreenName>ContextValue {
432
+ const ctx = useContext(<ScreenName>Context);
433
+ if (ctx === null) {
434
+ throw new Error('use<ScreenName>Context must be used within <ScreenName>Provider');
435
+ }
436
+ return ctx;
437
+ }
438
+ ```
439
+
440
+ ### Notes for Context API
441
+
442
+ - Do NOT generate a Redux slice or thunk.
443
+ - Do NOT generate a selectors file.
444
+ - The screen component wraps in `<ScreenName>Provider>` and accesses state via
445
+ `use<ScreenName>Context()`.
446
+ - Add a note in the output summary that the user must wrap the screen (or its parent navigator)
447
+ with the Provider.
448
+
449
+ ---
450
+
451
+ ## State fields from screenLogic — all patterns
452
+
453
+ The following screenLogic phrases map to additional state fields regardless of state lib:
454
+
455
+ | screenLogic phrase | Additional state field | Reducer/setter |
456
+ |---|---|---|
457
+ | "filter by category" | `filter: string` | `setFilter` action / setter |
458
+ | "sortable by field" | `sortOrder: 'asc' \| 'desc'`, `sortField: string` | `setSortOrder`, `setSortField` |
459
+ | "selected item detail" | `selectedItemId: string \| null` | `setSelectedItemId` |
460
+ | "tab switcher" | `activeTab: string` | `setActiveTab` |
461
+ | "pagination" | `page: number`, `hasMore: boolean` | `setPage`, `appendItems` |
462
+ | "search query" | `searchQuery: string` | `setSearchQuery` |
463
+ | "date range filter" | `fromDate: string`, `toDate: string` | `setDateRange` |
464
+ | "family flag toggle" | `familyFlag: 0 \| 1` | `setFamilyFlag` |
@@ -0,0 +1,34 @@
1
+ # figma-ui-mapper
2
+
3
+ Framework-agnostic Figma-to-code generation skill.
4
+
5
+ ## Supported Frameworks
6
+ - react
7
+ - react-native
8
+ - flutter
9
+ - angular
10
+ - vue
11
+ - next
12
+ - nuxt
13
+ - svelte
14
+ - expo
15
+ - native-android
16
+ - native-ios
17
+ - kotlin-multiplatform
18
+ - ionic
19
+ - capacitor
20
+
21
+ ## Entrypoints
22
+ - node ./scripts/generate-page-through-figma.js
23
+ - node ./scripts/generate-react-page-through-figma.js
24
+
25
+ ## Core Workflow
26
+ See references/workflow.md.
27
+
28
+ ## Script Help
29
+ Run with --help for CLI options.
30
+
31
+ ## Outputs
32
+ Script scaffolding writes to target project:
33
+ - .figma-ui-mapper/reports/
34
+ - .figma-ui-mapper/artifacts/
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: figma-ui-mapper
3
+ description: Framework-agnostic Figma-to-code generation skill that detects target project and framework, loads matching adapter rules, scaffolds generation files, and executes component-first workflow with validation and reporting gates.
4
+ ---
5
+
6
+ ## Purpose
7
+ Generate production-ready UI code from Figma for supported frameworks using one consistent workflow with strict validation, reporting, and backward-compatible React invocation.
8
+
9
+ ## Trigger Conditions
10
+ Use this skill when:
11
+ - User asks to generate pages or screens from one or more Figma URLs.
12
+ - User asks to scaffold page, component, asset, report, and artifact structures before implementation.
13
+ - User asks for framework auto-detection in single-app or monorepo repositories.
14
+
15
+ Do not use when:
16
+ - No Figma URL is provided.
17
+ - The request is design analysis only with no code generation.
18
+
19
+ ## Inputs
20
+ Required:
21
+ - figma_urls: one or more node-specific Figma URLs.
22
+ - page_path: root path for generated pages.
23
+ - component_path: root path for generated components.
24
+ - reusable_components_path: path to shared reusable components.
25
+
26
+ Optional:
27
+ - asset_path: root path for static assets (default: src/assets).
28
+ - links_file: text or JSON file containing multiple Figma URLs.
29
+ - pages_json: JSON array of pageName + figmaUrl pairs.
30
+ - project_path: target app path in monorepos.
31
+ - non_interactive: disable prompts and require all required flags.
32
+ - dry_run: compute outputs without writing files.
33
+
34
+ ## References
35
+ ### Common References
36
+ - ./references/workflow.md
37
+ - ./references/script-usage.md
38
+ - ./references/common.md
39
+
40
+ ### Platform References
41
+ Load only one platform reference based on detected framework:
42
+ - ./references/react.md
43
+ - ./references/react-native.md
44
+ - ./references/flutter.md
45
+ - ./references/angular.md
46
+ - ./references/vue.md
47
+ - ./references/next.md
48
+ - ./references/nuxt.md
49
+ - ./references/svelte.md
50
+ - ./references/expo.md
51
+ - ./references/native-android.md
52
+ - ./references/native-ios.md
53
+ - ./references/kotlin-multiplatform.md
54
+ - ./references/ionic.md
55
+ - ./references/capacitor.md
56
+
57
+ Framework adapter rule files:
58
+ - ./references/frameworks/<detected-framework>/rules.md
59
+
60
+ ## Assets
61
+ - ./assets/templates/generation-report-template.md
62
+ - ./assets/templates/component-map-template.md
63
+
64
+ ## Scripts
65
+ - ./scripts/generate-page-through-figma.js
66
+ - ./scripts/generate-react-page-through-figma.js
67
+
68
+ ## Execution Steps
69
+ 1. Validate inputs and resolve target project context.
70
+ 2. Detect framework and architecture from repository signals.
71
+ 3. Validate active adapter and load only matching reference/rule files.
72
+ 4. Run script-first scaffolding and create adapter-specific page/style/token files.
73
+ 5. Execute component-first MCP workflow in references/workflow.md.
74
+ 6. Enforce blocking validation gates: coverage, accessibility, screenshot loop, and final QA.
75
+ 7. Render report/template outputs and persist artifact summary.
76
+
77
+ ## Rules
78
+ - Keep workflow phases and quality gates intact.
79
+ - Do not skip token extraction, coverage checks, accessibility checks, screenshot validation, or final QA.
80
+ - Load only one framework adapter per run.
81
+ - Keep platform-specific logic in references, not inline in this file.
82
+ - Keep templates in assets and render them during output generation.
83
+ - Do not include secrets in scripts or references.
84
+
85
+ ## Output Format
86
+ Return a structured result with:
87
+ - detected_framework
88
+ - detection_reason
89
+ - framework_adapter_used
90
+ - framework_version
91
+ - architecture_detected
92
+ - pages_requested
93
+ - pages_generated
94
+ - pages_skipped
95
+ - components_reused
96
+ - components_generated
97
+ - validation_summary
98
+ - warnings
99
+ - errors
100
+ - report_path
101
+ - artifact_path
@@ -0,0 +1,30 @@
1
+ # Component Map - {{page_name}}
2
+
3
+ ## Inputs
4
+ - figma_url: {{figma_url}}
5
+ - file_key: {{file_key}}
6
+ - node_id: {{node_id}}
7
+
8
+ ## Page Container
9
+ - frame_name: {{frame_name}}
10
+ - node_id: {{node_id}}
11
+ - size: {{size}}
12
+
13
+ ## Sections
14
+ {{sections_table}}
15
+
16
+ ## Reusable Components
17
+ {{reusable_components_table}}
18
+
19
+ ## Assets
20
+ {{assets_table}}
21
+
22
+ ## Coverage Links
23
+ - inventory_reference: {{inventory_reference}}
24
+ - coverage_map_reference: {{coverage_map_reference}}
25
+
26
+ ## Generation Order
27
+ {{generation_order}}
28
+
29
+ ## Status
30
+ {{status_table}}
@@ -0,0 +1,49 @@
1
+ # Figma UI Mapper Generation Report
2
+
3
+ ## Inputs
4
+ - generated_at: {{generated_at}}
5
+ - project_root: {{project_root}}
6
+ - figma_urls: {{figma_urls}}
7
+ - page_path: {{page_path}}
8
+ - component_path: {{component_path}}
9
+ - asset_path: {{asset_path}}
10
+ - reusable_components_path: {{reusable_components_path}}
11
+
12
+ ## Framework
13
+ - detected_framework: {{detected_framework}}
14
+ - framework_version: {{framework_version}}
15
+ - architecture_detected: {{architecture_detected}}
16
+ - detection_reason: {{detection_reason}}
17
+ - adapter_used: {{adapter_used}}
18
+ - platform_reference: {{platform_reference}}
19
+ - framework_rules: {{framework_rules}}
20
+
21
+ ## Coverage
22
+ - pages_requested: {{pages_requested}}
23
+ - pages_generated: {{pages_generated}}
24
+ - pages_skipped: {{pages_skipped}}
25
+ - coverage_map_match: {{coverage_map_match}}
26
+
27
+ ## Components
28
+ - components_reused: {{components_reused}}
29
+ - components_generated: {{components_generated}}
30
+
31
+ ## Tokens and Assets
32
+ - token_extraction: {{token_extraction}}
33
+ - assets_resolved_local: {{assets_resolved_local}}
34
+ - assets_downloaded_figma: {{assets_downloaded_figma}}
35
+ - asset_failures: {{asset_failures}}
36
+
37
+ ## Validation
38
+ - component_first_generation: {{component_first_generation}}
39
+ - accessibility_check: {{accessibility_check}}
40
+ - screenshot_comparison: {{screenshot_comparison}}
41
+ - iteration_count: {{iteration_count}}
42
+ - qa_status: {{qa_status}}
43
+
44
+ ## Errors and Warnings
45
+ - errors: {{errors}}
46
+ - warnings: {{warnings}}
47
+
48
+ ## Summary
49
+ {{summary}}
@@ -0,0 +1,22 @@
1
+ name: figma-ui-mapper
2
+ version: 1.1.0
3
+ status: active
4
+ description: Framework-agnostic Figma-to-code generation skill with adapter-based scaffolding and workflow-driven MCP implementation.
5
+ entrypoints:
6
+ - scripts/generate-page-through-figma.js
7
+ - scripts/generate-react-page-through-figma.js
8
+ supported_frameworks:
9
+ - react
10
+ - react-native
11
+ - flutter
12
+ - angular
13
+ - vue
14
+ - next
15
+ - nuxt
16
+ - svelte
17
+ - expo
18
+ - native-android
19
+ - native-ios
20
+ - kotlin-multiplatform
21
+ - ionic
22
+ - capacitor