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.
- package/.github/skills/boiler-project-generator/SKILL.md +103 -0
- package/.github/skills/boiler-project-generator/assets/templates/android/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/angular/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/flutter/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/ios/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/react/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/README.md +3 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/api-setup.ts +76 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/component-primary-button.tsx +29 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/env-config.env +4 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/feature-auth-screen.tsx +45 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/feature-dashboard-screen.tsx +45 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/feature-profile-screen.tsx +45 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/hook-use-app-boot.ts +11 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/navigation-setup.tsx +25 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/project-structure.md +24 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/redux-hooks.ts +5 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/redux-session-slice.ts +29 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/redux-store.ts +15 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/theme-index.ts +23 -0
- package/.github/skills/boiler-project-generator/assets/templates/react-native/utils-helpers.ts +7 -0
- package/.github/skills/boiler-project-generator/metadata.yaml +29 -0
- package/.github/skills/boiler-project-generator/references/android.md +19 -0
- package/.github/skills/boiler-project-generator/references/angular.md +14 -0
- package/.github/skills/boiler-project-generator/references/flutter.md +17 -0
- package/.github/skills/boiler-project-generator/references/ios.md +17 -0
- package/.github/skills/boiler-project-generator/references/react-native.md +103 -0
- package/.github/skills/boiler-project-generator/references/react.md +17 -0
- package/.github/skills/boiler-project-generator/scripts/angular.js +43 -0
- package/.github/skills/boiler-project-generator/scripts/generate-project.mjs +107 -0
- package/.github/skills/boiler-project-generator/scripts/init.js +105 -0
- package/.github/skills/boiler-project-generator/scripts/react-native.js +1041 -0
- package/.github/skills/boiler-project-generator/scripts/react.js +32 -0
- package/.github/skills/clean-architecture-generator/SKILL.md +235 -0
- package/.github/skills/clean-architecture-generator/references/architecture-core.md +126 -0
- package/.github/skills/clean-architecture-generator/references/platform-angular.md +374 -0
- package/.github/skills/clean-architecture-generator/references/platform-flutter.md +366 -0
- package/.github/skills/clean-architecture-generator/references/platform-react-native.md +590 -0
- package/.github/skills/clean-architecture-generator/references/platform-react.md +261 -0
- package/.github/skills/code-test-coverage-analyzer/SKILL.md +1358 -0
- package/.github/skills/code-test-coverage-analyzer/assets/config-questionnaire.md +118 -0
- package/.github/skills/code-test-coverage-analyzer/assets/conflict-resolution-protocol.md +99 -0
- package/.github/skills/code-test-coverage-analyzer/assets/coverage-calculation-rules.md +294 -0
- package/.github/skills/code-test-coverage-analyzer/assets/multi-strategy-search.md +145 -0
- package/.github/skills/code-test-coverage-analyzer/assets/output-file-contracts.md +651 -0
- package/.github/skills/code-test-coverage-analyzer/assets/status-definitions.md +273 -0
- package/.github/skills/code-test-coverage-analyzer/examples/example-invocation.md +208 -0
- package/.github/skills/code-test-coverage-analyzer/references/android-patterns.md +229 -0
- package/.github/skills/code-test-coverage-analyzer/references/angular-patterns.md +177 -0
- package/.github/skills/code-test-coverage-analyzer/references/backend-patterns.md +383 -0
- package/.github/skills/code-test-coverage-analyzer/references/flutter-patterns.md +254 -0
- package/.github/skills/code-test-coverage-analyzer/references/ios-patterns.md +228 -0
- package/.github/skills/code-test-coverage-analyzer/references/react-native-patterns.md +431 -0
- package/.github/skills/code-test-coverage-analyzer/references/react-patterns.md +206 -0
- package/.github/skills/code-test-coverage-analyzer/scripts/detect-platform.ps1 +261 -0
- package/.github/skills/code-test-coverage-analyzer/scripts/scan-repository.ps1 +242 -0
- package/.github/skills/code-test-coverage-analyzer/templates/brd-compliance-row.md +107 -0
- package/.github/skills/code-test-coverage-analyzer/templates/test-case-row.md +130 -0
- package/.github/skills/code-test-coverage-analyzer/templates/user-story-compliance-row.md +170 -0
- package/.github/skills/custom-font-integrator/SKILL.md +373 -0
- package/.github/skills/custom-font-integrator/assets/FontTestScreen.js +150 -0
- package/.github/skills/custom-font-integrator/references/example-info-plist.xml +21 -0
- package/.github/skills/custom-font-integrator/scripts/setup-fonts.sh +99 -0
- package/.github/skills/encryption-decryption-utility/Instructions.md +282 -0
- package/.github/skills/encryption-decryption-utility/README.md +222 -0
- package/.github/skills/encryption-decryption-utility/SKILL.md +645 -0
- package/.github/skills/encryption-decryption-utility/assets/encryption-config-template.json +13 -0
- package/.github/skills/encryption-decryption-utility/assets/platform-matrix.json +180 -0
- package/.github/skills/encryption-decryption-utility/metadata.yaml +51 -0
- package/.github/skills/encryption-decryption-utility/references/android-crypto.md +157 -0
- package/.github/skills/encryption-decryption-utility/references/angular-crypto.md +130 -0
- package/.github/skills/encryption-decryption-utility/references/approach-1-webcrypto.md +95 -0
- package/.github/skills/encryption-decryption-utility/references/approach-2-rsa-aes-cbc.md +111 -0
- package/.github/skills/encryption-decryption-utility/references/approach-3-aes-sharedkey.md +114 -0
- package/.github/skills/encryption-decryption-utility/references/architecture.md +233 -0
- package/.github/skills/encryption-decryption-utility/references/backend-alignment.md +506 -0
- package/.github/skills/encryption-decryption-utility/references/dependency-guidance.md +234 -0
- package/.github/skills/encryption-decryption-utility/references/ec-implementation.md +832 -0
- package/.github/skills/encryption-decryption-utility/references/error-handling-playbook.md +234 -0
- package/.github/skills/encryption-decryption-utility/references/flutter-crypto.md +105 -0
- package/.github/skills/encryption-decryption-utility/references/ios-crypto.md +338 -0
- package/.github/skills/encryption-decryption-utility/references/native-rsa-implementation.md +373 -0
- package/.github/skills/encryption-decryption-utility/references/node-crypto.md +86 -0
- package/.github/skills/encryption-decryption-utility/references/react-crypto.md +105 -0
- package/.github/skills/encryption-decryption-utility/references/react-native-crypto.md +1001 -0
- package/.github/skills/encryption-decryption-utility/references/react-web-crypto.md +668 -0
- package/.github/skills/encryption-decryption-utility/references/security-checklist.md +176 -0
- package/.github/skills/encryption-decryption-utility/references/web-crypto.md +74 -0
- package/.github/skills/encryption-decryption-utility/scripts/detect.js +128 -0
- package/.github/skills/encryption-decryption-utility/scripts/install.js +1713 -0
- package/.github/skills/encryption-decryption-utility/scripts/setup.js +800 -0
- package/.github/skills/encryption-decryption-utility/template.md +241 -0
- package/.github/skills/encryption-decryption-utility/templates/config-questionnaire.md +467 -0
- package/.github/skills/encryption-decryption-utility/templates/delivery-checklist.md +206 -0
- package/.github/skills/encryption-decryption-utility/templates/implementation-plan.md +304 -0
- package/.github/skills/feature-generator/SKILL.MD +2741 -0
- package/.github/skills/feature-generator/assets/fingerprint-schema.json +385 -0
- package/.github/skills/feature-generator/assets/spec-template.md +172 -0
- package/.github/skills/feature-generator/assets/transform-rules.json +82 -0
- package/.github/skills/feature-generator/references/api-envelope-patterns.md +327 -0
- package/.github/skills/feature-generator/references/screen-logic-patterns.md +399 -0
- package/.github/skills/feature-generator/references/state-library-patterns.md +464 -0
- package/.github/skills/figma-ui-mapper/README.md +34 -0
- package/.github/skills/figma-ui-mapper/SKILL.md +101 -0
- package/.github/skills/figma-ui-mapper/assets/templates/component-map-template.md +30 -0
- package/.github/skills/figma-ui-mapper/assets/templates/generation-report-template.md +49 -0
- package/.github/skills/figma-ui-mapper/metadata.yaml +22 -0
- package/.github/skills/figma-ui-mapper/references/android.md +11 -0
- package/.github/skills/figma-ui-mapper/references/angular.md +18 -0
- package/.github/skills/figma-ui-mapper/references/capacitor.md +18 -0
- package/.github/skills/figma-ui-mapper/references/common.md +23 -0
- package/.github/skills/figma-ui-mapper/references/expo.md +18 -0
- package/.github/skills/figma-ui-mapper/references/flutter.md +18 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/angular/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/capacitor/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/expo/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/flutter/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/ionic/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/kotlin-multiplatform/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/native-android/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/native-ios/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/next/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/nuxt/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/react/rules.md +19 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/react-native/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/svelte/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/frameworks/vue/rules.md +23 -0
- package/.github/skills/figma-ui-mapper/references/ionic.md +18 -0
- package/.github/skills/figma-ui-mapper/references/ios.md +11 -0
- package/.github/skills/figma-ui-mapper/references/kotlin-multiplatform.md +18 -0
- package/.github/skills/figma-ui-mapper/references/native-android.md +18 -0
- package/.github/skills/figma-ui-mapper/references/native-ios.md +18 -0
- package/.github/skills/figma-ui-mapper/references/next.md +18 -0
- package/.github/skills/figma-ui-mapper/references/nuxt.md +18 -0
- package/.github/skills/figma-ui-mapper/references/react-figma-guideline.md +21 -0
- package/.github/skills/figma-ui-mapper/references/react-native.md +18 -0
- package/.github/skills/figma-ui-mapper/references/react.md +18 -0
- package/.github/skills/figma-ui-mapper/references/script-usage.md +46 -0
- package/.github/skills/figma-ui-mapper/references/svelte.md +18 -0
- package/.github/skills/figma-ui-mapper/references/vue.md +18 -0
- package/.github/skills/figma-ui-mapper/references/workflow.md +74 -0
- package/.github/skills/figma-ui-mapper/scripts/generate-page-through-figma.js +635 -0
- package/.github/skills/figma-ui-mapper/scripts/generate-react-page-through-figma.js +4 -0
- package/.github/skills/frontend-task-breakdown/SKILL.md +734 -0
- package/.github/skills/md-file-converter/SKILL.md +291 -0
- package/.github/skills/md-file-converter/config/formats.json +114 -0
- package/.github/skills/md-file-converter/extractors/extract-docx.sh +120 -0
- package/.github/skills/md-file-converter/extractors/extract-eml.py +108 -0
- package/.github/skills/md-file-converter/extractors/extract-pdf.sh +97 -0
- package/.github/skills/md-file-converter/extractors/extract-pptx.py +143 -0
- package/.github/skills/md-file-converter/extractors/extract-xlsx.py +175 -0
- package/.github/skills/md-file-converter/scripts/check-tools.sh +47 -0
- package/.github/skills/md-file-converter/scripts/extract-archive.sh +83 -0
- package/.github/skills/md-file-converter/scripts/extract-ocr.sh +77 -0
- package/.github/skills/md-file-converter/scripts/get-metadata.sh +57 -0
- package/.github/skills/md-file-converter/templates/output.md +73 -0
- package/.github/skills/md-file-converter/templates/unsupported-object.md +6 -0
- package/.github/skills/mockAPI-contract-generator/SKILL.md +607 -0
- package/.github/skills/test-case-validator/CHANGELOG.md +155 -0
- package/.github/skills/test-case-validator/CONFIGURATION.md +130 -0
- package/.github/skills/test-case-validator/EXAMPLES.md +50 -0
- package/.github/skills/test-case-validator/QUALITY_SCORING.md +98 -0
- package/.github/skills/test-case-validator/README.md +111 -0
- package/.github/skills/test-case-validator/REPORT_TEMPLATE.md +116 -0
- package/.github/skills/test-case-validator/SKILL.md +209 -0
- package/.github/skills/test-case-validator/SYSTEM_PROMPT.md +127 -0
- package/.github/skills/test-case-validator/TRACEABILITY_ENGINE.md +152 -0
- package/.github/skills/test-case-validator/VALIDATION_RULES.md +411 -0
- package/.github/skills/test-case-validator/config/default.config.yaml +62 -0
- package/.github/skills/test-case-validator/docs/ARCHITECTURE.md +66 -0
- package/.github/skills/test-case-validator/docs/EXTENDING.md +85 -0
- package/.github/skills/test-case-validator/docs/FAQ.md +88 -0
- package/.github/skills/test-case-validator/docs/VERSIONING.md +55 -0
- package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/input-brd.md +43 -0
- package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/input-test-cases.csv +9 -0
- package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/input-user-story.md +29 -0
- package/.github/skills/test-case-validator/examples/example-1-manual-qa-ecommerce/output-report.md +303 -0
- package/.github/skills/test-case-validator/examples/example-2-automated-frontend-suite/input-spec.md +43 -0
- package/.github/skills/test-case-validator/examples/example-2-automated-frontend-suite/input-test-files-index.md +56 -0
- package/.github/skills/test-case-validator/examples/example-2-automated-frontend-suite/output-report.md +274 -0
- package/.github/skills/test-case-validator/prompts/00-applicability-resolution.md +61 -0
- package/.github/skills/test-case-validator/prompts/01-extraction-user-story.md +58 -0
- package/.github/skills/test-case-validator/prompts/02-extraction-brd.md +64 -0
- package/.github/skills/test-case-validator/prompts/03-extraction-test-cases.md +92 -0
- package/.github/skills/test-case-validator/prompts/04-traceability-matrix.md +41 -0
- package/.github/skills/test-case-validator/prompts/05-coverage-analysis.md +46 -0
- package/.github/skills/test-case-validator/prompts/06-missing-scenario-detection.md +32 -0
- package/.github/skills/test-case-validator/prompts/07-duplicate-detection.md +36 -0
- package/.github/skills/test-case-validator/prompts/08-risk-analysis.md +39 -0
- package/.github/skills/test-case-validator/prompts/09-gated-wiring-validation.md +53 -0
- package/.github/skills/test-case-validator/prompts/10-observation-report.md +56 -0
- package/.github/skills/test-case-validator/prompts/11-final-report-assembly.md +57 -0
- package/.github/skills/test-case-validator/templates/coverage-table.md +25 -0
- package/.github/skills/test-case-validator/templates/executive-summary.md +38 -0
- package/.github/skills/test-case-validator/templates/final-summary-block.md +87 -0
- package/.github/skills/test-case-validator/templates/observation-entry.md +41 -0
- package/.github/skills/test-case-validator/templates/rtm-row.md +25 -0
- package/.github/skills/validation-engine-builder/README.md +50 -0
- package/.github/skills/validation-engine-builder/SKILL.md +241 -0
- package/.github/skills/validation-engine-builder/references/core.md +158 -0
- package/.github/skills/validation-engine-builder/references/platform-angular.md +166 -0
- package/.github/skills/validation-engine-builder/references/platform-flutter.md +118 -0
- package/.github/skills/validation-engine-builder/references/platform-react-native.md +170 -0
- package/.github/skills/validation-engine-builder/references/platform-react.md +94 -0
- package/.github/skills/validation-engine-builder/scripts/apply-to-project.js +80 -0
- package/.github/skills/validation-engine-builder/scripts/generate-angular.js +271 -0
- package/.github/skills/validation-engine-builder/scripts/generate-flutter.js +298 -0
- package/.github/skills/validation-engine-builder/scripts/generate-react-native.js +217 -0
- package/.github/skills/validation-engine-builder/scripts/generate-react.js +163 -0
- package/.github/skills/validation-engine-builder/scripts/install-deps.js +53 -0
- package/.github/skills/validation-engine-builder/scripts/shared/detect-platform.js +68 -0
- package/.github/skills/validation-engine-builder/scripts/shared/npm-deps.js +103 -0
- package/.github/skills/validation-engine-builder/scripts/shared/rhf-hook.js +43 -0
- package/.github/skills/validation-engine-builder/scripts/shared/ts-messages-regex.js +62 -0
- package/.github/skills/validation-engine-builder/scripts/shared/util.js +44 -0
- package/.github/skills/validation-engine-builder/scripts/shared/yup-schemas.js +80 -0
- package/.github/skills/validation-engine-builder/template.md +73 -0
- package/.github/skills/validation-engine-builder/templates/messages.json +22 -0
- package/.github/skills/validation-engine-builder/templates/regex.json +16 -0
- package/.github/skills/validation-engine-builder/templates/schemas.json +48 -0
- package/bin/index.js +145 -0
- package/package.json +22 -0
- 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
|