[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DADYV9G5PM6C0G2MJQHF9D":3,"skill-same:01M6DADYV9G5PM6C0G2MJQHF9D":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":14,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":48,"install":49,"resources":62},"01M6DADYV9G5PM6C0G2MJQHF9D","compose-multiplatform-patterns",null,"Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.","Prekzursil\u002Fagent-skills-toolchain","Prekzursil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54636077?v=4","01M6DACZ1PCQHD99SCR1YXG28B","Andrei Mihai Visalon","01M6DACZ670WZF535V3WYYSS4Z",0,"MIT","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Fcompose-multiplatform-patterns\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36],"compose multiplatform patterns","compose","patterns","performance","state management","state","ui","projects","management","jetpack compose","navigation","jetpack","platform","2026-11-10 10:12:30",false,"---\nname: compose-multiplatform-patterns\ndescription: Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.\norigin: ECC\n---\n\n# Compose Multiplatform Patterns\n\nPatterns for building shared UI across Android, iOS, Desktop, and Web using Compose Multiplatform and Jetpack Compose. Covers state management, navigation, theming, and performance.\n\n## When to Activate\n\n- Building Compose UI (Jetpack Compose or Compose Multiplatform)\n- Managing UI state with ViewModels and Compose state\n- Implementing navigation in KMP or Android projects\n- Designing reusable composables and design systems\n- Optimizing recomposition and rendering performance\n\n## State Management\n\n### ViewModel + Single State Object\n\nUse a single data class for screen state. Expose it as `StateFlow` and collect in Compose:\n\n```kotlin\ndata class ItemListState(\n    val items: List\u003CItem> = emptyList(),\n    val isLoading: Boolean = false,\n    val error: String? = null,\n    val searchQuery: String = \"\"\n)\n\nclass ItemListViewModel(\n    private val getItems: GetItemsUseCase\n) : ViewModel() {\n    private val _state = MutableStateFlow(ItemListState())\n    val state: StateFlow\u003CItemListState> = _state.asStateFlow()\n\n    fun onSearch(query: String) {\n        _state.update { it.copy(searchQuery = query) }\n        loadItems(query)\n    }\n\n    private fun loadItems(query: String) {\n        viewModelScope.launch {\n            _state.update { it.copy(isLoading = true) }\n            getItems(query).fold(\n                onSuccess = { items -> _state.update { it.copy(items = items, isLoading = false) } },\n                onFailure = { e -> _state.update { it.copy(error = e.message, isLoading = false) } }\n            )\n        }\n    }\n}\n```\n\n### Collecting State in Compose\n\n```kotlin\n@Composable\nfun ItemListScreen(viewModel: ItemListViewModel = koinViewModel()) {\n    val state by viewModel.state.collectAsStateWithLifecycle()\n\n    ItemListContent(\n        state = state,\n        onSearch = viewModel::onSearch\n    )\n}\n\n@Composable\nprivate fun ItemListContent(\n    state: ItemListState,\n    onSearch: (String) -> Unit\n) {\n    \u002F\u002F Stateless composable — easy to preview and test\n}\n```\n\n### Event Sink Pattern\n\nFor complex screens, use a sealed interface for events instead of multiple callback lambdas:\n\n```kotlin\nsealed interface ItemListEvent {\n    data class Search(val query: String) : ItemListEvent\n    data class Delete(val itemId: String) : ItemListEvent\n    data object Refresh : ItemListEvent\n}\n\n\u002F\u002F In ViewModel\nfun onEvent(event: ItemListEvent) {\n    when (event) {\n        is ItemListEvent.Search -> onSearch(event.query)\n        is ItemListEvent.Delete -> deleteItem(event.itemId)\n        is ItemListEvent.Refresh -> loadItems(_state.value.searchQuery)\n    }\n}\n\n\u002F\u002F In Composable — single lambda instead of many\nItemListContent(\n    state = state,\n    onEvent = viewModel::onEvent\n)\n```\n\n## Navigation\n\n### Type-Safe Navigation (Compose Navigation 2.8+)\n\nDefine routes as `@Serializable` objects:\n\n```kotlin\n@Serializable data object HomeRoute\n@Serializable data class DetailRoute(val id: String)\n@Serializable data object SettingsRoute\n\n@Composable\nfun AppNavHost(navController: NavHostController = rememberNavController()) {\n    NavHost(navController, startDestination = HomeRoute) {\n        composable\u003CHomeRoute> {\n            HomeScreen(onNavigateToDetail = { id -> navController.navigate(DetailRoute(id)) })\n        }\n        composable\u003CDetailRoute> { backStackEntry ->\n            val route = backStackEntry.toRoute\u003CDetailRoute>()\n            DetailScreen(id = route.id)\n        }\n        composable\u003CSettingsRoute> { SettingsScreen() }\n    }\n}\n```\n\n### Dialog and Bottom Sheet Navigation\n\nUse `dialog()` and overlay patterns instead of imperative show\u002Fhide:\n\n```kotlin\nNavHost(navController, startDestination = HomeRoute) {\n    composable\u003CHomeRoute> { \u002F* ... *\u002F }\n    dialog\u003CConfirmDeleteRoute> { backStackEntry ->\n        val route = backStackEntry.toRoute\u003CConfirmDeleteRoute>()\n        ConfirmDeleteDialog(\n            itemId = route.itemId,\n            onConfirm = { navController.popBackStack() },\n            onDismiss = { navController.popBackStack() }\n        )\n    }\n}\n```\n\n## Composable Design\n\n### Slot-Based APIs\n\nDesign composables with slot parameters for flexibility:\n\n```kotlin\n@Composable\nfun AppCard(\n    modifier: Modifier = Modifier,\n    header: @Composable () -> Unit = {},\n    content: @Composable ColumnScope.() -> Unit,\n    actions: @Composable RowScope.() -> Unit = {}\n) {\n    Card(modifier = modifier) {\n        Column {\n            header()\n            Column(content = content)\n            Row(horizontalArrangement = Arrangement.End, content = actions)\n        }\n    }\n}\n```\n\n### Modifier Ordering\n\nModifier order matters — apply in this sequence:\n\n```kotlin\nText(\n    text = \"Hello\",\n    modifier = Modifier\n        .padding(16.dp)          \u002F\u002F 1. Layout (padding, size)\n        .clip(RoundedCornerShape(8.dp))  \u002F\u002F 2. Shape\n        .background(Color.White) \u002F\u002F 3. Drawing (background, border)\n        .clickable { }           \u002F\u002F 4. Interaction\n)\n```\n\n## KMP Platform-Specific UI\n\n### expect\u002Factual for Platform Composables\n\n```kotlin\n\u002F\u002F commonMain\n@Composable\nexpect fun PlatformStatusBar(darkIcons: Boolean)\n\n\u002F\u002F androidMain\n@Composable\nactual fun PlatformStatusBar(darkIcons: Boolean) {\n    val systemUiController = rememberSystemUiController()\n    SideEffect { systemUiController.setStatusBarColor(Color.Transparent, darkIcons) }\n}\n\n\u002F\u002F iosMain\n@Composable\nactual fun PlatformStatusBar(darkIcons: Boolean) {\n    \u002F\u002F iOS handles this via UIKit interop or Info.plist\n}\n```\n\n## Performance\n\n### Stable Types for Skippable Recomposition\n\nMark classes as `@Stable` or `@Immutable` when all properties are stable:\n\n```kotlin\n@Immutable\ndata class ItemUiModel(\n    val id: String,\n    val title: String,\n    val description: String,\n    val progress: Float\n)\n```\n\n### Use `key()` and Lazy Lists Correctly\n\n```kotlin\nLazyColumn {\n    items(\n        items = items,\n        key = { it.id }  \u002F\u002F Stable keys enable item reuse and animations\n    ) { item ->\n        ItemRow(item = item)\n    }\n}\n```\n\n### Defer Reads with `derivedStateOf`\n\n```kotlin\nval listState = rememberLazyListState()\nval showScrollToTop by remember {\n    derivedStateOf { listState.firstVisibleItemIndex > 5 }\n}\n```\n\n### Avoid Allocations in Recomposition\n\n```kotlin\n\u002F\u002F BAD — new lambda and list every recomposition\nitems.filter { it.isActive }.forEach { ActiveItem(it, onClick = { handle(it) }) }\n\n\u002F\u002F GOOD — key each item so callbacks stay attached to the right row\nval activeItems = remember(items) { items.filter { it.isActive } }\nactiveItems.forEach { item ->\n    key(item.id) {\n        ActiveItem(item, onClick = { handle(item) })\n    }\n}\n```\n\n## Theming\n\n### Material 3 Dynamic Theming\n\n```kotlin\n@Composable\nfun AppTheme(\n    darkTheme: Boolean = isSystemInDarkTheme(),\n    dynamicColor: Boolean = true,\n    content: @Composable () -> Unit\n) {\n    val colorScheme = when {\n        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {\n            if (darkTheme) dynamicDarkColorScheme(LocalContext.current)\n            else dynamicLightColorScheme(LocalContext.current)\n        }\n        darkTheme -> darkColorScheme()\n        else -> lightColorScheme()\n    }\n\n    MaterialTheme(colorScheme = colorScheme, content = content)\n}\n```\n\n## Anti-Patterns to Avoid\n\n- Using `mutableStateOf` in ViewModels when `MutableStateFlow` with `collectAsStateWithLifecycle` is safer for lifecycle\n- Passing `NavController` deep into composables — pass lambda callbacks instead\n- Heavy computation inside `@Composable` functions — move to ViewModel or `remember {}`\n- Using `LaunchedEffect(Unit)` as a substitute for ViewModel init — it re-runs on configuration change in some setups\n- Creating new object instances in composable parameters — causes unnecessary recomposition\n\n## References\n\nSee skill: `android-clean-architecture` for module structure and layering.\nSee skill: `kotlin-coroutines-flows` for coroutine and Flow patterns.\n","# Compose Multiplatform Patterns\n\nPatterns for building shared UI across Android, iOS, Desktop, and Web using Compose Multiplatform and Jetpack Compose. Covers state management, navigation, theming, and performance.\n\n## When to Activate\n\n- Building Compose UI (Jetpack Compose or Compose Multiplatform)\n- Managing UI state with ViewModels and Compose state\n- Implementing navigation in KMP or Android projects\n- Designing reusable composables and design systems\n- Optimizing recomposition and rendering performance\n\n## State Management\n\n### ViewModel + Single State Object\n\nUse a single data class for screen state. Expose it as `StateFlow` and collect in Compose:\n\n```kotlin\ndata class ItemListState(\n    val items: List\u003CItem> = emptyList(),\n    val isLoading: Boolean = false,\n    val error: String? = null,\n    val searchQuery: String = \"\"\n)\n\nclass ItemListViewModel(\n    private val getItems: GetItemsUseCase\n) : ViewModel() {\n    private val _state = MutableStateFlow(ItemListState())\n    val state: StateFlow\u003CItemListState> = _state.asStateFlow()\n\n    fun onSearch(query: String) {\n        _state.update { it.copy(searchQuery = query) }\n        loadItems(query)\n    }\n\n    private fun loadItems(query: String) {\n        viewModelScope.launch {\n            _state.update { it.copy(isLoading = true) }\n            getItems(query).fold(\n                onSuccess = { items -> _state.update { it.copy(items = items, isLoading = false) } },\n                onFailure = { e -> _state.update { it.copy(error = e.message, isLoading = false) } }\n            )\n        }\n    }\n}\n```\n\n### Collecting State in Compose\n\n```kotlin\n@Composable\nfun ItemListScreen(viewModel: ItemListViewModel = koinViewModel()) {\n    val state by viewModel.state.collectAsStateWithLifecycle()\n\n    ItemListContent(\n        state = state,\n        onSearch = viewModel::onSearch\n    )\n}\n\n@Composable\nprivate fun ItemListContent(\n    state: ItemListState,\n    onSearch: (String) -> Unit\n) {\n    \u002F\u002F Stateless composable — easy to preview and test\n}\n```\n\n### Event Sink Pattern\n\nFor complex screens, use a sealed interface for events instead of multiple callback lambdas:\n\n```kotlin\nsealed interface ItemListEvent {\n    data class Search(val query: String) : ItemListEvent\n    data class Delete(val itemId: String) : ItemListEvent\n    data object Refresh : ItemListEvent\n}\n\n\u002F\u002F In ViewModel\nfun onEvent(event: ItemListEvent) {\n    when (event) {\n        is ItemListEvent.Search -> onSearch(event.query)\n        is ItemListEvent.Delete -> deleteItem(event.itemId)\n        is ItemListEvent.Refresh -> loadItems(_state.value.searchQuery)\n    }\n}\n\n\u002F\u002F In Composable — single lambda instead of many\nItemListContent(\n    state = state,\n    onEvent = viewModel::onEvent\n)\n```\n\n## Navigation\n\n### Type-Safe Navigation (Compose Navigation 2.8+)\n\nDefine routes as `@Serializable` objects:\n\n```kotlin\n@Serializable data object HomeRoute\n@Serializable data class DetailRoute(val id: String)\n@Serializable data object SettingsRoute\n\n@Composable\nfun AppNavHost(navController: NavHostController = rememberNavController()) {\n    NavHost(navController, startDestination = HomeRoute) {\n        composable\u003CHomeRoute> {\n            HomeScreen(onNavigateToDetail = { id -> navController.navigate(DetailRoute(id)) })\n        }\n        composable\u003CDetailRoute> { backStackEntry ->\n            val route = backStackEntry.toRoute\u003CDetailRoute>()\n            DetailScreen(id = route.id)\n        }\n        composable\u003CSettingsRoute> { SettingsScreen() }\n    }\n}\n```\n\n### Dialog and Bottom Sheet Navigation\n\nUse `dialog()` and overlay patterns instead of imperative show\u002Fhide:\n\n```kotlin\nNavHost(navController, startDestination = HomeRoute) {\n    composable\u003CHomeRoute> { \u002F* ... *\u002F }\n    dialog\u003CConfirmDeleteRoute> { backStackEntry ->\n        val route = backStackEntry.toRoute\u003CConfirmDeleteRoute>()\n        ConfirmDeleteDialog(\n            itemId = route.itemId,\n            onConfirm = { navController.popBackStack() },\n            onDismiss = { navController.popBackStack() }\n        )\n    }\n}\n```\n\n## Composable Design\n\n### Slot-Based APIs\n\nDesign composables with slot parameters for flexibility:\n\n```kotlin\n@Composable\nfun AppCard(\n    modifier: Modifier = Modifier,\n    header: @Composable () -> Unit = {},\n    content: @Composable ColumnScope.() -> Unit,\n    actions: @Composable RowScope.() -> Unit = {}\n) {\n    Card(modifier = modifier) {\n        Column {\n            header()\n            Column(content = content)\n            Row(horizontalArrangement = Arrangement.End, content = actions)\n        }\n    }\n}\n```\n\n### Modifier Ordering\n\nModifier order matters — apply in this sequence:\n\n```kotlin\nText(\n    text = \"Hello\",\n    modifier = Modifier\n        .padding(16.dp)          \u002F\u002F 1. Layout (padding, size)\n        .clip(RoundedCornerShape(8.dp))  \u002F\u002F 2. Shape\n        .background(Color.White) \u002F\u002F 3. Drawing (background, border)\n        .clickable { }           \u002F\u002F 4. Interaction\n)\n```\n\n## KMP Platform-Specific UI\n\n### expect\u002Factual for Platform Composables\n\n```kotlin\n\u002F\u002F commonMain\n@Composable\nexpect fun PlatformStatusBar(darkIcons: Boolean)\n\n\u002F\u002F androidMain\n@Composable\nactual fun PlatformStatusBar(darkIcons: Boolean) {\n    val systemUiController = rememberSystemUiController()\n    SideEffect { systemUiController.setStatusBarColor(Color.Transparent, darkIcons) }\n}\n\n\u002F\u002F iosMain\n@Composable\nactual fun PlatformStatusBar(darkIcons: Boolean) {\n    \u002F\u002F iOS handles this via UIKit interop or Info.plist\n}\n```\n\n## Performance\n\n### Stable Types for Skippable Recomposition\n\nMark classes as `@Stable` or `@Immutable` when all properties are stable:\n\n```kotlin\n@Immutable\ndata class ItemUiModel(\n    val id: String,\n    val title: String,\n    val description: String,\n    val progress: Float\n)\n```\n\n### Use `key()` and Lazy Lists Correctly\n\n```kotlin\nLazyColumn {\n    items(\n        items = items,\n        key = { it.id }  \u002F\u002F Stable keys enable item reuse and animations\n    ) { item ->\n        ItemRow(item = item)\n    }\n}\n```\n\n### Defer Reads with `derivedStateOf`\n\n```kotlin\nval listState = rememberLazyListState()\nval showScrollToTop by remember {\n    derivedStateOf { listState.firstVisibleItemIndex > 5 }\n}\n```\n\n### Avoid Allocations in Recomposition\n\n```kotlin\n\u002F\u002F BAD — new lambda and list every recomposition\nitems.filter { it.isActive }.forEach { ActiveItem(it, onClick = { handle(it) }) }\n\n\u002F\u002F GOOD — key each item so callbacks stay attached to the right row\nval activeItems = remember(items) { items.filter { it.isActive } }\nactiveItems.forEach { item ->\n    key(item.id) {\n        ActiveItem(item, onClick = { handle(item) })\n    }\n}\n```\n\n## Theming\n\n### Material 3 Dynamic Theming\n\n```kotlin\n@Composable\nfun AppTheme(\n    darkTheme: Boolean = isSystemInDarkTheme(),\n    dynamicColor: Boolean = true,\n    content: @Composable () -> Unit\n) {\n    val colorScheme = when {\n        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {\n            if (darkTheme) dynamicDarkColorScheme(LocalContext.current)\n            else dynamicLightColorScheme(LocalContext.current)\n        }\n        darkTheme -> darkColorScheme()\n        else -> lightColorScheme()\n    }\n\n    MaterialTheme(colorScheme = colorScheme, content = content)\n}\n```\n\n## Anti-Patterns to Avoid\n\n- Using `mutableStateOf` in ViewModels when `MutableStateFlow` with `collectAsStateWithLifecycle` is safer for lifecycle\n- Passing `NavController` deep into composables — pass lambda callbacks instead\n- Heavy computation inside `@Composable` functions — move to ViewModel or `remember {}`\n- Using `LaunchedEffect(Unit)` as a substitute for ViewModel init — it re-runs on configuration change in some setups\n- Creating new object instances in composable parameters — causes unnecessary recomposition\n\n## References\n\nSee skill: `android-clean-architecture` for module structure and layering.\nSee skill: `kotlin-coroutines-flows` for coroutine and Flow patterns.\n",{"name":5,"origin":42,"description":7},"ECC","main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Flibrary\u002Fskills\u002Fcompose-multiplatform-patterns","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill compose-multiplatform-patterns",{"tool":55,"command":56},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill compose-multiplatform-patterns",{"tool":58,"command":59},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill compose-multiplatform-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Fcompose-multiplatform-patterns\u002FSKILL.md",true,[63],{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"agents\u002Fopenai.yaml","REFERENCE","参考文档",82,"https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgenjutsu-motion-principles\u002Fagents\u002Fopenai.yaml",[70,92,123,149,162,178],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":37},"01M6DF7D7478R55P46REYH4QAC","clarify-requirements","Resolve genuine pre-execution ambiguity by scanning repo context, generating 1-6 grounded options, and asking 1-3 focused questions via AskUserQuestion. NOT for mid-task use (injection risk); NOT when the goal is already unambiguous; use to disambiguate vague prompts before any file edits.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fworkspace-hooks\u002Fskills\u002Fclarify-requirements\u002FSKILL.md",[],[77,78,79,80,81,82,83,84,85,86,87,88,89,90,91],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","use","context","repo","injection","execution","file",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":103,"publishedAt":37},"01M6DF79CA4BHJS66J8EZDBPWJ","openmm-md","Run FREE, open-source, Windows-native GPU molecular dynamics via the openmm-md MCP (OpenMM + CUDA on the local NVIDIA GPU). Use for protein \u002F protein-ligand MD when you want a free stack or are on Windows without a Schrodinger license. Covers the full workflow (prepare, solvate, minimize, equilibrate, production, analyze, mmgbsa) AND an honest decision guide vs Schrodinger Desmond, including how to run Desmond legitimately on Linux or a cloud GPU with a real license. This is a deliberately LESSER free alternative and does NOT replace the schrodinger MCP tools. Do NOT use it to pick a free tool when a validated FEP+, WaterMap, IFD-MD, or Prime MM-GBSA result is actually required.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fmcp\u002Fopenmm-md-mcp\u002Fskill\u002Fopenmm-md\u002FSKILL.md",[98],{"categoryNo":99,"categoryName":100,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[104,105,106,107,108,109,110,111,112,113,114,115,116,117,86,118,119,120,121,122],"openmm md","how","decision","pick","linux","analyze","tool","stack","open","NVIDIA","gpu","license","workflow","windows","free","molecular dynamics","local","do","MCP",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":135,"publishedAt":37},"01M6DF76C1MG85VEWP8VZCBNMN","visual-review","Take screenshots of web pages and UI using Playwright for visual review and iteration","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fvisual-review\u002FSKILL.md",[129,132],{"categoryNo":130,"categoryName":131,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":133,"categoryName":134,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000008","测试与质量",[136,137,138,139,140,141,142,143,144,145,105,30,146,147,148],"review","visual","visual review","pages","web","false","iteration","take","check","slides","screenshot","playwright","screenshots",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":37},"01M6DF73AQVCBZKEN0YXEX9FXP","status","Diagnostic status report — shows metaswarm installation state, project setup, and potential issues","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstatus\u002FSKILL.md",[],[151,156,157,158,159,160,161,29],"setup","report","project","installation","project setup","issues",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":169,"publishedAt":37},"01M6DF6X6C2XB0P6GX76P7TTYV","start","Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstart\u002FSKILL.md",[168],{"categoryNo":99,"categoryName":100,"taxonomyType":101,"taxonomyTypeDesc":102},[164,170,82,171,172,173,86,174,175,176,177],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":179,"name":156,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":183,"publishedAt":37},"01M6DF6QMJ9AJKFKHHKRT005PQ","Interactive project setup — detects your project, configures metaswarm, writes project-local files","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fsetup\u002FSKILL.md",[],[156,158,120,184,160,185],"files","interactive"]