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,261 @@
|
|
|
1
|
+
# Platform File — React (Web)
|
|
2
|
+
|
|
3
|
+
Read `architecture-core.md` first. This file supplies the React web-specific implementation of the
|
|
4
|
+
universal layers. It intentionally differs from `platform-react-native.md` in the places where the
|
|
5
|
+
browser environment is genuinely different (storage, no native SSL pinning, routing, no
|
|
6
|
+
Keychain/MMKV) — everything else (domain/data separation, use case pattern, mapper pattern) is
|
|
7
|
+
shared with RN because both are plain React with TypeScript.
|
|
8
|
+
|
|
9
|
+
Everything under "Stack Fingerprint Defaults" applies **only** when Phase 1 detection found nothing
|
|
10
|
+
in the target repo — if the repo already uses a different state library, HTTP client, storage, or
|
|
11
|
+
router, generate against what's already there instead.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Sub-Variant Detection (run before anything else)
|
|
16
|
+
|
|
17
|
+
| Signal | Sub-variant | Affects |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| `"next"` in `package.json` | Next.js | Routing (App Router or Pages Router — check for an `app/` vs `pages/` directory), env var prefix (`NEXT_PUBLIC_`) |
|
|
20
|
+
| `"react-scripts"` in `package.json` | Create React App | env var prefix (`REACT_APP_`) |
|
|
21
|
+
| `"vite"` in `package.json`, no meta-framework | Vite | env var prefix (`VITE_`) |
|
|
22
|
+
|
|
23
|
+
State this project's detected sub-variant before generating any file — it changes the routing
|
|
24
|
+
pattern and the environment variable prefix used in `data/config/`.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Stack Fingerprint Defaults (greenfield only)
|
|
29
|
+
|
|
30
|
+
| Concern | Detect first (search for) | Default if nothing detected |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| Language | — | TypeScript, strict mode |
|
|
33
|
+
| State management | `createSlice(`, `create(` from `'zustand'`, `makeAutoObservable(`/`observable(` (mobx), `QueryClient`/`useQuery` (React Query), `useReducer`+`createContext` | Redux Toolkit (`createSlice`, `createAsyncThunk`) + RTK Query (`createApi`) |
|
|
34
|
+
| HTTP client | `axios.create(`, `fetch(`, `createApi(` | Axios with interceptors |
|
|
35
|
+
| Browser storage | existing `storageService`/`localStorage`/`sessionStorage` wrapper | `sessionStorage` for tokens (see Security Rules below), `localStorage` for non-sensitive persisted UI state |
|
|
36
|
+
| Routing | `react-router-dom`, Next.js `app/`/`pages/` directory | React Router v6 (or Next.js's own router if Next.js was detected above) |
|
|
37
|
+
| DI mechanism | existing `di/[feature]Container.ts` files | manual DI — Pattern A or B (identical to the RN patterns, see below) |
|
|
38
|
+
| Test runner | `jest.config.*`, `vitest.config.*` | Vitest for Vite projects, Jest otherwise |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Folder Tree
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
src/
|
|
46
|
+
├── app/ # App bootstrap — orchestration only
|
|
47
|
+
│ ├── App.tsx
|
|
48
|
+
│ ├── index.ts
|
|
49
|
+
│ ├── di/
|
|
50
|
+
│ │ ├── container.ts # Global DI container — wires all feature containers
|
|
51
|
+
│ │ └── index.ts
|
|
52
|
+
│ ├── environment/
|
|
53
|
+
│ │ ├── env.ts # Reads import.meta.env / process.env with the correct prefix
|
|
54
|
+
│ │ └── index.ts
|
|
55
|
+
│ ├── routing/
|
|
56
|
+
│ │ ├── AppRouter.tsx # React Router <Routes> tree (or Next.js layout, if Next.js)
|
|
57
|
+
│ │ └── index.ts
|
|
58
|
+
│ └── state/
|
|
59
|
+
│ └── store.ts
|
|
60
|
+
│
|
|
61
|
+
├── core/ # Infrastructure — shared by all features
|
|
62
|
+
│ ├── api/
|
|
63
|
+
│ │ ├── httpClient.ts # Singleton Axios/fetch instance + interceptors
|
|
64
|
+
│ │ ├── apiErrorHandler.ts
|
|
65
|
+
│ │ ├── AppError.ts
|
|
66
|
+
│ │ ├── tokenProvider.ts # Token getter/setter (prevents circular deps)
|
|
67
|
+
│ │ ├── unauthorizedHandler.ts
|
|
68
|
+
│ │ └── index.ts
|
|
69
|
+
│ ├── cache/
|
|
70
|
+
│ │ ├── baseApiSlice.ts # Single createApi instance for the whole app
|
|
71
|
+
│ │ └── index.ts
|
|
72
|
+
│ ├── config/
|
|
73
|
+
│ │ ├── constants.ts
|
|
74
|
+
│ │ └── index.ts
|
|
75
|
+
│ ├── error/
|
|
76
|
+
│ │ └── errorHandler.ts
|
|
77
|
+
│ ├── logging/
|
|
78
|
+
│ │ └── loggerService.ts
|
|
79
|
+
│ ├── storage/
|
|
80
|
+
│ │ ├── storageService.ts # sessionStorage/localStorage wrapper — see Security Rules
|
|
81
|
+
│ │ └── index.ts
|
|
82
|
+
│ ├── store/
|
|
83
|
+
│ │ └── hooks.ts # useAppDispatch, useAppSelector
|
|
84
|
+
│ └── analytics/
|
|
85
|
+
│ └── eventTracker.ts
|
|
86
|
+
│
|
|
87
|
+
├── features/ # One folder per feature, fully self-contained
|
|
88
|
+
│ └── [feature-name]/
|
|
89
|
+
│ ├── domain/ # Pure TypeScript — ZERO framework imports
|
|
90
|
+
│ │ ├── entities/
|
|
91
|
+
│ │ ├── usecases/
|
|
92
|
+
│ │ ├── repositories/ # Interfaces only (I-prefixed)
|
|
93
|
+
│ │ └── index.ts
|
|
94
|
+
│ ├── data/
|
|
95
|
+
│ │ ├── api/ # Feature-specific HTTP client class
|
|
96
|
+
│ │ ├── dtos/
|
|
97
|
+
│ │ ├── mappers/
|
|
98
|
+
│ │ ├── repositories/
|
|
99
|
+
│ │ ├── config/ # Feature API base URLs, endpoint paths
|
|
100
|
+
│ │ ├── mock/ # Static mock responses (dev/test only)
|
|
101
|
+
│ │ └── index.ts
|
|
102
|
+
│ ├── presentation/
|
|
103
|
+
│ │ ├── pages/ # (RN calls this "screens" — web calls it "pages")
|
|
104
|
+
│ │ ├── components/
|
|
105
|
+
│ │ ├── hooks/
|
|
106
|
+
│ │ ├── routing/ # this feature's route definitions, mounted into AppRouter
|
|
107
|
+
│ │ ├── state/ # Redux slices/thunks/selectors (or detected equivalent)
|
|
108
|
+
│ │ ├── styles/
|
|
109
|
+
│ │ ├── config/
|
|
110
|
+
│ │ ├── utils/
|
|
111
|
+
│ │ ├── validation/
|
|
112
|
+
│ │ └── index.ts
|
|
113
|
+
│ ├── di/
|
|
114
|
+
│ │ └── [Feature]Container.ts
|
|
115
|
+
│ ├── __tests__/
|
|
116
|
+
│ └── index.ts # Public API — barrel exports everything public
|
|
117
|
+
│
|
|
118
|
+
├── shared/
|
|
119
|
+
│ └── theme/ # Design tokens only — NO logic, NO components
|
|
120
|
+
│
|
|
121
|
+
├── constants/
|
|
122
|
+
└── types/
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Naming Extensions (React web-specific, on top of architecture-core.md)
|
|
128
|
+
|
|
129
|
+
Identical to the RN naming table in `platform-react-native.md`, with these substitutions:
|
|
130
|
+
|
|
131
|
+
| Artifact | Convention | Example |
|
|
132
|
+
|----------|------------|---------|
|
|
133
|
+
| Page file (was "Screen" in RN) | PascalCase + `Page` | `HoldingDetailPage.tsx` |
|
|
134
|
+
| Route definitions file | camelCase + `Routes` | `holdingRoutes.tsx` |
|
|
135
|
+
| Everything else (Entity, Repository, UseCase, DTO, Mapper, Slice, Thunks, Selectors, Hook, DI container, Test) | same as `platform-react-native.md` | — |
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## DI Patterns
|
|
140
|
+
|
|
141
|
+
Identical mechanism to React Native — plain React has no built-in DI container, so the same manual
|
|
142
|
+
patterns apply. Copy **DI Pattern A (Lazy Getter Object)** and **DI Pattern B (Factory Function)**
|
|
143
|
+
verbatim from `platform-react-native.md`, replacing only the import paths.
|
|
144
|
+
|
|
145
|
+
## Redux Store, Slice, Thunk, Selector, RTK Query, Domain Layer, Data Layer Patterns
|
|
146
|
+
|
|
147
|
+
Identical to `platform-react-native.md` — copy those patterns verbatim. The only substitution is
|
|
148
|
+
`axiosClient`/`httpClient` import path (`@core/api/httpClient` instead of `@core/api/axiosClient`)
|
|
149
|
+
and no `react-native-*` imports anywhere.
|
|
150
|
+
|
|
151
|
+
## Routing Pattern (replaces RN's React Navigation pattern)
|
|
152
|
+
|
|
153
|
+
**React Router v6:**
|
|
154
|
+
|
|
155
|
+
```tsx
|
|
156
|
+
// presentation/routing/[feature]Routes.tsx
|
|
157
|
+
import { Route } from 'react-router-dom';
|
|
158
|
+
import { [Feature]MainPage } from '../pages/[Feature]MainPage';
|
|
159
|
+
import { [Feature]DetailPage } from '../pages/[Feature]DetailPage';
|
|
160
|
+
|
|
161
|
+
export const [feature]Routes = (
|
|
162
|
+
<>
|
|
163
|
+
<Route path="/[feature]" element={<[Feature]MainPage />} />
|
|
164
|
+
<Route path="/[feature]/:id" element={<[Feature]DetailPage />} />
|
|
165
|
+
</>
|
|
166
|
+
);
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Mount `[feature]Routes` inside `app/routing/AppRouter.tsx`'s top-level `<Routes>` tree.
|
|
170
|
+
|
|
171
|
+
**Next.js (if detected):** do not create a `routing/` folder — the file-system router is the
|
|
172
|
+
routing layer. A "page" is the file at `app/[feature]/page.tsx` (App Router) or
|
|
173
|
+
`pages/[feature]/index.tsx` (Pages Router). The `presentation/pages/[Feature]MainPage.tsx` component
|
|
174
|
+
still lives in the feature folder; the Next.js route file only imports and renders it, so the
|
|
175
|
+
feature remains portable if the app ever migrates off Next.js routing.
|
|
176
|
+
|
|
177
|
+
## Typed Store Hooks
|
|
178
|
+
|
|
179
|
+
Identical to `platform-react-native.md` — copy verbatim.
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Offline Handling (replaces RN's NetInfo/MMKV offline queue — browser has no native equivalent)
|
|
184
|
+
|
|
185
|
+
The browser does not have `NetInfo` or a native offline-queue OS primitive. Use the web platform's
|
|
186
|
+
own signals instead — do not port the RN offline-queue pattern uncritically:
|
|
187
|
+
|
|
188
|
+
1. Detect connectivity via `navigator.onLine` and the `window.addEventListener('online' | 'offline', …)` events.
|
|
189
|
+
2. For simple cases, disable mutating actions while offline and show a banner — RTK Query's
|
|
190
|
+
`refetchOnReconnect: true` + `setupListeners(store.dispatch)` still applies unchanged.
|
|
191
|
+
3. If the project genuinely needs an offline write queue (not just read-refetch-on-reconnect), that
|
|
192
|
+
requires a Service Worker + IndexedDB (e.g. Background Sync API) — this is a materially bigger
|
|
193
|
+
scope than the RN MMKV-backed queue and must be scoped with the user explicitly before building
|
|
194
|
+
it; do not silently generate a partial Service Worker.
|
|
195
|
+
|
|
196
|
+
## Security Rules (browser-specific — on top of architecture-core.md)
|
|
197
|
+
|
|
198
|
+
1. There is no OS Keychain/Keystore in a browser — the closest equivalents by risk profile are, in
|
|
199
|
+
order of preference: an httpOnly cookie set by the server (not readable by JS, immune to XSS
|
|
200
|
+
token theft), or in-memory storage with refresh-token rotation, or `sessionStorage` as a lower bar.
|
|
201
|
+
2. **Never** use `localStorage` for access/refresh tokens without explicitly accepting the XSS risk
|
|
202
|
+
tradeoff with the user — `localStorage` persists across tabs/restarts and is readable by any
|
|
203
|
+
script on the page, including an injected one. If the project already stores tokens in
|
|
204
|
+
`localStorage`, do not silently "fix" it; flag the tradeoff and continue only with confirmation.
|
|
205
|
+
3. **Never** disable TLS certificate validation in a Node-side proxy/BFF that this frontend talks to.
|
|
206
|
+
4. Every outbound request signed the same way as RN (nonce header, correlation ID) if the backend
|
|
207
|
+
contract requires it — read the actual API contract, do not assume the mobile app's signing
|
|
208
|
+
scheme applies unless the same backend is shared.
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Anti-Patterns (React web-specific, on top of architecture-core.md)
|
|
213
|
+
|
|
214
|
+
- **Never** call `fetch`/`axios` directly from a component or hook — always go through the
|
|
215
|
+
feature's API client class.
|
|
216
|
+
- **Never** use `useDispatch` / `useSelector` directly if the project defines typed
|
|
217
|
+
`useAppDispatch/useAppSelector` — use the typed hooks.
|
|
218
|
+
- **Never** use a `boolean` for loading state in a Redux slice — use
|
|
219
|
+
`'idle' | 'loading' | 'succeeded' | 'failed'`.
|
|
220
|
+
- **Never** define `ThunkExtra` inside the DI container file — define it in the thunks file.
|
|
221
|
+
- **Never** use the class-based `getInstance()` singleton pattern for feature DI containers.
|
|
222
|
+
- **Never** reference `AsyncStorage`, `react-native-keychain`, `MMKV`, or any RN-only package —
|
|
223
|
+
this is a web target.
|
|
224
|
+
- **Never** hardcode a Next.js/CRA/Vite env var prefix that doesn't match the detected sub-variant.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Worked Example
|
|
229
|
+
|
|
230
|
+
**Request**: "Add a watchlist feature with ability to fetch and display watchlist items."
|
|
231
|
+
|
|
232
|
+
**Artifacts**:
|
|
233
|
+
- Domain: `WatchlistItemEntity`, `IWatchlistRepository`, `GetWatchlistUseCase`
|
|
234
|
+
- Data: `WatchlistApiClient`, `WatchlistItemDTO`, `mapWatchlistDTOToDomain`, `WatchlistRepositoryImpl`
|
|
235
|
+
- Presentation: `watchlistSlice`, `watchlistThunks`, `watchlistSelectors`, `WatchlistMainPage`, `watchlistRoutes`
|
|
236
|
+
- DI: `watchlistContainer` (Pattern A)
|
|
237
|
+
|
|
238
|
+
**Output**:
|
|
239
|
+
```
|
|
240
|
+
Created:
|
|
241
|
+
src/features/watchlist/domain/entities/WatchlistItemEntity.ts
|
|
242
|
+
src/features/watchlist/domain/repositories/IWatchlistRepository.ts
|
|
243
|
+
src/features/watchlist/domain/usecases/GetWatchlistUseCase.ts
|
|
244
|
+
src/features/watchlist/data/api/WatchlistApiClient.ts
|
|
245
|
+
src/features/watchlist/data/dtos/WatchlistItemDTO.ts
|
|
246
|
+
src/features/watchlist/data/mappers/watchlistMappers.ts
|
|
247
|
+
src/features/watchlist/data/repositories/WatchlistRepositoryImpl.ts
|
|
248
|
+
src/features/watchlist/presentation/state/watchlistSlice.ts
|
|
249
|
+
src/features/watchlist/presentation/state/watchlistThunks.ts
|
|
250
|
+
src/features/watchlist/presentation/state/watchlistSelectors.ts
|
|
251
|
+
src/features/watchlist/presentation/pages/WatchlistMainPage.tsx
|
|
252
|
+
src/features/watchlist/presentation/routing/watchlistRoutes.tsx
|
|
253
|
+
src/features/watchlist/di/watchlistContainer.ts
|
|
254
|
+
src/features/watchlist/index.ts
|
|
255
|
+
|
|
256
|
+
Updated:
|
|
257
|
+
src/app/state/store.ts (added reducer + container to extraArgument)
|
|
258
|
+
src/app/routing/AppRouter.tsx (mounted watchlistRoutes)
|
|
259
|
+
|
|
260
|
+
Dependency check: PASS — no layer boundary violations detected
|
|
261
|
+
```
|