1Password 명령줄 도구의 설치와 인증을 확인하고 저장된 비밀번호와 API 키를 명령이나 설정에 전달합니다. 데스크톱 앱 연동과 서비스 계정도 지원합니다.
- 1Password 명령줄 도구 설치
- API 키를 명령에 전달
- CI에서 서비스 계정 인증 사용
Solid 2로 OpenClaw 화면을 구현하고 이전하며 검토와 테스트를 진행합니다. 상태 관리, Lit과의 공존, 대화상자 표시, 성능 확인을 다룹니다.
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.
Solid 2로 OpenClaw의 Control UI, 플러그인 화면, Canvas A2UI hosts를 구현하고 이전하며 검토와 테스트를 진행합니다. 상태를 관리하는 TypeScript 코드와 화면이 참조하는 데이터의 역할을 구분하고, 이전 과정에서 Lit이 남아 있을 때의 연동도 다룹니다. 기존 태그와 클래스 유지 규칙, 메뉴와 대화상자 관리, 성능 확인, 테스트 방법을 안내합니다.
Lit 화면을 단계적으로 이전하는 개발자나 OpenClaw 플러그인 화면을 만드는 사람에게 유용합니다. 컴파일을 통과해도 동작에 문제가 생길 수 있는 갱신 직후의 값 읽기, 이벤트 처리, 비동기 작업을 검토할 때도 사용합니다.
OpenClaw 고유의 구성과 Solid 2를 전제로 합니다. ui/AGENTS.md와 대상 package.json의 고정 버전을 확인합니다. Solid 1의 API는 그대로 사용할 수 없습니다. 외관을 변경하면 pnpm ui:parity를 실행하거나 변경 전후 스크린샷을 확인해야 합니다.
이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.
AI가 SKILL.md의 내용만을 근거로 4가지 관점에서 판정했습니다. 스타 수나 인기도는 판정에 넣지 않았습니다.
총점은 각 항목을 A=25점, B=15점, C=5점으로 더한 값입니다. 2026년 10월 19일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
The Control UI and plugin views (extensions/x, extensions/workboard) render with Solid 2 (solid-js, @solidjs/web, @solidjs/signals, compiled by @solidjs/vite-plugin/@solidjs/compiler). Lit and Web Awesome are removed from these surfaces; new code is Solid only. The Canvas hosts also use Solid, but the sandboxed upstream A2UI v0.8 catalog retains its separate @a2ui/lit dependency.
Read ui/AGENTS.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.14, and @solidjs/vite-plugin is 3.0.0-next.49. solid-js and @solidjs/* are exempt from the repository's seven-day release-age gate (Peter, 2026-10-11); third-party Solid ecosystem packages remain subject to it.
Before your first edit, read the installed ui/node_modules/solid-js/CHEATSHEET.md, especially its "What changed from 1.x" list. It is the rc.14 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 and lessons; to refactor or review existing code, also use the refactor checklist. Check solid-js/types/client/flow.d.ts and the installed @solidjs/signals / @solidjs/web types when choosing an API. rc.14 has no createAsync: asynchronous values are ordinary computations returning promises or async iterables.
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 ownershipui/src/lib/reactive/ (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.openclaw-* tag as a plain host element in light DOM; CSS and E2E select it. Never rename a tag or a class. → componentsdefineSolidBridge in ui/src/lib/solid-bridge.ts. Use its returned component in JSX so the host has one lifecycle owner. → componentscreateMemo before createSignal; no copies of owner state; no defensive guards for states the owner already excludes. Prefer smaller code with fewer owners.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.
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.onClick). Dashed custom events need the exact dash, such as onSession-change, or a listen(...) ref factory.flush(). Don't write-then-read in handlers; derive.await in an async memo are untracked, and async memos get no AbortSignal.onCleanup inside them does nothing.aria-pressed={pressed() ? "true" : "false"}, never a boolean.createResource, onMount, mergeProps, Context.Provider) don't carry over: use async computations, onSettled, merge, and the context component itself.untrack doesn't exempt it (the guard checks the owner); derive instead, or write from a handler, onSettled, or effect apply..filter(Boolean).join(" ") lose composable reactivity: use class={["base", { active: active() }]}.createRenderEffect is for render-phase runtime bindings, and flush() in production code usually hides a write-then-read: feature code uses createEffect and derivations.More, each with its root cause: lessons learned.
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 inspected, sanitized before/after screenshots. Follow the assigned campaign's compute budget. → testing
| Topic | Read when |
|---|---|
| idioms | choosing a primitive, derivations, props, lifecycle, stores, keys, async, context, diagnostics |
| refactor checklist | refactoring or reviewing existing Solid: measurable smells, replacements, before/after |
| components | writing components, native custom-element hosts, JSX bindings, events, refs, styles |
| state and ownership | touching owners, projections, async reads, lifetimes, parking, chat render lifecycle |
| overlays | menus, popovers, tooltips, dialogs, focus, positioning, the platform floor |
| testing | unit, browser, E2E, WebKit, parity, retention suites |
| performance | startup bundle, lazy loading, render budgets |
| plugins | building a plugin's Control UI view in Solid |
| lessons learned | before a new kind of change; most entries cost a failed CI run to learn |
아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
1Password 명령줄 도구의 설치와 인증을 확인하고 저장된 비밀번호와 API 키를 명령이나 설정에 전달합니다. 데스크톱 앱 연동과 서비스 계정도 지원합니다.
OpenClaw에 전달한 자연어 요청을 Claude Code 같은 외부 코딩 에이전트로 연결합니다. ACP나 acpx로 작업을 시작하거나 이어가며 대화 맥락을 유지합니다.
OpenClaw에 모델 제공업체를 추가하고 실제 응답을 확인합니다. 인증 정보는 환경 변수나 파일 참조로 다루며 설정 검증과 결과 보고도 진행합니다.
AI 에이전트의 작업 로그를 GitHub PR이나 이슈에 첨부할 기록으로 정리합니다. 관련 내용을 추리고 민감한 정보를 제거해 미리 보며, 별도 승인을 받아 게시합니다.
에이전트에서 macOS의 Apple Notes 메모를 생성, 검색, 편집, 삭제합니다. 폴더 간 이동과 HTML 또는 Markdown 내보내기도 지원합니다.
Mac에서 Apple Reminders의 기한이 있는 할 일을 확인하고 추가·편집합니다. 목록 관리와 완료·삭제를 통해 iPhone이나 iPad에서 보는 작업을 정리합니다.