[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71C3STWHXHW5QE75RD8VFDW":3,"skill-same:01M71C3STWHXHW5QE75RD8VFDW":60},{"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":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":6,"ownerHtmlUrl":43,"ownerBlogUrl":6,"ownerDescription":44,"updatedAt":45,"install":46,"resources":59},"01M71C3STWHXHW5QE75RD8VFDW","genjutsu-compose-graphics",null,"Advanced Compose visuals - Material 3 Expressive motion physics, AGSL shaders (Android 13+), Canvas\u002FDrawScope generative, graphicsLayer effects.","nexuslinkproductions\u002Fyuri-os","nexuslinkproductions","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F273246263?v=4","01M718YX9NZRCW50B59B8ZVDKN","Marcel Spatz","01M718YXAQ7530F4B1VKN6SFQV",2,"MIT","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fgenjutsu-compose-graphics\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32],"genjutsu compose graphics","compose","graphics","material 3","physics","advanced","generative","canvas","effects","shaders","material","visuals","motion","android","2026-11-10 10:12:30",false,"---\nname: genjutsu-compose-graphics\ndescription: \"Advanced Compose visuals - Material 3 Expressive motion physics, AGSL shaders (Android 13+), Canvas\u002FDrawScope generative, graphicsLayer effects.\"\n---\n\n# Compose Graphics\n\n> Advanced Compose visuals: M3 Expressive motion physics, AGSL shaders (Android 13+), Canvas \u002F DrawScope, graphicsLayer effects.\n> Loaded for advanced thesis (shader, expressive, M3 Expressive, AGSL, Canvas, holographic).\n> Foundation: `..\u002Fcompose-motion\u002FSKILL.md` covers basics. Concise rules here. Deep-dive in `references\u002F`.\n\n---\n\n## Decision Tree: Which API for Which Need\n\n| Need | API |\n|---|---|\n| Spring physics with bounce \u002F overshoot | `MotionScheme.expressive()` (M3 Expressive) |\n| Pixel-level shader | `RuntimeShader` + `Modifier.graphicsLayer { renderEffect = ... }` (Android 13+) |\n| Generative drawing (paths, particles, fractals) | `Canvas { drawScope -> ... }` |\n| GPU effects (blur, shadows, color filters) | `Modifier.graphicsLayer { renderEffect = ... }` or `Modifier.blur(...)` |\n| Adaptive system materials (Material You glassmorphism) | `Modifier.background(MaterialTheme.colorScheme.surfaceContainerHighest)` |\n| Liquid glass on Android | AGSL shader recipe (no native API like iOS yet) |\n\n---\n\n## Domain 1: Material 3 Expressive\n\n### What It Is\n\nThe 2025 Material 3 evolution introduces spring-based motion physics replacing fixed-duration tweens. New shape morphing API via `androidx.graphics.shapes`. New `MotionScheme` selectable on the theme. Aimed at hero moments, key interactions, brand-defining UI.\n\n### MotionScheme\n\n| Scheme | Personality | Use For |\n|---|---|---|\n| `MotionScheme.standard()` | Calmer, less overshoot | Default for chrome, lists, navigation |\n| `MotionScheme.expressive()` | More overshoot, longer settle | Hero reveals, FABs, primary CTAs |\n\nApply on the theme:\n\n```kotlin\nMaterialTheme(motionScheme = MotionScheme.expressive()) {\n    \u002F\u002F children read tokens via MaterialTheme.motionScheme.*\n}\n```\n\nTokens exposed:\n\n| Token | Domain | Speed |\n|---|---|---|\n| `fastSpatialSpec()` | Position \u002F size | \u003C 200ms |\n| `defaultSpatialSpec()` | Position \u002F size | ~ 350ms |\n| `slowSpatialSpec()` | Position \u002F size | ~ 600ms |\n| `fastEffectsSpec()` | Opacity \u002F color | \u003C 150ms |\n| `defaultEffectsSpec()` | Opacity \u002F color | ~ 250ms |\n| `slowEffectsSpec()` | Opacity \u002F color | ~ 400ms |\n\n> **Spatial vs Effects:** spatial = anything physical (height, offset, scale). Effects = visual properties without inertia (alpha, color, elevation). Springs feel natural for spatial; tweens feel right for effects. The tokens encode this for you.\n\n### Hero Card Expand (Expressive Springs)\n\n```kotlin\n@Composable\nfun ExpressiveHero() {\n    var expanded by remember { mutableStateOf(false) }\n    MaterialTheme(motionScheme = MotionScheme.expressive()) {\n        val transition = updateTransition(targetState = expanded, label = \"expand\")\n        val height by transition.animateDp(\n            transitionSpec = { MaterialTheme.motionScheme.slowSpatialSpec() },\n            label = \"height\"\n        ) { if (it) 400.dp else 100.dp }\n        val alpha by transition.animateFloat(\n            transitionSpec = { MaterialTheme.motionScheme.defaultEffectsSpec() },\n            label = \"alpha\"\n        ) { if (it) 1f else 0f }\n\n        Card(\n            modifier = Modifier\n                .fillMaxWidth()\n                .height(height)\n                .clickable { expanded = !expanded }\n        ) {\n            Box(modifier = Modifier.alpha(alpha)) {\n                Text(\"Detail content\", modifier = Modifier.padding(24.dp))\n            }\n        }\n    }\n}\n```\n\n### Spring Tuning Recipes\n\n| Mood | Spec |\n|---|---|\n| Hero reveal | `spring(stiffness = Spring.StiffnessLow, dampingRatio = Spring.DampingRatioMediumBouncy)` |\n| Snappy expressive | `spring(stiffness = Spring.StiffnessMediumLow, dampingRatio = 0.7f)` |\n| Calm spatial | `MaterialTheme.motionScheme.defaultSpatialSpec()` (use the token) |\n| Critical (no overshoot) | `spring(stiffness = Spring.StiffnessHigh, dampingRatio = 1f)` |\n\n### Shape Morphing (M3 Expressive 1.3+)\n\n`androidx.graphics.shapes` ships predefined morphable shapes (`MaterialShapes.Circle`, `Pentagon`, `Cookie4Sided`, `Sunny`, `Heart`, etc.) and a `Morph(start, end)` interpolator.\n\n```kotlin\nval morph = remember { Morph(MaterialShapes.Circle, MaterialShapes.Cookie4Sided) }\nval progress by animateFloatAsState(\n    targetValue = if (active) 1f else 0f,\n    animationSpec = MaterialTheme.motionScheme.slowSpatialSpec(),\n    label = \"morph\"\n)\nBox(\n    modifier = Modifier\n        .size(96.dp)\n        .clip(GenericShape { size, _ ->\n            addPath(\n                morph.toPath(progress).asAndroidPath().asComposePath()\n            )\n        })\n        .background(MaterialTheme.colorScheme.primary)\n)\n```\n\n### When to Use Expressive vs Standard\n\n- **Expressive:** hero moments, key interactions, FABs, primary CTAs. 1-3% of UI.\n- **Standard:** default for the rest of the app. Mixing too much Expressive feels chaotic - every element fighting for attention.\n\n---\n\n## Domain 2: AGSL Shaders (Android 13+)\n\n### What It Is\n\nAGSL is Android's shader language. Similar to GLSL with simplifications (`half4` instead of `vec4`, restricted feature set, sandbox-safe). `RuntimeShader` compiles your AGSL source. Bind to a Compose modifier via `Modifier.graphicsLayer { renderEffect = ... }`.\n\n### Setup\n\n```kotlin\n@Composable\nfun ShaderEffect(content: @Composable () -> Unit) {\n    if (Build.VERSION.SDK_INT \u003C Build.VERSION_CODES.TIRAMISU) {\n        \u002F\u002F Android 12 and below: skip the shader, render content as-is.\n        content()\n        return\n    }\n    val shader = remember { RuntimeShader(AGSL_SOURCE) }\n    val time by produceState(0f) {\n        while (true) {\n            withFrameMillis { ms ->\n                value = ms \u002F 1000f\n            }\n        }\n    }\n    Box(\n        modifier = Modifier\n            .onSizeChanged {\n                shader.setFloatUniform(\"resolution\", it.width.toFloat(), it.height.toFloat())\n            }\n            .graphicsLayer {\n                shader.setFloatUniform(\"time\", time)\n                renderEffect = RenderEffect\n                    .createRuntimeShaderEffect(shader, \"image\")\n                    .asComposeRenderEffect()\n            }\n    ) { content() }\n}\n```\n\n> **Always gate on `Build.VERSION.SDK_INT >= 33`.** Pre-Android 13 fallback: render the content unmodified, or use `Modifier.blur()` \u002F a static gradient overlay.\n\n### Recipe: Touch Ripple\n\nAGSL source:\n\n```glsl\n\u002F\u002F ripple.agsl\nuniform float2 resolution;\nuniform float2 origin;\nuniform float time;\nuniform shader image;\n\nhalf4 main(float2 fragCoord) {\n    float2 toOrigin = fragCoord - origin;\n    float dist = length(toOrigin);\n    float wave = sin(dist * 0.05 - time * 8.0) * 0.05;\n    float falloff = 1.0 \u002F max(dist * 0.01, 1.0);\n    float2 dir = toOrigin \u002F max(dist, 0.0001);\n    float2 displaced = fragCoord + dir * wave * falloff * 50.0;\n    return image.eval(displaced);\n}\n```\n\nCompose binding (state-driven `time`, animated via `LaunchedEffect`):\n\n```kotlin\n@Composable\nfun RippleSurface(content: @Composable BoxScope.() -> Unit) {\n    if (Build.VERSION.SDK_INT \u003C 33) { Box { content() }; return }\n    val shader = remember { RuntimeShader(RIPPLE_AGSL) }\n    var origin by remember { mutableStateOf(Offset.Zero) }\n    var startMs by remember { mutableStateOf\u003CLong?>(null) }\n    val time by produceState(0f, startMs) {\n        if (startMs == null) { value = 0f; return@produceState }\n        val begin = startMs!!\n        while (true) {\n            withFrameMillis { now ->\n                value = (now - begin) \u002F 1000f\n            }\n        }\n    }\n    Box(\n        modifier = Modifier\n            .onSizeChanged {\n                shader.setFloatUniform(\"resolution\", it.width.toFloat(), it.height.toFloat())\n            }\n            .pointerInput(Unit) {\n                detectTapGestures { tap ->\n                    origin = tap\n                    startMs = System.currentTimeMillis()\n                }\n            }\n            .graphicsLayer {\n                shader.setFloatUniform(\"origin\", origin.x, origin.y)\n                shader.setFloatUniform(\"time\", time)\n                renderEffect = RenderEffect\n                    .createRuntimeShaderEffect(shader, \"image\")\n                    .asComposeRenderEffect()\n            },\n        content = content\n    )\n}\n```\n\n### Recipe: Holographic Gradient\n\n```glsl\nuniform float time;\nuniform shader image;\n\nhalf4 main(float2 fragCoord) {\n    half4 color = image.eval(fragCoord);\n    float n = fragCoord.x * 0.01 + fragCoord.y * 0.005 + time * 0.3;\n    half3 rainbow = half3(\n        sin(n * 2.0) * 0.5 + 0.5,\n        sin(n * 2.0 + 2.094) * 0.5 + 0.5,\n        sin(n * 2.0 + 4.188) * 0.5 + 0.5\n    );\n    half luma = dot(color.rgb, half3(0.299, 0.587, 0.114));\n    return half4(mix(color.rgb, rainbow * luma * 2.0, 0.5), color.a);\n}\n```\n\nMultiplies the underlying view's luminance by a phase-shifted RGB sine wave - shimmer over text or icons. `time` animates the wave drift.\n\n### Recipe: Liquid Glass \u002F Glassmorphism\n\nAndroid lacks a native iOS-26-style `glassEffect`. Compose this with blur + chromatic aberration + soft edge tint:\n\n```glsl\nuniform float2 resolution;\nuniform shader image;\n\nhalf4 main(float2 fragCoord) {\n    float2 uv = fragCoord \u002F resolution;\n    \u002F\u002F Chromatic aberration: sample R, G, B at slightly different offsets\n    float2 ca = (uv - 0.5) * 0.004;\n    half r = image.eval(fragCoord + ca * resolution).r;\n    half g = image.eval(fragCoord).g;\n    half b = image.eval(fragCoord - ca * resolution).b;\n    half4 base = half4(r, g, b, 1.0);\n    \u002F\u002F Soft edge tint: brighten near borders for that frosted look\n    float edge = smoothstep(0.45, 0.5, max(abs(uv.x - 0.5), abs(uv.y - 0.5)));\n    half3 tinted = base.rgb + half3(edge * 0.08);\n    return half4(tinted, 0.85);\n}\n```\n\nPair with `Modifier.blur(20.dp, BlurredEdgeTreatment.Unbounded)` upstream for the actual blur (cheaper than computing it in AGSL).\n\n### Performance Notes\n\n- Each `RuntimeShader` is a render pass. Compounds at 60fps - benchmark via Macrobenchmark.\n- `image.eval(coord)` samples the underlying view as a texture. Heavy if the view is complex (long lists, nested layouts). Cache static parts in a parent that doesn't recompose.\n- On Android 12 and below: graceful fallback (static image, no shader). Never hard-crash.\n- Prefer 1 well-crafted shader over chaining 4 shaders in series.\n\n---\n\n## Domain 3: Canvas \u002F DrawScope\n\n### Canvas API\n\n```kotlin\nCanvas(modifier = Modifier.size(200.dp)) {\n    \u002F\u002F 'this' is DrawScope - size, drawCircle, drawPath, drawRect...\n    drawCircle(Color.Blue, radius = size.minDimension \u002F 2)\n    drawPath(myPath, color = Color.White, style = Stroke(width = 4.dp.toPx()))\n}\n```\n\n| DrawScope method | Use |\n|---|---|\n| `drawCircle` | Filled or stroked circles |\n| `drawRect` | Rectangles, optionally with gradient brush |\n| `drawPath` | Arbitrary path with `Stroke` or `Fill` |\n| `drawArc` | Slice of an oval - useful for progress arcs |\n| `drawLine` | Straight segment between two `Offset` |\n| `drawText` | Text via `TextMeasurer` (preferred) or `drawIntoCanvas { it.nativeCanvas.drawText(...) }` |\n| `drawIntoCanvas { }` | Escape hatch - access raw `android.graphics.Canvas` |\n\n### Recipe: Animated Sine Wave\n\n```kotlin\n@Composable\nfun AnimatedWave() {\n    val infinite = rememberInfiniteTransition(label = \"wave\")\n    val phase by infinite.animateFloat(\n        initialValue = 0f,\n        targetValue = 2 * PI.toFloat(),\n        animationSpec = infiniteRepeatable(\n            animation = tween(3000, easing = LinearEasing)\n        ),\n        label = \"phase\"\n    )\n    Canvas(modifier = Modifier.fillMaxWidth().height(80.dp)) {\n        val path = Path()\n        var x = 0\n        while (x \u003C= size.width.toInt()) {\n            val y = size.height \u002F 2 + sin(x * 0.05f + phase) * 20f\n            if (x == 0) path.moveTo(x.toFloat(), y) else path.lineTo(x.toFloat(), y)\n            x += 2\n        }\n        drawPath(path, color = Color.Blue, style = Stroke(width = 2.dp.toPx()))\n    }\n}\n```\n\n### Recipe: Particle System (50 Particles)\n\n```kotlin\ndata class Particle(var x: Float, var y: Float, var vx: Float, var vy: Float, var life: Float)\n\n@Composable\nfun ParticleField() {\n    val particles = remember {\n        mutableStateListOf\u003CParticle>().apply {\n            repeat(50) {\n                add(Particle(\n                    x = Random.nextFloat() * 1000f,\n                    y = Random.nextFloat() * 1000f,\n                    vx = (Random.nextFloat() - 0.5f) * 4f,\n                    vy = (Random.nextFloat() - 0.5f) * 4f,\n                    life = 1f\n                ))\n            }\n        }\n    }\n    LaunchedEffect(Unit) {\n        while (true) {\n            withFrameMillis { \u002F* tick *\u002F }\n            particles.forEachIndexed { i, p ->\n                p.x += p.vx\n                p.y += p.vy\n                p.life -= 0.01f\n                if (p.life \u003C= 0f) {\n                    p.x = Random.nextFloat() * 1000f\n                    p.y = Random.nextFloat() * 1000f\n                    p.life = 1f\n                }\n            }\n        }\n    }\n    Canvas(modifier = Modifier.fillMaxSize()) {\n        particles.forEach { p ->\n            drawCircle(\n                color = Color.White.copy(alpha = p.life),\n                radius = 2.dp.toPx(),\n                center = Offset(p.x, p.y)\n            )\n        }\n    }\n}\n```\n\n### Recipe: Generative Pattern (Flow Field)\n\nQuick mention: noise-driven particle motion. See `references\u002Fcanvas-generative.md` for the full deep-dive (Perlin noise, particle pools, advection loop).\n\n### Performance Notes\n\n- Canvas redraws on every state change of any state it reads. Wrap volatile state in `derivedStateOf` to gate redraws.\n- `LaunchedEffect(Unit) { while(true) { withFrameMillis { ... } } }` is fine for 60fps. Avoid `delay(16)` - it drifts.\n- Heavy generative work: precompute paths once in `remember`, only animate transforms via `translate { drawPath(...) }`.\n- 200 simple draws per frame = OK on most devices. 2000+ starts to lag.\n\n---\n\n## Anti-Patterns\n\n### 1. Expressive Everywhere\n\n```kotlin\n\u002F\u002F BAD - every interaction overshoots, UI feels like a bouncy castle\nMaterialTheme(motionScheme = MotionScheme.expressive()) {\n    AppRoot()\n}\n\n\u002F\u002F GOOD - Standard for chrome, scope Expressive to hero moments\nMaterialTheme(motionScheme = MotionScheme.standard()) {\n    NavigationScaffold {\n        \u002F\u002F Hero detail screen overrides locally\n        MaterialTheme(motionScheme = MotionScheme.expressive()) {\n            HeroDetail()\n        }\n    }\n}\n```\n\n### 2. RuntimeShader Without API Gate\n\n```kotlin\n\u002F\u002F BAD - crashes on Android 12 and below\nval shader = remember { RuntimeShader(AGSL_SOURCE) }\n\n\u002F\u002F GOOD - gate on SDK level, provide fallback\nif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n    ShaderEffect { content() }\n} else {\n    Box(modifier = Modifier.background(fallbackGradient)) { content() }\n}\n```\n\n### 3. Canvas Reading State Directly Each Frame\n\n```kotlin\n\u002F\u002F BAD - any state change in the parent triggers a recompose of the Canvas\nCanvas(modifier = Modifier.fillMaxSize()) {\n    drawCircle(color = if (viewModel.isActive) Color.Red else Color.Blue, radius = 50f)\n}\n\n\u002F\u002F GOOD - hoist the reads, derive a stable value\nval color by remember { derivedStateOf { if (viewModel.isActive) Color.Red else Color.Blue } }\nCanvas(modifier = Modifier.fillMaxSize()) {\n    drawCircle(color = color, radius = 50f)\n}\n```\n\n### 4. Chaining 4 AGSL Shaders in Series\n\n```kotlin\n\u002F\u002F BAD - 4 render passes per frame, GPU melts on mid-range devices\n.graphicsLayer { renderEffect = blurEffect }\n.graphicsLayer { renderEffect = chromaticEffect }\n.graphicsLayer { renderEffect = noiseEffect }\n.graphicsLayer { renderEffect = vignetteEffect }\n\n\u002F\u002F GOOD - one shader doing all the math in a single pass\n.graphicsLayer { renderEffect = combinedGlassEffect }\n```\n\n### 5. Allocating in DrawScope\n\n```kotlin\n\u002F\u002F BAD - new Path every frame, GC stutter\nCanvas(modifier = Modifier.fillMaxSize()) {\n    val path = Path()\n    points.forEach { path.lineTo(it.x, it.y) }\n    drawPath(path, color = Color.Black)\n}\n\n\u002F\u002F GOOD - reuse a remembered Path, rewind each frame\nval path = remember { Path() }\nCanvas(modifier = Modifier.fillMaxSize()) {\n    path.rewind()\n    points.forEach { path.lineTo(it.x, it.y) }\n    drawPath(path, color = Color.Black)\n}\n```\n\n---\n\n## Quick Reference: Loading Sub-resources\n\n| Need | Load |\n|---|---|\n| AGSL recipes (7 working shaders with binding code) | `references\u002Fagsl-recipes.md` |\n| M3 Expressive choreography deep-dive | `references\u002Fm3-expressive-deep.md` |\n| Generative drawing patterns (flow fields, L-systems, particles) | `references\u002Fcanvas-generative.md` |\n| Base animations (animateAsState, AnimatedVisibility, Transition) | `..\u002Fcompose-motion\u002FSKILL.md` |\n| CMP patterns (shared UI iOS \u002F Android \u002F Desktop) | `..\u002Fcompose-multiplatform\u002FSKILL.md` |\n\n---\n\n## Sources\n\n- [drinkthestars\u002Fshady](https:\u002F\u002Fgithub.com\u002Fdrinkthestars\u002Fshady) - AGSL shaders rendered in Compose\n- [Mortd3kay\u002Fliquid-glass-android](https:\u002F\u002Fgithub.com\u002FMortd3kay\u002Fliquid-glass-android)\n- [JumpingKeyCaps\u002FDynamicVisualEffectsAGSL](https:\u002F\u002Fgithub.com\u002FJumpingKeyCaps\u002FDynamicVisualEffectsAGSL)\n- [Material 3 Expressive blog](https:\u002F\u002Fm3.material.io\u002Fblog\u002Fm3-expressive-motion-theming)\n- [Material Design 3 Motion specs](https:\u002F\u002Fm3.material.io\u002Fstyles\u002Fmotion\u002Foverview\u002Fspecs)\n- [Android AGSL docs](https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fui\u002Fviews\u002Fgraphics\u002Fagsl\u002Fusing-agsl)\n- [androidx.graphics.shapes](https:\u002F\u002Fdeveloper.android.com\u002Fjetpack\u002Fandroidx\u002Freleases\u002Fgraphics-shapes) - shape morphing\n","# Compose Graphics\n\n> Advanced Compose visuals: M3 Expressive motion physics, AGSL shaders (Android 13+), Canvas \u002F DrawScope, graphicsLayer effects.\n> Loaded for advanced thesis (shader, expressive, M3 Expressive, AGSL, Canvas, holographic).\n> Foundation: `..\u002Fcompose-motion\u002FSKILL.md` covers basics. Concise rules here. Deep-dive in `references\u002F`.\n\n---\n\n## Decision Tree: Which API for Which Need\n\n| Need | API |\n|---|---|\n| Spring physics with bounce \u002F overshoot | `MotionScheme.expressive()` (M3 Expressive) |\n| Pixel-level shader | `RuntimeShader` + `Modifier.graphicsLayer { renderEffect = ... }` (Android 13+) |\n| Generative drawing (paths, particles, fractals) | `Canvas { drawScope -> ... }` |\n| GPU effects (blur, shadows, color filters) | `Modifier.graphicsLayer { renderEffect = ... }` or `Modifier.blur(...)` |\n| Adaptive system materials (Material You glassmorphism) | `Modifier.background(MaterialTheme.colorScheme.surfaceContainerHighest)` |\n| Liquid glass on Android | AGSL shader recipe (no native API like iOS yet) |\n\n---\n\n## Domain 1: Material 3 Expressive\n\n### What It Is\n\nThe 2025 Material 3 evolution introduces spring-based motion physics replacing fixed-duration tweens. New shape morphing API via `androidx.graphics.shapes`. New `MotionScheme` selectable on the theme. Aimed at hero moments, key interactions, brand-defining UI.\n\n### MotionScheme\n\n| Scheme | Personality | Use For |\n|---|---|---|\n| `MotionScheme.standard()` | Calmer, less overshoot | Default for chrome, lists, navigation |\n| `MotionScheme.expressive()` | More overshoot, longer settle | Hero reveals, FABs, primary CTAs |\n\nApply on the theme:\n\n```kotlin\nMaterialTheme(motionScheme = MotionScheme.expressive()) {\n    \u002F\u002F children read tokens via MaterialTheme.motionScheme.*\n}\n```\n\nTokens exposed:\n\n| Token | Domain | Speed |\n|---|---|---|\n| `fastSpatialSpec()` | Position \u002F size | \u003C 200ms |\n| `defaultSpatialSpec()` | Position \u002F size | ~ 350ms |\n| `slowSpatialSpec()` | Position \u002F size | ~ 600ms |\n| `fastEffectsSpec()` | Opacity \u002F color | \u003C 150ms |\n| `defaultEffectsSpec()` | Opacity \u002F color | ~ 250ms |\n| `slowEffectsSpec()` | Opacity \u002F color | ~ 400ms |\n\n> **Spatial vs Effects:** spatial = anything physical (height, offset, scale). Effects = visual properties without inertia (alpha, color, elevation). Springs feel natural for spatial; tweens feel right for effects. The tokens encode this for you.\n\n### Hero Card Expand (Expressive Springs)\n\n```kotlin\n@Composable\nfun ExpressiveHero() {\n    var expanded by remember { mutableStateOf(false) }\n    MaterialTheme(motionScheme = MotionScheme.expressive()) {\n        val transition = updateTransition(targetState = expanded, label = \"expand\")\n        val height by transition.animateDp(\n            transitionSpec = { MaterialTheme.motionScheme.slowSpatialSpec() },\n            label = \"height\"\n        ) { if (it) 400.dp else 100.dp }\n        val alpha by transition.animateFloat(\n            transitionSpec = { MaterialTheme.motionScheme.defaultEffectsSpec() },\n            label = \"alpha\"\n        ) { if (it) 1f else 0f }\n\n        Card(\n            modifier = Modifier\n                .fillMaxWidth()\n                .height(height)\n                .clickable { expanded = !expanded }\n        ) {\n            Box(modifier = Modifier.alpha(alpha)) {\n                Text(\"Detail content\", modifier = Modifier.padding(24.dp))\n            }\n        }\n    }\n}\n```\n\n### Spring Tuning Recipes\n\n| Mood | Spec |\n|---|---|\n| Hero reveal | `spring(stiffness = Spring.StiffnessLow, dampingRatio = Spring.DampingRatioMediumBouncy)` |\n| Snappy expressive | `spring(stiffness = Spring.StiffnessMediumLow, dampingRatio = 0.7f)` |\n| Calm spatial | `MaterialTheme.motionScheme.defaultSpatialSpec()` (use the token) |\n| Critical (no overshoot) | `spring(stiffness = Spring.StiffnessHigh, dampingRatio = 1f)` |\n\n### Shape Morphing (M3 Expressive 1.3+)\n\n`androidx.graphics.shapes` ships predefined morphable shapes (`MaterialShapes.Circle`, `Pentagon`, `Cookie4Sided`, `Sunny`, `Heart`, etc.) and a `Morph(start, end)` interpolator.\n\n```kotlin\nval morph = remember { Morph(MaterialShapes.Circle, MaterialShapes.Cookie4Sided) }\nval progress by animateFloatAsState(\n    targetValue = if (active) 1f else 0f,\n    animationSpec = MaterialTheme.motionScheme.slowSpatialSpec(),\n    label = \"morph\"\n)\nBox(\n    modifier = Modifier\n        .size(96.dp)\n        .clip(GenericShape { size, _ ->\n            addPath(\n                morph.toPath(progress).asAndroidPath().asComposePath()\n            )\n        })\n        .background(MaterialTheme.colorScheme.primary)\n)\n```\n\n### When to Use Expressive vs Standard\n\n- **Expressive:** hero moments, key interactions, FABs, primary CTAs. 1-3% of UI.\n- **Standard:** default for the rest of the app. Mixing too much Expressive feels chaotic - every element fighting for attention.\n\n---\n\n## Domain 2: AGSL Shaders (Android 13+)\n\n### What It Is\n\nAGSL is Android's shader language. Similar to GLSL with simplifications (`half4` instead of `vec4`, restricted feature set, sandbox-safe). `RuntimeShader` compiles your AGSL source. Bind to a Compose modifier via `Modifier.graphicsLayer { renderEffect = ... }`.\n\n### Setup\n\n```kotlin\n@Composable\nfun ShaderEffect(content: @Composable () -> Unit) {\n    if (Build.VERSION.SDK_INT \u003C Build.VERSION_CODES.TIRAMISU) {\n        \u002F\u002F Android 12 and below: skip the shader, render content as-is.\n        content()\n        return\n    }\n    val shader = remember { RuntimeShader(AGSL_SOURCE) }\n    val time by produceState(0f) {\n        while (true) {\n            withFrameMillis { ms ->\n                value = ms \u002F 1000f\n            }\n        }\n    }\n    Box(\n        modifier = Modifier\n            .onSizeChanged {\n                shader.setFloatUniform(\"resolution\", it.width.toFloat(), it.height.toFloat())\n            }\n            .graphicsLayer {\n                shader.setFloatUniform(\"time\", time)\n                renderEffect = RenderEffect\n                    .createRuntimeShaderEffect(shader, \"image\")\n                    .asComposeRenderEffect()\n            }\n    ) { content() }\n}\n```\n\n> **Always gate on `Build.VERSION.SDK_INT >= 33`.** Pre-Android 13 fallback: render the content unmodified, or use `Modifier.blur()` \u002F a static gradient overlay.\n\n### Recipe: Touch Ripple\n\nAGSL source:\n\n```glsl\n\u002F\u002F ripple.agsl\nuniform float2 resolution;\nuniform float2 origin;\nuniform float time;\nuniform shader image;\n\nhalf4 main(float2 fragCoord) {\n    float2 toOrigin = fragCoord - origin;\n    float dist = length(toOrigin);\n    float wave = sin(dist * 0.05 - time * 8.0) * 0.05;\n    float falloff = 1.0 \u002F max(dist * 0.01, 1.0);\n    float2 dir = toOrigin \u002F max(dist, 0.0001);\n    float2 displaced = fragCoord + dir * wave * falloff * 50.0;\n    return image.eval(displaced);\n}\n```\n\nCompose binding (state-driven `time`, animated via `LaunchedEffect`):\n\n```kotlin\n@Composable\nfun RippleSurface(content: @Composable BoxScope.() -> Unit) {\n    if (Build.VERSION.SDK_INT \u003C 33) { Box { content() }; return }\n    val shader = remember { RuntimeShader(RIPPLE_AGSL) }\n    var origin by remember { mutableStateOf(Offset.Zero) }\n    var startMs by remember { mutableStateOf\u003CLong?>(null) }\n    val time by produceState(0f, startMs) {\n        if (startMs == null) { value = 0f; return@produceState }\n        val begin = startMs!!\n        while (true) {\n            withFrameMillis { now ->\n                value = (now - begin) \u002F 1000f\n            }\n        }\n    }\n    Box(\n        modifier = Modifier\n            .onSizeChanged {\n                shader.setFloatUniform(\"resolution\", it.width.toFloat(), it.height.toFloat())\n            }\n            .pointerInput(Unit) {\n                detectTapGestures { tap ->\n                    origin = tap\n                    startMs = System.currentTimeMillis()\n                }\n            }\n            .graphicsLayer {\n                shader.setFloatUniform(\"origin\", origin.x, origin.y)\n                shader.setFloatUniform(\"time\", time)\n                renderEffect = RenderEffect\n                    .createRuntimeShaderEffect(shader, \"image\")\n                    .asComposeRenderEffect()\n            },\n        content = content\n    )\n}\n```\n\n### Recipe: Holographic Gradient\n\n```glsl\nuniform float time;\nuniform shader image;\n\nhalf4 main(float2 fragCoord) {\n    half4 color = image.eval(fragCoord);\n    float n = fragCoord.x * 0.01 + fragCoord.y * 0.005 + time * 0.3;\n    half3 rainbow = half3(\n        sin(n * 2.0) * 0.5 + 0.5,\n        sin(n * 2.0 + 2.094) * 0.5 + 0.5,\n        sin(n * 2.0 + 4.188) * 0.5 + 0.5\n    );\n    half luma = dot(color.rgb, half3(0.299, 0.587, 0.114));\n    return half4(mix(color.rgb, rainbow * luma * 2.0, 0.5), color.a);\n}\n```\n\nMultiplies the underlying view's luminance by a phase-shifted RGB sine wave - shimmer over text or icons. `time` animates the wave drift.\n\n### Recipe: Liquid Glass \u002F Glassmorphism\n\nAndroid lacks a native iOS-26-style `glassEffect`. Compose this with blur + chromatic aberration + soft edge tint:\n\n```glsl\nuniform float2 resolution;\nuniform shader image;\n\nhalf4 main(float2 fragCoord) {\n    float2 uv = fragCoord \u002F resolution;\n    \u002F\u002F Chromatic aberration: sample R, G, B at slightly different offsets\n    float2 ca = (uv - 0.5) * 0.004;\n    half r = image.eval(fragCoord + ca * resolution).r;\n    half g = image.eval(fragCoord).g;\n    half b = image.eval(fragCoord - ca * resolution).b;\n    half4 base = half4(r, g, b, 1.0);\n    \u002F\u002F Soft edge tint: brighten near borders for that frosted look\n    float edge = smoothstep(0.45, 0.5, max(abs(uv.x - 0.5), abs(uv.y - 0.5)));\n    half3 tinted = base.rgb + half3(edge * 0.08);\n    return half4(tinted, 0.85);\n}\n```\n\nPair with `Modifier.blur(20.dp, BlurredEdgeTreatment.Unbounded)` upstream for the actual blur (cheaper than computing it in AGSL).\n\n### Performance Notes\n\n- Each `RuntimeShader` is a render pass. Compounds at 60fps - benchmark via Macrobenchmark.\n- `image.eval(coord)` samples the underlying view as a texture. Heavy if the view is complex (long lists, nested layouts). Cache static parts in a parent that doesn't recompose.\n- On Android 12 and below: graceful fallback (static image, no shader). Never hard-crash.\n- Prefer 1 well-crafted shader over chaining 4 shaders in series.\n\n---\n\n## Domain 3: Canvas \u002F DrawScope\n\n### Canvas API\n\n```kotlin\nCanvas(modifier = Modifier.size(200.dp)) {\n    \u002F\u002F 'this' is DrawScope - size, drawCircle, drawPath, drawRect...\n    drawCircle(Color.Blue, radius = size.minDimension \u002F 2)\n    drawPath(myPath, color = Color.White, style = Stroke(width = 4.dp.toPx()))\n}\n```\n\n| DrawScope method | Use |\n|---|---|\n| `drawCircle` | Filled or stroked circles |\n| `drawRect` | Rectangles, optionally with gradient brush |\n| `drawPath` | Arbitrary path with `Stroke` or `Fill` |\n| `drawArc` | Slice of an oval - useful for progress arcs |\n| `drawLine` | Straight segment between two `Offset` |\n| `drawText` | Text via `TextMeasurer` (preferred) or `drawIntoCanvas { it.nativeCanvas.drawText(...) }` |\n| `drawIntoCanvas { }` | Escape hatch - access raw `android.graphics.Canvas` |\n\n### Recipe: Animated Sine Wave\n\n```kotlin\n@Composable\nfun AnimatedWave() {\n    val infinite = rememberInfiniteTransition(label = \"wave\")\n    val phase by infinite.animateFloat(\n        initialValue = 0f,\n        targetValue = 2 * PI.toFloat(),\n        animationSpec = infiniteRepeatable(\n            animation = tween(3000, easing = LinearEasing)\n        ),\n        label = \"phase\"\n    )\n    Canvas(modifier = Modifier.fillMaxWidth().height(80.dp)) {\n        val path = Path()\n        var x = 0\n        while (x \u003C= size.width.toInt()) {\n            val y = size.height \u002F 2 + sin(x * 0.05f + phase) * 20f\n            if (x == 0) path.moveTo(x.toFloat(), y) else path.lineTo(x.toFloat(), y)\n            x += 2\n        }\n        drawPath(path, color = Color.Blue, style = Stroke(width = 2.dp.toPx()))\n    }\n}\n```\n\n### Recipe: Particle System (50 Particles)\n\n```kotlin\ndata class Particle(var x: Float, var y: Float, var vx: Float, var vy: Float, var life: Float)\n\n@Composable\nfun ParticleField() {\n    val particles = remember {\n        mutableStateListOf\u003CParticle>().apply {\n            repeat(50) {\n                add(Particle(\n                    x = Random.nextFloat() * 1000f,\n                    y = Random.nextFloat() * 1000f,\n                    vx = (Random.nextFloat() - 0.5f) * 4f,\n                    vy = (Random.nextFloat() - 0.5f) * 4f,\n                    life = 1f\n                ))\n            }\n        }\n    }\n    LaunchedEffect(Unit) {\n        while (true) {\n            withFrameMillis { \u002F* tick *\u002F }\n            particles.forEachIndexed { i, p ->\n                p.x += p.vx\n                p.y += p.vy\n                p.life -= 0.01f\n                if (p.life \u003C= 0f) {\n                    p.x = Random.nextFloat() * 1000f\n                    p.y = Random.nextFloat() * 1000f\n                    p.life = 1f\n                }\n            }\n        }\n    }\n    Canvas(modifier = Modifier.fillMaxSize()) {\n        particles.forEach { p ->\n            drawCircle(\n                color = Color.White.copy(alpha = p.life),\n                radius = 2.dp.toPx(),\n                center = Offset(p.x, p.y)\n            )\n        }\n    }\n}\n```\n\n### Recipe: Generative Pattern (Flow Field)\n\nQuick mention: noise-driven particle motion. See `references\u002Fcanvas-generative.md` for the full deep-dive (Perlin noise, particle pools, advection loop).\n\n### Performance Notes\n\n- Canvas redraws on every state change of any state it reads. Wrap volatile state in `derivedStateOf` to gate redraws.\n- `LaunchedEffect(Unit) { while(true) { withFrameMillis { ... } } }` is fine for 60fps. Avoid `delay(16)` - it drifts.\n- Heavy generative work: precompute paths once in `remember`, only animate transforms via `translate { drawPath(...) }`.\n- 200 simple draws per frame = OK on most devices. 2000+ starts to lag.\n\n---\n\n## Anti-Patterns\n\n### 1. Expressive Everywhere\n\n```kotlin\n\u002F\u002F BAD - every interaction overshoots, UI feels like a bouncy castle\nMaterialTheme(motionScheme = MotionScheme.expressive()) {\n    AppRoot()\n}\n\n\u002F\u002F GOOD - Standard for chrome, scope Expressive to hero moments\nMaterialTheme(motionScheme = MotionScheme.standard()) {\n    NavigationScaffold {\n        \u002F\u002F Hero detail screen overrides locally\n        MaterialTheme(motionScheme = MotionScheme.expressive()) {\n            HeroDetail()\n        }\n    }\n}\n```\n\n### 2. RuntimeShader Without API Gate\n\n```kotlin\n\u002F\u002F BAD - crashes on Android 12 and below\nval shader = remember { RuntimeShader(AGSL_SOURCE) }\n\n\u002F\u002F GOOD - gate on SDK level, provide fallback\nif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n    ShaderEffect { content() }\n} else {\n    Box(modifier = Modifier.background(fallbackGradient)) { content() }\n}\n```\n\n### 3. Canvas Reading State Directly Each Frame\n\n```kotlin\n\u002F\u002F BAD - any state change in the parent triggers a recompose of the Canvas\nCanvas(modifier = Modifier.fillMaxSize()) {\n    drawCircle(color = if (viewModel.isActive) Color.Red else Color.Blue, radius = 50f)\n}\n\n\u002F\u002F GOOD - hoist the reads, derive a stable value\nval color by remember { derivedStateOf { if (viewModel.isActive) Color.Red else Color.Blue } }\nCanvas(modifier = Modifier.fillMaxSize()) {\n    drawCircle(color = color, radius = 50f)\n}\n```\n\n### 4. Chaining 4 AGSL Shaders in Series\n\n```kotlin\n\u002F\u002F BAD - 4 render passes per frame, GPU melts on mid-range devices\n.graphicsLayer { renderEffect = blurEffect }\n.graphicsLayer { renderEffect = chromaticEffect }\n.graphicsLayer { renderEffect = noiseEffect }\n.graphicsLayer { renderEffect = vignetteEffect }\n\n\u002F\u002F GOOD - one shader doing all the math in a single pass\n.graphicsLayer { renderEffect = combinedGlassEffect }\n```\n\n### 5. Allocating in DrawScope\n\n```kotlin\n\u002F\u002F BAD - new Path every frame, GC stutter\nCanvas(modifier = Modifier.fillMaxSize()) {\n    val path = Path()\n    points.forEach { path.lineTo(it.x, it.y) }\n    drawPath(path, color = Color.Black)\n}\n\n\u002F\u002F GOOD - reuse a remembered Path, rewind each frame\nval path = remember { Path() }\nCanvas(modifier = Modifier.fillMaxSize()) {\n    path.rewind()\n    points.forEach { path.lineTo(it.x, it.y) }\n    drawPath(path, color = Color.Black)\n}\n```\n\n---\n\n## Quick Reference: Loading Sub-resources\n\n| Need | Load |\n|---|---|\n| AGSL recipes (7 working shaders with binding code) | `references\u002Fagsl-recipes.md` |\n| M3 Expressive choreography deep-dive | `references\u002Fm3-expressive-deep.md` |\n| Generative drawing patterns (flow fields, L-systems, particles) | `references\u002Fcanvas-generative.md` |\n| Base animations (animateAsState, AnimatedVisibility, Transition) | `..\u002Fcompose-motion\u002FSKILL.md` |\n| CMP patterns (shared UI iOS \u002F Android \u002F Desktop) | `..\u002Fcompose-multiplatform\u002FSKILL.md` |\n\n---\n\n## Sources\n\n- [drinkthestars\u002Fshady](https:\u002F\u002Fgithub.com\u002Fdrinkthestars\u002Fshady) - AGSL shaders rendered in Compose\n- [Mortd3kay\u002Fliquid-glass-android](https:\u002F\u002Fgithub.com\u002FMortd3kay\u002Fliquid-glass-android)\n- [JumpingKeyCaps\u002FDynamicVisualEffectsAGSL](https:\u002F\u002Fgithub.com\u002FJumpingKeyCaps\u002FDynamicVisualEffectsAGSL)\n- [Material 3 Expressive blog](https:\u002F\u002Fm3.material.io\u002Fblog\u002Fm3-expressive-motion-theming)\n- [Material Design 3 Motion specs](https:\u002F\u002Fm3.material.io\u002Fstyles\u002Fmotion\u002Foverview\u002Fspecs)\n- [Android AGSL docs](https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fui\u002Fviews\u002Fgraphics\u002Fagsl\u002Fusing-agsl)\n- [androidx.graphics.shapes](https:\u002F\u002Fdeveloper.android.com\u002Fjetpack\u002Fandroidx\u002Freleases\u002Fgraphics-shapes) - shape morphing\n",{"name":5,"description":7},"main","4c6d8d65f3d6096e2fc25b0845e481dda73c2794","skills\u002Fgenjutsu-compose-graphics",0,"https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions","Building deterministic AI governance and continuity systems. Workflow architect + visual storyteller","2026-11-14 03:05:17",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add nexuslinkproductions\u002Fyuri-os --skill genjutsu-compose-graphics",{"tool":52,"command":53},"bunx","bunx skills add nexuslinkproductions\u002Fyuri-os --skill genjutsu-compose-graphics",{"tool":55,"command":56},"pnpm","pnpm dlx skills add nexuslinkproductions\u002Fyuri-os --skill genjutsu-compose-graphics","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fgenjutsu-compose-graphics\u002FSKILL.md",true,[],[61,84,108,138,167,186],{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":67,"publishedAt":33},"01M71CG1AME5WC0A79AE65WT0X","zoom-out","Tell the agent to zoom out and give broader context or a higher-level perspective. Use when you're unfamiliar with a section of code or need to understand how it fits into the bigger picture.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fzoom-out\u002FSKILL.md",[],[68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83],"zoom out","zoom","with","harness","how","section","re","true","understand","use","perspective","when","you","code","it","context",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":33},"01M71CFY9ATD0BAXV6B14HFG7C","yuri-shura","6-perspective adversarial review for high-stakes turns (architecture decisions, refactor planning, deployment review) — fans out architect, adversary (7-vector attack), maintainer, ops, product, and security perspectives in parallel, then consolidates. Use when user says 'review this decision', '\u002Fshura', 'adversarial review', 'what could go wrong', 'architecture review', or 'deployment review'.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-shura\u002FSKILL.md",[],[91,92,71,93,94,95,96,97,98,99,100,77,101,79,102,103,104,105,106,107],"yuri shura","parallel","architecture review","planning","for","deployment","vector","strategic review","decision","strategic","ops","workflow","decisions","architecture","review","perspectives","adversarial",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":119,"publishedAt":33},"01M71CFTTYW1HA2MNX38EV1GJ5","yuri-sales-intelligence","Unified sales and outreach skill generating cold outreach openers, social selling sequences, objection rebuttals, and ad creative for any paid platform — multi-persona aware, adapting tone and offer frame to buyer type. Use when user says 'write a cold email', 'outreach sequence', 'objection handling', 'ad copy', or 'sales pitch'.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-sales-intelligence\u002FSKILL.md",[114],{"categoryNo":115,"categoryName":116,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000005","邮件与沟通","SCENARIO","使用场景",[120,121,122,123,124,125,126,127,128,79,129,130,131,132,133,134,135,95,136,137],"intelligence","sales intelligence","yuri sales intelligence","sales","cold","paid","social","persona","pitch","cold email","ad creative","write","sequences","sequence","platform","email","cold outreach","frame",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":152,"publishedAt":33},"01M71CFQMBFTFADJNGP0Z2WCYK","yuri-code-intelligence","Unified code quality intelligence layer that diagnoses code smells (Long Method, Feature Envy, design pattern issues), prescribes targeted Fowler refactoring techniques, and reviews code for security, performance, and clarity. Use when user says 'review this code', 'refactor this', 'what's wrong with this method', 'code smells', or 'clean this up'.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-code-intelligence\u002FSKILL.md",[144,147],{"categoryNo":145,"categoryName":146,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":148,"categoryName":149,"taxonomyType":150,"taxonomyTypeDesc":151},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[153,81,154,120,71,155,156,157,95,158,159,160,161,162,163,164,165,166,77,79],"yuri code intelligence","code intelligence","reviews","code quality","feature","performance","code review","long","up","issues","clean","techniques","improve","design",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":173,"publishedAt":33},"01M71CFP32RT6GD3GKNHCJP8VP","yuri-adw","Invoke when user asks to run the ADW loop \u002F agentic engineering loop \u002F software factory workflow.","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fyuri-adw\u002FSKILL.md",[],[174,175,176,177,178,179,180,181,182,79,183,102,184,185],"yuri adw","run","engineering loop","software factory","software","agentic engineering","factory","loop","invoke","engineering","agentic","user",{"skillNo":187,"name":188,"nameZh":6,"description":189,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":190,"categories":191,"keywords":204,"publishedAt":33},"01M71CFK4VPEKY6A73237P7RSN","writing-skills","Use when creating new skills, editing existing skills, or verifying skills work before deployment","https:\u002F\u002Fgithub.com\u002Fnexuslinkproductions\u002Fyuri-os\u002Fblob\u002Fmain\u002Fskills\u002Fwriting-skills\u002FSKILL.md",[192,195,198,201],{"categoryNo":193,"categoryName":194,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":196,"categoryName":197,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":199,"categoryName":200,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":202,"categoryName":203,"taxonomyType":150,"taxonomyTypeDesc":151},"01JBSEEDCAT000000000000036","内容创作者",[205,206,207,79,102,208,71,209,96,77,210],"writing","writing skills","new","work","editing","Existing"]