Silence render-disposed spam, unbreak bundled skills, drop board wake
Three independently ugly bugs that all fed the same log flood:
* Electron's `WebFrameMain.send` writes every "Render frame was disposed"
to stderr via `console.error`. When the worker fans a second
agent-event past a reloading renderer, we produced thousands of
identical lines and stalled the main loop on stderr I/O. Added a
`mainFrame.detached` guard so the send is short-circuited before
Electron's own catch block fires, and installed a targeted filter in
`suppress-warnings.ts` (now actually imported from the entry point)
so the specific `console.error("Error sending from webFrameMain:"…)`
noise never reaches the terminal. Any other payload still surfaces.
* `dispatchAgentMessage` accepted the human-reader sentinel as a wake
target when an agent replied to `__board__` — `wakeAgentIfPossible`
then called `db.getAgent("__board__")`, threw, and the dispatcher
kept repeating on every send. Strip `HUMAN_SENDER_ID` at
`resolveMessageWakeTargets`, and keep a defense-in-depth guard in the
heartbeat so a stray caller (future automation fan-out) cannot
reintroduce the crash.
* Pi's skills loader rejects any SKILL.md whose frontmatter `name`
diverges from its parent directory. The four bundled `my-writing-style`
copies declared `name: writing-style-skill`, so every install emitted
a warning and dropped the skill. They also lived as orphan gitlinks
(mode 160000 without .gitmodules), and the global `*.md` gitignore
hid every other SKILL.md from version control. Fixed the frontmatter
to match the dir, converted the dangling submodules to plain trees,
and allowlisted `builtin-skills/**/*.md` so a fresh clone carries the
catalogue instead of silently losing it.
This commit is contained in:
1 parent
7a9a6779b0
commit
e74dafcd36
287 files changed
+59858
-10
No files matched your search
@@ -0,0 +1,261 @@
|
||||
---
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# SKILL: Mobile Development
|
||||
# Version: 2.0.0 | Updated: 2025-01
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
name: mobile-development
|
||||
description: iOS (Swift, SwiftUI), Android (Kotlin, Compose), cross-platform (Flutter, React Native), and game development (Unity, Unreal).
|
||||
|
||||
# ACTIVATION TRIGGERS
|
||||
triggers:
|
||||
- ios
|
||||
- android
|
||||
- flutter
|
||||
- react native
|
||||
- mobile
|
||||
- swift
|
||||
- kotlin
|
||||
- unity
|
||||
- game development
|
||||
|
||||
# SKILL PARAMETERS
|
||||
parameters:
|
||||
platform:
|
||||
type: string
|
||||
enum: [ios, android, cross-platform, games]
|
||||
required: true
|
||||
project_type:
|
||||
type: string
|
||||
required: false
|
||||
description: Type of app (social, productivity, game, etc.)
|
||||
|
||||
# OUTPUT SPECIFICATION
|
||||
outputs:
|
||||
recommended_stack:
|
||||
type: object
|
||||
learning_path:
|
||||
type: array
|
||||
portfolio_projects:
|
||||
type: array
|
||||
|
||||
# RELIABILITY
|
||||
retry:
|
||||
max_attempts: 3
|
||||
backoff: exponential
|
||||
|
||||
# OBSERVABILITY
|
||||
observability:
|
||||
log_level: info
|
||||
|
||||
level: advanced
|
||||
prerequisites:
|
||||
- core-development
|
||||
|
||||
sasmp_version: "1.3.0"
|
||||
bonded_agent: 01-core-paths
|
||||
bond_type: PRIMARY_BOND
|
||||
---
|
||||
|
||||
# Mobile Development Skill
|
||||
|
||||
## Quick Reference
|
||||
|
||||
| Platform | Language | Framework | Timeline | Job Market |
|
||||
|----------|----------|-----------|----------|------------|
|
||||
| **iOS** | Swift | SwiftUI | 6-9 mo | High |
|
||||
| **Android** | Kotlin | Compose | 6-9 mo | High |
|
||||
| **Cross-Platform** | Dart | Flutter | 4-6 mo | Growing |
|
||||
| **Games** | C# | Unity | 12-24 mo | Moderate |
|
||||
|
||||
---
|
||||
|
||||
## Learning Paths
|
||||
|
||||
### iOS Development
|
||||
```
|
||||
[1] Swift Fundamentals (4-6 wk)
|
||||
│ └─ Types, optionals, closures, protocols
|
||||
│
|
||||
▼
|
||||
[2] SwiftUI (4-6 wk)
|
||||
│ └─ Views, modifiers, state, binding
|
||||
│
|
||||
▼
|
||||
[3] Navigation + Data (3-4 wk)
|
||||
│ └─ NavigationStack, SwiftData/Core Data
|
||||
│
|
||||
▼
|
||||
[4] Networking + Async (2-3 wk)
|
||||
│ └─ URLSession, async/await, Combine
|
||||
│
|
||||
▼
|
||||
[5] Testing + App Store (2 wk)
|
||||
└─ XCTest, TestFlight, submission
|
||||
```
|
||||
|
||||
**2025 Stack:** Swift 5.10 + SwiftUI + SwiftData + Xcode 16
|
||||
|
||||
---
|
||||
|
||||
### Android Development
|
||||
```
|
||||
[1] Kotlin Fundamentals (4-6 wk)
|
||||
│ └─ Null safety, coroutines, data classes
|
||||
│
|
||||
▼
|
||||
[2] Jetpack Compose (4-6 wk)
|
||||
│ └─ Composables, state, effects
|
||||
│
|
||||
▼
|
||||
[3] Architecture (3-4 wk)
|
||||
│ └─ MVVM, Room, Navigation
|
||||
│
|
||||
▼
|
||||
[4] Networking + DI (2-3 wk)
|
||||
│ └─ Retrofit, Hilt, Flow
|
||||
│
|
||||
▼
|
||||
[5] Testing + Play Store (2 wk)
|
||||
└─ JUnit, Espresso, release
|
||||
```
|
||||
|
||||
**2025 Stack:** Kotlin 2.0 + Jetpack Compose + Room + Hilt
|
||||
|
||||
---
|
||||
|
||||
### Flutter (Cross-Platform)
|
||||
```
|
||||
[1] Dart Fundamentals (2-3 wk)
|
||||
│
|
||||
▼
|
||||
[2] Flutter Widgets (3-4 wk)
|
||||
│
|
||||
▼
|
||||
[3] State Management (2-3 wk)
|
||||
│ └─ Riverpod or Bloc
|
||||
│
|
||||
▼
|
||||
[4] Backend Integration (2 wk)
|
||||
│ └─ Firebase, REST APIs
|
||||
│
|
||||
▼
|
||||
[5] Deploy to Both Stores (1 wk)
|
||||
```
|
||||
|
||||
**2025 Stack:** Flutter 3.x + Dart 3.x + Riverpod + Firebase
|
||||
|
||||
---
|
||||
|
||||
### Game Development
|
||||
```
|
||||
[1] Game Basics (4-6 wk)
|
||||
│ └─ Game loop, input handling
|
||||
│
|
||||
▼
|
||||
[2] Unity/C# Fundamentals (6-8 wk)
|
||||
│ └─ GameObjects, Components, Scripts
|
||||
│
|
||||
▼
|
||||
[3] Physics + Graphics (4-6 wk)
|
||||
│ └─ Rigidbody, colliders, shaders
|
||||
│
|
||||
▼
|
||||
[4] Audio + Polish (2-4 wk)
|
||||
│
|
||||
▼
|
||||
[5] Publish (ongoing)
|
||||
└─ Steam, App Store, Play Store
|
||||
```
|
||||
|
||||
**2025 Stack:** Unity 6 LTS + C# OR Unreal 5.4 + C++
|
||||
|
||||
---
|
||||
|
||||
## Platform Decision Tree
|
||||
|
||||
```
|
||||
Which platform?
|
||||
│
|
||||
├─► Apple ecosystem only?
|
||||
│ └─► iOS (Swift + SwiftUI)
|
||||
│
|
||||
├─► Android ecosystem only?
|
||||
│ └─► Android (Kotlin + Compose)
|
||||
│
|
||||
├─► Both platforms?
|
||||
│ ├─► Performance-critical? → Native for both
|
||||
│ ├─► Budget/time limited? → Flutter
|
||||
│ └─► Web developer background? → React Native
|
||||
│
|
||||
└─► Making games?
|
||||
├─► 2D/3D indie → Unity
|
||||
├─► AAA quality → Unreal
|
||||
└─► Simple 2D → Godot
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Game Engine Comparison
|
||||
|
||||
| Engine | Market | Language | Learning | Best For |
|
||||
|--------|--------|----------|----------|----------|
|
||||
| **Unity** | 51% | C# | Medium | Indie, mobile, VR |
|
||||
| **Unreal** | 31% | C++/BP | Hard | AAA, high-fidelity |
|
||||
| **Godot** | 10% | GDScript | Easy | Indie, 2D |
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
```
|
||||
Native vs Cross-platform?
|
||||
├─► Need platform-specific APIs (HealthKit, ARCore)? → Native
|
||||
├─► Performance-critical (AR/VR, complex animations)? → Native
|
||||
├─► Budget or time limited? → Flutter
|
||||
├─► Team knows JavaScript? → React Native
|
||||
└─► Starting from scratch? → Flutter (best DX)
|
||||
|
||||
Simulator works, device doesn't?
|
||||
├─► Missing entitlements/capabilities?
|
||||
├─► Different iOS/Android version?
|
||||
├─► Network connectivity issues?
|
||||
└─► Always test on real devices from day 1
|
||||
|
||||
App rejected by store?
|
||||
├─► Read rejection reason carefully
|
||||
├─► Check App Store Review Guidelines
|
||||
├─► Most common: metadata issues, crashes, spam
|
||||
└─► Appeal if unjustified
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Failure Modes
|
||||
|
||||
| Symptom | Root Cause | Recovery |
|
||||
|---------|------------|----------|
|
||||
| Slow UI | Too many recompositions | Profile, optimize state |
|
||||
| Memory leaks | Not cleaning up resources | Use lifecycle-aware components |
|
||||
| App rejected | Guidelines violation | Read guidelines BEFORE building |
|
||||
| Game stutters | Draw call overhead | Object pooling, LOD, batching |
|
||||
|
||||
---
|
||||
|
||||
## Portfolio Projects
|
||||
|
||||
### Mobile (Progressive)
|
||||
1. **Todo App** - CRUD basics
|
||||
2. **Weather App** - API integration
|
||||
3. **Chat App** - Real-time, auth
|
||||
4. **Payment App** - Stripe, security
|
||||
|
||||
### Games
|
||||
1. **2D Platformer** - Physics basics
|
||||
2. **3D Runner** - 3D graphics, particles
|
||||
3. **Multiplayer Game** - Networking
|
||||
|
||||
---
|
||||
|
||||
## Next Actions
|
||||
|
||||
Specify your target platform for a detailed learning plan.
|
||||
@@ -0,0 +1,73 @@
|
||||
# Mobile Development Guide for Cloudflare
|
||||
|
||||
## PWA on Cloudflare Pages
|
||||
|
||||
```json
|
||||
// manifest.json
|
||||
{
|
||||
"name": "My PWA",
|
||||
"short_name": "PWA",
|
||||
"start_url": "/",
|
||||
"display": "standalone",
|
||||
"background_color": "#ffffff",
|
||||
"theme_color": "#f38020",
|
||||
"icons": [
|
||||
{ "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
|
||||
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Service Worker with Cloudflare
|
||||
|
||||
```typescript
|
||||
// sw.ts - Offline-first strategy
|
||||
const CACHE_NAME = 'v1';
|
||||
const OFFLINE_URL = '/offline.html';
|
||||
|
||||
self.addEventListener('install', (event) => {
|
||||
event.waitUntil(
|
||||
caches.open(CACHE_NAME).then((cache) => {
|
||||
return cache.addAll([OFFLINE_URL, '/', '/styles.css']);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
self.addEventListener('fetch', (event) => {
|
||||
event.respondWith(
|
||||
fetch(event.request).catch(() => caches.match(OFFLINE_URL))
|
||||
);
|
||||
});
|
||||
```
|
||||
|
||||
## Mobile API with Workers
|
||||
|
||||
```typescript
|
||||
// Optimized for mobile clients
|
||||
export default {
|
||||
async fetch(request: Request, env: Env) {
|
||||
const userAgent = request.headers.get('User-Agent') || '';
|
||||
const isMobile = /Mobile|Android|iPhone/i.test(userAgent);
|
||||
|
||||
return Response.json({
|
||||
data: await getData(env),
|
||||
optimized: isMobile ? 'mobile' : 'desktop'
|
||||
}, {
|
||||
headers: {
|
||||
'Cache-Control': isMobile ? 'max-age=300' : 'max-age=3600'
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## Deployment
|
||||
|
||||
```bash
|
||||
# Deploy to Cloudflare Pages
|
||||
npx wrangler pages deploy dist --project-name=my-pwa
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*Cloudflare Plugin - Mobile Development Skill*
|
||||
Reference in new issue
Block a user