本文へ移動
cccskills
無料GitHub で公開日本語紹介

solid

OpenClawの画面をSolid 2で実装・移行・レビューするスキル。状態管理やLitとの共存、ダイアログなどの表示、テストと性能確認を扱います。

原文原文の説明を見る

Write, port, review, or test Solid 2 UI in OpenClaw (Control UI, plugin views, Canvas hosts), including state ownership, Lit interop during the migration, native overlays, testing, performance, and lessons learned.

インストール方法を見る

こんなときに便利

  • Litの画面をSolid 2へ移行したいとき
  • 状態管理と画面更新をレビューしたいとき
  • プラグイン画面やダイアログの実装
  • 画面の動作と見た目をテストしたいとき

日本語での紹介

できること

OpenClawのControl UI、プラグイン画面、Canvas A2UI hostsをSolid 2で実装・移行・レビュー・テストするためのスキルです。状態を管理するTypeScript側と、画面が参照するデータの役割を整理し、Litが残る移行途中の連携も扱います。既存のタグやクラスを保つルールに加え、メニューやダイアログの管理、性能確認、テストの進め方を示します。

こんなときに便利

Litの画面を段階的に移行したい開発者や、OpenClawのプラグイン画面を作る人に向いています。更新直後の値の読み取り、イベント、非同期処理など、コンパイルが通っても動作を損ねる箇所の確認にも役立ちます。

使い方の例

  • 「このLitコンポーネントを、既存のタグとクラスを保ってSolid 2へ移行して」
  • 「状態の持ち方とイベント処理をレビューし、必要なテストを整理して」

注意点

OpenClaw固有の構成とSolid 2を前提にしています。ui/AGENTS.mdと対象のpackage.jsonの固定バージョンを確認します。Solid 1のAPIはそのまま使えません。見た目を変更する場合はpnpm ui:parityまたは変更前後のスクリーンショット確認が必要です。

この紹介文は、公開されている SKILL.md をもとに AI(Claude Haiku)が作成しました。正確な仕様は下の原文を確認してください。

含まれるファイル(10)

  • SKILL.md6.2 KB
  • references/components.md7.4 KB
  • references/lessons.md4.9 KB
  • references/lit-interop.md3.1 KB
  • references/migration.md2.8 KB
  • references/overlays.md3.7 KB
  • references/performance.md1.9 KB
  • references/plugins.md1.2 KB
  • references/state-and-ownership.md4.1 KB
  • references/testing.md4.2 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Solid 2 in OpenClaw

The Control UI, plugin views (extensions/x, extensions/workboard), and the Canvas A2UI hosts render with Solid 2 (solid-js, @solidjs/web, @solidjs/signals, compiled by @solidjs/vite-plugin/@solidjs/compiler). Lit 3 and Web Awesome are being removed. Until the last Lit file is gone, ported Solid code runs next to unported Lit at every commit.

Read ui/AGENTS.md first; its state-ownership rules apply to Solid unchanged. Use the exact installed Solid pins from the owning package.json. Dependencies follow the repository's seven-day release-age gate.

