本文へ移動
cccskills
無料GitHub で公開

app-layout-and-agent

Lay out a Boring UI app and place its agent. Use for AppShell (layouts screen, workspace, chat), nav items, ListDetail, screen headers, the phone tab bar or sheet, the collapsed left pane, where the agent lives (shell layer, full page, embedded screen, ambient bar, placed), and for customising the chat from the app side (AgentSpec, chatProps, labels, conversations, mentions beyond files, tool cards, natural presentation). Pick this before writing any layout code or any PiChat prop.

日本語の概要は準備中です。原文の説明を表示しています。

hachej/boring-uiスター 49(GitHub 49 + cccskills 0)

実行スコア 未検証

インストール方法を見る

含まれるファイル(1)

  • SKILL.md6.6 KB

SKILL.md(原文)

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

Lay out the app, place the agent

The app shell is a registry block (app-shell), installed with boring-ui-blocks (skill add-blocks) and never edited. The app shapes it through the props below. The feature map of what exists is features/README.md; the full prop reference is registry/README.md.

Pick the layout

AppShell takes layout (registry/app-shell/app-shell.tsx):

layoutThe screens areLeft pane startsPick it when
screenone page per nav itemopen (wide sidebar)a few independent screens
workspacea ListDetail (list pane, detail pane)collapsed to the icon railrecords to browse and open: the default for a data app
chatthe one nav item renders AgentWorkspaceicon railthe page is the conversation (no agent prop: the shell throws)
  • Phone: a bottom tab bar (four items; more give three plus « Plus »). compactNav="sheet" drops the bar and opens the sidebar as a sheet from the header. Wide: the shadcn sidebar; rail="hover" keeps it at icon width and reveals labels on hover.
  • A nav item is NavItem { id, label, icon, render, badge?, sidebar? } (nav.tsx). The app's router owns the URL: pass route={{ id, onChange }}. Every screen stays mounted, so keep state out of unmount.
  • One header per screen: call useScreenHeader({ title, subtitle?, back?, actions?, leading?, dense? }) inside the screen (header.tsx).
  • ListDetail { list, detail, onBack, collapsible?, collapsed?, railWidth?, title? } (list-detail.tsx): both panes wide; one at a time on a phone, the detail pushed as one history entry. Keep selection in the URL so a deep link opens the detail.
  • account={{ name, email?, menu, signOut?, theme? }} (account.tsx); theme: { value, onChange } adds the dark-mode switch. locale (fr | en) sets the shell's own words.
  • Tell the agent what is on show with useAgentContext({ name, params }) (agent-context.ts); it travels with each message as context.

Place the agent

PlacementComponentPick it when
Shell layer (default)AppShell agent={spec}the app has screens and the agent helps from any of them. Phone: bottom drawer (peek, half, full); wide: a right panel, floatable and dockable
Full pageAppShell layout="chat" + AgentWorkspace (item pi-app)the agent is the product
Embedded screenAgentWorkspace layout="embedded" in a nav itemone screen is a conversation with files and a Library; its bar controls go into the screen header
PlacedPlacedAgentWorkspace (item placed-agent)the same conversation lives in a tab and collapses beside the app
Ambient barAmbientChat (item pi-ambient)an existing website or console, no shell: a floating bar over it
Bare chatPiChat (item pi-chat)you lay the page out yourself

