[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M79HSSN477TMH0102QQF0RVC":3,"skill-same:01M79HSSN477TMH0102QQF0RVC":47},{"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":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":29,"ownerHtmlUrl":30,"ownerBlogUrl":6,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M79HSSN477TMH0102QQF0RVC","android-compose-ui",null,"Compose UI patterns for Android\u002FKMP - stability, recomposition, side effects, lazy lists, animations, previews, accessibility, modifier extensions, and design system composables. Use this skill whenever writing or reviewing composables, optimizing recomposition, adding animations, creating previews, writing custom modifiers, structuring a design system, or making any Compose UI decision beyond the MVI\u002FViewModel layer. Trigger on phrases like \"composable\", \"recomposition\", \"LaunchedEffect\", \"Modifier\", \"LazyColumn\", \"preview\", \"animation\", \"design system\", \"stability\", \"contentDescription\", \"graphicsLayer\", \"slot API\", or \"Compose performance\".","cosmictaserdev-creator\u002FConvx","cosmictaserdev-creator","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F278399831?v=4","01M79HSPX02ZNGBSR0HA77WMX1","Aryan sharma","01M79HSPY09R4SAB7DAFCQWSKV",1420,"GPL-3.0","https:\u002F\u002Fgithub.com\u002Fcosmictaserdev-creator\u002FConvx\u002Fblob\u002Fmain\u002Fcontributor\u002Fskills\u002Fandroid-compose-ui\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: android-compose-ui\ndescription: |\n  Compose UI patterns for Android\u002FKMP - stability, recomposition, side effects, lazy lists, animations, previews, accessibility, modifier extensions, and design system composables. Use this skill whenever writing or reviewing composables, optimizing recomposition, adding animations, creating previews, writing custom modifiers, structuring a design system, or making any Compose UI decision beyond the MVI\u002FViewModel layer. Trigger on phrases like \"composable\", \"recomposition\", \"LaunchedEffect\", \"Modifier\", \"LazyColumn\", \"preview\", \"animation\", \"design system\", \"stability\", \"contentDescription\", \"graphicsLayer\", \"slot API\", or \"Compose performance\".\n---\n\n# Android \u002F KMP Compose UI Patterns\n\n## Core Principle\n\nThe UI is dumb. Composables render state and forward user actions — nothing more. All state lives in the ViewModel. All logic lives in the ViewModel, domain, or data layer. Compose code should contain zero business logic, zero data transformation, and minimal side effects.\n\n---\n\n## Stability & Recomposition\n\nStrong skipping mode is enabled by default in modern Compose — no explicit opt-in needed.\n\nOnly annotate a state data class with `@Stable` when it contains fields the Compose compiler considers unstable (e.g., `List`, `Map`, `Set`, interfaces, or abstract types). If all fields are primitive types, `String`, or other stable types, no annotation is needed.\n\n```kotlin\n\u002F\u002F Needs @Stable — contains a List (unstable by default)\n@Stable\ndata class NoteListState(\n    val notes: List\u003CNoteUi> = emptyList(),\n    val isLoading: Boolean = false\n)\n\n\u002F\u002F No annotation needed — all fields are stable\ndata class NoteDetailState(\n    val title: String = \"\",\n    val body: String = \"\",\n    val isSaving: Boolean = false\n)\n```\n\n---\n\n## State Ownership\n\nAll state lives in the ViewModel. Do not use `remember` or `rememberSaveable` for application state — that belongs in the ViewModel's `StateFlow` and is surfaced via `collectAsStateWithLifecycle()`.\n\nThe only exception is Compose-internal state that the framework requires you to hold in composition, such as `LazyListState`, `ScrollState`, or `PagerState`. For these, use `remember*` as needed:\n\n```kotlin\n\u002F\u002F Acceptable — Compose-owned UI state\nval lazyListState = rememberLazyListState()\n\n\u002F\u002F Reacting to Compose-owned state with derivedStateOf\nval showScrollToTop by remember {\n    derivedStateOf { lazyListState.firstVisibleItemIndex > 5 }\n}\n```\n\n`derivedStateOf` should only be used in these rare scenarios where Compose-internal state drives a derived value. If the derivation can happen in the ViewModel, it should.\n\nAlways collect ViewModel state with lifecycle awareness:\n```kotlin\nval state by viewModel.state.collectAsStateWithLifecycle()\n```\n\n---\n\n## Side Effects\n\nSide effects should be avoided when possible. If something can be handled by the ViewModel through an Action, do that instead of using a side effect in a composable.\n\nWhen a side effect is truly necessary (e.g., interacting with Android lifecycle APIs that have no ViewModel equivalent), extract it into a dedicated composable to keep the Screen composable clean:\n\n```kotlin\n\u002F\u002F Extracted into its own composable\n@Composable\nfun ObserveLifecycle(onStart: () -> Unit, onStop: () -> Unit) {\n    val lifecycleOwner = LocalLifecycleOwner.current\n    DisposableEffect(lifecycleOwner) {\n        val observer = LifecycleEventObserver { _, event ->\n            when (event) {\n                Lifecycle.Event.ON_START -> onStart()\n                Lifecycle.Event.ON_STOP -> onStop()\n                else -> Unit\n            }\n        }\n        lifecycleOwner.lifecycle.addObserver(observer)\n        onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }\n    }\n}\n```\n\n`LaunchedEffect` is acceptable when genuinely needed, but question whether the work belongs in the ViewModel first. Do not use custom `CompositionLocal`s.\n\n---\n\n## Lazy Layouts\n\nAdd `key` to lazy list items when there is an obvious unique identifier available. Don't force it if it's unclear which property is unique:\n\n```kotlin\nLazyColumn {\n    items(\n        items = state.notes,\n        key = { it.id }  \u002F\u002F id is clearly unique\n    ) { note ->\n        NoteItem(note = note, onClick = { onAction(OnNoteClick(note.id)) })\n    }\n}\n```\n\n---\n\n## Animations\n\nAvoid animations that cause recompositions. Prefer approaches that animate below the recomposition layer:\n\n- **`graphicsLayer`** — for alpha, scale, rotation, translation\n- **Offset lambda** — for position changes (`offset { ... }`)\n- **`Canvas`** — for custom drawing that animates\n- **`animateFloatAsState` + `graphicsLayer`** — animate a float, apply in graphicsLayer\n\n```kotlin\n\u002F\u002F Good — animates without recomposition\nval alpha by animateFloatAsState(if (state.isVisible) 1f else 0f)\nBox(\n    modifier = Modifier.graphicsLayer { this.alpha = alpha }\n)\n\n\u002F\u002F Bad — causes recomposition on every frame\nBox(\n    modifier = Modifier.alpha(animatedAlpha)\n)\n```\n\n**Deferred state reads:** When a value drives an animation, pass it as a lambda rather than reading it directly. This defers the state read to the layout\u002Fdraw phase and avoids recomposition:\n\n```kotlin\n\u002F\u002F Good — deferred read\nfun Modifier.animatedOffset(offsetProvider: () -> IntOffset) =\n    offset { offsetProvider() }\n\n\u002F\u002F Bad — immediate read causes recomposition\nfun Modifier.animatedOffset(offset: IntOffset) =\n    offset(x = offset.x.dp, y = offset.y.dp)\n```\n\n---\n\n## Modifier Extensions\n\nPrefer plain `Modifier` extension functions or `Modifier.Node`-based factories. Do not make modifier extensions `@Composable`:\n\n```kotlin\n\u002F\u002F Good — plain extension\nfun Modifier.shimmerEffect(): Modifier = composed {\n    \u002F\u002F shimmer implementation\n}\n\n\u002F\u002F Better — Modifier factory (no composition needed)\nfun Modifier.roundedBackground(color: Color, radius: Dp) =\n    background(color, RoundedCornerShape(radius))\n```\n\n---\n\n## Design System & Slot APIs\n\nThe design system lives in `:core:design-system` and contains reusable Compose components, colors, theme, and typography.\n\nUse slot APIs (passing `@Composable` lambdas) primarily for design system components that need flexible content areas:\n\n```kotlin\n\u002F\u002F Slot API — design system component\n@Composable\nfun AppCard(\n    modifier: Modifier = Modifier,\n    header: @Composable () -> Unit,\n    content: @Composable () -> Unit\n) {\n    Card(modifier = modifier) {\n        header()\n        content()\n    }\n}\n```\n\nFeature-level composables should prefer typed parameters over slots for clarity.\n\n---\n\n## Previews\n\nEvery Screen composable should have at least one meaningful `@Preview` that shows a realistic state:\n\n```kotlin\n@Preview\n@Composable\nprivate fun NoteListScreenPreview() {\n    AppTheme {\n        NoteListScreen(\n            state = NoteListState(\n                notes = listOf(\n                    NoteUi(\"1\", \"Meeting notes\", \"Mar 15\"),\n                    NoteUi(\"2\", \"Shopping list\", \"Mar 14\")\n                )\n            ),\n            onAction = {}\n        )\n    }\n}\n```\n\nWrap previews in the app theme so they reflect real appearance. Use realistic sample data, not empty states (unless previewing the empty state specifically).\n\n---\n\n## Accessibility\n\nUse meaningful `contentDescription` on all interactive or informational visual elements. Always use string resources to allow localization:\n\n```kotlin\nIcon(\n    imageVector = Icons.Default.Delete,\n    contentDescription = stringResource(R.string.cd_delete_note)\n)\n\nImage(\n    painter = painterResource(R.drawable.profile),\n    contentDescription = stringResource(R.string.cd_profile_picture)\n)\n```\n\nFor decorative elements that convey no information, set `contentDescription = null`.\n\n---\n\n## TextField\n\nText input state lives in the ViewModel. Every keystroke dispatches an Action:\n\n```kotlin\n\u002F\u002F In the Screen composable\nTextField(\n    value = state.title,\n    onValueChange = { onAction(NoteEditorAction.OnTitleChange(it)) }\n)\n```\n\nThe ViewModel updates state (and optionally persists to `SavedStateHandle`) in response to the Action — see the **android-presentation-mvi** skill for the full pattern.\n","# Android \u002F KMP Compose UI Patterns\n\n## Core Principle\n\nThe UI is dumb. Composables render state and forward user actions — nothing more. All state lives in the ViewModel. All logic lives in the ViewModel, domain, or data layer. Compose code should contain zero business logic, zero data transformation, and minimal side effects.\n\n---\n\n## Stability & Recomposition\n\nStrong skipping mode is enabled by default in modern Compose — no explicit opt-in needed.\n\nOnly annotate a state data class with `@Stable` when it contains fields the Compose compiler considers unstable (e.g., `List`, `Map`, `Set`, interfaces, or abstract types). If all fields are primitive types, `String`, or other stable types, no annotation is needed.\n\n```kotlin\n\u002F\u002F Needs @Stable — contains a List (unstable by default)\n@Stable\ndata class NoteListState(\n    val notes: List\u003CNoteUi> = emptyList(),\n    val isLoading: Boolean = false\n)\n\n\u002F\u002F No annotation needed — all fields are stable\ndata class NoteDetailState(\n    val title: String = \"\",\n    val body: String = \"\",\n    val isSaving: Boolean = false\n)\n```\n\n---\n\n## State Ownership\n\nAll state lives in the ViewModel. Do not use `remember` or `rememberSaveable` for application state — that belongs in the ViewModel's `StateFlow` and is surfaced via `collectAsStateWithLifecycle()`.\n\nThe only exception is Compose-internal state that the framework requires you to hold in composition, such as `LazyListState`, `ScrollState`, or `PagerState`. For these, use `remember*` as needed:\n\n```kotlin\n\u002F\u002F Acceptable — Compose-owned UI state\nval lazyListState = rememberLazyListState()\n\n\u002F\u002F Reacting to Compose-owned state with derivedStateOf\nval showScrollToTop by remember {\n    derivedStateOf { lazyListState.firstVisibleItemIndex > 5 }\n}\n```\n\n`derivedStateOf` should only be used in these rare scenarios where Compose-internal state drives a derived value. If the derivation can happen in the ViewModel, it should.\n\nAlways collect ViewModel state with lifecycle awareness:\n```kotlin\nval state by viewModel.state.collectAsStateWithLifecycle()\n```\n\n---\n\n## Side Effects\n\nSide effects should be avoided when possible. If something can be handled by the ViewModel through an Action, do that instead of using a side effect in a composable.\n\nWhen a side effect is truly necessary (e.g., interacting with Android lifecycle APIs that have no ViewModel equivalent), extract it into a dedicated composable to keep the Screen composable clean:\n\n```kotlin\n\u002F\u002F Extracted into its own composable\n@Composable\nfun ObserveLifecycle(onStart: () -> Unit, onStop: () -> Unit) {\n    val lifecycleOwner = LocalLifecycleOwner.current\n    DisposableEffect(lifecycleOwner) {\n        val observer = LifecycleEventObserver { _, event ->\n            when (event) {\n                Lifecycle.Event.ON_START -> onStart()\n                Lifecycle.Event.ON_STOP -> onStop()\n                else -> Unit\n            }\n        }\n        lifecycleOwner.lifecycle.addObserver(observer)\n        onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }\n    }\n}\n```\n\n`LaunchedEffect` is acceptable when genuinely needed, but question whether the work belongs in the ViewModel first. Do not use custom `CompositionLocal`s.\n\n---\n\n## Lazy Layouts\n\nAdd `key` to lazy list items when there is an obvious unique identifier available. Don't force it if it's unclear which property is unique:\n\n```kotlin\nLazyColumn {\n    items(\n        items = state.notes,\n        key = { it.id }  \u002F\u002F id is clearly unique\n    ) { note ->\n        NoteItem(note = note, onClick = { onAction(OnNoteClick(note.id)) })\n    }\n}\n```\n\n---\n\n## Animations\n\nAvoid animations that cause recompositions. Prefer approaches that animate below the recomposition layer:\n\n- **`graphicsLayer`** — for alpha, scale, rotation, translation\n- **Offset lambda** — for position changes (`offset { ... }`)\n- **`Canvas`** — for custom drawing that animates\n- **`animateFloatAsState` + `graphicsLayer`** — animate a float, apply in graphicsLayer\n\n```kotlin\n\u002F\u002F Good — animates without recomposition\nval alpha by animateFloatAsState(if (state.isVisible) 1f else 0f)\nBox(\n    modifier = Modifier.graphicsLayer { this.alpha = alpha }\n)\n\n\u002F\u002F Bad — causes recomposition on every frame\nBox(\n    modifier = Modifier.alpha(animatedAlpha)\n)\n```\n\n**Deferred state reads:** When a value drives an animation, pass it as a lambda rather than reading it directly. This defers the state read to the layout\u002Fdraw phase and avoids recomposition:\n\n```kotlin\n\u002F\u002F Good — deferred read\nfun Modifier.animatedOffset(offsetProvider: () -> IntOffset) =\n    offset { offsetProvider() }\n\n\u002F\u002F Bad — immediate read causes recomposition\nfun Modifier.animatedOffset(offset: IntOffset) =\n    offset(x = offset.x.dp, y = offset.y.dp)\n```\n\n---\n\n## Modifier Extensions\n\nPrefer plain `Modifier` extension functions or `Modifier.Node`-based factories. Do not make modifier extensions `@Composable`:\n\n```kotlin\n\u002F\u002F Good — plain extension\nfun Modifier.shimmerEffect(): Modifier = composed {\n    \u002F\u002F shimmer implementation\n}\n\n\u002F\u002F Better — Modifier factory (no composition needed)\nfun Modifier.roundedBackground(color: Color, radius: Dp) =\n    background(color, RoundedCornerShape(radius))\n```\n\n---\n\n## Design System & Slot APIs\n\nThe design system lives in `:core:design-system` and contains reusable Compose components, colors, theme, and typography.\n\nUse slot APIs (passing `@Composable` lambdas) primarily for design system components that need flexible content areas:\n\n```kotlin\n\u002F\u002F Slot API — design system component\n@Composable\nfun AppCard(\n    modifier: Modifier = Modifier,\n    header: @Composable () -> Unit,\n    content: @Composable () -> Unit\n) {\n    Card(modifier = modifier) {\n        header()\n        content()\n    }\n}\n```\n\nFeature-level composables should prefer typed parameters over slots for clarity.\n\n---\n\n## Previews\n\nEvery Screen composable should have at least one meaningful `@Preview` that shows a realistic state:\n\n```kotlin\n@Preview\n@Composable\nprivate fun NoteListScreenPreview() {\n    AppTheme {\n        NoteListScreen(\n            state = NoteListState(\n                notes = listOf(\n                    NoteUi(\"1\", \"Meeting notes\", \"Mar 15\"),\n                    NoteUi(\"2\", \"Shopping list\", \"Mar 14\")\n                )\n            ),\n            onAction = {}\n        )\n    }\n}\n```\n\nWrap previews in the app theme so they reflect real appearance. Use realistic sample data, not empty states (unless previewing the empty state specifically).\n\n---\n\n## Accessibility\n\nUse meaningful `contentDescription` on all interactive or informational visual elements. Always use string resources to allow localization:\n\n```kotlin\nIcon(\n    imageVector = Icons.Default.Delete,\n    contentDescription = stringResource(R.string.cd_delete_note)\n)\n\nImage(\n    painter = painterResource(R.drawable.profile),\n    contentDescription = stringResource(R.string.cd_profile_picture)\n)\n```\n\nFor decorative elements that convey no information, set `contentDescription = null`.\n\n---\n\n## TextField\n\nText input state lives in the ViewModel. Every keystroke dispatches an Action:\n\n```kotlin\n\u002F\u002F In the Screen composable\nTextField(\n    value = state.title,\n    onValueChange = { onAction(NoteEditorAction.OnTitleChange(it)) }\n)\n```\n\nThe ViewModel updates state (and optionally persists to `SavedStateHandle`) in response to the Action — see the **android-presentation-mvi** skill for the full pattern.\n",{"name":5,"description":7},"main","f3dd4f71d603f8eb5828696fa7bab18c6172fb55","contributor\u002Fskills\u002Fandroid-compose-ui",82,"https:\u002F\u002Fgithub.com\u002Fcosmictaserdev-creator\u002FConvx","https:\u002F\u002Fcosmictaser.de5.net","https:\u002F\u002Fgithub.com\u002Fcosmictaserdev-creator","Android developer who do side quest on backend and other things 😗","2026-11-14 01:39:13",{"source":8,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add cosmictaserdev-creator\u002FConvx --skill android-compose-ui",{"tool":39,"command":40},"bunx","bunx skills add cosmictaserdev-creator\u002FConvx --skill android-compose-ui",{"tool":42,"command":43},"pnpm","pnpm dlx skills add cosmictaserdev-creator\u002FConvx --skill android-compose-ui","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcosmictaserdev-creator\u002FConvx\u002Fblob\u002Fmain\u002Fcontributor\u002Fskills\u002Fandroid-compose-ui\u002FSKILL.md",true,[],[48,55,62,69,76,83],{"skillNo":49,"name":50,"nameZh":6,"description":51,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":52,"categories":53,"keywords":54,"publishedAt":19},"01M79HYWSY9H6DNW14YM28D5NH","review-animations","Reviews animation and motion code against a high craft bar derived from Emil Kowalski's design engineering philosophy. Default to flagging; approval is earned.","https:\u002F\u002Fgithub.com\u002Fcosmictaserdev-creator\u002FConvx\u002Fblob\u002Fmain\u002Fcontributor\u002Fskills\u002Freview-animations\u002FSKILL.md",[],[],{"skillNo":56,"name":57,"nameZh":6,"description":58,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":59,"categories":60,"keywords":61,"publishedAt":19},"01M79HYS6N1DJE11T0B8HZKHQP","prototype","Build multiple genuinely different versions of a UI piece you describe, rendered behind a visual picker so you can flip through them live and promote the one that feels right. Only runs when explicitly invoked; it does not trigger on its own.","https:\u002F\u002Fgithub.com\u002Fcosmictaserdev-creator\u002FConvx\u002Fblob\u002Fmain\u002Fcontributor\u002Fskills\u002Fprototype\u002FSKILL.md",[],[],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":19},"01M79HYNBQ5NK2STBY5E1JMDZS","pick-ui-library","Pick the right library for a given frontend task from a curated, opinionated list — numbers, OTP inputs, charts, command menus, virtualization, drag and drop, toasts, state, styling, and more. Only runs when explicitly invoked; it does not trigger on its own.","https:\u002F\u002Fgithub.com\u002Fcosmictaserdev-creator\u002FConvx\u002Fblob\u002Fmain\u002Fcontributor\u002Fskills\u002Fpick-ui-library\u002FSKILL.md",[],[],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":19},"01M79HYG5N018C9KB5SZAJ03VK","improve-animations","Survey a codebase's animation and motion code as a senior motion advisor, then produce a prioritized audit and self-contained implementation plans for other agents (or cheaper models) to execute. Read-only on source code — it plans improvements, it does not apply them. Use when the user asks to \"improve the animations\", \"audit the motion\", \"make this app feel better\", or wants a roadmap of animation fixes rather than a review of a single diff.","https:\u002F\u002Fgithub.com\u002Fcosmictaserdev-creator\u002FConvx\u002Fblob\u002Fmain\u002Fcontributor\u002Fskills\u002Fimprove-animations\u002FSKILL.md",[],[],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":19},"01M79HYD3F6PR68BVEK4NYQT66","grilling","Interview the user relentlessly about a plan or design. Use when the user wants to stress-test a plan before building, or uses any 'grill' trigger phrases.","https:\u002F\u002Fgithub.com\u002Fcosmictaserdev-creator\u002FConvx\u002Fblob\u002Fmain\u002Fcontributor\u002Fskills\u002Fgrilling\u002FSKILL.md",[],[],{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":19},"01M79HYAYH7PR194SMGTP7NZWZ","grill-with-docs","A relentless interview to sharpen a plan or design, which also creates docs (ADR's and glossary) as we go.","https:\u002F\u002Fgithub.com\u002Fcosmictaserdev-creator\u002FConvx\u002Fblob\u002Fmain\u002Fcontributor\u002Fskills\u002Fgrill-with-docs\u002FSKILL.md",[],[]]