Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions design-system/packages/ui/src/components/Icon/Icon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
BookOpen,
BookSearch,
CalendarClock,
ChartSpline,
Check,
ChevronDown,
ChevronLeft,
Expand Down Expand Up @@ -128,6 +129,7 @@ export const iconNames = [
"book-search",
"browser",
"calendar-clock",
"chart-spline",
"check-circle",
"check-fill",
"check-line",
Expand Down Expand Up @@ -260,6 +262,7 @@ const lineGlyphs = {
"book-search": BookSearch,
"browser": Globe,
"calendar-clock": CalendarClock,
"chart-spline": ChartSpline,
"check-circle": CircleCheck,
"check-fill": CircleCheck,
"check-line": Check,
Expand Down
5 changes: 3 additions & 2 deletions design-system/packages/ui/tests/icon.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ import { Icon, iconNames, canonicalIconNames, iconAliases } from "../dist/index.
import { Network } from "lucide-react";

test("Icon exposes the complete named catalog without duplicate names", () => {
assert.equal(iconNames.length, 102);
assert.equal(canonicalIconNames.length, 99);
assert.equal(iconNames.length, 103);
assert.equal(canonicalIconNames.length, 100);
assert.deepEqual(Object.keys(iconAliases).sort(), ["circle", "download"]);
for (const name of ["thinking", "git", "duplicate", "chevron-left", "selected", "delete", "waitlist-message", "creative", "ultimate", "standard", "minimal", "arrow-down", "unselected"]) {
assert.ok(canonicalIconNames.includes(name), name);
}
assert.equal(new Set(iconNames).size, iconNames.length);
assert.ok(iconNames.includes("search"));
assert.match(renderToStaticMarkup(createElement(Icon, { name: "chart-spline" })), /lucide-chart-spline/);
assert.ok(canonicalIconNames.includes("list-todo"));
assert.match(renderToStaticMarkup(createElement(Icon, { name: "list-todo" })), /lucide-list-todo/);
assert.ok(iconNames.includes("book-open"));
Expand Down
24 changes: 24 additions & 0 deletions docs/architecture/product-customization-blueprint.md
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,30 @@ GUI 主题由 Web/TS 主题模块定义,TUI 主题由 CLI/TUI 宿主定义,I
界面宿主负责焦点、键盘导航、屏幕阅读器、窄终端、ANSI/truecolor、无鼠标和无 Unicode 等降级。无合法组合时
构建失败;运行时插件贡献无法渲染时使用可退出的降级界面。

### 7.1 用户侧导航偏好与入口贡献

Web UI 的左侧导航定制属于控制端运行时展示偏好,不进入产品定义或远端配置。
`src/web-ui/src/app/navigation/sidebarRegistry.ts` 定义可信前端模块的贡献接口:稳定的 owner 限定 ID、
bootstrap 文案键、设计系统图标、当前页面匹配、不可用原因和按需打开动作。
`sidebarContributions.ts` 注册现有页面并复用页面 owner / Product Action;设置与导航共同消费同一份注册表。
注册返回注销函数,冲突 ID 拒绝注册,新入口只进入可选列表,由用户决定是否固定。

`sidebarPreferences.ts` 只持久化版本和有序入口 ID,不保存回调、组件、工作区路径或权限。
默认保留首页与任务板,首页固定存在;用户可添加、排序、移除其他入口并恢复默认。
未知或暂时不可用的入口保留原位置、显式禁用,重新注册或能力恢复后自动复用偏好。
未知附加字段随写入保留;无法读取的数据和更新版本的记录不自动覆盖;写入失败保留原布局并报错。
单个 MiniApp 仍由已有的按设备固定机制管理,不能把主机资源 ID 当作跨设备页面 ID。

导航贡献不会获得额外权限:页面 owner 继续承担 SSH、Peer 能力判断与数据访问,延迟准备后必须检查
捕获的 surface scope;不支持的技能页面在非本机桌面显式禁用。Mobile / IM Remote Control 与 Detached
Dispatch 不消费这份 GUI 布局,也不因固定入口获得新协议能力。此接口尚不是第三方插件 API:以后接入插件
必须由受控适配层把已授权的声明投影为可信贡献,不得从偏好文件执行代码或任意地址。

入口声明与用户布局分离、按需加载、可恢复布局参考
[VS Code View Contributions](https://code.visualstudio.com/api/extension-guides/tree-view) 和
[Custom Layout](https://code.visualstudio.com/docs/configure/custom-layout);这里只采用适合现有 GUI owner 的部分,
不引入通用组件协议或跨 GUI/TUI 布局 schema。

## 8. 产品内置扩展与用户插件

产品内置扩展只表示“随产品交付”,不表示更高运行权限,也不表示同名用户插件必须被拒绝。三类来源的生命周期
Expand Down
8 changes: 4 additions & 4 deletions docs/interactive-capabilities/README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<!-- generated by scripts/generate-interactive-capabilities.mjs; do not edit -->
# OpenBitFun 功能与设置目录 / OpenBitFun Features & Settings

OpenBitFun Playbook 当前包含 **23 个功能**和 **21 个设置页**,共 **44 个**用户可理解的条目、**336 项**有源码证据的子能力。每个条目有独立 Markdown,并直接服务于说明书网站、OpenBitFun 全局搜索和 `OpenBitFunControl` 智能体工具。
OpenBitFun Playbook 当前包含 **22 个功能**和 **22 个设置页**,共 **44 个**用户可理解的条目、**336 项**有源码证据的子能力。每个条目有独立 Markdown,并直接服务于说明书网站、OpenBitFun 全局搜索和 `OpenBitFunControl` 智能体工具。

OpenBitFun Playbook currently contains **23 features**, **21 settings pages**, and **336** source-backed sub-capabilities across **44** user-facing entries. Every entry has its own Markdown page and directly powers the website, in-app global search, and the `OpenBitFunControl` agent tool.
OpenBitFun Playbook currently contains **22 features**, **22 settings pages**, and **336** source-backed sub-capabilities across **44** user-facing entries. Every entry has its own Markdown page and directly powers the website, in-app global search, and the `OpenBitFunControl` agent tool.

## 唯一事实源 / Single source of truth

Expand All @@ -27,9 +27,9 @@ OpenBitFun Playbook currently contains **23 features**, **21 settings pages**, a
- Generated per-item interaction audit: `docs/interactive-capabilities/technical/product-control-open-audit.json`
- Generated low-level audit map: `docs/interactive-capabilities/technical/tauri-command-map.json`

说明书、网站、搜索和智能体只看“功能 + 设置 + 子能力”。每项子能力都必须引用已注册 Tauri Command 或可解析的源码标记;这些证据不会进入公开目录。当前 **706** 个 Tauri 命令只用于实现覆盖审计。产品 UI 交互源码会在生成和检查时扫描并校验,但不会保存成随普通 UI 改动频繁变化的版本化快照。
说明书、网站、搜索和智能体只看“功能 + 设置 + 子能力”。每项子能力都必须引用已注册 Tauri Command 或可解析的源码标记;这些证据不会进入公开目录。当前 **707** 个 Tauri 命令只用于实现覆盖审计。产品 UI 交互源码会在生成和检查时扫描并校验,但不会保存成随普通 UI 改动频繁变化的版本化快照。

Docs, website, search, and agents see only features, settings, and documented sub-capabilities. Every sub-capability must reference a registered Tauri command or a resolvable source marker; evidence is stripped from public projections. The **706** Tauri commands remain implementation-audit evidence only. Product UI interaction sources are scanned and validated during generation and checks, but are not stored as a versioned snapshot that churns with ordinary UI changes.
Docs, website, search, and agents see only features, settings, and documented sub-capabilities. Every sub-capability must reference a registered Tauri command or a resolvable source marker; evidence is stripped from public projections. The **707** Tauri commands remain implementation-audit evidence only. Product UI interaction sources are scanned and validated during generation and checks, but are not stored as a versioned snapshot that churns with ordinary UI changes.

## 控制边界 / Control boundary

Expand Down
68 changes: 34 additions & 34 deletions docs/interactive-capabilities/capabilities.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"title": "OpenBitFun Playbook",
"origin": "https://playbook.openbitfun.com",
"source": "src/shared/interactive-capabilities/catalog.json",
"digest": "95e9b682d9e2fe6d4d9fe80b6564af3dec33f4b860e1b6ffc7da0eebea4d0e27",
"digest": "516e1cab17ad7c33ff1be2777de1c52bb8a47ef0292bed32928843b8d1ee72ae",
"ownerDigest": "f27c231da2e536e4f2123910f34f862b55d21feb0528bc915d4d13edbd528af9",
"searchAcceptance": [
{
Expand Down Expand Up @@ -172,8 +172,8 @@
}
],
"counts": {
"features": 23,
"settings": 21,
"features": 22,
"settings": 22,
"userFacing": 44,
"documentedItems": 336,
"controlCoverage": {
Expand Down Expand Up @@ -8046,8 +8046,8 @@
"kind": "static"
},
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8092,8 +8092,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8138,8 +8138,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8184,8 +8184,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8230,8 +8230,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8276,8 +8276,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8322,8 +8322,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8368,8 +8368,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8414,8 +8414,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8460,8 +8460,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8506,8 +8506,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -8552,8 +8552,8 @@
},
"openReason": "unstructuredInteraction",
"presentationTarget": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
}
},
{
Expand Down Expand Up @@ -24414,7 +24414,7 @@
},
{
"id": "feature.ecosystem-compatibility",
"kind": "feature",
"kind": "setting",
"categoryId": "automation",
"titleZh": "外部导入",
"titleEn": "External Import",
Expand Down Expand Up @@ -24585,15 +24585,15 @@
}
],
"stepsZh": [
"打开“外部导入”并选择应用",
"在左侧导航搜索框上方切换自动发现,悬停查看说明;关闭后立即隐藏对应来源的跟随会话,已分叉副本继续保留",
"打开“设置 → 工具与集成 → 外部导入”并选择应用",
"在外部应用标题旁切换自动发现,悬停查看说明;关闭后立即隐藏对应来源的跟随会话,已分叉副本继续保留",
"查看分类状态,打开分类弹窗浏览、搜索并选择内容",
"审阅可导入项目并确认创建副本;Command、Tool、子智能体按已有兼容功能使用",
"前往对应管理页确认副本启用或连接;当前页不将“已导入”视为可用"
],
"stepsEn": [
"Open External Import and choose an app",
"Toggle automatic discovery above the sidebar search and hover for details; disabling immediately hides source-following sessions while local forks remain visible",
"Open Settings → Tools & integrations → External import and choose an app",
"Toggle automatic discovery beside the External apps heading and hover for details; disabling immediately hides source-following sessions while local forks remain visible",
"Inspect category status, then open a category dialog to browse, search, and select content",
"Review importable items and confirm copies; use commands, tools and subagents through existing compatibility features",
"Confirm copy activation or connection in the relevant settings; Imported does not mean available"
Expand All @@ -24607,8 +24607,8 @@
"I want to migrate my Claude Code configuration"
],
"destination": {
"kind": "action",
"actionId": "surface.ecosystemCompatibility.open"
"kind": "settings",
"pageId": "tools.external-import"
},
"operations": [],
"options": [],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
<!-- generated by scripts/generate-interactive-capabilities.mjs; do not edit -->
---
id: feature.ecosystem-compatibility
kind: feature
kind: setting
category: automation
title_zh: "外部导入"
title_en: "External Import"
---

# 外部导入 / External Import

> 功能 / Feature
> 设置 / Setting

查看外部 AI 生态的内容与状态,导入受支持的 Skill、MCP、Hook,以及 Codex、Zcode 会话,并在 OpenBitFun 中继续对话。

Expand Down Expand Up @@ -42,18 +42,18 @@ Inspect external AI content and status, import supported Skills, MCP, Hooks, and

## 怎么用 / How to use it

1. 打开“外部导入”并选择应用
Open External Import and choose an app
2. 在左侧导航搜索框上方切换自动发现,悬停查看说明;关闭后立即隐藏对应来源的跟随会话,已分叉副本继续保留
Toggle automatic discovery above the sidebar search and hover for details; disabling immediately hides source-following sessions while local forks remain visible
1. 打开“设置 → 工具与集成 → 外部导入”并选择应用
Open Settings → Tools & integrations → External import and choose an app
2. 在外部应用标题旁切换自动发现,悬停查看说明;关闭后立即隐藏对应来源的跟随会话,已分叉副本继续保留
Toggle automatic discovery beside the External apps heading and hover for details; disabling immediately hides source-following sessions while local forks remain visible
3. 查看分类状态,打开分类弹窗浏览、搜索并选择内容
Inspect category status, then open a category dialog to browse, search, and select content
4. 审阅可导入项目并确认创建副本;Command、Tool、子智能体按已有兼容功能使用
Review importable items and confirm copies; use commands, tools and subagents through existing compatibility features
5. 前往对应管理页确认副本启用或连接;当前页不将“已导入”视为可用
Confirm copy activation or connection in the relevant settings; Imported does not mean available

入口 / Entry: OpenBitFun 功能入口
入口 / Entry: OpenBitFun 设置

## 智能体可替你做什么 / What an agent can do for you

Expand Down
Loading
Loading