Rules that keep the UI correct

  1. Domain owners stay plain TypeScript. The Gateway store, capabilities, lib/sessions/*, 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
  2. Components consume projections from ui/src/lib/reactive/ (one per owner and scope, never a second store) and useApplication() for the application context.
  3. 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
  4. One implementation per registered tag. A Solid component must never render a tag that a Lit class still registers. When you port a custom element, delete its Lit class; remaining Lit callers reach the Solid version through defineSolidBridge. → Lit interop
  5. One renderer per DOM region, and one lifecycle owner per overlay surface. → overlays
  6. Derive, don't synchronize. createMemo before createSignal; no copies of owner state; no defensive guards for states the owner already excludes. Prefer smaller code than the Lit you replace.

Component skeleton

An illustrative component (the tag is an example): it renders its host tag, reads an owner through a projection, and derives instead of copying state.

import { createMemo, Show } from "solid-js";
import { useApplication } from "../lib/reactive/context.ts";
import { projectAgents } from "../lib/reactive/domain-capabilities.ts";

export function AgentCount(props: { compact?: boolean }) {
  const app = useApplication();
  // Reads through to the synchronous owner; disposed with this component's owner.
  const agents = projectAgents(app.agents);
  // Never destructure props: reads must stay reactive.
  const count = createMemo(() => agents.read().agentsList?.agents.length ?? 0);
  return (
    <openclaw-agent-count class={["agent-count", { "agent-count--compact": props.compact }]}>
      <Show when={count() > 0} fallback={<span class="muted">—</span>}>
        <span>{count()}</span>
      </Show>
    </openclaw-agent-count>
  );
}

Use jsxImportSource: "@solidjs/web" and its JSX types, not Solid 1's solid-js/web.

Traps that compile but break

  • on:x, attr:x, bool:x, classList, and use: are gone in Solid 2; they compile to literal attributes or no-ops (lint flags them). prop: is the only namespace left.
  • Events are camelCase (onClick). onWaSelect listens to waselect; dashed custom events need onWa-select or a listen(...) ref factory.
  • A read right after a write sees the old value until flush(). Don't write-then-read in handlers; derive.
  • Reactive reads after the first await in an async memo are untracked, and async memos get no AbortSignal.
  • Ref callbacks run unowned: onCleanup inside them does nothing.
  • ARIA enumerations are typed strings: aria-pressed={pressed() ? "true" : "false"}, never a boolean.
  • Solid 1 APIs (createResource, onMount, mergeProps, Context.Provider) don't carry over: use async computations, onSettled, merge, and the context component itself.

More, each with its root cause: lessons learned.

Testing

mountSolid, waitForSolid/flush, renderSolidRef, and the Solid application-context provider live in ui/src/test-helpers/. .test.tsx files are discovered. Keep assertions when you replace a harness. Visual changes need pnpm ui:parity or inspected before/after screenshots. → testing

References

TopicRead when
componentsporting or writing components: Lit → Solid table, JSX bindings, events, refs, styles
state and ownershiptouching owners, projections, async reads, lifetimes, parking, chat render lifecycle
Lit interopa Lit caller uses your component, or your component hosts unported Lit
overlaysmenus, popovers, tooltips, dialogs, focus, positioning, the platform floor
testingunit, browser, E2E, WebKit, parity, retention suites
performancestartup bundle, lazy loading, render budgets
pluginsbuilding a plugin's Control UI view in Solid
migrationporting the remaining Lit, the final sweep, the inventory
lessons learnedbefore a new kind of change; most entries cost a failed CI run to learn

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

1password

無料日本語概要

1Password CLIの導入と認証を確認し、保存したパスワードやAPIキーをコマンドや設定へ渡します。デスクトップ連携やサービスアカウントにも対応します。

  • 1Password CLIを導入したいとき
  • APIキーをコマンドに渡したいとき
  • CIでサービスアカウント認証を使う
openclaw/openclaw39.2万2026年10月11日 更新

acp-router

無料日本語概要

OpenClawへの自然な言葉の依頼をClaude Codeなどの外部コーディングエージェントへ振り分け、作業の開始や継続、スレッド内の会話をつなぐスキルです。

  • Claude Codeをスレッドで開始
  • 外部エージェントの作業を続けたいとき
  • acpxから直接指示を渡したいとき
openclaw/openclaw39.2万2026年10月11日 更新

add-model-provider

無料日本語概要

OpenClawにモデル提供サービスを追加し、実際の応答まで確認するスキル。認証情報は環境変数やファイルへの参照で扱い、設定の検証と結果報告も進めます。

  • OpenClawにモデルを追加したいとき
  • 認証情報を参照形式で設定したいとき
  • モデルの実際の応答を確認したいとき
openclaw/openclaw39.2万2026年10月11日 更新

agent-transcript

無料日本語概要

AIエージェントの作業ログから、GitHubのPRやissueに添える記録を作ります。関連部分を絞り、機密情報を除いてプレビューと掲載を扱います。

  • PRに添えるエージェント作業記録の作成
  • ローカルログから関連する依頼と結果を抽出
  • 機密情報を除いた記録のプレビュー
openclaw/openclaw39.2万2026年10月11日 更新

apple-notes

無料日本語概要

macOSのApple Notesをエージェントから作成・検索・編集・削除し、フォルダ間の移動やHTML・Markdownへの書き出しを行うスキル。

  • タイトルを付けてメモを作りたいとき
  • フォルダ指定やあいまい検索でメモ探し
  • メモの編集とフォルダ整理
openclaw/openclaw39.2万2026年10月11日 更新

apple-reminders

無料日本語概要

Apple Remindersの予定付きToDoをMacから確認・追加・編集するスキル。リストの管理や完了・削除にも対応し、iPhoneやiPadで見るタスクを整理できます。

  • 今日のタスクや期限超過を確認したいとき
  • 期限付きの個人ToDoを追加したいとき
  • iPhoneやiPadのタスクを整理
openclaw/openclaw39.2万2026年10月11日 更新

openclaw のスキルをすべて見る

このスキルの問題を報告する