AppShell improve={spec} adds a second agent (« Améliorer l'app ») to the account menu; omit it unless the host has such an agent. A launch link opens the layer: agentLink({ agent, open, input }) builds it, AppShell agentLink={false} turns reading it off.

Customise the agent from the app

AgentSpec { controller, label?, icon?, chatProps?, voice?, feedback?, headerActions? } (agent-layer.tsx). The controller comes from useRemoteChat({ conversationId, identity, endpoint, fetch }) (use-remote-chat.ts); the agent's server side is skill build-agent-app. Everything else is chatProps, the props of PiChat (pi-chat.tsx):

  • Words and look: locale, labels, icons, avatar, headerActions, emptyState, suggestions, messageStyle. Every visual value is a theme token; a block never takes a literal.
  • Threads: conversations: useConversations({ endpoint, fetch, activeId, onSelect }) shows History with New, rename, archive, fork.
  • People who read a conversation, not a trace: presentation="natural" hides tool steps and reasoning.
  • Tool results your way: toolRenderers (by tool name), renderTool, cards={{ question, approval, subagent }}, artifacts. Wire all plug-ins at once with withChatPlugins(props).
  • Composer features exist only when their prop and item are present: slash, mentions, attachments, model, effort, voiceMessage. Prop table: registry/README.md.

Mentions of things that are not files

MentionsConfig (config.ts) is generic: search(query, signal) returns { path, kind?, label? }, and path can be any stable id token (meal-12, a member id). Install pi-chat-mentions, then give:

  • Picker: MentionPicker, listLabel and icon for the menu, renderOption(item, query) for each row;
  • label(id) for the chip, renderSent(id) for the sent message (render is the older hook);
  • generation to make an open picker search again when the catalog changes.

The message carries the token as text (@id). createMentionResolver (@hachej/boring-agent/mentions) expands workspace files only; the host resolves any other id itself, in an agent tool that looks it up or a Pi extension. Model the client side on useSharedChat (registry/shared-chat/use-shared-chat.tsx), which does it for members.

Rules

  1. Install and update blocks with boring-ui-blocks only; configure through props and tokens.
  2. One controller per conversation; a placement change moves the controller, never copies the chat.
  3. Phone first: the layer, tab bar and sheets already follow the keyboard and the safe areas; do not add your own fixed bars.
  4. Prove a layout with the shell journeys: npm run app-shell:journey, app-shell:journey:workspace, app-shell:journey:placed (examples in examples/app-shell).

レビュー

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

コメント

ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。

まだコメントはありません。最初のコメントを書いてみませんか。

送信するとすぐに公開されます。メールアドレスや電話番号などの個人情報は書かないでください。URL は 2 つまでです。

0 / 1000 文字

このフォームは reCAPTCHA で保護されており、Google のプライバシーポリシーと利用規約が適用されます。

同じリポジトリのスキル

Find, install, update, check and theme Boring UI registry blocks (shadcn items such as pi-chat, pi-ambient, pi-workspace, pi-app, app-shell, viewers, file-tree, documents, feedback, windows) with the boring-ui-blocks command. Use when asked to "add a chat/agent block", "install pi-app", "upgrade/update the Boring blocks", "boring-ui-blocks check fails", "blocks edited", "restyle/rebrand the agent UI", "change the chat labels/icons/actions", "dark mode for the chat", or when tempted to edit a file under src/components/pi-*.

日本語の概要は準備中です。原文の説明を表示しています。

hachej/boring-ui492026年10月29日 更新

Give a Boring UI in-app agent capabilities and gate them safely - custom tools, workspace file access (file guard, present), Approve/Deny approvals, ask_user questions, sub-agents (delegate), schedules, sandboxes and self-evolving tools. Use when asked to "add a tool to the agent", "let the agent edit files", "require approval before X", "ask the user a question", "add a sub-agent/delegate", "schedule a follow-up/reminder", "dry-run/sandbox the agent", "let the agent write its own tools", or when choosing which tools to gate with requireApproval or createApprovalExtension.

日本語の概要は準備中です。原文の説明を表示しています。

hachej/boring-ui492026年10月29日 更新

boring-pm

無料

The domain expert's product manager in a project repository run by the Boring Factory. Use when the expert brings a need or an idea, wants to clarify, change or resume a feature ("reprends la fiche"), asks what is happening with a feature, has a builder's question to answer, or has a preview to try and accept. Interviews one question at a time, writes the contract and mockups on the contract pull request, and submits the expert's approval only after the expert confirms. Never writes code.

日本語の概要は準備中です。原文の説明を表示しています。

hachej/boring-ui492026年10月29日 更新

boring-ui

無料

Entry point for building with Boring UI (the @hachej/boring-* npm packages and shadcn registry blocks for apps with an AI agent inside, on the Pi agent harness). Use when a task mentions boring-ui, @hachej/boring-ui-kit, @hachej/boring-agent, @hachej/boring-files, boring-ui-blocks, PiChat, AgentWorkspace, AmbientChat, AppShell, or asks to "add an agent/assistant/chat to my app", "build an app with an agent inside", or "use the Boring kit". Explains the packages, the rules every change must follow, and which boring-ui skill to load next.

日本語の概要は準備中です。原文の説明を表示しています。

hachej/boring-ui492026年10月29日 更新

Build a React + Node app with an AI agent inside using Boring UI, or add one to an existing app. Use when asked to "create an agent app", "add an AI assistant/chat/copilot to my app", "scaffold a Boring UI app", "wire AgentWorkspace/PiChat to a server", "set up the Pi Harness with the kit", or to connect the pi-app, pi-chat or pi-ambient blocks to defineAgent, createChatTransportHandler, createConversationsHandler and createRevisionHandler. Gives the verified smallest setup (one Node server, one page) and how to extend it.

日本語の概要は準備中です。原文の説明を表示しています。

hachej/boring-ui492026年10月29日 更新

hachej のスキルをすべて見る

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