- 用户只安装一个
localappnpm 包;它提供唯一 TypeScript CLI、统一 Server 的前台/daemon 模式、模板与按平台 native adapter。 localapp server管理当前用户 daemon,localapp server run以前台模式运行同一 Server;不要新增第二套本地后端或独立 Server launcher。- native adapter 只负责
localapp://、系统通知及必要的操作系统注册;安全判断、动作执行、应用托管和数据能力都属于 Server。 - 不要恢复独立原生 CLI、Desktop/Tauri package、托盘界面或 Local Runtime 产品边界。
端到端验证 Agent 和应用功能时,所有生成项目、Server 数据、上传文件和下载文件都放在本仓库的 tmp/ 下:
- 启动统一 Server — 在本项目目录运行
npm run dev(等同于npm run dev:server)。 - 初始化测试应用 — 使用 CLI 的 builtin 模板在
tmp/下创建项目:mkdir -p tmp/localapp-test && cd tmp/localapp-test localapp init # 使用 builtin 模板
- 实现应用 — 遵循生成项目中的
AGENTS.md和.claude/skills/localapp*/。 - 安装到明确的 Server — 构建并安装应用包:
localapp check --json localapp app install --target local - 正式入口验证 — 使用
browser:control-in-app-browser访问 Server 返回的/<owner>/<app>/URL,检查 DOM、console、核心读写和权限边界。/serve/<owner>/<app>/只用于 raw app resource/API 诊断,不能作为功能验收入口。
本地应用临时产物不得写入系统 /tmp;测试结束后只清理本项目 tmp/ 下本次创建的明确目录。
平台 Shell 导航栏(buildPlatformShell())采用左右分区设计:
- 左侧 — 关联应用的操作:应用名称、Issue 按钮
- 右侧 — 关联用户的操作:主页入口、收藏按钮、头像、登录/登出等
添加导航栏新功能时,按此原则决定放置位置。
@localapp/crdt是 builtin template 内的可选包;统一 Server 负责 CRDT 更新的认证、授权、持久化和传输,不要引入应用私有协作后端。- Awareness 是短期在线状态,不进入数据库、备份或 peer 数据同步;正式数据与 verification session 必须使用隔离事件 channel。
- “谁正在编辑什么”的遮罩由 Platform Shell 根据应用声明的
data-localapp-edit-surface/data-localapp-edit-field绘制。应用不得传任意 CSS selector、用户身份或颜色,遮罩不得拦截应用交互。
项目统一使用 Lucide 图标库:
- React SPA(admin、profile)— 使用
lucide-react,按需引入:import { House } from "lucide-react" - Server 端页面(serve.ts 中的 HTML 模板)— 使用 Lucide 图标的 inline SVG(24x24 viewBox, stroke-width 2, stroke="currentColor")