一键导入
mobile-developer
Expert knowledge in mobile app development for iOS, Android, and cross-platform solutions
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Expert knowledge in mobile app development for iOS, Android, and cross-platform solutions
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Send and edit Telegram messages, and send photos via Bot API. Use when AMCP needs to send text, reply to a specific message, edit an existing message, send an image, or push proactive notifications (cron results, heartbeat alerts, task status). Requires AMCP_TELEGRAM_BOT_TOKEN env var.
Search and read the live web for current documentation, APIs, libraries, examples, breaking changes, and unfamiliar technologies. Use when the user asks for online research, current knowledge, web pages, URLs, external docs, internet learning, or when the assistant needs to learn something new from the public web before answering or coding.
Create or update AMCP skills. Use when designing, structuring, or packaging skills with scripts, references, and assets. This skill should be used when users want to create a new skill (or update an existing skill) that extends AMCP's capabilities with specialized knowledge, workflows, or tool integrations.
Review GitHub Pull Requests using the gh CLI. Use when a user asks to review a PR, perform code review, check a pull request, or provide feedback on proposed changes. Triggers on phrases like "review PR", "review pull request", "check PR", "code review".
Periodic heartbeat check that reads HEARTBEAT.md from the workspace and executes any tasks listed there. Use for autonomous background monitoring, periodic maintenance, and proactive task execution. Triggered by a cron schedule.
Backup old AMCP sessions by renaming with execution date, then clean and compact sessions and memory.
| name | mobile-developer |
| description | Expert knowledge in mobile app development for iOS, Android, and cross-platform solutions |
import React, { useState, useEffect } from 'react';
import { View, Text, TextInput, Button, StyleSheet } from 'react-native';
import { useNavigation } from '@react-navigation/native';
const LoginForm = () => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [loading, setLoading] = useState(false);
const navigation = useNavigation();
const handleLogin = async () => {
setLoading(true);
try {
// API call for authentication
await loginAPI(email, password);
navigation.navigate('Home');
} catch (error) {
console.error('Login failed:', error);
} finally {
setLoading(false);
}
};
return (
<View style={styles.container}>
<Text style={styles.title}>Login</Text>
<TextInput
style={styles.input}
placeholder="Email"
value={email}
onChangeText={setEmail}
keyboardType="email-address"
autoCapitalize="none"
/>
<TextInput
style={styles.input}
placeholder="Password"
value={password}
onChangeText={setPassword}
secureTextEntry
/>
<Button
title={loading ? "Logging in..." : "Login"}
onPress={handleLogin}
disabled={loading}
/>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 20,
justifyContent: 'center',
},
title: {
fontSize: 24,
fontWeight: 'bold',
textAlign: 'center',
marginBottom: 20,
},
input: {
height: 40,
borderColor: 'gray',
borderWidth: 1,
marginBottom: 10,
paddingHorizontal: 10,
},
});
import SwiftUI
struct LoginView: View {
@State private var email = ""
@State private var password = ""
@State private var showingAlert = false
@State private var alertMessage = ""
var body: some View {
VStack(spacing: 20) {
Text("Login")
.font(.largeTitle)
.fontWeight(.bold)
TextField("Email", text: $email)
.textFieldStyle(RoundedBorderTextFieldStyle())
.keyboardType(.emailAddress)
.autocapitalization(.none)
SecureField("Password", text: $password)
.textFieldStyle(RoundedBorderTextFieldStyle())
Button(action: login) {
Text("Login")
.frame(maxWidth: .infinity)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
.disabled(email.isEmpty || password.isEmpty)
}
.padding()
.alert(isPresented: $showingAlert) {
Alert(title: Text("Error"), message: Text(alertMessage))
}
}
private func login() {
// Authentication logic
guard !email.isEmpty, !password.isEmpty else {
alertMessage = "Please fill in all fields"
showingAlert = true
return
}
// API call for authentication
AuthAPI.login(email: email, password: password) { result in
switch result {
case .success:
// Navigate to home screen
break
case .failure(let error):
alertMessage = error.localizedDescription
showingAlert = true
}
}
}
}
import 'package:flutter/material.dart';
class LoginForm extends StatefulWidget {
@override
_LoginFormState createState() => _LoginFormState();
}
class _LoginFormState extends State<LoginForm> {
final _formKey = GlobalKey<FormState>();
final _emailController = TextEditingController();
final _passwordController = TextEditingController();
bool _isLoading = false;
Future<void> _login() async {
if (_formKey.currentState!.validate()) {
setState(() => _isLoading = true);
try {
await AuthAPI.login(
email: _emailController.text,
password: _passwordController.text,
);
Navigator.pushReplacementNamed(context, '/home');
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Login failed: ${e.toString()}')),
);
} finally {
setState(() => _isLoading = false);
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Login')),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextFormField(
controller: _emailController,
decoration: InputDecoration(labelText: 'Email'),
keyboardType: TextInputType.emailAddress,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your email';
}
return null;
},
),
SizedBox(height: 16),
TextFormField(
controller: _passwordController,
decoration: InputDecoration(labelText: 'Password'),
obscureText: true,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your password';
}
return null;
},
),
SizedBox(height: 24),
_isLoading
? CircularProgressIndicator()
: ElevatedButton(
onPressed: _login,
child: Text('Login'),
style: ElevatedButton.styleFrom(
minimumSize: Size(double.infinity, 48),
),
),
],
),
),
),
);
}
}
When developing mobile applications, always consider: