[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DRHBN8XTJZP1SCT1QJYRPV":3,"skill-same:01M6DRHBN8XTJZP1SCT1QJYRPV":234},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":6,"ownerHtmlUrl":52,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M6DRHBN8XTJZP1SCT1QJYRPV","solidjs",null,"SolidJS framework development skill for building reactive web applications with fine-grained reactivity.\nUse when working with SolidJS projects including: (1) Creating components with signals, stores, and effects,\n(2) Implementing reactive state management, (3) Using control flow components (Show, For, Switch\u002FMatch),\n(4) Setting up routing with Solid Router, (5) Building full-stack apps with SolidStart,\n(6) Data fetching with createResource, (7) Context API for shared state, (8) SSR\u002FSSG configuration.\nTriggers: solid, solidjs, solid-js, solid start, solidstart, createSignal, createStore, createEffect.","AntifragileTech\u002Fantifragile-claude-code","AntifragileTech","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F174357194?v=4","01M6DQCYMK4CDSQQAN0ZC72NTV","01M6DQCYS9YPW1WKMQ5TJMPQ43",9,"MIT","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fdev\u002Fsolidjs\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[5,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"context","apps","full","shared","signals","show","switch","up","router","components","stack","projects","api","data","flow","start","framework","development","ssr","2026-11-10 10:12:30",false,"---\nname: solidjs\ndescription: |\n    SolidJS framework development skill for building reactive web applications with fine-grained reactivity.\n    Use when working with SolidJS projects including: (1) Creating components with signals, stores, and effects,\n    (2) Implementing reactive state management, (3) Using control flow components (Show, For, Switch\u002FMatch),\n    (4) Setting up routing with Solid Router, (5) Building full-stack apps with SolidStart,\n    (6) Data fetching with createResource, (7) Context API for shared state, (8) SSR\u002FSSG configuration.\n    Triggers: solid, solidjs, solid-js, solid start, solidstart, createSignal, createStore, createEffect.\n---\n\n# SolidJS Development\n\nSolidJS is a declarative JavaScript library for building user interfaces with fine-grained reactivity. Unlike virtual DOM frameworks, Solid compiles templates to real DOM nodes and updates them with fine-grained reactions.\n\n## Core Principles\n\n1. **Components run once** — Component functions execute only during initialization, not on every update\n2. **Fine-grained reactivity** — Only the specific DOM nodes that depend on changed data update\n3. **No virtual DOM** — Direct DOM manipulation via compiled templates\n4. **Signals are functions** — Access values by calling: `count()` not `count`\n\n## Reactivity Primitives\n\n### Signals — Basic State\n\n```tsx\nimport { createSignal } from 'solid-js';\n\nconst [count, setCount] = createSignal(0);\n\n\u002F\u002F Read value (getter)\nconsole.log(count()); \u002F\u002F 0\n\n\u002F\u002F Update value (setter)\nsetCount(1);\nsetCount((prev) => prev + 1); \u002F\u002F Functional update\n```\n\n**Options:**\n\n```tsx\nconst [value, setValue] = createSignal(initialValue, {\n    equals: false, \u002F\u002F Always trigger updates, even if value unchanged\n    name: 'debugName', \u002F\u002F For devtools\n});\n```\n\n### Effects — Side Effects\n\n```tsx\nimport { createEffect } from 'solid-js';\n\ncreateEffect(() => {\n    console.log('Count changed:', count());\n    \u002F\u002F Runs after render, re-runs when dependencies change\n});\n```\n\n**Key behaviors:**\n\n- Initial run: after render, before browser paint\n- Subsequent runs: when tracked dependencies change\n- Never runs during SSR or hydration\n- Use `onCleanup` for cleanup logic\n\n### Memos — Derived\u002FCached Values\n\n```tsx\nimport { createMemo } from 'solid-js';\n\nconst doubled = createMemo(() => count() * 2);\n\n\u002F\u002F Access like signal\nconsole.log(doubled()); \u002F\u002F Cached, only recalculates when count changes\n```\n\nUse memos when:\n\n- Derived value is expensive to compute\n- Derived value is accessed multiple times\n- You want to prevent downstream updates when result unchanged\n\n### Resources — Async Data\n\n```tsx\nimport { createResource } from 'solid-js';\n\nconst [user, { mutate, refetch }] = createResource(userId, fetchUser);\n\n\u002F\u002F In JSX\n\u003CShow when={!user.loading} fallback={\u003CLoading \u002F>}>\n    \u003Cdiv>{user()?.name}\u003C\u002Fdiv>\n\u003C\u002FShow>;\n\n\u002F\u002F Resource properties\nuser.loading; \u002F\u002F boolean\nuser.error; \u002F\u002F error if failed\nuser.state; \u002F\u002F \"unresolved\" | \"pending\" | \"ready\" | \"refreshing\" | \"errored\"\nuser.latest; \u002F\u002F last successful value\n```\n\n## Stores — Complex State\n\nFor nested objects\u002Farrays with fine-grained updates:\n\n```tsx\nimport { createStore } from 'solid-js\u002Fstore';\n\nconst [state, setState] = createStore({\n    user: { name: 'John', age: 30 },\n    todos: [],\n});\n\n\u002F\u002F Path syntax updates\nsetState('user', 'name', 'Jane');\nsetState('todos', (todos) => [...todos, newTodo]);\nsetState('todos', 0, 'completed', true);\n\n\u002F\u002F Produce for immer-like updates\nimport { produce } from 'solid-js\u002Fstore';\nsetState(\n    produce((s) => {\n        s.user.age++;\n        s.todos.push(newTodo);\n    }),\n);\n```\n\n**Store utilities:**\n\n- `produce` — Immer-like mutations\n- `reconcile` — Diff and patch data (for API responses)\n- `unwrap` — Get raw non-reactive object\n\n## Components\n\n### Basic Component\n\n```tsx\nimport { Component } from 'solid-js';\n\nconst MyComponent: Component\u003C{ name: string }> = (props) => {\n    return \u003Cdiv>Hello, {props.name}\u003C\u002Fdiv>;\n};\n```\n\n### Props Handling\n\n```tsx\nimport { splitProps, mergeProps } from 'solid-js';\n\n\u002F\u002F Default props\nconst merged = mergeProps({ size: 'medium' }, props);\n\n\u002F\u002F Split props (for spreading)\nconst [local, others] = splitProps(props, ['class', 'onClick']);\nreturn \u003Cbutton class={local.class} {...others} \u002F>;\n```\n\n**Props rules:**\n\n- Props are reactive getters — don't destructure at top level\n- Use `props.value` in JSX, not `const { value } = props`\n\n### Children Helper\n\n```tsx\nimport { children } from 'solid-js';\n\nconst Wrapper: Component = (props) => {\n    const resolved = children(() => props.children);\n\n    createEffect(() => {\n        console.log('Children:', resolved());\n    });\n\n    return \u003Cdiv>{resolved()}\u003C\u002Fdiv>;\n};\n```\n\n## Control Flow Components\n\n### Show — Conditional Rendering\n\n```tsx\nimport { Show } from 'solid-js';\n\n\u003CShow when={user()} fallback={\u003CLogin \u002F>}>\n    {(user) => \u003CProfile user={user()} \u002F>}\n\u003C\u002FShow>;\n```\n\n### For — List Rendering (keyed by reference)\n\n```tsx\nimport { For } from 'solid-js';\n\n\u003CFor each={items()} fallback={\u003CEmpty \u002F>}>\n    {(item, index) => (\n        \u003Cdiv>\n            {index()}: {item.name}\n        \u003C\u002Fdiv>\n    )}\n\u003C\u002FFor>;\n```\n\n**Note:** `index` is a signal, `item` is the value.\n\n### Index — List Rendering (keyed by index)\n\n```tsx\nimport { Index } from 'solid-js';\n\n\u003CIndex each={items()}>{(item, index) => \u003Cinput value={item().text} \u002F>}\u003C\u002FIndex>;\n```\n\n**Note:** `item` is a signal, `index` is the value. Better for primitive arrays or inputs.\n\n### Switch\u002FMatch — Multiple Conditions\n\n```tsx\nimport { Switch, Match } from 'solid-js';\n\n\u003CSwitch fallback={\u003CDefault \u002F>}>\n    \u003CMatch when={state() === 'loading'}>\n        \u003CLoading \u002F>\n    \u003C\u002FMatch>\n    \u003CMatch when={state() === 'error'}>\n        \u003CError \u002F>\n    \u003C\u002FMatch>\n    \u003CMatch when={state() === 'success'}>\n        \u003CSuccess \u002F>\n    \u003C\u002FMatch>\n\u003C\u002FSwitch>;\n```\n\n### Dynamic — Dynamic Component\n\n```tsx\nimport { Dynamic } from 'solid-js\u002Fweb';\n\n\u003CDynamic component={selected()} someProp=\"value\" \u002F>;\n```\n\n### Portal — Render Outside DOM Hierarchy\n\n```tsx\nimport { Portal } from 'solid-js\u002Fweb';\n\n\u003CPortal mount={document.body}>\n    \u003CModal \u002F>\n\u003C\u002FPortal>;\n```\n\n### ErrorBoundary — Error Handling\n\n```tsx\nimport { ErrorBoundary } from 'solid-js';\n\n\u003CErrorBoundary\n    fallback={(err, reset) => (\n        \u003Cdiv>\n            Error: {err.message}\n            \u003Cbutton onClick={reset}>Retry\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n    )}\n>\n    \u003CRiskyComponent \u002F>\n\u003C\u002FErrorBoundary>;\n```\n\n### Suspense — Async Loading\n\n```tsx\nimport { Suspense } from 'solid-js';\n\n\u003CSuspense fallback={\u003CLoading \u002F>}>\n    \u003CAsyncComponent \u002F>\n\u003C\u002FSuspense>;\n```\n\n## Context API\n\n```tsx\nimport { createContext, useContext } from 'solid-js';\n\n\u002F\u002F Create context\nconst CounterContext = createContext\u003C{\n    count: () => number;\n    increment: () => void;\n}>();\n\n\u002F\u002F Provider component\nexport function CounterProvider(props) {\n    const [count, setCount] = createSignal(0);\n\n    return (\n        \u003CCounterContext.Provider\n            value={{\n                count,\n                increment: () => setCount((c) => c + 1),\n            }}\n        >\n            {props.children}\n        \u003C\u002FCounterContext.Provider>\n    );\n}\n\n\u002F\u002F Consumer hook\nexport function useCounter() {\n    const ctx = useContext(CounterContext);\n    if (!ctx) throw new Error('useCounter must be used within CounterProvider');\n    return ctx;\n}\n```\n\n## Lifecycle\n\n```tsx\nimport { onMount, onCleanup } from 'solid-js';\n\nfunction MyComponent() {\n    onMount(() => {\n        console.log('Mounted');\n        const handler = () => {};\n        window.addEventListener('resize', handler);\n\n        onCleanup(() => {\n            window.removeEventListener('resize', handler);\n        });\n    });\n\n    return \u003Cdiv>Content\u003C\u002Fdiv>;\n}\n```\n\n## Refs\n\n```tsx\nlet inputRef: HTMLInputElement;\n\n\u003Cinput ref={inputRef} \u002F>\n\u003Cinput ref={(el) => { \u002F* el is the DOM element *\u002F }} \u002F>\n```\n\n## Event Handling\n\n```tsx\n\u002F\u002F Standard events (lowercase)\n\u003Cbutton onClick={handleClick}>Click\u003C\u002Fbutton>\n\u003Cbutton onClick={(e) => handleClick(e)}>Click\u003C\u002Fbutton>\n\n\u002F\u002F Delegated events (on:)\n\u003Cinput on:input={handleInput} \u002F>\n\n\u002F\u002F Native events (on:) - not delegated\n\u003Cdiv on:scroll={handleScroll} \u002F>\n```\n\n## Routing (Solid Router)\n\nSee [references\u002Frouting.md](references\u002Frouting.md) for complete routing guide.\n\nQuick setup:\n\n```tsx\nimport { Router, Route } from '@solidjs\u002Frouter';\n\n\u003CRouter>\n    \u003CRoute path=\"\u002F\" component={Home} \u002F>\n    \u003CRoute path=\"\u002Fusers\u002F:id\" component={User} \u002F>\n    \u003CRoute path=\"*404\" component={NotFound} \u002F>\n\u003C\u002FRouter>;\n```\n\n## SolidStart\n\nSee [references\u002Fsolidstart.md](references\u002Fsolidstart.md) for full-stack development guide.\n\nQuick setup:\n\n```bash\nnpm create solid@latest my-app\ncd my-app && npm install && npm run dev\n```\n\n## Common Patterns\n\n### Conditional Classes\n\n```tsx\nimport { clsx } from \"clsx\"; \u002F\u002F or classList\n\n\u003Cdiv class={clsx(\"base\", { active: isActive() })} \u002F>\n\u003Cdiv classList={{ active: isActive(), disabled: isDisabled() }} \u002F>\n```\n\n### Batch Updates\n\n```tsx\nimport { batch } from 'solid-js';\n\nbatch(() => {\n    setName('John');\n    setAge(30);\n    \u002F\u002F Effects run once after batch completes\n});\n```\n\n### Untrack\n\n```tsx\nimport { untrack } from 'solid-js';\n\ncreateEffect(() => {\n    console.log(count()); \u002F\u002F tracked\n    console.log(untrack(() => other())); \u002F\u002F not tracked\n});\n```\n\n## TypeScript\n\n```tsx\nimport type { Component, ParentComponent, JSX } from 'solid-js';\n\n\u002F\u002F Basic component\nconst Button: Component\u003C{ label: string }> = (props) => \u003Cbutton>{props.label}\u003C\u002Fbutton>;\n\n\u002F\u002F With children\nconst Layout: ParentComponent\u003C{ title: string }> = (props) => (\n    \u003Cdiv>\n        \u003Ch1>{props.title}\u003C\u002Fh1>\n        {props.children}\n    \u003C\u002Fdiv>\n);\n\n\u002F\u002F Event handler types\nconst handleClick: JSX.EventHandler\u003CHTMLButtonElement, MouseEvent> = (e) => {\n    console.log(e.currentTarget);\n};\n```\n\n## Project Setup\n\n```bash\n# Create new project\nnpm create solid@latest my-app\n\n# With template\nnpx degit solidjs\u002Ftemplates\u002Fts my-app\n\n# SolidStart\nnpm create solid@latest my-app -- --template solidstart\n```\n\n**vite.config.ts:**\n\n```ts\nimport { defineConfig } from 'vite';\nimport solid from 'vite-plugin-solid';\n\nexport default defineConfig({\n    plugins: [solid()],\n});\n```\n\n## Anti-Patterns to Avoid\n\n1. **Destructuring props** — Breaks reactivity\n\n    ```tsx\n    \u002F\u002F ❌ Bad\n    const { name } = props;\n\n    \u002F\u002F ✅ Good\n    props.name;\n    ```\n\n2. **Accessing signals outside tracking scope**\n\n    ```tsx\n    \u002F\u002F ❌ Won't update\n    console.log(count());\n\n    \u002F\u002F ✅ Will update\n    createEffect(() => console.log(count()));\n    ```\n\n3. **Forgetting to call signal getters**\n\n    ```tsx\n    \u002F\u002F ❌ Passes the function\n    \u003Cdiv>{count}\u003C\u002Fdiv>\n\n    \u002F\u002F ✅ Passes the value\n    \u003Cdiv>{count()}\u003C\u002Fdiv>\n    ```\n\n4. **Using array index as key** — Use `\u003CFor>` for reference-keyed, `\u003CIndex>` for index-keyed\n\n5. **Side effects during render** — Use `createEffect` or `onMount`\n","# SolidJS Development\n\nSolidJS is a declarative JavaScript library for building user interfaces with fine-grained reactivity. Unlike virtual DOM frameworks, Solid compiles templates to real DOM nodes and updates them with fine-grained reactions.\n\n## Core Principles\n\n1. **Components run once** — Component functions execute only during initialization, not on every update\n2. **Fine-grained reactivity** — Only the specific DOM nodes that depend on changed data update\n3. **No virtual DOM** — Direct DOM manipulation via compiled templates\n4. **Signals are functions** — Access values by calling: `count()` not `count`\n\n## Reactivity Primitives\n\n### Signals — Basic State\n\n```tsx\nimport { createSignal } from 'solid-js';\n\nconst [count, setCount] = createSignal(0);\n\n\u002F\u002F Read value (getter)\nconsole.log(count()); \u002F\u002F 0\n\n\u002F\u002F Update value (setter)\nsetCount(1);\nsetCount((prev) => prev + 1); \u002F\u002F Functional update\n```\n\n**Options:**\n\n```tsx\nconst [value, setValue] = createSignal(initialValue, {\n    equals: false, \u002F\u002F Always trigger updates, even if value unchanged\n    name: 'debugName', \u002F\u002F For devtools\n});\n```\n\n### Effects — Side Effects\n\n```tsx\nimport { createEffect } from 'solid-js';\n\ncreateEffect(() => {\n    console.log('Count changed:', count());\n    \u002F\u002F Runs after render, re-runs when dependencies change\n});\n```\n\n**Key behaviors:**\n\n- Initial run: after render, before browser paint\n- Subsequent runs: when tracked dependencies change\n- Never runs during SSR or hydration\n- Use `onCleanup` for cleanup logic\n\n### Memos — Derived\u002FCached Values\n\n```tsx\nimport { createMemo } from 'solid-js';\n\nconst doubled = createMemo(() => count() * 2);\n\n\u002F\u002F Access like signal\nconsole.log(doubled()); \u002F\u002F Cached, only recalculates when count changes\n```\n\nUse memos when:\n\n- Derived value is expensive to compute\n- Derived value is accessed multiple times\n- You want to prevent downstream updates when result unchanged\n\n### Resources — Async Data\n\n```tsx\nimport { createResource } from 'solid-js';\n\nconst [user, { mutate, refetch }] = createResource(userId, fetchUser);\n\n\u002F\u002F In JSX\n\u003CShow when={!user.loading} fallback={\u003CLoading \u002F>}>\n    \u003Cdiv>{user()?.name}\u003C\u002Fdiv>\n\u003C\u002FShow>;\n\n\u002F\u002F Resource properties\nuser.loading; \u002F\u002F boolean\nuser.error; \u002F\u002F error if failed\nuser.state; \u002F\u002F \"unresolved\" | \"pending\" | \"ready\" | \"refreshing\" | \"errored\"\nuser.latest; \u002F\u002F last successful value\n```\n\n## Stores — Complex State\n\nFor nested objects\u002Farrays with fine-grained updates:\n\n```tsx\nimport { createStore } from 'solid-js\u002Fstore';\n\nconst [state, setState] = createStore({\n    user: { name: 'John', age: 30 },\n    todos: [],\n});\n\n\u002F\u002F Path syntax updates\nsetState('user', 'name', 'Jane');\nsetState('todos', (todos) => [...todos, newTodo]);\nsetState('todos', 0, 'completed', true);\n\n\u002F\u002F Produce for immer-like updates\nimport { produce } from 'solid-js\u002Fstore';\nsetState(\n    produce((s) => {\n        s.user.age++;\n        s.todos.push(newTodo);\n    }),\n);\n```\n\n**Store utilities:**\n\n- `produce` — Immer-like mutations\n- `reconcile` — Diff and patch data (for API responses)\n- `unwrap` — Get raw non-reactive object\n\n## Components\n\n### Basic Component\n\n```tsx\nimport { Component } from 'solid-js';\n\nconst MyComponent: Component\u003C{ name: string }> = (props) => {\n    return \u003Cdiv>Hello, {props.name}\u003C\u002Fdiv>;\n};\n```\n\n### Props Handling\n\n```tsx\nimport { splitProps, mergeProps } from 'solid-js';\n\n\u002F\u002F Default props\nconst merged = mergeProps({ size: 'medium' }, props);\n\n\u002F\u002F Split props (for spreading)\nconst [local, others] = splitProps(props, ['class', 'onClick']);\nreturn \u003Cbutton class={local.class} {...others} \u002F>;\n```\n\n**Props rules:**\n\n- Props are reactive getters — don't destructure at top level\n- Use `props.value` in JSX, not `const { value } = props`\n\n### Children Helper\n\n```tsx\nimport { children } from 'solid-js';\n\nconst Wrapper: Component = (props) => {\n    const resolved = children(() => props.children);\n\n    createEffect(() => {\n        console.log('Children:', resolved());\n    });\n\n    return \u003Cdiv>{resolved()}\u003C\u002Fdiv>;\n};\n```\n\n## Control Flow Components\n\n### Show — Conditional Rendering\n\n```tsx\nimport { Show } from 'solid-js';\n\n\u003CShow when={user()} fallback={\u003CLogin \u002F>}>\n    {(user) => \u003CProfile user={user()} \u002F>}\n\u003C\u002FShow>;\n```\n\n### For — List Rendering (keyed by reference)\n\n```tsx\nimport { For } from 'solid-js';\n\n\u003CFor each={items()} fallback={\u003CEmpty \u002F>}>\n    {(item, index) => (\n        \u003Cdiv>\n            {index()}: {item.name}\n        \u003C\u002Fdiv>\n    )}\n\u003C\u002FFor>;\n```\n\n**Note:** `index` is a signal, `item` is the value.\n\n### Index — List Rendering (keyed by index)\n\n```tsx\nimport { Index } from 'solid-js';\n\n\u003CIndex each={items()}>{(item, index) => \u003Cinput value={item().text} \u002F>}\u003C\u002FIndex>;\n```\n\n**Note:** `item` is a signal, `index` is the value. Better for primitive arrays or inputs.\n\n### Switch\u002FMatch — Multiple Conditions\n\n```tsx\nimport { Switch, Match } from 'solid-js';\n\n\u003CSwitch fallback={\u003CDefault \u002F>}>\n    \u003CMatch when={state() === 'loading'}>\n        \u003CLoading \u002F>\n    \u003C\u002FMatch>\n    \u003CMatch when={state() === 'error'}>\n        \u003CError \u002F>\n    \u003C\u002FMatch>\n    \u003CMatch when={state() === 'success'}>\n        \u003CSuccess \u002F>\n    \u003C\u002FMatch>\n\u003C\u002FSwitch>;\n```\n\n### Dynamic — Dynamic Component\n\n```tsx\nimport { Dynamic } from 'solid-js\u002Fweb';\n\n\u003CDynamic component={selected()} someProp=\"value\" \u002F>;\n```\n\n### Portal — Render Outside DOM Hierarchy\n\n```tsx\nimport { Portal } from 'solid-js\u002Fweb';\n\n\u003CPortal mount={document.body}>\n    \u003CModal \u002F>\n\u003C\u002FPortal>;\n```\n\n### ErrorBoundary — Error Handling\n\n```tsx\nimport { ErrorBoundary } from 'solid-js';\n\n\u003CErrorBoundary\n    fallback={(err, reset) => (\n        \u003Cdiv>\n            Error: {err.message}\n            \u003Cbutton onClick={reset}>Retry\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n    )}\n>\n    \u003CRiskyComponent \u002F>\n\u003C\u002FErrorBoundary>;\n```\n\n### Suspense — Async Loading\n\n```tsx\nimport { Suspense } from 'solid-js';\n\n\u003CSuspense fallback={\u003CLoading \u002F>}>\n    \u003CAsyncComponent \u002F>\n\u003C\u002FSuspense>;\n```\n\n## Context API\n\n```tsx\nimport { createContext, useContext } from 'solid-js';\n\n\u002F\u002F Create context\nconst CounterContext = createContext\u003C{\n    count: () => number;\n    increment: () => void;\n}>();\n\n\u002F\u002F Provider component\nexport function CounterProvider(props) {\n    const [count, setCount] = createSignal(0);\n\n    return (\n        \u003CCounterContext.Provider\n            value={{\n                count,\n                increment: () => setCount((c) => c + 1),\n            }}\n        >\n            {props.children}\n        \u003C\u002FCounterContext.Provider>\n    );\n}\n\n\u002F\u002F Consumer hook\nexport function useCounter() {\n    const ctx = useContext(CounterContext);\n    if (!ctx) throw new Error('useCounter must be used within CounterProvider');\n    return ctx;\n}\n```\n\n## Lifecycle\n\n```tsx\nimport { onMount, onCleanup } from 'solid-js';\n\nfunction MyComponent() {\n    onMount(() => {\n        console.log('Mounted');\n        const handler = () => {};\n        window.addEventListener('resize', handler);\n\n        onCleanup(() => {\n            window.removeEventListener('resize', handler);\n        });\n    });\n\n    return \u003Cdiv>Content\u003C\u002Fdiv>;\n}\n```\n\n## Refs\n\n```tsx\nlet inputRef: HTMLInputElement;\n\n\u003Cinput ref={inputRef} \u002F>\n\u003Cinput ref={(el) => { \u002F* el is the DOM element *\u002F }} \u002F>\n```\n\n## Event Handling\n\n```tsx\n\u002F\u002F Standard events (lowercase)\n\u003Cbutton onClick={handleClick}>Click\u003C\u002Fbutton>\n\u003Cbutton onClick={(e) => handleClick(e)}>Click\u003C\u002Fbutton>\n\n\u002F\u002F Delegated events (on:)\n\u003Cinput on:input={handleInput} \u002F>\n\n\u002F\u002F Native events (on:) - not delegated\n\u003Cdiv on:scroll={handleScroll} \u002F>\n```\n\n## Routing (Solid Router)\n\nSee [references\u002Frouting.md](references\u002Frouting.md) for complete routing guide.\n\nQuick setup:\n\n```tsx\nimport { Router, Route } from '@solidjs\u002Frouter';\n\n\u003CRouter>\n    \u003CRoute path=\"\u002F\" component={Home} \u002F>\n    \u003CRoute path=\"\u002Fusers\u002F:id\" component={User} \u002F>\n    \u003CRoute path=\"*404\" component={NotFound} \u002F>\n\u003C\u002FRouter>;\n```\n\n## SolidStart\n\nSee [references\u002Fsolidstart.md](references\u002Fsolidstart.md) for full-stack development guide.\n\nQuick setup:\n\n```bash\nnpm create solid@latest my-app\ncd my-app && npm install && npm run dev\n```\n\n## Common Patterns\n\n### Conditional Classes\n\n```tsx\nimport { clsx } from \"clsx\"; \u002F\u002F or classList\n\n\u003Cdiv class={clsx(\"base\", { active: isActive() })} \u002F>\n\u003Cdiv classList={{ active: isActive(), disabled: isDisabled() }} \u002F>\n```\n\n### Batch Updates\n\n```tsx\nimport { batch } from 'solid-js';\n\nbatch(() => {\n    setName('John');\n    setAge(30);\n    \u002F\u002F Effects run once after batch completes\n});\n```\n\n### Untrack\n\n```tsx\nimport { untrack } from 'solid-js';\n\ncreateEffect(() => {\n    console.log(count()); \u002F\u002F tracked\n    console.log(untrack(() => other())); \u002F\u002F not tracked\n});\n```\n\n## TypeScript\n\n```tsx\nimport type { Component, ParentComponent, JSX } from 'solid-js';\n\n\u002F\u002F Basic component\nconst Button: Component\u003C{ label: string }> = (props) => \u003Cbutton>{props.label}\u003C\u002Fbutton>;\n\n\u002F\u002F With children\nconst Layout: ParentComponent\u003C{ title: string }> = (props) => (\n    \u003Cdiv>\n        \u003Ch1>{props.title}\u003C\u002Fh1>\n        {props.children}\n    \u003C\u002Fdiv>\n);\n\n\u002F\u002F Event handler types\nconst handleClick: JSX.EventHandler\u003CHTMLButtonElement, MouseEvent> = (e) => {\n    console.log(e.currentTarget);\n};\n```\n\n## Project Setup\n\n```bash\n# Create new project\nnpm create solid@latest my-app\n\n# With template\nnpx degit solidjs\u002Ftemplates\u002Fts my-app\n\n# SolidStart\nnpm create solid@latest my-app -- --template solidstart\n```\n\n**vite.config.ts:**\n\n```ts\nimport { defineConfig } from 'vite';\nimport solid from 'vite-plugin-solid';\n\nexport default defineConfig({\n    plugins: [solid()],\n});\n```\n\n## Anti-Patterns to Avoid\n\n1. **Destructuring props** — Breaks reactivity\n\n    ```tsx\n    \u002F\u002F ❌ Bad\n    const { name } = props;\n\n    \u002F\u002F ✅ Good\n    props.name;\n    ```\n\n2. **Accessing signals outside tracking scope**\n\n    ```tsx\n    \u002F\u002F ❌ Won't update\n    console.log(count());\n\n    \u002F\u002F ✅ Will update\n    createEffect(() => console.log(count()));\n    ```\n\n3. **Forgetting to call signal getters**\n\n    ```tsx\n    \u002F\u002F ❌ Passes the function\n    \u003Cdiv>{count}\u003C\u002Fdiv>\n\n    \u002F\u002F ✅ Passes the value\n    \u003Cdiv>{count()}\u003C\u002Fdiv>\n    ```\n\n4. **Using array index as key** — Use `\u003CFor>` for reference-keyed, `\u003CIndex>` for index-keyed\n\n5. **Side effects during render** — Use `createEffect` or `onMount`\n",{"name":5,"description":7},"master","c73386b305dec167db7654e0e6feacb462d4f9dc","assets\u002Fskills\u002Fdev\u002Fsolidjs",1,"https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code","https:\u002F\u002Fgithub.com\u002FAntifragileTech","2026-10-02 14:22:14",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add AntifragileTech\u002Fantifragile-claude-code --skill solidjs",{"tool":60,"command":61},"bunx","bunx skills add AntifragileTech\u002Fantifragile-claude-code --skill solidjs",{"tool":63,"command":64},"pnpm","pnpm dlx skills add AntifragileTech\u002Fantifragile-claude-code --skill solidjs","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fdev\u002Fsolidjs\u002FSKILL.md",true,[68,74,78,84,88,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"cli.py","SCRIPT","脚本",20803,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002Fcli.py",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"iterative_train.py",24876,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002Fiterative_train.py",{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"pyproject.toml","OTHER","其他",1071,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002Fpyproject.toml",{"path":85,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":86,"sourceHtmlUrl":87},"qwen3_infer_simple.py",1865,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002Fqwen3_infer_simple.py",{"path":89,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":92,"sourceHtmlUrl":93},"Qwen3-TTS\u002F.github\u002FISSUE_TEMPLATE\u002Fbug_report.yml","REFERENCE","参考文档",3553,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002F.github\u002FISSUE_TEMPLATE\u002Fbug_report.yml",{"path":95,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":96,"sourceHtmlUrl":97},"Qwen3-TTS\u002F.github\u002FISSUE_TEMPLATE\u002Fconfig.yml",521,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002F.github\u002FISSUE_TEMPLATE\u002Fconfig.yml",{"path":99,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":100,"sourceHtmlUrl":101},"Qwen3-TTS\u002F.github\u002Fworkflows\u002Finactive.yaml",1461,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002F.github\u002Fworkflows\u002Finactive.yaml",{"path":103,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":104,"sourceHtmlUrl":105},"Qwen3-TTS\u002F.github\u002Fworkflows\u002Ftranslate.yaml",575,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002F.github\u002Fworkflows\u002Ftranslate.yaml",{"path":107,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":108,"sourceHtmlUrl":109},"Qwen3-TTS\u002Fexamples\u002Ftest_model_12hz_base.py",6427,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fexamples\u002Ftest_model_12hz_base.py",{"path":111,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":112,"sourceHtmlUrl":113},"Qwen3-TTS\u002Fexamples\u002Ftest_model_12hz_custom_voice.py",2275,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fexamples\u002Ftest_model_12hz_custom_voice.py",{"path":115,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":116,"sourceHtmlUrl":117},"Qwen3-TTS\u002Fexamples\u002Ftest_model_12hz_voice_design.py",2546,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fexamples\u002Ftest_model_12hz_voice_design.py",{"path":119,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":120,"sourceHtmlUrl":121},"Qwen3-TTS\u002Fexamples\u002Ftest_tokenizer_12hz.py",2677,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fexamples\u002Ftest_tokenizer_12hz.py",{"path":123,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":124,"sourceHtmlUrl":125},"Qwen3-TTS\u002Ffinetuning\u002Fdataset.py",9044,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Ffinetuning\u002Fdataset.py",{"path":127,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":128,"sourceHtmlUrl":129},"Qwen3-TTS\u002Ffinetuning\u002Fprepare_data.py",2262,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Ffinetuning\u002Fprepare_data.py",{"path":131,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":132,"sourceHtmlUrl":133},"Qwen3-TTS\u002Ffinetuning\u002FREADME.md",3163,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Ffinetuning\u002FREADME.md",{"path":135,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":136,"sourceHtmlUrl":137},"Qwen3-TTS\u002Ffinetuning\u002Fsft_12hz.py",7795,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Ffinetuning\u002Fsft_12hz.py",{"path":139,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":140,"sourceHtmlUrl":141},"Qwen3-TTS\u002Fpyproject.toml",1099,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fpyproject.toml",{"path":143,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":144,"sourceHtmlUrl":145},"Qwen3-TTS\u002Fqwen_tts\u002F__init__.py",839,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002F__init__.py",{"path":147,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":148,"sourceHtmlUrl":149},"Qwen3-TTS\u002Fqwen_tts\u002F__main__.py",800,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002F__main__.py",{"path":151,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":152,"sourceHtmlUrl":153},"Qwen3-TTS\u002Fqwen_tts\u002Fcli\u002Fdemo.py",29160,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Fcli\u002Fdemo.py",{"path":155,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":156,"sourceHtmlUrl":157},"Qwen3-TTS\u002Fqwen_tts\u002Fcore\u002F__init__.py",990,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Fcore\u002F__init__.py",{"path":159,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":160,"sourceHtmlUrl":161},"Qwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_12hz\u002Fconfiguration_qwen3_tts_tokenizer_v2.py",7946,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_12hz\u002Fconfiguration_qwen3_tts_tokenizer_v2.py",{"path":163,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":164,"sourceHtmlUrl":165},"Qwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_12hz\u002Fmodeling_qwen3_tts_tokenizer_v2.py",40521,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_12hz\u002Fmodeling_qwen3_tts_tokenizer_v2.py",{"path":167,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":168,"sourceHtmlUrl":169},"Qwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_25hz\u002Fconfiguration_qwen3_tts_tokenizer_v1.py",14494,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_25hz\u002Fconfiguration_qwen3_tts_tokenizer_v1.py",{"path":171,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":172,"sourceHtmlUrl":173},"Qwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_25hz\u002Fmodeling_qwen3_tts_tokenizer_v1.py",56472,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_25hz\u002Fmodeling_qwen3_tts_tokenizer_v1.py",{"path":175,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":176,"sourceHtmlUrl":177},"Qwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_25hz\u002Fvq\u002Fcore_vq.py",20074,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_25hz\u002Fvq\u002Fcore_vq.py",{"path":179,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":180,"sourceHtmlUrl":181},"Qwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_25hz\u002Fvq\u002Fspeech_vq.py",14833,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_25hz\u002Fvq\u002Fspeech_vq.py",{"path":183,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":184,"sourceHtmlUrl":185},"Qwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_25hz\u002Fvq\u002Fwhisper_encoder.py",14351,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Fcore\u002Ftokenizer_25hz\u002Fvq\u002Fwhisper_encoder.py",{"path":187,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":188,"sourceHtmlUrl":189},"Qwen3-TTS\u002Fqwen_tts\u002Finference\u002Fqwen3_tts_model.py",37121,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Finference\u002Fqwen3_tts_model.py",{"path":191,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":192,"sourceHtmlUrl":193},"Qwen3-TTS\u002Fqwen_tts\u002Finference\u002Fqwen3_tts_tokenizer.py",15698,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002Fqwen_tts\u002Finference\u002Fqwen3_tts_tokenizer.py",{"path":195,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":196,"sourceHtmlUrl":197},"Qwen3-TTS\u002FREADME.md",60341,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002FQwen3-TTS\u002FREADME.md",{"path":199,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":200,"sourceHtmlUrl":201},"references\u002Fapi_reference.md",13958,"https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fdev\u002Fsolidjs\u002Freferences\u002Fapi_reference.md",{"path":203,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":204,"sourceHtmlUrl":205},"references\u002Fpatterns.md",17584,"https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fdev\u002Fsolidjs\u002Freferences\u002Fpatterns.md",{"path":207,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":208,"sourceHtmlUrl":209},"references\u002Frouting.md",7875,"https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fdev\u002Fsolidjs\u002Freferences\u002Frouting.md",{"path":211,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":212,"sourceHtmlUrl":213},"references\u002Fsolidstart.md",11577,"https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fdev\u002Fsolidjs\u002Freferences\u002Fsolidstart.md",{"path":215,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":216,"sourceHtmlUrl":217},"run.sh",4149,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002Frun.sh",{"path":219,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":220,"sourceHtmlUrl":221},"sanity.sh",1423,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002Fsanity.sh",{"path":223,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":224,"sourceHtmlUrl":225},"tune_qwen3_1.7b_bayesian_fixed.py",22326,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002Ftune_qwen3_1.7b_bayesian_fixed.py",{"path":227,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":228,"sourceHtmlUrl":229},"tune_qwen3_1.7b_bayesian.py",15248,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002Ftune_qwen3_1.7b_bayesian.py",{"path":231,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":232,"sourceHtmlUrl":233},"tune_qwen3_bayesian.py",8186,"https:\u002F\u002Fgithub.com\u002Fcateyephotos\u002Fagent-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftts-train\u002Ftune_qwen3_bayesian.py",[235,259,274,289,302,315],{"skillNo":236,"name":237,"nameZh":6,"description":238,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":239,"categories":240,"keywords":252,"publishedAt":42},"01M6DT9Q6VYA615SCXR757TZZ7","writing-skills","Use when creating new skills, editing existing skills, or verifying skills work before deployment","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwriting-skills\u002FSKILL.md",[241,244,247],{"categoryNo":242,"categoryName":243,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":245,"categoryName":246,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":248,"categoryName":249,"taxonomyType":250,"taxonomyTypeDesc":251},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[253,254,255,256,257,258],"writing skills","writing","use","editing","work","deployment",{"skillNo":260,"name":261,"nameZh":6,"description":262,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":263,"categories":264,"keywords":267,"publishedAt":42},"01M6DT9GFHDNY90P41WGAE1TV0","writing-plans","Use when you have a spec or requirements for a multi-step task, before touching code","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwriting-plans\u002FSKILL.md",[265,266],{"categoryNo":245,"categoryName":246,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":248,"categoryName":249,"taxonomyType":250,"taxonomyTypeDesc":251},[268,269,254,270,271,255,272,273],"plans","writing plans","requirements","task","code","spec",{"skillNo":275,"name":276,"nameZh":6,"description":277,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":278,"categories":279,"keywords":282,"publishedAt":42},"01M6DT9C6PFGD86WS3HY7YE3XG","docs:write-concisely","Apply writing rules to any documentation that humans will read. Makes your writing clearer, stronger, and more professional.","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwrite-concisely\u002FSKILL.md",[280,281],{"categoryNo":245,"categoryName":246,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":248,"categoryName":249,"taxonomyType":250,"taxonomyTypeDesc":251},[283,284,285,286,287,288,254],"docs:write concisely","write","docs","read","Rules","documentation",{"skillNo":290,"name":291,"nameZh":6,"description":292,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":293,"categories":294,"keywords":295,"publishedAt":42},"01M6DT98AWQ27P0N1CG97WAG66","kaizen:why","Iterative Five Whys root cause analysis drilling from symptoms to fundamentals","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwhy\u002FSKILL.md",[],[291,296,297,298,299,300,301],"why","kaizen","issue","five whys","analysis","root cause analysis",{"skillNo":303,"name":304,"nameZh":6,"description":305,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":306,"categories":307,"keywords":308,"publishedAt":42},"01M6DT93EH25NAX19R3WGE1P53","verification-loop","A comprehensive verification system for Claude Code sessions.","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fverification-loop\u002FSKILL.md",[],[309,310,311,312,272,313,314],"verification loop","verification","loop","sessions","claude code sessions","system",{"skillNo":316,"name":317,"nameZh":6,"description":318,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":319,"categories":320,"keywords":321,"publishedAt":42},"01M6DT90GW7Z7VCN98P9DVYSNC","verification-before-completion","Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fverification-before-completion\u002FSKILL.md",[],[322,310,323,257,255,324,325,326],"verification before completion","commands","evidence","claim","complete"]