[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DAD3SA0E2HTX60XSNZ6EMW":3,"skill-same:01M6DAD3SA0E2HTX60XSNZ6EMW":66},{"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":18,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":14,"repositoryHtmlUrl":43,"repositoryHomepageUrl":6,"ownerHtmlUrl":44,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":45,"install":46,"resources":59},"01M6DAD3SA0E2HTX60XSNZ6EMW","android-clean-architecture",null,"Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns.","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\u002Fandroid-clean-architecture\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"android","architecture","android clean architecture","clean","clean architecture","data","architecture patterns","projects","kotlin","kotlin multiplatform","Rules","dependency","patterns","structure","module","2026-11-10 10:12:30",false,"---\nname: android-clean-architecture\ndescription: Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns.\norigin: ECC\n---\n\n# Android Clean Architecture\n\nClean Architecture patterns for Android and KMP projects. Covers module boundaries, dependency inversion, UseCase\u002FRepository patterns, and data layer design with Room, SQLDelight, and Ktor.\n\n## When to Activate\n\n- Structuring Android or KMP project modules\n- Implementing UseCases, Repositories, or DataSources\n- Designing data flow between layers (domain, data, presentation)\n- Setting up dependency injection with Koin or Hilt\n- Working with Room, SQLDelight, or Ktor in a layered architecture\n\n## Module Structure\n\n### Recommended Layout\n\n```\nproject\u002F\n├── app\u002F                  # Android entry point, DI wiring, Application class\n├── core\u002F                 # Shared utilities, base classes, error types\n├── domain\u002F               # UseCases, domain models, repository interfaces (pure Kotlin)\n├── data\u002F                 # Repository implementations, DataSources, DB, network\n├── presentation\u002F         # Screens, ViewModels, UI models, navigation\n├── design-system\u002F        # Reusable Compose components, theme, typography\n└── feature\u002F              # Feature modules (optional, for larger projects)\n    ├── auth\u002F\n    ├── settings\u002F\n    └── profile\u002F\n```\n\n### Dependency Rules\n\n```\napp → presentation, domain, data, core\npresentation → domain, design-system, core\ndata → domain, core\ndomain → core (or no dependencies)\ncore → (nothing)\n```\n\n**Critical**: `domain` must NEVER depend on `data`, `presentation`, or any framework. It contains pure Kotlin only.\n\n## Domain Layer\n\n### UseCase Pattern\n\nEach UseCase represents one business operation. Use `operator fun invoke` for clean call sites:\n\n```kotlin\nclass GetItemsByCategoryUseCase(\n    private val repository: ItemRepository\n) {\n    suspend operator fun invoke(category: String): Result\u003CList\u003CItem>> {\n        return repository.getItemsByCategory(category)\n    }\n}\n\n\u002F\u002F Flow-based UseCase for reactive streams\nclass ObserveUserProgressUseCase(\n    private val repository: UserRepository\n) {\n    operator fun invoke(userId: String): Flow\u003CUserProgress> {\n        return repository.observeProgress(userId)\n    }\n}\n```\n\n### Domain Models\n\nDomain models are plain Kotlin data classes — no framework annotations:\n\n```kotlin\ndata class Item(\n    val id: String,\n    val title: String,\n    val description: String,\n    val tags: List\u003CString>,\n    val status: Status,\n    val category: String\n)\n\nenum class Status { DRAFT, ACTIVE, ARCHIVED }\n```\n\n### Repository Interfaces\n\nDefined in domain, implemented in data:\n\n```kotlin\ninterface ItemRepository {\n    suspend fun getItemsByCategory(category: String): Result\u003CList\u003CItem>>\n    suspend fun saveItem(item: Item): Result\u003CUnit>\n    fun observeItems(): Flow\u003CList\u003CItem>>\n}\n```\n\n## Data Layer\n\n### Repository Implementation\n\nCoordinates between local and remote data sources:\n\n```kotlin\nclass ItemRepositoryImpl(\n    private val localDataSource: ItemLocalDataSource,\n    private val remoteDataSource: ItemRemoteDataSource\n) : ItemRepository {\n\n    override suspend fun getItemsByCategory(category: String): Result\u003CList\u003CItem>> {\n        return runCatching {\n            val remote = remoteDataSource.fetchItems(category)\n            localDataSource.insertItems(remote.map { it.toEntity() })\n            localDataSource.getItemsByCategory(category).map { it.toDomain() }\n        }\n    }\n\n    override suspend fun saveItem(item: Item): Result\u003CUnit> {\n        return runCatching {\n            localDataSource.insertItems(listOf(item.toEntity()))\n        }\n    }\n\n    override fun observeItems(): Flow\u003CList\u003CItem>> {\n        return localDataSource.observeAll().map { entities ->\n            entities.map { it.toDomain() }\n        }\n    }\n}\n```\n\n### Mapper Pattern\n\nKeep mappers as extension functions near the data models:\n\n```kotlin\n\u002F\u002F In data layer\nfun ItemEntity.toDomain() = Item(\n    id = id,\n    title = title,\n    description = description,\n    tags = tags.split(\"|\"),\n    status = Status.valueOf(status),\n    category = category\n)\n\nfun ItemDto.toEntity() = ItemEntity(\n    id = id,\n    title = title,\n    description = description,\n    tags = tags.joinToString(\"|\"),\n    status = status,\n    category = category\n)\n```\n\n### Room Database (Android)\n\n```kotlin\n@Entity(tableName = \"items\")\ndata class ItemEntity(\n    @PrimaryKey val id: String,\n    val title: String,\n    val description: String,\n    val tags: String,\n    val status: String,\n    val category: String\n)\n\n@Dao\ninterface ItemDao {\n    @Query(\"SELECT * FROM items WHERE category = :category\")\n    suspend fun getByCategory(category: String): List\u003CItemEntity>\n\n    @Upsert\n    suspend fun upsert(items: List\u003CItemEntity>)\n\n    @Query(\"SELECT * FROM items\")\n    fun observeAll(): Flow\u003CList\u003CItemEntity>>\n}\n```\n\n### SQLDelight (KMP)\n\n```sql\n-- Item.sq\nCREATE TABLE ItemEntity (\n    id TEXT NOT NULL PRIMARY KEY,\n    title TEXT NOT NULL,\n    description TEXT NOT NULL,\n    tags TEXT NOT NULL,\n    status TEXT NOT NULL,\n    category TEXT NOT NULL\n);\n\ngetByCategory:\nSELECT * FROM ItemEntity WHERE category = ?;\n\nupsert:\nINSERT OR REPLACE INTO ItemEntity (id, title, description, tags, status, category)\nVALUES (?, ?, ?, ?, ?, ?);\n\nobserveAll:\nSELECT * FROM ItemEntity;\n```\n\n### Ktor Network Client (KMP)\n\n```kotlin\nclass ItemRemoteDataSource(private val client: HttpClient) {\n\n    suspend fun fetchItems(category: String): List\u003CItemDto> {\n        return client.get(\"api\u002Fitems\") {\n            parameter(\"category\", category)\n        }.body()\n    }\n}\n\n\u002F\u002F HttpClient setup with content negotiation\nval httpClient = HttpClient {\n    install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true }) }\n    install(Logging) { level = LogLevel.HEADERS }\n    defaultRequest { url(\"https:\u002F\u002Fapi.example.com\u002F\") }\n}\n```\n\n## Dependency Injection\n\n### Koin (KMP-friendly)\n\n```kotlin\n\u002F\u002F Domain module\nval domainModule = module {\n    factory { GetItemsByCategoryUseCase(get()) }\n    factory { ObserveUserProgressUseCase(get()) }\n}\n\n\u002F\u002F Data module\nval dataModule = module {\n    single\u003CItemRepository> { ItemRepositoryImpl(get(), get()) }\n    single { ItemLocalDataSource(get()) }\n    single { ItemRemoteDataSource(get()) }\n}\n\n\u002F\u002F Presentation module\nval presentationModule = module {\n    viewModelOf(::ItemListViewModel)\n    viewModelOf(::DashboardViewModel)\n}\n```\n\n### Hilt (Android-only)\n\n```kotlin\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class RepositoryModule {\n    @Binds\n    abstract fun bindItemRepository(impl: ItemRepositoryImpl): ItemRepository\n}\n\n@HiltViewModel\nclass ItemListViewModel @Inject constructor(\n    private val getItems: GetItemsByCategoryUseCase\n) : ViewModel()\n```\n\n## Error Handling\n\n### Result\u002FTry Pattern\n\nUse `Result\u003CT>` or a custom sealed type for error propagation:\n\n```kotlin\nsealed interface Try\u003Cout T> {\n    data class Success\u003CT>(val value: T) : Try\u003CT>\n    data class Failure(val error: AppError) : Try\u003CNothing>\n}\n\nsealed interface AppError {\n    data class Network(val message: String) : AppError\n    data class Database(val message: String) : AppError\n    data object Unauthorized : AppError\n}\n\n\u002F\u002F In ViewModel — map to UI state\nviewModelScope.launch {\n    when (val result = getItems(category)) {\n        is Try.Success -> _state.update { it.copy(items = result.value, isLoading = false) }\n        is Try.Failure -> _state.update { it.copy(error = result.error.toMessage(), isLoading = false) }\n    }\n}\n```\n\n## Convention Plugins (Gradle)\n\nFor KMP projects, use convention plugins to reduce build file duplication:\n\n```kotlin\n\u002F\u002F build-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fkmp-library.gradle.kts\nplugins {\n    id(\"org.jetbrains.kotlin.multiplatform\")\n}\n\nkotlin {\n    androidTarget()\n    iosX64(); iosArm64(); iosSimulatorArm64()\n    sourceSets {\n        commonMain.dependencies { \u002F* shared deps *\u002F }\n        commonTest.dependencies { implementation(kotlin(\"test\")) }\n    }\n}\n```\n\nApply in modules:\n\n```kotlin\n\u002F\u002F domain\u002Fbuild.gradle.kts\nplugins { id(\"kmp-library\") }\n```\n\n## Anti-Patterns to Avoid\n\n- Importing Android framework classes in `domain` — keep it pure Kotlin\n- Exposing database entities or DTOs to the UI layer — always map to domain models\n- Putting business logic in ViewModels — extract to UseCases\n- Using `GlobalScope` or unstructured coroutines — use `viewModelScope` or structured concurrency\n- Fat repository implementations — split into focused DataSources\n- Circular module dependencies — if A depends on B, B must not depend on A\n\n## References\n\nSee skill: `compose-multiplatform-patterns` for UI patterns.\nSee skill: `kotlin-coroutines-flows` for async patterns.\n","# Android Clean Architecture\n\nClean Architecture patterns for Android and KMP projects. Covers module boundaries, dependency inversion, UseCase\u002FRepository patterns, and data layer design with Room, SQLDelight, and Ktor.\n\n## When to Activate\n\n- Structuring Android or KMP project modules\n- Implementing UseCases, Repositories, or DataSources\n- Designing data flow between layers (domain, data, presentation)\n- Setting up dependency injection with Koin or Hilt\n- Working with Room, SQLDelight, or Ktor in a layered architecture\n\n## Module Structure\n\n### Recommended Layout\n\n```\nproject\u002F\n├── app\u002F                  # Android entry point, DI wiring, Application class\n├── core\u002F                 # Shared utilities, base classes, error types\n├── domain\u002F               # UseCases, domain models, repository interfaces (pure Kotlin)\n├── data\u002F                 # Repository implementations, DataSources, DB, network\n├── presentation\u002F         # Screens, ViewModels, UI models, navigation\n├── design-system\u002F        # Reusable Compose components, theme, typography\n└── feature\u002F              # Feature modules (optional, for larger projects)\n    ├── auth\u002F\n    ├── settings\u002F\n    └── profile\u002F\n```\n\n### Dependency Rules\n\n```\napp → presentation, domain, data, core\npresentation → domain, design-system, core\ndata → domain, core\ndomain → core (or no dependencies)\ncore → (nothing)\n```\n\n**Critical**: `domain` must NEVER depend on `data`, `presentation`, or any framework. It contains pure Kotlin only.\n\n## Domain Layer\n\n### UseCase Pattern\n\nEach UseCase represents one business operation. Use `operator fun invoke` for clean call sites:\n\n```kotlin\nclass GetItemsByCategoryUseCase(\n    private val repository: ItemRepository\n) {\n    suspend operator fun invoke(category: String): Result\u003CList\u003CItem>> {\n        return repository.getItemsByCategory(category)\n    }\n}\n\n\u002F\u002F Flow-based UseCase for reactive streams\nclass ObserveUserProgressUseCase(\n    private val repository: UserRepository\n) {\n    operator fun invoke(userId: String): Flow\u003CUserProgress> {\n        return repository.observeProgress(userId)\n    }\n}\n```\n\n### Domain Models\n\nDomain models are plain Kotlin data classes — no framework annotations:\n\n```kotlin\ndata class Item(\n    val id: String,\n    val title: String,\n    val description: String,\n    val tags: List\u003CString>,\n    val status: Status,\n    val category: String\n)\n\nenum class Status { DRAFT, ACTIVE, ARCHIVED }\n```\n\n### Repository Interfaces\n\nDefined in domain, implemented in data:\n\n```kotlin\ninterface ItemRepository {\n    suspend fun getItemsByCategory(category: String): Result\u003CList\u003CItem>>\n    suspend fun saveItem(item: Item): Result\u003CUnit>\n    fun observeItems(): Flow\u003CList\u003CItem>>\n}\n```\n\n## Data Layer\n\n### Repository Implementation\n\nCoordinates between local and remote data sources:\n\n```kotlin\nclass ItemRepositoryImpl(\n    private val localDataSource: ItemLocalDataSource,\n    private val remoteDataSource: ItemRemoteDataSource\n) : ItemRepository {\n\n    override suspend fun getItemsByCategory(category: String): Result\u003CList\u003CItem>> {\n        return runCatching {\n            val remote = remoteDataSource.fetchItems(category)\n            localDataSource.insertItems(remote.map { it.toEntity() })\n            localDataSource.getItemsByCategory(category).map { it.toDomain() }\n        }\n    }\n\n    override suspend fun saveItem(item: Item): Result\u003CUnit> {\n        return runCatching {\n            localDataSource.insertItems(listOf(item.toEntity()))\n        }\n    }\n\n    override fun observeItems(): Flow\u003CList\u003CItem>> {\n        return localDataSource.observeAll().map { entities ->\n            entities.map { it.toDomain() }\n        }\n    }\n}\n```\n\n### Mapper Pattern\n\nKeep mappers as extension functions near the data models:\n\n```kotlin\n\u002F\u002F In data layer\nfun ItemEntity.toDomain() = Item(\n    id = id,\n    title = title,\n    description = description,\n    tags = tags.split(\"|\"),\n    status = Status.valueOf(status),\n    category = category\n)\n\nfun ItemDto.toEntity() = ItemEntity(\n    id = id,\n    title = title,\n    description = description,\n    tags = tags.joinToString(\"|\"),\n    status = status,\n    category = category\n)\n```\n\n### Room Database (Android)\n\n```kotlin\n@Entity(tableName = \"items\")\ndata class ItemEntity(\n    @PrimaryKey val id: String,\n    val title: String,\n    val description: String,\n    val tags: String,\n    val status: String,\n    val category: String\n)\n\n@Dao\ninterface ItemDao {\n    @Query(\"SELECT * FROM items WHERE category = :category\")\n    suspend fun getByCategory(category: String): List\u003CItemEntity>\n\n    @Upsert\n    suspend fun upsert(items: List\u003CItemEntity>)\n\n    @Query(\"SELECT * FROM items\")\n    fun observeAll(): Flow\u003CList\u003CItemEntity>>\n}\n```\n\n### SQLDelight (KMP)\n\n```sql\n-- Item.sq\nCREATE TABLE ItemEntity (\n    id TEXT NOT NULL PRIMARY KEY,\n    title TEXT NOT NULL,\n    description TEXT NOT NULL,\n    tags TEXT NOT NULL,\n    status TEXT NOT NULL,\n    category TEXT NOT NULL\n);\n\ngetByCategory:\nSELECT * FROM ItemEntity WHERE category = ?;\n\nupsert:\nINSERT OR REPLACE INTO ItemEntity (id, title, description, tags, status, category)\nVALUES (?, ?, ?, ?, ?, ?);\n\nobserveAll:\nSELECT * FROM ItemEntity;\n```\n\n### Ktor Network Client (KMP)\n\n```kotlin\nclass ItemRemoteDataSource(private val client: HttpClient) {\n\n    suspend fun fetchItems(category: String): List\u003CItemDto> {\n        return client.get(\"api\u002Fitems\") {\n            parameter(\"category\", category)\n        }.body()\n    }\n}\n\n\u002F\u002F HttpClient setup with content negotiation\nval httpClient = HttpClient {\n    install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true }) }\n    install(Logging) { level = LogLevel.HEADERS }\n    defaultRequest { url(\"https:\u002F\u002Fapi.example.com\u002F\") }\n}\n```\n\n## Dependency Injection\n\n### Koin (KMP-friendly)\n\n```kotlin\n\u002F\u002F Domain module\nval domainModule = module {\n    factory { GetItemsByCategoryUseCase(get()) }\n    factory { ObserveUserProgressUseCase(get()) }\n}\n\n\u002F\u002F Data module\nval dataModule = module {\n    single\u003CItemRepository> { ItemRepositoryImpl(get(), get()) }\n    single { ItemLocalDataSource(get()) }\n    single { ItemRemoteDataSource(get()) }\n}\n\n\u002F\u002F Presentation module\nval presentationModule = module {\n    viewModelOf(::ItemListViewModel)\n    viewModelOf(::DashboardViewModel)\n}\n```\n\n### Hilt (Android-only)\n\n```kotlin\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class RepositoryModule {\n    @Binds\n    abstract fun bindItemRepository(impl: ItemRepositoryImpl): ItemRepository\n}\n\n@HiltViewModel\nclass ItemListViewModel @Inject constructor(\n    private val getItems: GetItemsByCategoryUseCase\n) : ViewModel()\n```\n\n## Error Handling\n\n### Result\u002FTry Pattern\n\nUse `Result\u003CT>` or a custom sealed type for error propagation:\n\n```kotlin\nsealed interface Try\u003Cout T> {\n    data class Success\u003CT>(val value: T) : Try\u003CT>\n    data class Failure(val error: AppError) : Try\u003CNothing>\n}\n\nsealed interface AppError {\n    data class Network(val message: String) : AppError\n    data class Database(val message: String) : AppError\n    data object Unauthorized : AppError\n}\n\n\u002F\u002F In ViewModel — map to UI state\nviewModelScope.launch {\n    when (val result = getItems(category)) {\n        is Try.Success -> _state.update { it.copy(items = result.value, isLoading = false) }\n        is Try.Failure -> _state.update { it.copy(error = result.error.toMessage(), isLoading = false) }\n    }\n}\n```\n\n## Convention Plugins (Gradle)\n\nFor KMP projects, use convention plugins to reduce build file duplication:\n\n```kotlin\n\u002F\u002F build-logic\u002Fsrc\u002Fmain\u002Fkotlin\u002Fkmp-library.gradle.kts\nplugins {\n    id(\"org.jetbrains.kotlin.multiplatform\")\n}\n\nkotlin {\n    androidTarget()\n    iosX64(); iosArm64(); iosSimulatorArm64()\n    sourceSets {\n        commonMain.dependencies { \u002F* shared deps *\u002F }\n        commonTest.dependencies { implementation(kotlin(\"test\")) }\n    }\n}\n```\n\nApply in modules:\n\n```kotlin\n\u002F\u002F domain\u002Fbuild.gradle.kts\nplugins { id(\"kmp-library\") }\n```\n\n## Anti-Patterns to Avoid\n\n- Importing Android framework classes in `domain` — keep it pure Kotlin\n- Exposing database entities or DTOs to the UI layer — always map to domain models\n- Putting business logic in ViewModels — extract to UseCases\n- Using `GlobalScope` or unstructured coroutines — use `viewModelScope` or structured concurrency\n- Fat repository implementations — split into focused DataSources\n- Circular module dependencies — if A depends on B, B must not depend on A\n\n## References\n\nSee skill: `compose-multiplatform-patterns` for UI patterns.\nSee skill: `kotlin-coroutines-flows` for async patterns.\n",{"name":5,"origin":39,"description":7},"ECC","main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Flibrary\u002Fskills\u002Fandroid-clean-architecture","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill android-clean-architecture",{"tool":52,"command":53},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill android-clean-architecture",{"tool":55,"command":56},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill android-clean-architecture","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Flibrary\u002Fskills\u002Fandroid-clean-architecture\u002FSKILL.md",true,[60],{"path":61,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":65},"agents\u002Fopenai.yaml","REFERENCE","参考文档",82,"https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgenjutsu-compose-multiplatform\u002Fagents\u002Fopenai.yaml",[67,89,120,147,161,177],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":34},"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",[],[74,75,76,77,78,79,80,81,82,83,84,85,86,87,88],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","use","context","repo","injection","execution","file",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":100,"publishedAt":34},"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",[95],{"categoryNo":96,"categoryName":97,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[101,102,103,104,105,106,107,108,109,110,111,112,113,114,83,115,116,117,118,119],"openmm md","how","decision","pick","linux","analyze","tool","stack","open","NVIDIA","gpu","license","workflow","windows","free","molecular dynamics","local","do","MCP",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":132,"publishedAt":34},"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",[126,129],{"categoryNo":127,"categoryName":128,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":130,"categoryName":131,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000008","测试与质量",[133,134,135,136,137,138,139,140,141,142,102,143,144,145,146],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","playwright","screenshots",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":34},"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",[],[149,154,155,156,157,158,159,160],"setup","report","project","installation","project setup","issues","state",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":168,"publishedAt":34},"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",[167],{"categoryNo":96,"categoryName":97,"taxonomyType":98,"taxonomyTypeDesc":99},[163,169,79,170,171,172,83,173,174,175,176],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":178,"name":154,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":34},"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",[],[154,156,117,183,158,184],"files","interactive"]