[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DAGHJPRRSM9A160X2CCA95":3,"skill-same:01M6DAGHJPRRSM9A160X2CCA95":62},{"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":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":14,"repositoryHtmlUrl":45,"repositoryHomepageUrl":6,"ownerHtmlUrl":46,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":47,"install":48,"resources":61},"01M6DAGHJPRRSM9A160X2CCA95","kotlin-coroutines-flows",null,"Kotlin Coroutines and Flow patterns for Android and KMP — structured concurrency, Flow operators, StateFlow, error handling, and testing.","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\u002Fkotlin-coroutines-flows\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35],"kotlin coroutines flows","kotlin","kotlin coroutines","coroutines","testing","android","error handling","flow","concurrency","patterns","structured","operators","2026-11-10 10:12:30",false,"---\nname: kotlin-coroutines-flows\ndescription: Kotlin Coroutines and Flow patterns for Android and KMP — structured concurrency, Flow operators, StateFlow, error handling, and testing.\norigin: ECC\n---\n\n# Kotlin Coroutines & Flows\n\nPatterns for structured concurrency, Flow-based reactive streams, and coroutine testing in Android and Kotlin Multiplatform projects.\n\n## When to Activate\n\n- Writing async code with Kotlin coroutines\n- Using Flow, StateFlow, or SharedFlow for reactive data\n- Handling concurrent operations (parallel loading, debounce, retry)\n- Testing coroutines and Flows\n- Managing coroutine scopes and cancellation\n\n## Structured Concurrency\n\n### Scope Hierarchy\n\n```\nApplication\n  └── viewModelScope (ViewModel)\n        └── coroutineScope { } (structured child)\n              ├── async { } (concurrent task)\n              └── async { } (concurrent task)\n```\n\nAlways use structured concurrency — never `GlobalScope`:\n\n```kotlin\n\u002F\u002F BAD\nGlobalScope.launch { fetchData() }\n\n\u002F\u002F GOOD — scoped to ViewModel lifecycle\nviewModelScope.launch { fetchData() }\n\n\u002F\u002F GOOD — scoped to composable lifecycle\nLaunchedEffect(key) { fetchData() }\n```\n\n### Parallel Decomposition\n\nUse `coroutineScope` + `async` for parallel work:\n\n```kotlin\nsuspend fun loadDashboard(): Dashboard = coroutineScope {\n    val items = async { itemRepository.getRecent() }\n    val stats = async { statsRepository.getToday() }\n    val profile = async { userRepository.getCurrent() }\n    Dashboard(\n        items = items.await(),\n        stats = stats.await(),\n        profile = profile.await()\n    )\n}\n```\n\n### SupervisorScope\n\nUse `supervisorScope` when child failures should not cancel siblings:\n\n```kotlin\nsuspend fun syncAll() = supervisorScope {\n    launch { syncItems() }       \u002F\u002F failure here won't cancel syncStats\n    launch { syncStats() }\n    launch { syncSettings() }\n}\n```\n\n## Flow Patterns\n\n### Cold Flow — One-Shot to Stream Conversion\n\n```kotlin\nfun observeItems(): Flow\u003CList\u003CItem>> = flow {\n    \u002F\u002F Re-emits whenever the database changes\n    itemDao.observeAll()\n        .map { entities -> entities.map { it.toDomain() } }\n        .collect { emit(it) }\n}\n```\n\n### StateFlow for UI State\n\n```kotlin\nclass DashboardViewModel(\n    observeProgress: ObserveUserProgressUseCase\n) : ViewModel() {\n    val progress: StateFlow\u003CUserProgress> = observeProgress()\n        .stateIn(\n            scope = viewModelScope,\n            started = SharingStarted.WhileSubscribed(5_000),\n            initialValue = UserProgress.EMPTY\n        )\n}\n```\n\n`WhileSubscribed(5_000)` keeps the upstream active for 5 seconds after the last subscriber leaves — survives configuration changes without restarting.\n\n### Combining Multiple Flows\n\n```kotlin\nval uiState: StateFlow\u003CHomeState> = combine(\n    itemRepository.observeItems(),\n    settingsRepository.observeTheme(),\n    userRepository.observeProfile()\n) { items, theme, profile ->\n    HomeState(items = items, theme = theme, profile = profile)\n}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), HomeState())\n```\n\n### Flow Operators\n\n```kotlin\n\u002F\u002F Debounce search input\nsearchQuery\n    .debounce(300)\n    .distinctUntilChanged()\n    .flatMapLatest { query -> repository.search(query) }\n    .catch { emit(emptyList()) }\n    .collect { results -> _state.update { it.copy(results = results) } }\n\n\u002F\u002F Retry with exponential backoff\nfun fetchWithRetry(): Flow\u003CData> = flow { emit(api.fetch()) }\n    .retryWhen { cause, attempt ->\n        if (cause is IOException && attempt \u003C 3) {\n            delay(1000L * (1 shl attempt.toInt()))\n            true\n        } else {\n            false\n        }\n    }\n```\n\n### SharedFlow for One-Time Events\n\n```kotlin\nclass ItemListViewModel : ViewModel() {\n    private val _effects = MutableSharedFlow\u003CEffect>()\n    val effects: SharedFlow\u003CEffect> = _effects.asSharedFlow()\n\n    sealed interface Effect {\n        data class ShowSnackbar(val message: String) : Effect\n        data class NavigateTo(val route: String) : Effect\n    }\n\n    private fun deleteItem(id: String) {\n        viewModelScope.launch {\n            repository.delete(id)\n            _effects.emit(Effect.ShowSnackbar(\"Item deleted\"))\n        }\n    }\n}\n\n\u002F\u002F Collect in Composable\nLaunchedEffect(Unit) {\n    viewModel.effects.collect { effect ->\n        when (effect) {\n            is Effect.ShowSnackbar -> snackbarHostState.showSnackbar(effect.message)\n            is Effect.NavigateTo -> navController.navigate(effect.route)\n        }\n    }\n}\n```\n\n## Dispatchers\n\n```kotlin\n\u002F\u002F CPU-intensive work\nwithContext(Dispatchers.Default) { parseJson(largePayload) }\n\n\u002F\u002F IO-bound work\nwithContext(Dispatchers.IO) { database.query() }\n\n\u002F\u002F Main thread (UI) — default in viewModelScope\nwithContext(Dispatchers.Main) { updateUi() }\n```\n\nIn KMP, use `Dispatchers.Default` and `Dispatchers.Main` (available on all platforms). `Dispatchers.IO` is JVM\u002FAndroid only — use `Dispatchers.Default` on other platforms or provide via DI.\n\n## Cancellation\n\n### Cooperative Cancellation\n\nLong-running loops must check for cancellation:\n\n```kotlin\nsuspend fun processItems(items: List\u003CItem>) = coroutineScope {\n    for (item in items) {\n        ensureActive()  \u002F\u002F throws CancellationException if cancelled\n        process(item)\n    }\n}\n```\n\n### Cleanup with try\u002Ffinally\n\n```kotlin\nviewModelScope.launch {\n    try {\n        _state.update { it.copy(isLoading = true) }\n        val data = repository.fetch()\n        _state.update { it.copy(data = data) }\n    } finally {\n        _state.update { it.copy(isLoading = false) }  \u002F\u002F always runs, even on cancellation\n    }\n}\n```\n\n## Testing\n\n### Testing StateFlow with Turbine\n\n```kotlin\n@Test\nfun `search updates item list`() = runTest {\n    val fakeRepository = FakeItemRepository().apply { emit(testItems) }\n    val viewModel = ItemListViewModel(GetItemsUseCase(fakeRepository))\n\n    viewModel.state.test {\n        assertEquals(ItemListState(), awaitItem())  \u002F\u002F initial\n\n        viewModel.onSearch(\"query\")\n        val loading = awaitItem()\n        assertTrue(loading.isLoading)\n\n        val loaded = awaitItem()\n        assertFalse(loaded.isLoading)\n        assertEquals(1, loaded.items.size)\n    }\n}\n```\n\n### Testing with TestDispatcher\n\n```kotlin\n@Test\nfun `parallel load completes correctly`() = runTest {\n    val viewModel = DashboardViewModel(\n        itemRepo = FakeItemRepo(),\n        statsRepo = FakeStatsRepo()\n    )\n\n    viewModel.load()\n    advanceUntilIdle()\n\n    val state = viewModel.state.value\n    assertNotNull(state.items)\n    assertNotNull(state.stats)\n}\n```\n\n### Faking Flows\n\n```kotlin\nclass FakeItemRepository : ItemRepository {\n    private val _items = MutableStateFlow\u003CList\u003CItem>>(emptyList())\n\n    override fun observeItems(): Flow\u003CList\u003CItem>> = _items\n\n    fun emit(items: List\u003CItem>) { _items.value = items }\n\n    override suspend fun getItemsByCategory(category: String): Result\u003CList\u003CItem>> {\n        return Result.success(_items.value.filter { it.category == category })\n    }\n}\n```\n\n## Anti-Patterns to Avoid\n\n- Using `GlobalScope` — leaks coroutines, no structured cancellation\n- Collecting Flows in `init {}` without a scope — use `viewModelScope.launch`\n- Using `MutableStateFlow` with mutable collections — always use immutable copies: `_state.update { it.copy(list = it.list + newItem) }`\n- Catching `CancellationException` — let it propagate for proper cancellation\n- Using `flowOn(Dispatchers.Main)` to collect — collection dispatcher is the caller's dispatcher\n- Creating `Flow` in `@Composable` without `remember` — recreates the flow every recomposition\n\n## References\n\nSee skill: `compose-multiplatform-patterns` for UI consumption of Flows.\nSee skill: `android-clean-architecture` for where coroutines fit in layers.\n","# Kotlin Coroutines & Flows\n\nPatterns for structured concurrency, Flow-based reactive streams, and coroutine testing in Android and Kotlin Multiplatform projects.\n\n## When to Activate\n\n- Writing async code with Kotlin coroutines\n- Using Flow, StateFlow, or SharedFlow for reactive data\n- Handling concurrent operations (parallel loading, debounce, retry)\n- Testing coroutines and Flows\n- Managing coroutine scopes and cancellation\n\n## Structured Concurrency\n\n### Scope Hierarchy\n\n```\nApplication\n  └── viewModelScope (ViewModel)\n        └── coroutineScope { } (structured child)\n              ├── async { } (concurrent task)\n              └── async { } (concurrent task)\n```\n\nAlways use structured concurrency — never `GlobalScope`:\n\n```kotlin\n\u002F\u002F BAD\nGlobalScope.launch { fetchData() }\n\n\u002F\u002F GOOD — scoped to ViewModel lifecycle\nviewModelScope.launch { fetchData() }\n\n\u002F\u002F GOOD — scoped to composable lifecycle\nLaunchedEffect(key) { fetchData() }\n```\n\n### Parallel Decomposition\n\nUse `coroutineScope` + `async` for parallel work:\n\n```kotlin\nsuspend fun loadDashboard(): Dashboard = coroutineScope {\n    val items = async { itemRepository.getRecent() }\n    val stats = async { statsRepository.getToday() }\n    val profile = async { userRepository.getCurrent() }\n    Dashboard(\n        items = items.await(),\n        stats = stats.await(),\n        profile = profile.await()\n    )\n}\n```\n\n### SupervisorScope\n\nUse `supervisorScope` when child failures should not cancel siblings:\n\n```kotlin\nsuspend fun syncAll() = supervisorScope {\n    launch { syncItems() }       \u002F\u002F failure here won't cancel syncStats\n    launch { syncStats() }\n    launch { syncSettings() }\n}\n```\n\n## Flow Patterns\n\n### Cold Flow — One-Shot to Stream Conversion\n\n```kotlin\nfun observeItems(): Flow\u003CList\u003CItem>> = flow {\n    \u002F\u002F Re-emits whenever the database changes\n    itemDao.observeAll()\n        .map { entities -> entities.map { it.toDomain() } }\n        .collect { emit(it) }\n}\n```\n\n### StateFlow for UI State\n\n```kotlin\nclass DashboardViewModel(\n    observeProgress: ObserveUserProgressUseCase\n) : ViewModel() {\n    val progress: StateFlow\u003CUserProgress> = observeProgress()\n        .stateIn(\n            scope = viewModelScope,\n            started = SharingStarted.WhileSubscribed(5_000),\n            initialValue = UserProgress.EMPTY\n        )\n}\n```\n\n`WhileSubscribed(5_000)` keeps the upstream active for 5 seconds after the last subscriber leaves — survives configuration changes without restarting.\n\n### Combining Multiple Flows\n\n```kotlin\nval uiState: StateFlow\u003CHomeState> = combine(\n    itemRepository.observeItems(),\n    settingsRepository.observeTheme(),\n    userRepository.observeProfile()\n) { items, theme, profile ->\n    HomeState(items = items, theme = theme, profile = profile)\n}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), HomeState())\n```\n\n### Flow Operators\n\n```kotlin\n\u002F\u002F Debounce search input\nsearchQuery\n    .debounce(300)\n    .distinctUntilChanged()\n    .flatMapLatest { query -> repository.search(query) }\n    .catch { emit(emptyList()) }\n    .collect { results -> _state.update { it.copy(results = results) } }\n\n\u002F\u002F Retry with exponential backoff\nfun fetchWithRetry(): Flow\u003CData> = flow { emit(api.fetch()) }\n    .retryWhen { cause, attempt ->\n        if (cause is IOException && attempt \u003C 3) {\n            delay(1000L * (1 shl attempt.toInt()))\n            true\n        } else {\n            false\n        }\n    }\n```\n\n### SharedFlow for One-Time Events\n\n```kotlin\nclass ItemListViewModel : ViewModel() {\n    private val _effects = MutableSharedFlow\u003CEffect>()\n    val effects: SharedFlow\u003CEffect> = _effects.asSharedFlow()\n\n    sealed interface Effect {\n        data class ShowSnackbar(val message: String) : Effect\n        data class NavigateTo(val route: String) : Effect\n    }\n\n    private fun deleteItem(id: String) {\n        viewModelScope.launch {\n            repository.delete(id)\n            _effects.emit(Effect.ShowSnackbar(\"Item deleted\"))\n        }\n    }\n}\n\n\u002F\u002F Collect in Composable\nLaunchedEffect(Unit) {\n    viewModel.effects.collect { effect ->\n        when (effect) {\n            is Effect.ShowSnackbar -> snackbarHostState.showSnackbar(effect.message)\n            is Effect.NavigateTo -> navController.navigate(effect.route)\n        }\n    }\n}\n```\n\n## Dispatchers\n\n```kotlin\n\u002F\u002F CPU-intensive work\nwithContext(Dispatchers.Default) { parseJson(largePayload) }\n\n\u002F\u002F IO-bound work\nwithContext(Dispatchers.IO) { database.query() }\n\n\u002F\u002F Main thread (UI) — default in viewModelScope\nwithContext(Dispatchers.Main) { updateUi() }\n```\n\nIn KMP, use `Dispatchers.Default` and `Dispatchers.Main` (available on all platforms). `Dispatchers.IO` is JVM\u002FAndroid only — use `Dispatchers.Default` on other platforms or provide via DI.\n\n## Cancellation\n\n### Cooperative Cancellation\n\nLong-running loops must check for cancellation:\n\n```kotlin\nsuspend fun processItems(items: List\u003CItem>) = coroutineScope {\n    for (item in items) {\n        ensureActive()  \u002F\u002F throws CancellationException if cancelled\n        process(item)\n    }\n}\n```\n\n### Cleanup with try\u002Ffinally\n\n```kotlin\nviewModelScope.launch {\n    try {\n        _state.update { it.copy(isLoading = true) }\n        val data = repository.fetch()\n        _state.update { it.copy(data = data) }\n    } finally {\n        _state.update { it.copy(isLoading = false) }  \u002F\u002F always runs, even on cancellation\n    }\n}\n```\n\n## Testing\n\n### Testing StateFlow with Turbine\n\n```kotlin\n@Test\nfun `search updates item list`() = runTest {\n    val fakeRepository = FakeItemRepository().apply { emit(testItems) }\n    val viewModel = ItemListViewModel(GetItemsUseCase(fakeRepository))\n\n    viewModel.state.test {\n        assertEquals(ItemListState(), awaitItem())  \u002F\u002F initial\n\n        viewModel.onSearch(\"query\")\n        val loading = awaitItem()\n        assertTrue(loading.isLoading)\n\n        val loaded = awaitItem()\n        assertFalse(loaded.isLoading)\n        assertEquals(1, loaded.items.size)\n    }\n}\n```\n\n### Testing with TestDispatcher\n\n```kotlin\n@Test\nfun `parallel load completes correctly`() = runTest {\n    val viewModel = DashboardViewModel(\n        itemRepo = FakeItemRepo(),\n        statsRepo = FakeStatsRepo()\n    )\n\n    viewModel.load()\n    advanceUntilIdle()\n\n    val state = viewModel.state.value\n    assertNotNull(state.items)\n    assertNotNull(state.stats)\n}\n```\n\n### Faking Flows\n\n```kotlin\nclass FakeItemRepository : ItemRepository {\n    private val _items = MutableStateFlow\u003CList\u003CItem>>(emptyList())\n\n    override fun observeItems(): Flow\u003CList\u003CItem>> = _items\n\n    fun emit(items: List\u003CItem>) { _items.value = items }\n\n    override suspend fun getItemsByCategory(category: String): Result\u003CList\u003CItem>> {\n        return Result.success(_items.value.filter { it.category == category })\n    }\n}\n```\n\n## Anti-Patterns to Avoid\n\n- Using `GlobalScope` — leaks coroutines, no structured cancellation\n- Collecting Flows in `init {}` without a scope — use `viewModelScope.launch`\n- Using `MutableStateFlow` with mutable collections — always use immutable copies: `_state.update { it.copy(list = it.list + newItem) }`\n- Catching `CancellationException` — let it propagate for proper cancellation\n- Using `flowOn(Dispatchers.Main)` to collect — collection dispatcher is the caller's dispatcher\n- Creating `Flow` in `@Composable` without `remember` — recreates the flow every recomposition\n\n## References\n\nSee skill: `compose-multiplatform-patterns` for UI consumption of Flows.\nSee skill: `android-clean-architecture` for where coroutines fit in layers.\n",{"name":5,"origin":41,"description":7},"ECC","main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Flibrary\u002Fskills\u002Fkotlin-coroutines-flows","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill kotlin-coroutines-flows",{"tool":54,"command":55},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill kotlin-coroutines-flows",{"tool":57,"command":58},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill kotlin-coroutines-flows","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Fkotlin-coroutines-flows\u002FSKILL.md",true,[],[63,85,114,139,153,169],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":36},"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",[],[70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","use","context","repo","injection","execution","file",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":94,"publishedAt":36},"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",[91],{"categoryNo":92,"categoryName":93,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[95,96,97,98,99,100,101,102,103,104,105,106,107,108,79,109,110,111,112,113],"openmm md","how","decision","pick","linux","analyze","tool","stack","open","NVIDIA","gpu","license","workflow","windows","free","molecular dynamics","local","do","MCP",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":124,"publishedAt":36},"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",[120,123],{"categoryNo":121,"categoryName":122,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[125,126,127,128,129,130,131,132,133,134,96,135,136,137,138],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","playwright","screenshots",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":36},"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",[],[141,146,147,148,149,150,151,152],"setup","report","project","installation","project setup","issues","state",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":160,"publishedAt":36},"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",[159],{"categoryNo":92,"categoryName":93,"taxonomyType":21,"taxonomyTypeDesc":22},[155,161,75,162,163,164,79,165,166,167,168],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":170,"name":146,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":174,"publishedAt":36},"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",[],[146,148,111,175,150,176],"files","interactive"]