실제 제품을 적절한 조작 환경에서 실행해 변경 사항을 검증하고, 사용자가 확인할 수 있는 증거를 모아 인수 보고서로 게시합니다. 기존 검증 계획을 확인하거나 점검 항목을 만들고, `lh` CLI로 결과를 게시할 수 있습니다.
- 변경된 제품 동작을 실제로 확인하기
- 스크린샷 등 검증 증거 수집하기
- 검증 계획과 보고서 작성하기
저장소의 실제 LobeHub UI 구성 요소와 스타일을 사용해 상호작용 가능한 단일 HTML 프로토타입을 만드는 안내서입니다. 런타임 구성, 테마 설정, 상태와 동작 확인을 다루며 정식 화면 구현 전에 흐름을 검토할 수 있습니다.
Use for interactive HTML prototypes (交互原型) with the real LobeHub UI stack. Excludes production UI implementation.
실행 점수 미검증
설치 방법 보기이 안내서는 LobeHub의 실제 UI 구성 요소와 스타일을 사용해 상호작용 가능한 단일 HTML 프로토타입을 만드는 방법을 설명합니다. 저장소의 의존 항목으로 런타임을 준비한 뒤 React 형식의 코드로 화면과 동작을 작성합니다. 테마는 운영체제의 라이트·다크 설정을 따르게 하거나 직접 지정할 수 있습니다. 빌드나 서버를 실행하지 않고 HTML 파일을 열어 확인할 수 있습니다. 화면 상태 전환과 동작 후 이동, 버튼 같은 조작 요소가 실제로 작동하는지를 중점적으로 살핍니다. 콘솔 오류와 스크린샷을 확인하고, 필요한 경우 좁은 화면 너비도 검토하는 방법을 안내합니다.
실제 제품과 가까운 UI로 화면의 계층과 조작 흐름을 검토하고 싶을 때 유용합니다. 정식 화면을 구현하기 전에 빈 상태, 로딩 상태, 오류 상태까지 포함해 관계자들과 구체적으로 확인할 수 있습니다.
런타임 구성에는 저장소의 node_modules를 사용합니다. 처음 실행할 때 unpkg에서 babel.min.js를 가져옵니다. 이 스킬은 프로토타입을 만드는 용도이며 정식 UI를 구현하지 않습니다.
이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.
AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.
점수에는 넣지 않았습니다. 2026년 10월 26일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
One HTML file, double-click to open, fully interactive, rendered by the actual
design system (@lobehub/ui 6.x components, compiled style.css, --lobe-* theme tokens — exact
versions from this repo's node_modules) — while the source stays production-style
React (import { Block } from '@lobehub/ui', createStaticStyles(({ css, cssVar }) => …),
hooks, memo). Promotion to production is mostly "split into files", not "rewrite".
Prototype code may be quick-and-dirty (one file, no i18n, inline data) — but the interaction must be complete: states, transitions, and affordances are the point of a prototype, not its code style.
one-time (~2s, cached): scripts/build-runtime.sh → lobe-prototype-runtime.js (IIFE global)
+ lobe-prototype-runtime.css
+ vendored babel.min.js
per prototype (no build): single HTML = <link css> + <script runtime> + babel-standalone
+ <script type="text/babel"> with production-style React
react, react-dom/client, the full @lobehub/ui namespace,
lucide-react and motion from the repo's own node_modules — so tokens/components/
versions match production, and react/emotion/theme-scope are singletons by
construction.entry.mjs also imports @lobehub/ui/theme.css + global.css + style.css (the same
three the app loads in src/layout/GlobalProvider/AppTheme.tsx); esbuild emits them
as lobe-prototype-runtime.css, linked from the template's <head>.window.require shim + babel's transform-modules-commonjs lets the
prototype keep real import statements.setLobeTheme({ appearance }) from prefers-color-scheme (and on change), so
light/dark follow the OS before first paint. Force a theme with
setLobeTheme({ appearance: 'dark' }), or <ThemeScope appearance="dark"> for an
island. The React tree is wrapped in <ConfigProvider motion={motion}> like the app's
AppTheme (motion for Button, Drawer, Modal, …, plus fonts, focus ring and the
popup portal host) and <ToastHost /> for toast.⚠️ Don't re-attempt the pure-CDN route (esm.sh import maps). It was tried and rejected: esm.sh's CJS named-export analysis failed serially across the dep chain and
?bundleleaked an unversionedreact-is404. Bundling from the repo's ownnode_modulesis the only way to match production versions exactly.
Build the runtime into the prototype's directory (any dir works; /tmp is fine):
bash .agents/skills/design-prototype/scripts/build-runtime.sh /tmp/my-proto
Skip if lobe-prototype-runtime.{js,css} + babel.min.js are already there and the
design-system versions haven't bumped. The first run downloads babel.min.js from
unpkg (pinned); later runs reuse it.
Copy references/template.html into the same dir,
rename, and replace the sample App with the real surface. Keep the runtime shim
block untouched.
Open it (open /tmp/my-proto/xxx.html) — no server, no build.
Headless-check it renders with zero console errors (the repo's e2e Playwright works):
// node /tmp/check.mjs — adjust paths
import { chromium } from '<repo>/e2e/node_modules/playwright/index.mjs';
const b = await chromium.launch();
const p = await b.newPage();
const errs = [];
p.on('pageerror', (e) => errs.push(String(e)));
await p.goto('file:///tmp/my-proto/xxx.html');
await p.waitForSelector('#root *', { timeout: 30000 });
await p.screenshot({ path: '/tmp/proto.png' }); // Read the screenshot yourself
console.log('errors:', errs);
await b.close();
Then Read the screenshot — a prototype is a visual deliverable; don't ship it
sight-unseen. Check light + dark (emulate prefers-color-scheme) and a narrow
viewport if the surface has a mobile story.
See assets/entry.mjs — the single source of truth. Currently:
@lobehub/ui: full namespace — every component (Button, Input, Modal,
createModal, confirmModal, Table, Switch, Checkbox, Radio, Badge,
Progress, Slider, Steps, Divider, DropdownMenu, Accordion, Collapsible,
Spin, Skeleton, DraggablePanel, FloatingSheet, …) plus toast / ToastHost,
MotionProvider, setLobeTheme, ThemeScope, useThemeMode, useTheme, and the
styling API createStaticStyles, cssVar, cx, css, keyframes, responsive,
useResponsive@lobehub/icons: Amp, ClaudeCode, Codex, HermesAgent, OpenClaw, OpenCodelucide-react, motion/react, motion/react-m, react, react/jsx-runtime,
react-dom, react-dom/client: full namespacesNot included: @lobehub/ui/form, @lobehub/ui/pro-table, @lobehub/ui/chat and the
other subpaths — add import * as x from '@lobehub/ui/<sub>' + a '@lobehub/ui/<sub>': x
entry and rebuild (~2s). Size ≈ 17MB JS + 0.3MB CSS (fine from disk).
toast.success(…) + <ToastHost />; dialogs: Modal, createModal,
confirmModal.DropdownMenu items={…} (opens on click); context menus: ContextMenuTrigger.Flexbox horizontal gap={…} / Center / Grid — there is no Space.Accordion for several sections, Collapsible for one region.Badge, Checkbox, Divider, Progress, Radio, Slider, Steps, Switch,
Table (columns / dataSource / rowSelection) are root exports.node_modules/@lobehub/ui/es/index.d.mts rather than
guessing; an unknown import is undefined at runtime, not a build error.createStaticStyles + cssVar.* exactly as production does — it is
emotion-backed and inserts at call time, so it needs no build step. Tokens resolve
to var(--lobe-*) and flip with the theme; never hardcode light/dark colors.lobe-base, lobe-popup, lobe-ui), so
any unlayered CSS in the prototype's <style> beats them. Override through
className / style / classNames / styles slot props, not global selectors
like button { … }.<link> to lobe-prototype-runtime.css — without it components render
unstyled and --lobe-* tokens are undefined.<script src> chokes on export.Text type accepts only secondary|success|warning|danger|info; Tag color has
no primary (DESIGN.md "Applying tokens in components").A prototype is a surface — the ux checklists apply to what it demonstrates:
DraggablePanel
(collapse + drag-resize come free), loading follows the ux skill's feedback §4.1
scenario table (Skeleton / Spin, variant="network" only for AI work), modals via createModal-style flows.cursor: zoom-in with no zoom, keycap
chips with no keys) — in an interactive prototype a dead affordance is a spec bug.아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
실제 제품을 적절한 조작 환경에서 실행해 변경 사항을 검증하고, 사용자가 확인할 수 있는 증거를 모아 인수 보고서로 게시합니다. 기존 검증 계획을 확인하거나 점검 항목을 만들고, `lh` CLI로 결과를 게시할 수 있습니다.
LobeHub에 AI 모델 제공자를 추가하는 과정을 안내합니다. 런타임 연동, 모델 정보와 설정, 브랜드 표시, 문서화 및 인수 확인을 다루며, 기존 제공자에 모델만 추가하는 경우와 새 연동이 필요한 경우를 구분합니다.
서버 환경 변수로 사용자 설정의 기본값을 지정하도록 구현하는 절차를 안내합니다. 변수 검증, 서버 설정 구성, 사용자 저장소 반영부터 예시 환경 파일과 셀프 호스팅 문서 갱신까지 다룹니다.
에이전트 실행 단계, 도구 호출, 사람의 승인, 컨텍스트 압축, 하위 에이전트 호출에 훅을 등록하는 방법을 안내합니다. 이벤트를 관찰하고 로컬 도구 결과를 모의하거나 설정에 따라 웹훅으로 도구 호출을 허용 또는 거부할 수 있습니다.
에이전트의 이벤트 기반 백그라운드 작업을 설계하고 구현하도록 돕습니다. 소스, 시그널, 액션, 정책의 역할을 나누고 비동기 처리, 중복 실행 방지, 완료 기록과 관측 기능을 다룹니다.
실제 데스크톱 채팅 앱에서 봇 채널의 인수 테스트를 진행합니다. Discord, Slack, Telegram, WeChat, Lark, QQ에서 메시지를 보내고 응답을 기다린 뒤 결과 화면을 캡처합니다. iMessage는 BlueBubbles 브리지를 사용합니다.