[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M698SG0EP6J5A2R8T4K0PP9M":3,"skill-same:01M698SG0EP6J5A2R8T4K0PP9M":112},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"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":52,"ownerHtmlUrl":53,"ownerBlogUrl":52,"ownerDescription":54,"updatedAt":55,"install":56,"resources":69},"01M698SG0EP6J5A2R8T4K0PP9M","solid",null,"Write, refactor, review, or test Solid 2 UI in OpenClaw (Control UI, plugin views, Canvas hosts), including state ownership, native custom elements, overlays, testing, performance, and lessons learned.","openclaw\u002Fopenclaw","openclaw","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F252820863?v=4","01M698P3FSAZ6B4R928ZF19KPT","01M698PDMDRVH56MV30D253NFP",394452,"MIT","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[5,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,9],"ui","custom","lessons","overlays","hosts","lessons learned","native","learned","control","elements","write","testing","state","plugin","test","performance","control ui","canvas","review","2026-11-10 10:12:30",false,"---\nname: solid\ndescription: Write, refactor, review, or test Solid 2 UI in OpenClaw (Control UI, plugin views, Canvas hosts), including state ownership, native custom elements, overlays, testing, performance, and lessons learned.\n---\n\n# Solid 2 in OpenClaw\n\nThe Control UI and plugin views (`extensions\u002Fx`, `extensions\u002Fworkboard`) render with **Solid 2** (`solid-js`, `@solidjs\u002Fweb`, `@solidjs\u002Fsignals`, compiled by `@solidjs\u002Fvite-plugin`\u002F`@solidjs\u002Fcompiler`). Lit and Web Awesome are removed from these surfaces; new code is Solid only. The Canvas hosts also use Solid.\n\nRead [ui\u002FAGENTS.md](..\u002F..\u002F..\u002Fui\u002FAGENTS.md) first; its state-ownership rules apply to Solid unchanged. Use the exact installed Solid pins from the owning `package.json`: the runtime and compiler are `2.0.0-rc.18`, and `@solidjs\u002Fvite-plugin` is `3.0.0-next.51`. `@solidjs\u002Ftesting-library` remains `1.0.0-beta.3`. `solid-js` and `@solidjs\u002F*` are exempt from the repository's seven-day release-age gate (Peter, 2026-10-11). Peter also approved exact-version exceptions for `seroval@1.7.0` and `seroval-plugins@1.7.0` on 2026-10-24: rc.18 requires them for SSR\u002Fhydration serialization. Other third-party Solid ecosystem packages remain subject to the gate.\n\n## Rules that keep the UI correct\n\n**Before your first edit**, read the installed `ui\u002Fnode_modules\u002Fsolid-js\u002FCHEATSHEET.md`, especially its \"What changed from 1.x\" list. It is the rc.18 API contract, written as a guard against React and Solid 1 priors, the two dominant bug sources. For new code or a Solid audit, then read [idioms](references\u002Fidioms.md) and [lessons](references\u002Flessons.md); to refactor or review existing code, also use the [refactor checklist](references\u002Frefactor-checklist.md). Check `solid-js\u002Ftypes\u002Fclient\u002Fflow.d.ts` and the installed `@solidjs\u002Fsignals` \u002F `@solidjs\u002Fweb` types when choosing an API. rc.18 has no `createAsync`: asynchronous values are ordinary computations returning promises or async iterables. `createDeferred` explicitly permits stale answers during refetch; use it only when that lag is the intended presentation contract.\n\nFor async reads, mutations, keyed projections, lazy components, or coordinated loading, read the [async and action recipes](references\u002Fasync-and-actions.md). Cron is the worked reference: plain owners admit requests and writes; Solid presents their readiness and optimistic transitions.\n\nFor lists, derivations, copies, or anything on a hot path, read [performance](references\u002Fperformance.md).\n\n1. **Domain owners stay plain TypeScript.** The Gateway store, capabilities, `lib\u002Fsessions\u002F*`, caches, persistence, and mutation authority keep synchronous mutate-then-read semantics. Solid 2 writes become visible only after a microtask flush, so authoritative state never lives in a signal. → [state and ownership](references\u002Fstate-and-ownership.md)\n2. **Components consume projections** from `ui\u002Fsrc\u002Flib\u002Freactive\u002F` (one per owner and scope, never a second store) and `useApplication()` for the application context. Add a thin adapter only with its first production caller; subscribe to ordered events directly.\n3. **Host tags and classes survive.** A component renders its existing `openclaw-*` tag as a plain host element in light DOM; CSS and E2E select it. Never rename a tag or a class. → [components](references\u002Fcomponents.md)\n4. **One implementation per registered tag.** Solid-rendered native hosts share their renderer through `defineSolidBridge` in `ui\u002Fsrc\u002Flib\u002Fsolid-bridge.ts`; use its returned component in JSX. Specialized native hosts such as Tooltip keep their existing wrapper and lifecycle owner. → [components](references\u002Fcomponents.md)\n5. **One renderer per DOM region**, and one lifecycle owner per overlay surface. → [overlays](references\u002Foverlays.md)\n6. **Derive, don't synchronize.** `createMemo` before `createSignal`; no copies of owner state; no defensive guards for states the owner already excludes. Prefer smaller code with fewer owners.\n7. **Keep rendering controller lifecycles out.** Production Control UI rendering controllers and host-update contracts have been removed and are guarded. The [controller-to-Solid recipe](references\u002Fidioms.md#replace-rendering-controllers) explains the boundary for new integrations: plain domain owners retain authority; Solid owns presentation and lifecycle.\n\n## Component skeleton\n\nAn illustrative component (the tag is an example): it renders its host tag, reads an owner through a projection, and derives instead of copying state.\n\n```tsx\nimport { createMemo, Show } from \"solid-js\";\nimport { useApplication } from \"..\u002Flib\u002Freactive\u002Fcontext.ts\";\nimport { projectAgents } from \"..\u002Flib\u002Freactive\u002Fdomain-capabilities.ts\";\n\nexport function AgentCount(props: { compact?: boolean }) {\n  const app = useApplication();\n  \u002F\u002F Reads through to the synchronous owner; disposed with this component's owner.\n  const agents = projectAgents(app.agents);\n  \u002F\u002F Never destructure props: reads must stay reactive.\n  const count = createMemo(() => agents.read().agentsList?.agents.length ?? 0);\n  return (\n    \u003Copenclaw-agent-count class={[\"agent-count\", { \"agent-count--compact\": props.compact }]}>\n      \u003CShow when={count() > 0} fallback={\u003Cspan class=\"muted\">—\u003C\u002Fspan>}>\n        \u003Cspan>{count()}\u003C\u002Fspan>\n      \u003C\u002FShow>\n    \u003C\u002Fopenclaw-agent-count>\n  );\n}\n```\n\nUse `jsxImportSource: \"@solidjs\u002Fweb\"` and its JSX types, not Solid 1's `solid-js\u002Fweb`.\n\n## Traps that compile but break\n\n- `on:x`, `oncapture:`, `attr:x`, `bool:x`, `classList`, and `use:` are compile errors on native elements in rc.18. Spreads can still hide them from the compiler; keep the lint guard. `prop:` and XML namespaces remain supported.\n- Events are **camelCase** (`onClick`). Dashed custom events need the exact dash, such as `onSession-change`, or a `listen(...)` ref factory.\n- Native event bindings bind once: dispatch through a stable callback that reads the current handler prop. Runtime spreads, including dynamic elements, can update handlers.\n- A read right after a write sees the **old** value until `flush()`. Don't write-then-read in handlers; derive.\n- Reactive reads after the first `await` in an async memo are untracked, and async memos get no `AbortSignal`.\n- Ref callbacks run **unowned**: `onCleanup` inside them does nothing.\n- ARIA enumerations are typed strings: `aria-pressed={pressed() ? \"true\" : \"false\"}`, never a boolean.\n- Solid 1 APIs (`createResource`, `onMount`, `mergeProps`, `Context.Provider`) don't carry over: use async computations, `onSettled`, `merge`, and the context component itself.\n- Writing a signal or store from a memo, an effect compute phase, or a component body throws in dev. `untrack` doesn't exempt it (the guard checks the owner); derive instead, or write from a handler, `onSettled`, or effect apply.\n- Class strings built with template literals or `.filter(Boolean).join(\" \")` lose composable reactivity: use `class={[\"base\", { active: active() }]}`.\n- `createRenderEffect` is for render-phase runtime bindings, and `flush()` in production code usually hides a write-then-read: feature code uses `createEffect` and derivations.\n\n## Enforced wave-zero guard\n\n`pnpm check:control-ui-controllers` runs in lint and the changed-file checks.\nFor production `ui\u002Fsrc` and the bundled Workboard, Memory Core, Nostr, WhatsApp,\nClawRouter, and X view directories, it rejects `createRenderEffect` outside `lib\u002Freactive\u002F`,\nall direct `addEventListener` calls in TSX, DOM queries outside the explicit\nforeign-DOM owner list, and option-free memos whose callback only returns a\nliteral. Property\u002Fequality, async, and option-bearing memos retain their contracts.\nTests and test helpers are excluded. The native AST scan counts generic and\noptional calls; `flush`, `getOwner`, and `runWithOwner` resolve actual Solid imports,\nincluding aliases and namespaces, without counting owner methods or shadowed locals.\n\n`createEffect`, `untrack`, `addEventListener`, `querySelector(All)`, `flush`,\n`getOwner`, and `runWithOwner` also have\nper-file shrink-only baselines in `config\u002Fcontrol-ui-*-baseline.txt` and\n`config\u002Fplugin-ui-*-baseline.txt`. New calls cannot borrow another file's\nallowance, including allowances in another plugin or the host. Deleting\ncalls requires `pnpm check:control-ui-controllers --prune`; moving an allowance\nrequires a verified Git rename. Never raise a baseline to admit new debt. See\nthe [refactor checklist](references\u002Frefactor-checklist.md) for replacements and\nthe permitted survivors.\n\nThe guard also bans JSX `classList` and hand-written `createComponent` outside\nthe explicit context-adapter allowlist. Component\u002Fview `onCleanup` and manual\nstored\u002Fchained import loaders have shrink-only baselines; computation cleanup\nand reactive primitives remain allowed. Saving flags require recipe review:\ntrace the co-written `createOptimistic(false)` rather than infer busy state\nfrom `isPending` or a nearby optimistic declaration.\n\nMore, each with its root cause: [lessons learned](references\u002Flessons.md).\n\n## Testing\n\n`mountSolid`, `waitForSolid`\u002F`flush`, `renderSolidRef`, and the Solid application-context provider live in `ui\u002Fsrc\u002Ftest-helpers\u002F`. `.test.tsx` files are discovered. Keep assertions when you replace a harness. Visual changes need inspected, sanitized before\u002Fafter screenshots. Follow the assigned campaign's compute budget. → [testing](references\u002Ftesting.md)\n\n## References\n\n| Topic                                                    | Read when                                                                                      |\n| -------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |\n| [idioms](references\u002Fidioms.md)                           | choosing a primitive, derivations, props, lifecycle, stores, keys, async, context, diagnostics |\n| [async and actions](references\u002Fasync-and-actions.md)     | Gateway-owned reads, optimistic mutations, keyed projections, lazy code, sibling loading       |\n| [refactor checklist](references\u002Frefactor-checklist.md)   | refactoring or reviewing existing Solid: measurable smells, replacements, before\u002Fafter         |\n| [components](references\u002Fcomponents.md)                   | writing components, native custom-element hosts, JSX bindings, events, refs, styles            |\n| [state and ownership](references\u002Fstate-and-ownership.md) | touching owners, projections, async reads, lifetimes, parking, chat render lifecycle           |\n| [overlays](references\u002Foverlays.md)                       | menus, popovers, tooltips, dialogs, focus, positioning, the platform floor                     |\n| [testing](references\u002Ftesting.md)                         | unit, browser, E2E, WebKit, parity, retention suites                                           |\n| [performance](references\u002Fperformance.md)                 | startup bundle, lazy loading, render budgets                                                   |\n| [plugins](references\u002Fplugins.md)                         | building a plugin's Control UI view in Solid                                                   |\n| [lessons learned](references\u002Flessons.md)                 | before a new kind of change; most entries cost a failed CI run to learn                        |\n","# Solid 2 in OpenClaw\n\nThe Control UI and plugin views (`extensions\u002Fx`, `extensions\u002Fworkboard`) render with **Solid 2** (`solid-js`, `@solidjs\u002Fweb`, `@solidjs\u002Fsignals`, compiled by `@solidjs\u002Fvite-plugin`\u002F`@solidjs\u002Fcompiler`). Lit and Web Awesome are removed from these surfaces; new code is Solid only. The Canvas hosts also use Solid.\n\nRead [ui\u002FAGENTS.md](..\u002F..\u002F..\u002Fui\u002FAGENTS.md) first; its state-ownership rules apply to Solid unchanged. Use the exact installed Solid pins from the owning `package.json`: the runtime and compiler are `2.0.0-rc.18`, and `@solidjs\u002Fvite-plugin` is `3.0.0-next.51`. `@solidjs\u002Ftesting-library` remains `1.0.0-beta.3`. `solid-js` and `@solidjs\u002F*` are exempt from the repository's seven-day release-age gate (Peter, 2026-10-11). Peter also approved exact-version exceptions for `seroval@1.7.0` and `seroval-plugins@1.7.0` on 2026-10-24: rc.18 requires them for SSR\u002Fhydration serialization. Other third-party Solid ecosystem packages remain subject to the gate.\n\n## Rules that keep the UI correct\n\n**Before your first edit**, read the installed `ui\u002Fnode_modules\u002Fsolid-js\u002FCHEATSHEET.md`, especially its \"What changed from 1.x\" list. It is the rc.18 API contract, written as a guard against React and Solid 1 priors, the two dominant bug sources. For new code or a Solid audit, then read [idioms](references\u002Fidioms.md) and [lessons](references\u002Flessons.md); to refactor or review existing code, also use the [refactor checklist](references\u002Frefactor-checklist.md). Check `solid-js\u002Ftypes\u002Fclient\u002Fflow.d.ts` and the installed `@solidjs\u002Fsignals` \u002F `@solidjs\u002Fweb` types when choosing an API. rc.18 has no `createAsync`: asynchronous values are ordinary computations returning promises or async iterables. `createDeferred` explicitly permits stale answers during refetch; use it only when that lag is the intended presentation contract.\n\nFor async reads, mutations, keyed projections, lazy components, or coordinated loading, read the [async and action recipes](references\u002Fasync-and-actions.md). Cron is the worked reference: plain owners admit requests and writes; Solid presents their readiness and optimistic transitions.\n\nFor lists, derivations, copies, or anything on a hot path, read [performance](references\u002Fperformance.md).\n\n1. **Domain owners stay plain TypeScript.** The Gateway store, capabilities, `lib\u002Fsessions\u002F*`, caches, persistence, and mutation authority keep synchronous mutate-then-read semantics. Solid 2 writes become visible only after a microtask flush, so authoritative state never lives in a signal. → [state and ownership](references\u002Fstate-and-ownership.md)\n2. **Components consume projections** from `ui\u002Fsrc\u002Flib\u002Freactive\u002F` (one per owner and scope, never a second store) and `useApplication()` for the application context. Add a thin adapter only with its first production caller; subscribe to ordered events directly.\n3. **Host tags and classes survive.** A component renders its existing `openclaw-*` tag as a plain host element in light DOM; CSS and E2E select it. Never rename a tag or a class. → [components](references\u002Fcomponents.md)\n4. **One implementation per registered tag.** Solid-rendered native hosts share their renderer through `defineSolidBridge` in `ui\u002Fsrc\u002Flib\u002Fsolid-bridge.ts`; use its returned component in JSX. Specialized native hosts such as Tooltip keep their existing wrapper and lifecycle owner. → [components](references\u002Fcomponents.md)\n5. **One renderer per DOM region**, and one lifecycle owner per overlay surface. → [overlays](references\u002Foverlays.md)\n6. **Derive, don't synchronize.** `createMemo` before `createSignal`; no copies of owner state; no defensive guards for states the owner already excludes. Prefer smaller code with fewer owners.\n7. **Keep rendering controller lifecycles out.** Production Control UI rendering controllers and host-update contracts have been removed and are guarded. The [controller-to-Solid recipe](references\u002Fidioms.md#replace-rendering-controllers) explains the boundary for new integrations: plain domain owners retain authority; Solid owns presentation and lifecycle.\n\n## Component skeleton\n\nAn illustrative component (the tag is an example): it renders its host tag, reads an owner through a projection, and derives instead of copying state.\n\n```tsx\nimport { createMemo, Show } from \"solid-js\";\nimport { useApplication } from \"..\u002Flib\u002Freactive\u002Fcontext.ts\";\nimport { projectAgents } from \"..\u002Flib\u002Freactive\u002Fdomain-capabilities.ts\";\n\nexport function AgentCount(props: { compact?: boolean }) {\n  const app = useApplication();\n  \u002F\u002F Reads through to the synchronous owner; disposed with this component's owner.\n  const agents = projectAgents(app.agents);\n  \u002F\u002F Never destructure props: reads must stay reactive.\n  const count = createMemo(() => agents.read().agentsList?.agents.length ?? 0);\n  return (\n    \u003Copenclaw-agent-count class={[\"agent-count\", { \"agent-count--compact\": props.compact }]}>\n      \u003CShow when={count() > 0} fallback={\u003Cspan class=\"muted\">—\u003C\u002Fspan>}>\n        \u003Cspan>{count()}\u003C\u002Fspan>\n      \u003C\u002FShow>\n    \u003C\u002Fopenclaw-agent-count>\n  );\n}\n```\n\nUse `jsxImportSource: \"@solidjs\u002Fweb\"` and its JSX types, not Solid 1's `solid-js\u002Fweb`.\n\n## Traps that compile but break\n\n- `on:x`, `oncapture:`, `attr:x`, `bool:x`, `classList`, and `use:` are compile errors on native elements in rc.18. Spreads can still hide them from the compiler; keep the lint guard. `prop:` and XML namespaces remain supported.\n- Events are **camelCase** (`onClick`). Dashed custom events need the exact dash, such as `onSession-change`, or a `listen(...)` ref factory.\n- Native event bindings bind once: dispatch through a stable callback that reads the current handler prop. Runtime spreads, including dynamic elements, can update handlers.\n- A read right after a write sees the **old** value until `flush()`. Don't write-then-read in handlers; derive.\n- Reactive reads after the first `await` in an async memo are untracked, and async memos get no `AbortSignal`.\n- Ref callbacks run **unowned**: `onCleanup` inside them does nothing.\n- ARIA enumerations are typed strings: `aria-pressed={pressed() ? \"true\" : \"false\"}`, never a boolean.\n- Solid 1 APIs (`createResource`, `onMount`, `mergeProps`, `Context.Provider`) don't carry over: use async computations, `onSettled`, `merge`, and the context component itself.\n- Writing a signal or store from a memo, an effect compute phase, or a component body throws in dev. `untrack` doesn't exempt it (the guard checks the owner); derive instead, or write from a handler, `onSettled`, or effect apply.\n- Class strings built with template literals or `.filter(Boolean).join(\" \")` lose composable reactivity: use `class={[\"base\", { active: active() }]}`.\n- `createRenderEffect` is for render-phase runtime bindings, and `flush()` in production code usually hides a write-then-read: feature code uses `createEffect` and derivations.\n\n## Enforced wave-zero guard\n\n`pnpm check:control-ui-controllers` runs in lint and the changed-file checks.\nFor production `ui\u002Fsrc` and the bundled Workboard, Memory Core, Nostr, WhatsApp,\nClawRouter, and X view directories, it rejects `createRenderEffect` outside `lib\u002Freactive\u002F`,\nall direct `addEventListener` calls in TSX, DOM queries outside the explicit\nforeign-DOM owner list, and option-free memos whose callback only returns a\nliteral. Property\u002Fequality, async, and option-bearing memos retain their contracts.\nTests and test helpers are excluded. The native AST scan counts generic and\noptional calls; `flush`, `getOwner`, and `runWithOwner` resolve actual Solid imports,\nincluding aliases and namespaces, without counting owner methods or shadowed locals.\n\n`createEffect`, `untrack`, `addEventListener`, `querySelector(All)`, `flush`,\n`getOwner`, and `runWithOwner` also have\nper-file shrink-only baselines in `config\u002Fcontrol-ui-*-baseline.txt` and\n`config\u002Fplugin-ui-*-baseline.txt`. New calls cannot borrow another file's\nallowance, including allowances in another plugin or the host. Deleting\ncalls requires `pnpm check:control-ui-controllers --prune`; moving an allowance\nrequires a verified Git rename. Never raise a baseline to admit new debt. See\nthe [refactor checklist](references\u002Frefactor-checklist.md) for replacements and\nthe permitted survivors.\n\nThe guard also bans JSX `classList` and hand-written `createComponent` outside\nthe explicit context-adapter allowlist. Component\u002Fview `onCleanup` and manual\nstored\u002Fchained import loaders have shrink-only baselines; computation cleanup\nand reactive primitives remain allowed. Saving flags require recipe review:\ntrace the co-written `createOptimistic(false)` rather than infer busy state\nfrom `isPending` or a nearby optimistic declaration.\n\nMore, each with its root cause: [lessons learned](references\u002Flessons.md).\n\n## Testing\n\n`mountSolid`, `waitForSolid`\u002F`flush`, `renderSolidRef`, and the Solid application-context provider live in `ui\u002Fsrc\u002Ftest-helpers\u002F`. `.test.tsx` files are discovered. Keep assertions when you replace a harness. Visual changes need inspected, sanitized before\u002Fafter screenshots. Follow the assigned campaign's compute budget. → [testing](references\u002Ftesting.md)\n\n## References\n\n| Topic                                                    | Read when                                                                                      |\n| -------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |\n| [idioms](references\u002Fidioms.md)                           | choosing a primitive, derivations, props, lifecycle, stores, keys, async, context, diagnostics |\n| [async and actions](references\u002Fasync-and-actions.md)     | Gateway-owned reads, optimistic mutations, keyed projections, lazy code, sibling loading       |\n| [refactor checklist](references\u002Frefactor-checklist.md)   | refactoring or reviewing existing Solid: measurable smells, replacements, before\u002Fafter         |\n| [components](references\u002Fcomponents.md)                   | writing components, native custom-element hosts, JSX bindings, events, refs, styles            |\n| [state and ownership](references\u002Fstate-and-ownership.md) | touching owners, projections, async reads, lifetimes, parking, chat render lifecycle           |\n| [overlays](references\u002Foverlays.md)                       | menus, popovers, tooltips, dialogs, focus, positioning, the platform floor                     |\n| [testing](references\u002Ftesting.md)                         | unit, browser, E2E, WebKit, parity, retention suites                                           |\n| [performance](references\u002Fperformance.md)                 | startup bundle, lazy loading, render budgets                                                   |\n| [plugins](references\u002Fplugins.md)                         | building a plugin's Control UI view in Solid                                                   |\n| [lessons learned](references\u002Flessons.md)                 | before a new kind of change; most entries cost a failed CI run to learn                        |\n",{"name":5,"description":7},"main","f1c93577085244aa96aa87b53a2df9b59d293bd7",".agents\u002Fskills\u002Fsolid",82888,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw","https:\u002F\u002Fopenclaw.ai","https:\u002F\u002Fgithub.com\u002Fopenclaw","Your personal, open source AI assistant.","2026-11-15 03:04:02",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add openclaw\u002Fopenclaw --skill solid",{"tool":62,"command":63},"bunx","bunx skills add openclaw\u002Fopenclaw --skill solid",{"tool":65,"command":66},"pnpm","pnpm dlx skills add openclaw\u002Fopenclaw --skill solid","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002FSKILL.md",true,[70,76,80,84,88,92,96,100,104,108],{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"references\u002Fasync-and-actions.md","REFERENCE","参考文档",31656,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002Freferences\u002Fasync-and-actions.md",{"path":77,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Fcomponents.md",4664,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002Freferences\u002Fcomponents.md",{"path":81,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fidioms.md",25127,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002Freferences\u002Fidioms.md",{"path":85,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Flessons.md",18463,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002Freferences\u002Flessons.md",{"path":89,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Foverlays.md",4814,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002Freferences\u002Foverlays.md",{"path":93,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fperformance.md",16672,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002Freferences\u002Fperformance.md",{"path":97,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fplugins.md",1218,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002Freferences\u002Fplugins.md",{"path":101,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Frefactor-checklist.md",19925,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002Freferences\u002Frefactor-checklist.md",{"path":105,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Fstate-and-ownership.md",5155,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002Freferences\u002Fstate-and-ownership.md",{"path":109,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Ftesting.md",4611,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsolid\u002Freferences\u002Ftesting.md",[113,119,142,160,182,204],{"skillNo":114,"name":115,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":42},"01M698VP84FNM6G9MR1HPX7MF7","lobster","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fextensions\u002Flobster\u002FSKILL.md",[],[115],{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":42},"01M698YY8QGQ7S8TJNKJG6VTPH","xurl","xurl CLI for authenticated X posts, replies, reads\u002Fsearch, DMs, media upload, followers, auth status, or raw v2 API calls.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md",[],[121,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141],"for","api","calls","replies","posts","upload","tap","install","brew","node","Media","search","npm","status","auth","cli",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":148,"publishedAt":42},"01M698YWT1CJ0WK88WB909R9RT","weather","Current weather and forecasts with web_fetch, falling back to wttr.in curl for locations, rain, temperature, travel planning.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fweather\u002FSKILL.md",[],[144,149,150,133,151,134,152,153,154,155,156,157,126,158,159],"travel planning","travel","fetch","curl","https","help","planning","web","back","temperature","with",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":171,"publishedAt":42},"01M698YV2Q0R0JJKAWGFS21K0N","visualize","Create inline visuals for code and explanations, or author persistent OpenClaw dashboard widgets with show_widget.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fvisualize\u002FSKILL.md",[166],{"categoryNo":167,"categoryName":168,"taxonomyType":169,"taxonomyTypeDesc":170},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[162,172,173,174,175,126,159,176,177,178,179,180,9,181],"widgets","openclaw dashboard","author","inline","show","code","create","visuals","dashboard","widget",{"skillNo":183,"name":184,"nameZh":6,"description":185,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":186,"categories":187,"keywords":194,"publishedAt":42},"01M698YS2TRJH9ENG28HD9CD87","trello","Manage Trello boards, lists, and cards via the Trello REST API.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftrello\u002FSKILL.md",[188,191],{"categoryNo":189,"categoryName":190,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":192,"categoryName":193,"taxonomyType":169,"taxonomyTypeDesc":170},"01JBSEEDCAT000000000000030","开发工程师",[184,153,195,196,197,198,199,200,133,134,201,152,127,202,203],"cloud","manage","via","rest api","token","atlassian","jq","REST","developer",{"skillNo":205,"name":206,"nameZh":6,"description":207,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":208,"categories":209,"keywords":210,"publishedAt":42},"01M698YQ9Q3M4W78EWV2KSCSVW","tmux","Control tmux sessions\u002Fpanes for interactive CLIs: list, capture output, send keys, paste text, monitor prompts.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftmux\u002FSKILL.md",[],[206,133,211,212,126,213,214,215,31,216,217,218,134,219,220,221,222,223,224],"send","darwin","keys","paste","output","prompts","interactive","list","capture","panes","text","monitor","sessions","linux"]