ソース情報
- リポジトリ
- CodySwannGT/lisa
- ソースの最終更新活動
- 2026年7月10日 13:59
- 検出された SKILL.md の言語
- 英語
- スター
- 3
- フォーク
- 3
インストール方法
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
ソースファイルを確認
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
メニュー
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/CodySwannGT/lisa --skill cross-platform-compatibilityコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
This skill should be used for any non-trivial request — features, bugs, stories, epics, spikes, or multi-step tasks. It accepts a ticket URL (Jira, Linear, GitHub), a file path containing a spec, or a plain-text prompt. It assembles an agent team, breaks the work into structured tasks, and manages the full lifecycle from research through implementation, code review, deploy, and empirical verification.
any non-trivial request —…
This skill should be used for any non-trivial request — features, bugs, stories, epics, spikes, or multi-step tasks. It accepts a ticket URL (Jira, Linear, GitHub), a file path containing a spec, or a plain-text prompt. It assembles an agent team, breaks the work into structured tasks, and manages the full lifecycle from research through implementation, code review, deploy, and empirical verification.
SOC 職業分類に基づく
SKILL.md を表示中
| name | cross-platform-compatibility |
| description | This skill enforces… |
This skill provides guidance for writing code that works correctly on iOS, Android, and web platforms in Expo applications.
Every feature must work on all three platforms (iOS, Android, web) unless explicitly documented otherwise. Test on all platforms before considering a feature complete.
There are two primary ways to handle platform differences:
Use Platform.OS for small, inline differences within a single component.
import { Platform } from "react-native";
// Simple conditional
if (Platform.OS === "web") {
// Web-specific code
}
// Platform.select for multiple platforms
const styles = StyleSheet.create({
container: {
...Platform.select({
ios: { shadowColor: "#000" },
android: { elevation: 4 },
web: { boxShadow: "0 2px 4px rgba(0,0,0,0.1)" },
}),
},
});
Use file extensions when entire components or modules differ significantly between platforms.
| Extension | Platforms | Use Case |
|---|---|---|
.web.tsx | Web only | Web-specific implementation |
.native.tsx | iOS + Android | Shared native implementation |
.ios.tsx | iOS only | iOS-specific implementation |
.android.tsx | Android only | Android-specific implementation |
Resolution Priority: Metro bundler resolves in this order:
.ios.tsx / .android.tsx (most specific).native.tsx (native platforms).web.tsx (web platform).tsx (universal fallback)Need platform-specific behavior?
├── Small differences (styles, one-liner logic)?
│ └── Use Platform.OS or Platform.select()
├── Moderate differences (conditional rendering blocks)?
│ └── Use Platform.OS with clear separation
└── Significant differences (entire component logic)?
└── Use platform-specific file extensions
dom-to-image for web vs react-native-view-shot for native)app/ Directory (Expo Router)Platform-specific extensions in the app/ directory require a base version for route universality:
app/
├── _layout.tsx # Required base version
├── _layout.web.tsx # Optional web override
├── index.tsx # Required base version
├── about.tsx # Required base version
└── about.web.tsx # Optional web override
app/ DirectoryPlatform-specific files outside app/ do not require a base version:
components/
├── DatePicker/
│ ├── DatePickerContainer.tsx # Container (shared logic)
│ ├── DatePickerView.tsx # Default view
│ ├── DatePickerView.web.tsx # Web-specific view
│ └── index.tsx # Exports container
To use platform-specific components in routes:
// components/about/index.tsx (or about.native.tsx + about.web.tsx)
// Platform-specific implementations
// app/about.tsx
export { default } from "../components/about";
These APIs require Platform.OS checks or alternatives on web:
| API | Issue on Web | Solution |
|---|---|---|
MediaLibrary.saveToLibraryAsync | Not supported | Use download link on web |
Share.share() | Limited support | Use Web Share API or clipboard |
Haptics.* | Not supported | Skip or use CSS animations |
captureRef() | Not supported | Use dom-to-image on web |
Linking.openURL() | Works but differs | Consider window.open() for web |
// Platform-specific shadows
const shadowStyles = Platform.select({
ios: {
shadowColor: "#000",
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.25,
shadowRadius: 3.84,
},
android: {
elevation: 5,
},
web: {
boxShadow: "0 2px 4px rgba(0,0,0,0.25)",
},
});
// Web may need different gesture handlers
const gestureConfig = Platform.select({
web: { enabled: false }, // Disable on web if using mouse
default: { enabled: true },
});
// hooks/useSaveImage.ts
import { Platform } from "react-native";
/**
* Hook for saving images with platform-specific implementations.
*/
export const useSaveImage = () => {
const saveImage = useCallback(async (imageRef: React.RefObject<View>) => {
if (Platform.OS === "web") {
// Web implementation using dom-to-image
const dataUrl = await domtoimage.toJpeg(imageRef.current);
const link = document.createElement("a");
link.download = "image.jpeg";
link.href = dataUrl;
link.click();
} else {
// Native implementation using view-shot
const uri = await captureRef(imageRef);
await MediaLibrary.saveToLibraryAsync(uri);
}
}, []);
return { saveImage };
};
// components/Modal/ModalView.native.tsx
import { Modal as RNModal } from "react-native";
const ModalView = ({ visible, children }: ModalViewProps) => (
<RNModal visible={visible} animationType="slide">
{children}
</RNModal>
);
// components/Modal/ModalView.web.tsx
const ModalView = ({ visible, children }: ModalViewProps) =>
visible ? (
<div className="modal-overlay">
<div className="modal-content">{children}</div>
</div>
) : null;
// Only import heavy libraries on platforms that need them
const loadPlatformModule = async () => {
if (Platform.OS === "web") {
return await import("dom-to-image");
}
return await import("react-native-view-shot");
};
Before submitting code, verify:
app/ have base versionsdefault)To validate cross-platform compliance:
python3 .claude/skills/cross-platform-compatibility/scripts/validate_cross_platform.py [path]
For detailed patterns and examples:
references/platform-api.md - Platform module API referencereferences/file-extensions.md - File extension patterns and resolutionreferences/common-issues.md - Platform-specific issues and solutions