1Password CLIの導入と認証を確認し、保存したパスワードやAPIキーをコマンドや設定へ渡します。デスクトップ連携やサービスアカウントにも対応します。
- 1Password CLIを導入したいとき
- APIキーをコマンドに渡したいとき
- CIでサービスアカウント認証を使う
OpenClaw Control UIをLit 3とWeb AwesomeからSolid 2へ移す実装・レビューを支援します。状態管理や画面の寿命を保ち、移行後の検証まで扱います。
原文Port or review OpenClaw Control UI code moving from Lit 3 and Web Awesome to Solid 2, including components, projections, lifecycle boundaries, and migration proof.
インストール方法を見るOpenClaw Control UIをLit 3とWeb AwesomeからSolid 2へ移す際の実装とレビューを支援します。コンポーネント、イベント、スタイルの変換に加え、状態を管理する主体や画面の保持・破棄の扱いを確認します。単純な置換で挙動が変わる箇所を示し、非同期処理、ダイアログ、フォーカス操作なども検証対象にします。
担当範囲が決まったUI移行や、そのレビューに向いています。表示を保ちながら内部の仕組みを変更したい場合や、コンパイルは通っても操作が壊れる問題を確認したい場合に役立ちます。既存テストの検証内容を保ち、見た目や性能の基準も確認します。
プロジェクトのui/AGENTS.mdと作業指示書、導入済みのSolid 2のバージョンに従います。Solid 1のAPIをそのまま使う前提ではありません。移行に伴うテストやビルドなどは原則Testboxで実行し、描画部分の移行では見た目の比較や型検査などの証拠が求められます。
この紹介文は、公開されている SKILL.md をもとに AI(Claude Haiku)が作成しました。正確な仕様は下の原文を確認してください。
インストールする前に、エージェントに与えられる指示の中身を確認できます。
The Control UI is migrating from Lit 3 + Web Awesome to Solid 2 in one cutover; the plan and lane assignments live with the migration coordinator. Read ui/AGENTS.md and the assigned work order first. Renderer-neutral and additive foundations land before the integration-branch port; remove Lit and Web Awesome at cutover.
Use the exact installed Solid 2 pins and APIs in the owning package manifests. Add dependencies only within the work order; keep the seven-day release-age gate and coordinated package upgrades. The helpers, lint rules, and codemod below describe the migration target: verify that the prerequisite lane has landed before using them. A missing prerequisite or a fix outside the assigned paths goes back to the coordinator.
lib/sessions/* (reconciler, provenance, refresh coordinator), caches, persistence, and mutation authority keep synchronous mutate-then-read semantics. Never move authoritative state into a Solid signal: Solid 2 setters become visible only after a microtask flush.ui/src/lib/reactive/ publish what owners admitted. One per owner and scope, never a second store. Preserve initial reads, subscriptions, equality contracts, and explicit disposal. Mutable snapshots publish a revision signal. Event channels (invalidations, confirmations, handoffs, Gateway events) stay events.ui/AGENTS.md still apply. Key async reads by complete connection, agent, session, and query identity. Async memos discard superseded results but get no AbortSignal; keep generation guards around shared caches and Gateway writes. For immediate transport cancellation, use an owned async-iterable adapter whose return() aborts. Cancellation is never rollback. action and optimistic stores present mutations; captured targets, live authority, and uncertain outcomes stay with the domain owner.RenderLifecycle.afterCommit contract for committed DOM; geometry still settles through requestAnimationFrame/ResizeObserver. Keep one live sidebar and stable retained pane/iframe nodes.| Lit | Solid 2 |
|---|---|
element class + customElements.define | function X(props) rendering the existing <openclaw-x> host tag (CSS and E2E select it) |
@property() foo | props.foo; never destructure props; merge for defaults (undefined overrides), omit for a remainder |
@state() | createMemo derivation first; createSignal only for genuinely local state |
willUpdate | createMemo / function-form createSignal |
updated() | createEffect(compute, apply); apply runs after DOM commit; return cleanup from apply |
firstUpdated | onSettled (one-shot; return cleanup, no reactive primitive creation or flush() inside) |
connected/disconnectedCallback | component body / onCleanup |
requestUpdate() | delete it |
html/svg templates | JSX |
cond ? html\…` : nothing` | <Show when> or a ternary; nothing in attributes → undefined |
.prop=${v} | prop:prop={v} preserves explicit property assignment on native and custom elements; ordinary JSX works only for the renderer's recognized stateful properties |
?disabled=${b} | disabled={b} (ARIA enumerations need "true"/"false" strings) |
@click=${fn} | onClick={fn}: camelCase; lowercase onclick becomes an attribute string |
@some-event=${fn} | onSome-event={fn} or ref={listen("some-event", fn, opts)} |
repeat(items, key, tpl) | <For each={items} keyed={key}> (item and index are accessors) |
keyed(k, tpl) | <Show when={k} keyed> only for truthy identities; it hides falsy keys that Lit would render. Preserve every valid identity and explicit reset; never key by streaming text |
guard(deps, fn) | Equality-gated dependency memo feeding an untracked render computation; preserve every explicit dependency and parked-work gate |
live(v) | liveValue ref factory: compare the DOM value before writing |
ref() | ref={el} or a callback (unowned: no cleanup inside) |
class strings / classMap | class={["a", { b: cond }]} |
styleMap | style={{ … }} |
unsafeHTML(sanitized) | the shared sanitized-HTML helper only |
until | async createMemo + <Loading> |
@consume | useApplication() |
@lit/task | async createMemo + isPending/refresh, or an explicit owner if it has side effects |
ReactiveController | useX() primitive with owner cleanup; extract domain logic first |
| custom directive | ref directive factory (behavior) or component (content owner) |
t("key") | unchanged; it reads the locale revision signal |
The planned codemod (scripts/codemods/lit-to-solid.mts) handles mechanical bindings and leaves TODO(solid2): <reason> markers for ownership decisions. Resolve every marker before handoff; the migration lint gate must reject them. Do not mechanically convert keyed, live, guard, cache, custom directives, unsafe HTML, controller lifetimes, or cancellation.
Render light DOM under the existing host tag. Scope former shadow styles to that host; replace :host, slots, and Web Awesome ::part selectors deliberately. Keep the shared stylesheet policy. Use jsxImportSource: "@solidjs/web" and its JSX types, not Solid 1's solid-js/web or JSX namespace.
on:x={…}, attr:x, bool:x, classList, and use: compile to literal attributes or no-ops in Solid 2. Lint flags them.onWaSelect listens to waselect. Dashed events need onWa-select or listen(...).flush(). Don't write-then-read in handlers; derive.await in an async memo are not tracked.equals compares results after computation; it does not replace Lit guard's check before rendering. Compare the explicit dependency vector element by element in a dependency memo, then read that memo from a separate computation and invoke untrack(fn). An equivalent owner-controlled gate is also valid. Hidden data must not become a new rendering dependency for parked content.onCleanup inside them does nothing. Create reactive work and register cleanup in the ref factory's owned setup or component body. For one-shot settled DOM work, return cleanup from onSettled.Show callback children get accessors; keyed children get raw values. Calling a branch accessor after its branch unmounted throws.createResource, onMount, mergeProps, and Context.Provider do not carry over. Use async computations, onSettled, merge, and the context component itself.action uses a generator: yield restores transaction context; await alone does not.WeakMap identity caches. Keep immutable message/tool objects out of stores.Target floor: Safari/WebKit 26.2, Chrome/Edge and Firefox from the last ~6 months. The floor and capability enforcement ship with cutover, not with additive foundations. Linux WebKitGTK qualification remains a coordinator prerequisite.
anchor-name, position-area, position-try-fallbacks). No Floating UI. Caret popups anchor to an invisible element placed at the measured caret.<dialog>.showModal(). auto supplies native light dismissal; manual needs the owning dismissal policy. Do not create competing native and library dismissal owners.<dialog> under the existing modal policy (focus entry/return, cancellation, native occlusion leases).<Menu> on the qualified headless engine; Zag is the plan's first candidate, with a Solid 2 adapter and roving-focus/cancellation parity still requiring proof. Never hand-roll keyboard models or silently substitute an unqualified engine.ui/src/lib/native-overlay-occlusion.ts) still applies; top layer does not cover native views.mountSolid() and always dispose. Settle with flush() plus outcome-based waits; flush() does not settle promises.WeakRef + collectGarbageForTest suites must stay green.node scripts/crabbox-wrapper.mjs: one task-owned lease, stopped at handoff. Quick single-file tests may run locally when a remote round trip costs more than it saves. No local Docker/OrbStack.Use the work order's scoped proof for additive foundations or docs-only lanes. For rendered ports, preserve existing budgets and collect:
maintsgoTODO(solid2)Run Codex autoreview, resolve actionable findings, and follow the work order's publication boundary. Phase 1 lanes open ready PRs against main; integration-port lanes hand off tested commits to the coordinator without opening CI-triggering PRs. Do not merge without a landing order. Report branch/HEAD, grouped files, exact proof commands/results and lease/run IDs, requested calibration, open questions, and stopped lease status.
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
1Password CLIの導入と認証を確認し、保存したパスワードやAPIキーをコマンドや設定へ渡します。デスクトップ連携やサービスアカウントにも対応します。
OpenClawへの自然な言葉の依頼をClaude Codeなどの外部コーディングエージェントへ振り分け、作業の開始や継続、スレッド内の会話をつなぐスキルです。
Add and live-prove a model provider with non-interactive config one-liners, without exposing credentials.
日本語の概要は準備中です。原文の説明を表示しています。
Requested GitHub PR/issue agent transcripts: redact, trim, preview, and insert safely.
日本語の概要は準備中です。原文の説明を表示しています。
macOSのApple Notesをエージェントから作成・検索・編集・削除し、フォルダ間の移動やHTML・Markdownへの書き出しを行うスキル。
Apple Remindersの予定付きToDoをMacから確認・追加・編集するスキル。リストの管理や完了・削除にも対応し、iPhoneやiPadで見るタスクを整理できます。