packwise-skills 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursorrules +23 -0
- package/CLAUDE.md +25 -0
- package/README.md +295 -0
- package/audit.md +224 -0
- package/bin/packwise.js +155 -0
- package/package.json +31 -0
- package/skill.md +719 -0
- package/sub-skills/ai/local-llm.md +183 -0
- package/sub-skills/ai/python-ml.md +164 -0
- package/sub-skills/backend/go-server.md +184 -0
- package/sub-skills/backend/java-spring.md +241 -0
- package/sub-skills/backend/node-server.md +164 -0
- package/sub-skills/backend/php-laravel.md +175 -0
- package/sub-skills/backend/python-server.md +164 -0
- package/sub-skills/backend/rust-backend.md +118 -0
- package/sub-skills/cli/python-cli.md +236 -0
- package/sub-skills/cli/sdk-library.md +497 -0
- package/sub-skills/cloud/ci-cd-pipelines.md +350 -0
- package/sub-skills/cloud/docker.md +191 -0
- package/sub-skills/cloud/kubernetes.md +277 -0
- package/sub-skills/cloud/payment-integration.md +307 -0
- package/sub-skills/cross-platform/multiplatform.md +252 -0
- package/sub-skills/desktop/electron.md +783 -0
- package/sub-skills/desktop/game-dev.md +443 -0
- package/sub-skills/desktop/native-app.md +123 -0
- package/sub-skills/desktop/scenarios.md +443 -0
- package/sub-skills/desktop/smart-platforms.md +324 -0
- package/sub-skills/desktop/tauri.md +428 -0
- package/sub-skills/desktop/vr-ar.md +252 -0
- package/sub-skills/desktop/web-to-desktop.md +153 -0
- package/sub-skills/embedded/car-infotainment.md +129 -0
- package/sub-skills/embedded/esp32.md +184 -0
- package/sub-skills/embedded/ros.md +150 -0
- package/sub-skills/embedded/stm32.md +160 -0
- package/sub-skills/mobile/android.md +322 -0
- package/sub-skills/mobile/capacitor.md +232 -0
- package/sub-skills/mobile/flutter-mobile.md +138 -0
- package/sub-skills/mobile/harmonyos.md +150 -0
- package/sub-skills/mobile/ios.md +245 -0
- package/sub-skills/mobile/react-native.md +443 -0
- package/sub-skills/mobile/wearables.md +230 -0
- package/sub-skills/plugins/browser-extension.md +308 -0
- package/sub-skills/plugins/jetbrains-plugin.md +226 -0
- package/sub-skills/plugins/vscode-extension.md +204 -0
- package/sub-skills/security/security-tools.md +174 -0
- package/sub-skills/web/monorepo.md +274 -0
- package/sub-skills/web/pwa.md +220 -0
- package/sub-skills/web/serverless-edge.md +295 -0
- package/sub-skills/web/spa.md +266 -0
- package/sub-skills/web/ssr.md +228 -0
- package/sub-skills/web/wasm.md +243 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# Cross-Platform Multiplatform Build Sub-Skill
|
|
2
|
+
|
|
3
|
+
Build apps targeting multiple platforms from a single codebase using .NET MAUI, Kotlin Multiplatform, or similar frameworks.
|
|
4
|
+
|
|
5
|
+
**Current version**: .NET 9 / MAUI 9 / Kotlin 2.0 / KMP (2025-2026)
|
|
6
|
+
|
|
7
|
+
## When to Use
|
|
8
|
+
|
|
9
|
+
- Need iOS + Android + Desktop + Web from one codebase
|
|
10
|
+
- Team has C#/.NET or Kotlin experience
|
|
11
|
+
- Want to share business logic across platforms while keeping native UI
|
|
12
|
+
- Enterprise/internal apps where development speed matters more than pixel-perfect native UI
|
|
13
|
+
|
|
14
|
+
## Framework Comparison
|
|
15
|
+
|
|
16
|
+
| Feature | .NET MAUI 9 | Kotlin Multiplatform (KMP) | Compose Multiplatform |
|
|
17
|
+
|---------|------------|---------------------------|----------------------|
|
|
18
|
+
| Language | C# | Kotlin | Kotlin |
|
|
19
|
+
| UI approach | Single UI (native controls) | Shared logic, native UI | Shared UI (Compose) |
|
|
20
|
+
| Platforms | iOS, Android, Windows, macOS | iOS, Android, Web, Desktop | iOS, Android, Desktop, Web |
|
|
21
|
+
| Maturity | Stable (since .NET 7) | Stable (since KMP 1.9) | Beta (iOS) / Stable (Desktop) |
|
|
22
|
+
| Shared code | 100% (including UI) | 60–80% (logic only) | 80–95% (including UI) |
|
|
23
|
+
| Performance | Near-native | Native (compiled per platform) | Near-native |
|
|
24
|
+
| Best for | .NET teams, enterprise | Max native feel + shared logic | Kotlin teams, cross-platform UI |
|
|
25
|
+
|
|
26
|
+
## .NET MAUI
|
|
27
|
+
|
|
28
|
+
### Prerequisites
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Install .NET 9 SDK
|
|
32
|
+
# https://dotnet.microsoft.com/download
|
|
33
|
+
|
|
34
|
+
# Install MAUI workload
|
|
35
|
+
dotnet workload install maui
|
|
36
|
+
|
|
37
|
+
# Verify
|
|
38
|
+
dotnet --list-sdks
|
|
39
|
+
dotnet workload list
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Build
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Create project
|
|
46
|
+
dotnet new maui -n MyApp
|
|
47
|
+
cd MyApp
|
|
48
|
+
|
|
49
|
+
# Build for Android
|
|
50
|
+
dotnet build -f net9.0-android -c Release
|
|
51
|
+
# Output: bin/Release/net9.0-android/com.companyname.myapp-Signed.apk
|
|
52
|
+
|
|
53
|
+
# Build for iOS (macOS only)
|
|
54
|
+
dotnet build -f net9.0-ios -c Release
|
|
55
|
+
# Output: bin/Release/net9.0-ios/MyApp.ipa
|
|
56
|
+
|
|
57
|
+
# Build for Windows
|
|
58
|
+
dotnet build -f net9.0-windows10.0.19041.0 -c Release
|
|
59
|
+
# Output: bin/Release/net9.0-windows10.0.19041.0/win-x64/
|
|
60
|
+
|
|
61
|
+
# Build for macOS (macOS only)
|
|
62
|
+
dotnet build -f net9.0-maccatalyst -c Release
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Publish
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Android AAB (for Play Store)
|
|
69
|
+
dotnet publish -f net9.0-android -c Release /p:AndroidPackageFormat=aab
|
|
70
|
+
|
|
71
|
+
# Android APK
|
|
72
|
+
dotnet publish -f net9.0-android -c Release
|
|
73
|
+
|
|
74
|
+
# iOS (requires Apple Developer account + signing)
|
|
75
|
+
dotnet publish -f net9.0-ios -c Release /p:CodesignKey="Apple Distribution: ..." /p:CodesignProvision="MyApp Provisioning"
|
|
76
|
+
|
|
77
|
+
# Windows (MSIX for Store or sideloading)
|
|
78
|
+
dotnet publish -f net9.0-windows10.0.19041.0 -c Release /p:GenerateAppxPackageOnBuild=true
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Project Structure
|
|
82
|
+
|
|
83
|
+
```xml
|
|
84
|
+
<!-- MyApp.csproj -->
|
|
85
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
|
86
|
+
<PropertyGroup>
|
|
87
|
+
<TargetFrameworks>net9.0-android;net9.0-ios;net9.0-windows10.0.19041.0;net9.0-maccatalyst</TargetFrameworks>
|
|
88
|
+
<OutputType>Exe</OutputType>
|
|
89
|
+
<ApplicationTitle>MyApp</ApplicationTitle>
|
|
90
|
+
<ApplicationId>com.companyname.myapp</ApplicationId>
|
|
91
|
+
<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
|
|
92
|
+
<ApplicationVersion>1</ApplicationVersion>
|
|
93
|
+
</PropertyGroup>
|
|
94
|
+
</Project>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Common Pitfalls
|
|
98
|
+
|
|
99
|
+
| Issue | Fix |
|
|
100
|
+
|-------|-----|
|
|
101
|
+
| Android build fails | Ensure Android SDK 34+ and JDK 17 installed; set `JAVA_HOME` |
|
|
102
|
+
| iOS signing error | Set up provisioning profile; use `dotnet build -p:CodesignKey=...` |
|
|
103
|
+
| Windows MSIX won't install | Enable Developer Mode; sign with trusted certificate |
|
|
104
|
+
| Hot Reload not working | Use Visual Studio 2022 17.8+; ensure `net9.0` target |
|
|
105
|
+
| Memory leaks | Dispose `IDisposable` resources; avoid circular event subscriptions |
|
|
106
|
+
| Platform-specific code | Use `#if ANDROID` / `#if IOS` / `#if WINDOWS` conditional compilation |
|
|
107
|
+
|
|
108
|
+
## Kotlin Multiplatform (KMP)
|
|
109
|
+
|
|
110
|
+
### Prerequisites
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# Android Studio with KMP plugin
|
|
114
|
+
# Kotlin 2.0+ (included in Android Studio 2024.2+)
|
|
115
|
+
|
|
116
|
+
# For iOS: Xcode 15+, CocoaPods
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Project Structure
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
my-kmp-app/
|
|
123
|
+
├── shared/ # Shared Kotlin code
|
|
124
|
+
│ ├── src/
|
|
125
|
+
│ │ ├── commonMain/ # Shared code (all platforms)
|
|
126
|
+
│ │ ├── androidMain/ # Android-specific
|
|
127
|
+
│ │ ├── iosMain/ # iOS-specific
|
|
128
|
+
│ │ └── commonTest/ # Shared tests
|
|
129
|
+
│ └── build.gradle.kts
|
|
130
|
+
├── androidApp/ # Android app (thin shell)
|
|
131
|
+
│ └── build.gradle.kts
|
|
132
|
+
├── iosApp/ # iOS app (Xcode project)
|
|
133
|
+
│ └── iosApp.xcodeproj
|
|
134
|
+
└── build.gradle.kts
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Build Configuration
|
|
138
|
+
|
|
139
|
+
```kotlin
|
|
140
|
+
// shared/build.gradle.kts
|
|
141
|
+
plugins {
|
|
142
|
+
kotlin("multiplatform")
|
|
143
|
+
id("com.android.library")
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
kotlin {
|
|
147
|
+
androidTarget {
|
|
148
|
+
compilations.all {
|
|
149
|
+
kotlinOptions {
|
|
150
|
+
jvmTarget = "17"
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
listOf(
|
|
156
|
+
iosX64(),
|
|
157
|
+
iosArm64(),
|
|
158
|
+
iosSimulatorArm64()
|
|
159
|
+
).forEach {
|
|
160
|
+
it.binaries.framework {
|
|
161
|
+
baseName = "shared"
|
|
162
|
+
isStatic = true
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
sourceSets {
|
|
167
|
+
commonMain.dependencies {
|
|
168
|
+
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
|
|
169
|
+
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
|
|
170
|
+
implementation("io.ktor:ktor-client-core:2.3.12")
|
|
171
|
+
implementation("io.ktor:ktor-client-content-negotiation:2.3.12")
|
|
172
|
+
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.12")
|
|
173
|
+
}
|
|
174
|
+
androidMain.dependencies {
|
|
175
|
+
implementation("io.ktor:ktor-client-okhttp:2.3.12")
|
|
176
|
+
}
|
|
177
|
+
iosMain.dependencies {
|
|
178
|
+
implementation("io.ktor:ktor-client-darwin:2.3.12")
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Build
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
# Build shared framework for iOS
|
|
188
|
+
./gradlew :shared:linkDebugFrameworkIosArm64
|
|
189
|
+
./gradlew :shared:linkReleaseFrameworkIosArm64
|
|
190
|
+
|
|
191
|
+
# Build Android
|
|
192
|
+
./gradlew :androidApp:assembleDebug
|
|
193
|
+
./gradlew :androidApp:assembleRelease
|
|
194
|
+
|
|
195
|
+
# Run all tests
|
|
196
|
+
./gradlew :shared:allTests
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Common Pitfalls
|
|
200
|
+
|
|
201
|
+
| Issue | Fix |
|
|
202
|
+
|-------|-----|
|
|
203
|
+
| iOS framework not found in Xcode | Ensure framework path is set in Xcode Build Settings |
|
|
204
|
+
| Coroutine crash on iOS | Use `Dispatchers.Main` on iOS; wrap suspend calls in `@MainActor` |
|
|
205
|
+
| Serialization fails on iOS | Ensure `kotlinx-serialization` plugin is applied in shared module |
|
|
206
|
+
| Slow iOS builds | Use Simulator for development; `linkDebugFramework` caches better |
|
|
207
|
+
| Platform-specific API access | Use `expect`/`actual` declarations |
|
|
208
|
+
|
|
209
|
+
## expect/actual Pattern (KMP)
|
|
210
|
+
|
|
211
|
+
```kotlin
|
|
212
|
+
// commonMain: declare expected API
|
|
213
|
+
expect class PlatformContext
|
|
214
|
+
expect fun getPlatformName(): String
|
|
215
|
+
|
|
216
|
+
// androidMain: implement
|
|
217
|
+
actual class PlatformContext(val context: android.content.Context)
|
|
218
|
+
actual fun getPlatformName(): String = "Android ${android.os.Build.VERSION.SDK_INT}"
|
|
219
|
+
|
|
220
|
+
// iosMain: implement
|
|
221
|
+
actual class PlatformContext
|
|
222
|
+
actual fun getPlatformName(): String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## CI/CD — GitHub Actions (KMP)
|
|
226
|
+
|
|
227
|
+
```yaml
|
|
228
|
+
name: KMP Build
|
|
229
|
+
on:
|
|
230
|
+
push:
|
|
231
|
+
branches: [main]
|
|
232
|
+
|
|
233
|
+
jobs:
|
|
234
|
+
android:
|
|
235
|
+
runs-on: ubuntu-latest
|
|
236
|
+
steps:
|
|
237
|
+
- uses: actions/checkout@v4
|
|
238
|
+
- uses: actions/setup-java@v4
|
|
239
|
+
with:
|
|
240
|
+
distribution: 'temurin'
|
|
241
|
+
java-version: '17'
|
|
242
|
+
- run: ./gradlew :androidApp:assembleRelease
|
|
243
|
+
|
|
244
|
+
ios:
|
|
245
|
+
runs-on: macos-latest
|
|
246
|
+
steps:
|
|
247
|
+
- uses: actions/checkout@v4
|
|
248
|
+
- run: ./gradlew :shared:linkReleaseFrameworkIosArm64
|
|
249
|
+
- run: |
|
|
250
|
+
cd iosApp
|
|
251
|
+
xcodebuild -scheme iosApp -configuration Release -sdk iphoneos -archivePath build/MyApp.xcarchive archive
|
|
252
|
+
```
|