specweave 0.23.18 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +144 -45
- package/CLAUDE.md +137 -4
- package/dist/src/cli/helpers/ado-area-path-mapper.d.ts +89 -0
- package/dist/src/cli/helpers/ado-area-path-mapper.d.ts.map +1 -0
- package/dist/src/cli/helpers/ado-area-path-mapper.js +213 -0
- package/dist/src/cli/helpers/ado-area-path-mapper.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.d.ts +29 -0
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.d.ts.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.js +109 -0
- package/dist/src/cli/helpers/issue-tracker/ado-auto-discover.js.map +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts +1 -0
- package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/ado.js +2 -0
- package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
- package/dist/src/cli/helpers/smart-filter.d.ts +83 -0
- package/dist/src/cli/helpers/smart-filter.d.ts.map +1 -0
- package/dist/src/cli/helpers/smart-filter.js +265 -0
- package/dist/src/cli/helpers/smart-filter.js.map +1 -0
- package/dist/src/core/qa/quality-gate-decider.d.ts +1 -1
- package/dist/src/core/qa/quality-gate-decider.js +2 -2
- package/dist/src/core/qa/quality-gate-decider.js.map +1 -1
- package/dist/src/core/qa/risk-calculator.d.ts +2 -2
- package/dist/src/core/qa/risk-calculator.js +2 -2
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +76 -43
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/core/validators/ac-presence-validator.d.ts +56 -0
- package/dist/src/core/validators/ac-presence-validator.d.ts.map +1 -0
- package/dist/src/core/validators/ac-presence-validator.js +149 -0
- package/dist/src/core/validators/ac-presence-validator.js.map +1 -0
- package/dist/src/integrations/ado/area-path-mapper.d.ts +137 -0
- package/dist/src/integrations/ado/area-path-mapper.d.ts.map +1 -0
- package/dist/src/integrations/ado/area-path-mapper.js +267 -0
- package/dist/src/integrations/ado/area-path-mapper.js.map +1 -0
- package/dist/src/integrations/jira/filter-processor.d.ts +126 -0
- package/dist/src/integrations/jira/filter-processor.d.ts.map +1 -0
- package/dist/src/integrations/jira/filter-processor.js +207 -0
- package/dist/src/integrations/jira/filter-processor.js.map +1 -0
- package/dist/src/integrations/jira/jira-client.d.ts +13 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +33 -0
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/utils/ac-embedder.d.ts +63 -0
- package/dist/src/utils/ac-embedder.d.ts.map +1 -0
- package/dist/src/utils/ac-embedder.js +217 -0
- package/dist/src/utils/ac-embedder.js.map +1 -0
- package/dist/src/utils/env-manager.d.ts +86 -0
- package/dist/src/utils/env-manager.d.ts.map +1 -0
- package/dist/src/utils/env-manager.js +188 -0
- package/dist/src/utils/env-manager.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/agents/AGENTS-INDEX.md +1 -1
- package/plugins/specweave/agents/increment-quality-judge-v2/AGENT.md +9 -9
- package/plugins/specweave/commands/specweave-do.md +37 -0
- package/plugins/specweave/commands/specweave-done.md +159 -0
- package/plugins/specweave/commands/specweave-embed-acs.md +446 -0
- package/plugins/specweave/commands/specweave-next.md +148 -3
- package/plugins/specweave/commands/specweave-qa.md +2 -2
- package/plugins/specweave/hooks/pre-increment-start.sh +168 -0
- package/plugins/specweave/skills/SKILLS-INDEX.md +1 -1
- package/plugins/specweave-ado/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-ado/commands/specweave-ado-import-projects.md +331 -0
- package/plugins/specweave-alternatives/.claude-plugin/plugin.json +10 -0
- package/plugins/specweave-alternatives/commands/alternatives-analyze.md +336 -0
- package/plugins/specweave-alternatives/skills/architecture-alternatives/SKILL.md +651 -0
- package/plugins/specweave-alternatives/skills/bmad-method/SKILL.md +420 -0
- package/plugins/specweave-alternatives/skills/spec-kit-expert/SKILL.md +487 -0
- package/plugins/specweave-backend/commands/api-scaffold.md +80 -0
- package/plugins/specweave-backend/commands/crud-generate.md +109 -0
- package/plugins/specweave-backend/commands/migration-generate.md +139 -0
- package/plugins/specweave-confluent/commands/connector-deploy.md +154 -0
- package/plugins/specweave-confluent/commands/ksqldb-query.md +179 -0
- package/plugins/specweave-confluent/commands/schema-register.md +123 -0
- package/plugins/specweave-core/.claude-plugin/plugin.json +21 -0
- package/plugins/specweave-core/commands/architecture-review.md +288 -0
- package/plugins/specweave-core/commands/code-review.md +213 -0
- package/plugins/specweave-core/commands/refactor-plan.md +249 -0
- package/plugins/specweave-core/skills/code-quality/SKILL.md +157 -0
- package/plugins/specweave-core/skills/design-patterns/SKILL.md +244 -0
- package/plugins/specweave-core/skills/software-architecture/SKILL.md +83 -0
- package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +22 -0
- package/plugins/specweave-cost-optimizer/commands/cost-analyze.md +360 -0
- package/plugins/specweave-cost-optimizer/commands/cost-optimize.md +480 -0
- package/plugins/specweave-cost-optimizer/skills/aws-cost-expert/SKILL.md +416 -0
- package/plugins/specweave-cost-optimizer/skills/cloud-pricing/SKILL.md +325 -0
- package/plugins/specweave-cost-optimizer/skills/cost-optimization/SKILL.md +337 -0
- package/plugins/specweave-diagrams/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-diagrams/commands/diagrams-generate.md +168 -0
- package/plugins/specweave-docs/.claude-plugin/plugin.json +10 -0
- package/plugins/specweave-docs/commands/docs-generate.md +441 -0
- package/plugins/specweave-docs/commands/docs-init.md +334 -0
- package/plugins/specweave-docs/skills/docusaurus/SKILL.md +581 -0
- package/plugins/specweave-docs/skills/spec-driven-brainstorming/SKILL.md +689 -0
- package/plugins/specweave-docs/skills/technical-writing/SKILL.md +1039 -0
- package/plugins/specweave-docs-preview/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-figma/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-figma/commands/figma-import.md +690 -0
- package/plugins/specweave-figma/commands/figma-to-react.md +834 -0
- package/plugins/specweave-figma/commands/figma-tokens.md +815 -0
- package/plugins/specweave-frontend/.claude-plugin/plugin.json +21 -0
- package/plugins/specweave-frontend/agents/frontend-architect/AGENT.md +408 -0
- package/plugins/specweave-frontend/agents/frontend-architect/README.md +385 -0
- package/plugins/specweave-frontend/agents/frontend-architect/examples.md +590 -0
- package/plugins/specweave-frontend/agents/frontend-architect/templates/component-template.tsx +152 -0
- package/plugins/specweave-frontend/agents/frontend-architect/templates/hook-template.ts +311 -0
- package/plugins/specweave-frontend/agents/frontend-architect/templates/page-template.tsx +228 -0
- package/plugins/specweave-frontend/commands/component-generate.md +510 -0
- package/plugins/specweave-frontend/commands/design-system-init.md +494 -0
- package/plugins/specweave-frontend/commands/frontend-scaffold.md +207 -0
- package/plugins/specweave-frontend/commands/nextjs-setup.md +396 -0
- package/plugins/specweave-frontend/skills/design-system-architect/SKILL.md +278 -0
- package/plugins/specweave-frontend/skills/frontend/SKILL.md +420 -0
- package/plugins/specweave-frontend/skills/nextjs/SKILL.md +546 -0
- package/plugins/specweave-github/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +212 -0
- package/plugins/specweave-infrastructure/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-jira/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-jira/commands/import-projects.js +183 -0
- package/plugins/specweave-jira/commands/import-projects.md +97 -0
- package/plugins/specweave-jira/commands/import-projects.ts +288 -0
- package/plugins/specweave-jira/commands/specweave-jira-import-projects.md +298 -0
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-kubernetes/commands/cluster-setup.md +262 -0
- package/plugins/specweave-kubernetes/commands/deployment-generate.md +242 -0
- package/plugins/specweave-kubernetes/commands/helm-scaffold.md +333 -0
- package/plugins/specweave-ml/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-mobile/commands/app-scaffold.md +233 -0
- package/plugins/specweave-mobile/commands/build-config.md +256 -0
- package/plugins/specweave-mobile/commands/screen-generate.md +289 -0
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-payments/commands/stripe-setup.md +931 -0
- package/plugins/specweave-payments/commands/subscription-flow.md +1193 -0
- package/plugins/specweave-payments/commands/subscription-manage.md +386 -0
- package/plugins/specweave-payments/commands/webhook-setup.md +295 -0
- package/plugins/specweave-plugin-dev/.claude-plugin/plugin.json +13 -12
- package/plugins/specweave-plugin-dev/commands/plugin-create.md +333 -0
- package/plugins/specweave-plugin-dev/commands/plugin-publish.md +339 -0
- package/plugins/specweave-plugin-dev/commands/plugin-test.md +293 -0
- package/plugins/specweave-plugin-dev/skills/claude-sdk/SKILL.md +162 -0
- package/plugins/specweave-plugin-dev/skills/marketplace-publishing/SKILL.md +263 -0
- package/plugins/specweave-plugin-dev/skills/plugin-development/SKILL.md +316 -0
- package/plugins/specweave-release/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave-release/commands/specweave-release-npm.md +110 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +168 -0
- package/plugins/specweave-testing/.claude-plugin/plugin.json +21 -0
- package/plugins/specweave-testing/agents/qa-engineer/AGENT.md +818 -0
- package/plugins/specweave-testing/agents/qa-engineer/README.md +443 -0
- package/plugins/specweave-testing/agents/qa-engineer/templates/playwright-e2e-test.ts +470 -0
- package/plugins/specweave-testing/agents/qa-engineer/templates/test-data-factory.ts +507 -0
- package/plugins/specweave-testing/agents/qa-engineer/templates/vitest-unit-test.ts +400 -0
- package/plugins/specweave-testing/agents/qa-engineer/test-strategies.md +726 -0
- package/plugins/specweave-testing/commands/e2e-setup.md +1081 -0
- package/plugins/specweave-testing/commands/test-coverage.md +979 -0
- package/plugins/specweave-testing/commands/test-generate.md +1156 -0
- package/plugins/specweave-testing/commands/test-init.md +409 -0
- package/plugins/specweave-testing/skills/e2e-playwright/SKILL.md +769 -0
- package/plugins/specweave-testing/skills/tdd-expert/SKILL.md +934 -0
- package/plugins/specweave-testing/skills/unit-testing-expert/SKILL.md +1011 -0
- package/plugins/specweave-tooling/.claude-plugin/plugin.json +22 -0
- package/plugins/specweave-tooling/commands/specweave-tooling-skill-create.md +691 -0
- package/plugins/specweave-tooling/commands/specweave-tooling-skill-package.md +751 -0
- package/plugins/specweave-tooling/commands/specweave-tooling-skill-validate.md +858 -0
- package/plugins/specweave-ui/.claude-plugin/plugin.json +10 -0
- package/plugins/specweave-ui/commands/ui-automate.md +199 -0
- package/plugins/specweave-ui/commands/ui-inspect.md +70 -0
- package/plugins/specweave-ui/skills/browser-automation/SKILL.md +314 -0
- package/plugins/specweave-ui/skills/ui-testing/SKILL.md +716 -0
- package/plugins/specweave-ui/skills/visual-regression/SKILL.md +728 -0
- package/plugins/specweave/commands/check-hooks.md +0 -257
- package/plugins/specweave/commands/specweave-archive-increments.md +0 -82
- package/plugins/specweave-plugin-dev/skills/plugin-expert/SKILL.md +0 -1231
- /package/plugins/specweave/{agents/code-reviewer.md → skills/code-reviewer/SKILL.md} +0 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# Build Configuration
|
|
2
|
+
|
|
3
|
+
Generate build configurations for iOS and Android.
|
|
4
|
+
|
|
5
|
+
## Task
|
|
6
|
+
|
|
7
|
+
You are a React Native build expert. Generate complete build configurations for production releases.
|
|
8
|
+
|
|
9
|
+
### Steps:
|
|
10
|
+
|
|
11
|
+
1. **Ask for Requirements**:
|
|
12
|
+
- App identifier/bundle ID
|
|
13
|
+
- Environment (dev, staging, prod)
|
|
14
|
+
- Code signing details
|
|
15
|
+
- Push notification setup
|
|
16
|
+
|
|
17
|
+
2. **Generate app.json** (Expo):
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"expo": {
|
|
22
|
+
"name": "My App",
|
|
23
|
+
"slug": "my-app",
|
|
24
|
+
"version": "1.0.0",
|
|
25
|
+
"orientation": "portrait",
|
|
26
|
+
"icon": "./assets/icon.png",
|
|
27
|
+
"userInterfaceStyle": "automatic",
|
|
28
|
+
"splash": {
|
|
29
|
+
"image": "./assets/splash.png",
|
|
30
|
+
"resizeMode": "contain",
|
|
31
|
+
"backgroundColor": "#ffffff"
|
|
32
|
+
},
|
|
33
|
+
"assetBundlePatterns": [
|
|
34
|
+
"**/*"
|
|
35
|
+
],
|
|
36
|
+
"ios": {
|
|
37
|
+
"supportsTablet": true,
|
|
38
|
+
"bundleIdentifier": "com.company.myapp",
|
|
39
|
+
"buildNumber": "1",
|
|
40
|
+
"infoPlist": {
|
|
41
|
+
"NSCameraUsageDescription": "This app uses the camera to...",
|
|
42
|
+
"NSPhotoLibraryUsageDescription": "This app accesses photos to...",
|
|
43
|
+
"NSLocationWhenInUseUsageDescription": "This app uses location to..."
|
|
44
|
+
},
|
|
45
|
+
"config": {
|
|
46
|
+
"googleMapsApiKey": "YOUR_KEY_HERE"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"android": {
|
|
50
|
+
"adaptiveIcon": {
|
|
51
|
+
"foregroundImage": "./assets/adaptive-icon.png",
|
|
52
|
+
"backgroundColor": "#ffffff"
|
|
53
|
+
},
|
|
54
|
+
"package": "com.company.myapp",
|
|
55
|
+
"versionCode": 1,
|
|
56
|
+
"permissions": [
|
|
57
|
+
"CAMERA",
|
|
58
|
+
"READ_EXTERNAL_STORAGE",
|
|
59
|
+
"WRITE_EXTERNAL_STORAGE",
|
|
60
|
+
"ACCESS_FINE_LOCATION"
|
|
61
|
+
],
|
|
62
|
+
"config": {
|
|
63
|
+
"googleMaps": {
|
|
64
|
+
"apiKey": "YOUR_KEY_HERE"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"plugins": [
|
|
69
|
+
"expo-camera",
|
|
70
|
+
"expo-location",
|
|
71
|
+
[
|
|
72
|
+
"expo-notifications",
|
|
73
|
+
{
|
|
74
|
+
"icon": "./assets/notification-icon.png",
|
|
75
|
+
"color": "#ffffff"
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
],
|
|
79
|
+
"extra": {
|
|
80
|
+
"eas": {
|
|
81
|
+
"projectId": "your-project-id"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
3. **Generate eas.json** (Expo EAS Build):
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"cli": {
|
|
93
|
+
"version": ">= 5.0.0"
|
|
94
|
+
},
|
|
95
|
+
"build": {
|
|
96
|
+
"development": {
|
|
97
|
+
"developmentClient": true,
|
|
98
|
+
"distribution": "internal",
|
|
99
|
+
"ios": {
|
|
100
|
+
"simulator": true
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"preview": {
|
|
104
|
+
"distribution": "internal",
|
|
105
|
+
"ios": {
|
|
106
|
+
"simulator": false,
|
|
107
|
+
"resourceClass": "m-medium"
|
|
108
|
+
},
|
|
109
|
+
"android": {
|
|
110
|
+
"buildType": "apk",
|
|
111
|
+
"gradleCommand": ":app:assembleRelease"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"production": {
|
|
115
|
+
"ios": {
|
|
116
|
+
"resourceClass": "m-medium",
|
|
117
|
+
"autoIncrement BuildNumber": true
|
|
118
|
+
},
|
|
119
|
+
"android": {
|
|
120
|
+
"buildType": "app-bundle",
|
|
121
|
+
"autoIncrement VersionCode": true
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
"submit": {
|
|
126
|
+
"production": {
|
|
127
|
+
"ios": {
|
|
128
|
+
"appleId": "your@email.com",
|
|
129
|
+
"ascAppId": "1234567890",
|
|
130
|
+
"appleTeamId": "ABCD1234"
|
|
131
|
+
},
|
|
132
|
+
"android": {
|
|
133
|
+
"serviceAccountKeyPath": "./service-account.json",
|
|
134
|
+
"track": "production"
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
4. **Generate Environment Variables**:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
// config/env.ts
|
|
145
|
+
import Constants from 'expo-constants';
|
|
146
|
+
|
|
147
|
+
const ENV = {
|
|
148
|
+
dev: {
|
|
149
|
+
apiUrl: 'http://localhost:3000',
|
|
150
|
+
environment: 'development',
|
|
151
|
+
},
|
|
152
|
+
staging: {
|
|
153
|
+
apiUrl: 'https://staging-api.example.com',
|
|
154
|
+
environment: 'staging',
|
|
155
|
+
},
|
|
156
|
+
prod: {
|
|
157
|
+
apiUrl: 'https://api.example.com',
|
|
158
|
+
environment: 'production',
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
const getEnvVars = (env = Constants.manifest?.releaseChannel) => {
|
|
163
|
+
if (__DEV__) return ENV.dev;
|
|
164
|
+
if (env === 'staging') return ENV.staging;
|
|
165
|
+
return ENV.prod;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export default getEnvVars();
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
5. **Generate Build Scripts**:
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
// package.json scripts
|
|
175
|
+
{
|
|
176
|
+
"scripts": {
|
|
177
|
+
"build:dev:ios": "eas build --profile development --platform ios",
|
|
178
|
+
"build:dev:android": "eas build --profile development --platform android",
|
|
179
|
+
"build:preview:ios": "eas build --profile preview --platform ios",
|
|
180
|
+
"build:preview:android": "eas build --profile preview --platform android",
|
|
181
|
+
"build:prod:ios": "eas build --profile production --platform ios",
|
|
182
|
+
"build:prod:android": "eas build --profile production --platform android",
|
|
183
|
+
"build:prod:all": "eas build --profile production --platform all",
|
|
184
|
+
"submit:ios": "eas submit --platform ios",
|
|
185
|
+
"submit:android": "eas submit --platform android"
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
6. **Generate CI/CD Configuration** (GitHub Actions):
|
|
191
|
+
|
|
192
|
+
```yaml
|
|
193
|
+
name: EAS Build
|
|
194
|
+
|
|
195
|
+
on:
|
|
196
|
+
push:
|
|
197
|
+
branches: [main, develop]
|
|
198
|
+
pull_request:
|
|
199
|
+
branches: [main]
|
|
200
|
+
|
|
201
|
+
jobs:
|
|
202
|
+
build:
|
|
203
|
+
runs-on: ubuntu-latest
|
|
204
|
+
steps:
|
|
205
|
+
- uses: actions/checkout@v3
|
|
206
|
+
|
|
207
|
+
- name: Setup Node
|
|
208
|
+
uses: actions/setup-node@v3
|
|
209
|
+
with:
|
|
210
|
+
node-version: 18
|
|
211
|
+
cache: 'npm'
|
|
212
|
+
|
|
213
|
+
- name: Setup Expo
|
|
214
|
+
uses: expo/expo-github-action@v8
|
|
215
|
+
with:
|
|
216
|
+
expo-version: latest
|
|
217
|
+
eas-version: latest
|
|
218
|
+
token: ${{ secrets.EXPO_TOKEN }}
|
|
219
|
+
|
|
220
|
+
- name: Install dependencies
|
|
221
|
+
run: npm ci
|
|
222
|
+
|
|
223
|
+
- name: Run tests
|
|
224
|
+
run: npm test
|
|
225
|
+
|
|
226
|
+
- name: Build iOS
|
|
227
|
+
run: eas build --profile production --platform ios --non-interactive
|
|
228
|
+
if: github.ref == 'refs/heads/main'
|
|
229
|
+
|
|
230
|
+
- name: Build Android
|
|
231
|
+
run: eas build --profile production --platform android --non-interactive
|
|
232
|
+
if: github.ref == 'refs/heads/main'
|
|
233
|
+
|
|
234
|
+
- name: Submit to stores
|
|
235
|
+
run: |
|
|
236
|
+
eas submit --platform ios --non-interactive
|
|
237
|
+
eas submit --platform android --non-interactive
|
|
238
|
+
if: github.ref == 'refs/heads/main'
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Best Practices Included:
|
|
242
|
+
|
|
243
|
+
- Multi-environment configuration
|
|
244
|
+
- Proper permissions setup
|
|
245
|
+
- Code signing automation
|
|
246
|
+
- CI/CD integration
|
|
247
|
+
- Auto-increment version numbers
|
|
248
|
+
- Proper asset management
|
|
249
|
+
- Push notification setup
|
|
250
|
+
|
|
251
|
+
### Example Usage:
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
User: "Set up production build for iOS and Android"
|
|
255
|
+
Result: Complete build configuration with EAS, CI/CD, environment management
|
|
256
|
+
```
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
# Screen Generator
|
|
2
|
+
|
|
3
|
+
Generate React Native screens with navigation integration.
|
|
4
|
+
|
|
5
|
+
## Task
|
|
6
|
+
|
|
7
|
+
You are a React Native expert. Generate complete, production-ready screens with proper typing and navigation.
|
|
8
|
+
|
|
9
|
+
### Steps:
|
|
10
|
+
|
|
11
|
+
1. **Ask for Requirements**:
|
|
12
|
+
- Screen name and purpose
|
|
13
|
+
- Required data/API calls
|
|
14
|
+
- Form inputs (if any)
|
|
15
|
+
- Navigation params
|
|
16
|
+
|
|
17
|
+
2. **Generate Screen Component**:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import React, { useEffect, useState } from 'react';
|
|
21
|
+
import {
|
|
22
|
+
View,
|
|
23
|
+
Text,
|
|
24
|
+
StyleSheet,
|
|
25
|
+
FlatList,
|
|
26
|
+
RefreshControl,
|
|
27
|
+
ActivityIndicator,
|
|
28
|
+
} from 'react-native';
|
|
29
|
+
import { NativeStackScreenProps } from '@react-navigation/native-stack';
|
|
30
|
+
import { useQuery, useMutation } from '@tanstack/react-query';
|
|
31
|
+
|
|
32
|
+
import { api } from '../../services/api';
|
|
33
|
+
import { Product } from '../../types';
|
|
34
|
+
import { ProductCard } from '../../components/ProductCard';
|
|
35
|
+
import { RootStackParamList } from '../../navigation/types';
|
|
36
|
+
|
|
37
|
+
type Props = NativeStackScreenProps<RootStackParamList, 'ProductList'>;
|
|
38
|
+
|
|
39
|
+
export function ProductListScreen({ navigation, route }: Props) {
|
|
40
|
+
const { category } = route.params;
|
|
41
|
+
|
|
42
|
+
// Fetch data with React Query
|
|
43
|
+
const {
|
|
44
|
+
data: products,
|
|
45
|
+
isLoading,
|
|
46
|
+
error,
|
|
47
|
+
refetch,
|
|
48
|
+
isRefetching,
|
|
49
|
+
} = useQuery({
|
|
50
|
+
queryKey: ['products', category],
|
|
51
|
+
queryFn: () => api.getProducts({ category }),
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Handle item press
|
|
55
|
+
const handleProductPress = (productId: string) => {
|
|
56
|
+
navigation.navigate('ProductDetail', { productId });
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// Render loading state
|
|
60
|
+
if (isLoading) {
|
|
61
|
+
return (
|
|
62
|
+
<View style={styles.centerContainer}>
|
|
63
|
+
<ActivityIndicator size="large" />
|
|
64
|
+
</View>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Render error state
|
|
69
|
+
if (error) {
|
|
70
|
+
return (
|
|
71
|
+
<View style={styles.centerContainer}>
|
|
72
|
+
<Text style={styles.errorText}>
|
|
73
|
+
Failed to load products
|
|
74
|
+
</Text>
|
|
75
|
+
</View>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Render list
|
|
80
|
+
return (
|
|
81
|
+
<View style={styles.container}>
|
|
82
|
+
<FlatList
|
|
83
|
+
data={products}
|
|
84
|
+
keyExtractor={(item) => item.id}
|
|
85
|
+
renderItem={({ item }) => (
|
|
86
|
+
<ProductCard
|
|
87
|
+
product={item}
|
|
88
|
+
onPress={() => handleProductPress(item.id)}
|
|
89
|
+
/>
|
|
90
|
+
)}
|
|
91
|
+
contentContainerStyle={styles.listContent}
|
|
92
|
+
refreshControl={
|
|
93
|
+
<RefreshControl
|
|
94
|
+
refreshing={isRefetching}
|
|
95
|
+
onRefresh={refetch}
|
|
96
|
+
/>
|
|
97
|
+
}
|
|
98
|
+
ListEmptyComponent={
|
|
99
|
+
<Text style={styles.emptyText}>
|
|
100
|
+
No products found
|
|
101
|
+
</Text>
|
|
102
|
+
}
|
|
103
|
+
/>
|
|
104
|
+
</View>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const styles = StyleSheet.create({
|
|
109
|
+
container: {
|
|
110
|
+
flex: 1,
|
|
111
|
+
backgroundColor: '#fff',
|
|
112
|
+
},
|
|
113
|
+
centerContainer: {
|
|
114
|
+
flex: 1,
|
|
115
|
+
justifyContent: 'center',
|
|
116
|
+
alignItems: 'center',
|
|
117
|
+
},
|
|
118
|
+
listContent: {
|
|
119
|
+
padding: 16,
|
|
120
|
+
},
|
|
121
|
+
errorText: {
|
|
122
|
+
fontSize: 16,
|
|
123
|
+
color: 'red',
|
|
124
|
+
},
|
|
125
|
+
emptyText: {
|
|
126
|
+
fontSize: 16,
|
|
127
|
+
textAlign: 'center',
|
|
128
|
+
marginTop: 32,
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
3. **Generate Form Screen**:
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import React from 'react';
|
|
137
|
+
import {
|
|
138
|
+
View,
|
|
139
|
+
StyleSheet,
|
|
140
|
+
ScrollView,
|
|
141
|
+
KeyboardAvoidingView,
|
|
142
|
+
Platform,
|
|
143
|
+
} from 'react-native';
|
|
144
|
+
import { useForm, Controller } from 'react-hook-form';
|
|
145
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
146
|
+
import * as z from 'zod';
|
|
147
|
+
|
|
148
|
+
import { Input } from '../../components/Input';
|
|
149
|
+
import { Button } from '../../components/Button';
|
|
150
|
+
import { api } from '../../services/api';
|
|
151
|
+
|
|
152
|
+
const schema = z.object({
|
|
153
|
+
name: z.string().min(1, 'Name is required'),
|
|
154
|
+
email: z.string().email('Invalid email'),
|
|
155
|
+
phone: z.string().regex(/^\d{10}$/, 'Invalid phone number'),
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
type FormData = z.infer<typeof schema>;
|
|
159
|
+
|
|
160
|
+
export function ProfileEditScreen({ navigation }: Props) {
|
|
161
|
+
const {
|
|
162
|
+
control,
|
|
163
|
+
handleSubmit,
|
|
164
|
+
formState: { errors, isSubmitting },
|
|
165
|
+
} = useForm<FormData>({
|
|
166
|
+
resolver: zodResolver(schema),
|
|
167
|
+
defaultValues: {
|
|
168
|
+
name: '',
|
|
169
|
+
email: '',
|
|
170
|
+
phone: '',
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
const onSubmit = async (data: FormData) => {
|
|
175
|
+
try {
|
|
176
|
+
await api.updateProfile(data);
|
|
177
|
+
navigation.goBack();
|
|
178
|
+
} catch (error) {
|
|
179
|
+
console.error('Failed to update profile', error);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
return (
|
|
184
|
+
<KeyboardAvoidingView
|
|
185
|
+
style={styles.container}
|
|
186
|
+
behavior={Platform.OS === 'ios' ? 'padding' : undefined}
|
|
187
|
+
>
|
|
188
|
+
<ScrollView
|
|
189
|
+
contentContainerStyle={styles.content}
|
|
190
|
+
keyboardShouldPersistTaps="handled"
|
|
191
|
+
>
|
|
192
|
+
<Controller
|
|
193
|
+
control={control}
|
|
194
|
+
name="name"
|
|
195
|
+
render={({ field: { onChange, value } }) => (
|
|
196
|
+
<Input
|
|
197
|
+
label="Name"
|
|
198
|
+
value={value}
|
|
199
|
+
onChangeText={onChange}
|
|
200
|
+
error={errors.name?.message}
|
|
201
|
+
/>
|
|
202
|
+
)}
|
|
203
|
+
/>
|
|
204
|
+
|
|
205
|
+
<Controller
|
|
206
|
+
control={control}
|
|
207
|
+
name="email"
|
|
208
|
+
render={({ field: { onChange, value } }) => (
|
|
209
|
+
<Input
|
|
210
|
+
label="Email"
|
|
211
|
+
value={value}
|
|
212
|
+
onChangeText={onChange}
|
|
213
|
+
keyboardType="email-address"
|
|
214
|
+
autoCapitalize="none"
|
|
215
|
+
error={errors.email?.message}
|
|
216
|
+
/>
|
|
217
|
+
)}
|
|
218
|
+
/>
|
|
219
|
+
|
|
220
|
+
<Controller
|
|
221
|
+
control={control}
|
|
222
|
+
name="phone"
|
|
223
|
+
render={({ field: { onChange, value } }) => (
|
|
224
|
+
<Input
|
|
225
|
+
label="Phone"
|
|
226
|
+
value={value}
|
|
227
|
+
onChangeText={onChange}
|
|
228
|
+
keyboardType="phone-pad"
|
|
229
|
+
error={errors.phone?.message}
|
|
230
|
+
/>
|
|
231
|
+
)}
|
|
232
|
+
/>
|
|
233
|
+
|
|
234
|
+
<Button
|
|
235
|
+
title="Save"
|
|
236
|
+
onPress={handleSubmit(onSubmit)}
|
|
237
|
+
loading={isSubmitting}
|
|
238
|
+
/>
|
|
239
|
+
</ScrollView>
|
|
240
|
+
</KeyboardAvoidingView>
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const styles = StyleSheet.create({
|
|
245
|
+
container: {
|
|
246
|
+
flex: 1,
|
|
247
|
+
backgroundColor: '#fff',
|
|
248
|
+
},
|
|
249
|
+
content: {
|
|
250
|
+
padding: 16,
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
4. **Generate Navigation Types**:
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
// navigation/types.ts
|
|
259
|
+
export type RootStackParamList = {
|
|
260
|
+
ProductList: { category: string };
|
|
261
|
+
ProductDetail: { productId: string };
|
|
262
|
+
ProfileEdit: undefined;
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
declare global {
|
|
266
|
+
namespace ReactNavigation {
|
|
267
|
+
interface RootParamList extends RootStackParamList {}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Best Practices Included:
|
|
273
|
+
|
|
274
|
+
- TypeScript types
|
|
275
|
+
- React Query for data fetching
|
|
276
|
+
- React Hook Form for forms
|
|
277
|
+
- Zod validation
|
|
278
|
+
- Proper error handling
|
|
279
|
+
- Loading states
|
|
280
|
+
- Pull-to-refresh
|
|
281
|
+
- Keyboard handling
|
|
282
|
+
- Responsive styling
|
|
283
|
+
|
|
284
|
+
### Example Usage:
|
|
285
|
+
|
|
286
|
+
```
|
|
287
|
+
User: "Generate product list screen with pull-to-refresh"
|
|
288
|
+
Result: Complete screen with navigation, data fetching, error handling
|
|
289
|
+
```
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave-n8n",
|
|
3
3
|
"description": "n8n workflow automation integration with Kafka - Event-driven workflows, Kafka triggers, producers, consumers, and workflow patterns for no-code/low-code event processing",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.24.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|