diff --git a/AGENTS.md b/AGENTS.md index aab608e..3975391 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ ## 项目 -本仓库包含 SenlinAI 项目工作台 MVP。 +本仓库包含森林AI项目工作台 MVP。 该产品是一个以项目为中心、面向私有化部署的工作台,服务于个人知识工作者、团队负责人和可信的内部用户。它用于组织项目任务、inbox 条目、Markdown 笔记、文件、AI 会话、项目内标签,以及轻量级任务分发。 diff --git a/README.md b/README.md index 3b51685..6135f41 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# SenlinAI Agent Workbench +# 森林AI -SenlinAI Agent Workbench 是一个以项目为中心的私有化工作台 MVP。 +森林AI 是一个以项目为中心的私有化工作台 MVP。 ## 本地开发 diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 6bf3e63..2b83110 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "senlinai_workbench" version = "0.1.0" -description = "SenlinAI project workbench desktop shell" -authors = ["SenlinAI"] +description = "森林AI 项目工作台桌面端" +authors = ["森林AI"] edition = "2021" [lib] diff --git a/apps/desktop/src-tauri/icons/128x128.png b/apps/desktop/src-tauri/icons/128x128.png new file mode 100644 index 0000000..e54c249 Binary files /dev/null and b/apps/desktop/src-tauri/icons/128x128.png differ diff --git a/apps/desktop/src-tauri/icons/128x128@2x.png b/apps/desktop/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..2d620ac Binary files /dev/null and b/apps/desktop/src-tauri/icons/128x128@2x.png differ diff --git a/apps/desktop/src-tauri/icons/32x32.png b/apps/desktop/src-tauri/icons/32x32.png new file mode 100644 index 0000000..c843a55 Binary files /dev/null and b/apps/desktop/src-tauri/icons/32x32.png differ diff --git a/apps/desktop/src-tauri/icons/icon.icns b/apps/desktop/src-tauri/icons/icon.icns new file mode 100644 index 0000000..a21bda4 Binary files /dev/null and b/apps/desktop/src-tauri/icons/icon.icns differ diff --git a/apps/desktop/src-tauri/icons/icon.ico b/apps/desktop/src-tauri/icons/icon.ico index e0c73af..2a5bb4b 100644 Binary files a/apps/desktop/src-tauri/icons/icon.ico and b/apps/desktop/src-tauri/icons/icon.ico differ diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 413e3fd..060dbf9 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -3,5 +3,5 @@ pub fn run() { tauri::Builder::default() .plugin(tauri_plugin_opener::init()) .run(tauri::generate_context!()) - .expect("error while running SenlinAI Workbench"); + .expect("启动森林AI时发生错误"); } diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index 71d7b61..5c877b5 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -1,6 +1,6 @@ { "$schema": "https://schema.tauri.app/config/2", - "productName": "SenlinAI Workbench", + "productName": "森林AI", "version": "0.1.0", "identifier": "ai.senlin.workbench", "build": { @@ -12,7 +12,7 @@ "app": { "windows": [ { - "title": "项目工作台", + "title": "森林AI", "width": 1280, "height": 820 } @@ -24,6 +24,12 @@ "bundle": { "active": true, "targets": "all", - "icon": ["icons/icon.ico"] + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] } } diff --git a/apps/web_v1/README.md b/apps/web_v1/README.md index c086495..f963b5a 100644 --- a/apps/web_v1/README.md +++ b/apps/web_v1/README.md @@ -1,6 +1,6 @@ -# SenlinAI Acro React +# 森林AI Web 客户端 -SenlinAI primary web client built with React, TypeScript, Vite, and Arco Design. +森林AI主 Web 客户端,使用 React、TypeScript、Vite 和 Arco Design 构建。 This app is the active web client under `apps/web_v1`. diff --git a/apps/web_v1/index.html b/apps/web_v1/index.html index c80d6e3..7075a74 100644 --- a/apps/web_v1/index.html +++ b/apps/web_v1/index.html @@ -1,10 +1,12 @@ - + - + - web_v1 + + + 森林AI
diff --git a/apps/web_v1/public/favicon.svg b/apps/web_v1/public/favicon.svg index 6893eb1..dc3662b 100644 --- a/apps/web_v1/public/favicon.svg +++ b/apps/web_v1/public/favicon.svg @@ -1 +1,10 @@ - \ No newline at end of file + + 森林AI 图标 + + + + + + + + diff --git a/apps/web_v1/public/senlinai-icon.svg b/apps/web_v1/public/senlinai-icon.svg new file mode 100644 index 0000000..dc3662b --- /dev/null +++ b/apps/web_v1/public/senlinai-icon.svg @@ -0,0 +1,10 @@ + + 森林AI 图标 + + + + + + + + diff --git a/apps/web_v1/scripts/structure-check.mjs b/apps/web_v1/scripts/structure-check.mjs index 11b5fa6..13bef57 100644 --- a/apps/web_v1/scripts/structure-check.mjs +++ b/apps/web_v1/scripts/structure-check.mjs @@ -25,6 +25,23 @@ const requiredFiles = [ const failures = requiredFiles.filter((file) => !existsSync(file)).map((file) => `missing ${file}`) +const html = readFileSync('index.html', 'utf8') +if (!html.includes('')) failures.push('index language must be zh-CN') +if (!html.includes('森林AI')) failures.push('document title must be 森林AI') +if (!html.includes('href="/senlinai-icon.svg"')) failures.push('favicon must use /senlinai-icon.svg') +if (!existsSync('public/senlinai-icon.svg')) failures.push('missing public/senlinai-icon.svg') + +for (const file of ['src/pages/login.tsx', 'src/pages/projects/project-topbar.tsx', 'src/pages/projects/project-rail.tsx']) { + const source = readFileSync(file, 'utf8') + if (!source.includes('/senlinai-icon.svg')) failures.push(`${file} must use the brand icon`) +} + +for (const forbidden of ['森林Agent', 'SenlinAI Workbench']) { + for (const file of requiredFiles.filter((name) => name.endsWith('.tsx'))) { + if (readFileSync(file, 'utf8').includes(forbidden)) failures.push(`${file} contains legacy product name ${forbidden}`) + } +} + if (existsSync('src/App.tsx')) { failures.push('legacy src/App.tsx should be removed after page split') } diff --git a/apps/web_v1/src/App.css b/apps/web_v1/src/App.css index bce5986..74b45ea 100644 --- a/apps/web_v1/src/App.css +++ b/apps/web_v1/src/App.css @@ -113,23 +113,23 @@ gap: 16px; } -.brand-symbol { +.brand-icon { width: 32px; height: 32px; - display: grid; - place-items: center; + display: block; border-radius: 8px; - background: var(--senlin-primary); - color: white; - font-weight: 800; - font-size: 18px; } -.brand-lockup.large .brand-symbol { +.brand-lockup.large .brand-icon { width: 46px; height: 46px; border-radius: 12px; - font-size: 24px; +} + +.rail-brand-icon { + width: 40px; + height: 40px; + border-radius: 10px; } .brand-name { diff --git a/apps/web_v1/src/pages/login.tsx b/apps/web_v1/src/pages/login.tsx index f477e8f..5ef1d51 100644 --- a/apps/web_v1/src/pages/login.tsx +++ b/apps/web_v1/src/pages/login.tsx @@ -38,8 +38,8 @@ export function LoginPage({ onLogin }: { onLogin: (input: { server: string; emai
- S - 森林Agent + + 森林AI
私有部署 · 安全可控的智能协作平台 知识沉淀 · 团队协作 · AI Agent @@ -51,7 +51,7 @@ export function LoginPage({ onLogin }: { onLogin: (input: { server: string; emai
- 登录到您的 SenlinAI + 登录到您的森林AI 连接私有工作台
@@ -81,7 +81,7 @@ export function LoginPage({ onLogin }: { onLogin: (input: { server: string; emai
安全 · 专注 · 高效 - SenlinAI 是面向知识工作者与内部团队的私有部署工作台,帮助团队在统一空间中收集信息、整理知识、协同决策。 + 森林AI 是面向知识工作者与内部团队的私有部署工作台,帮助团队在统一空间中收集信息、整理知识、协同决策。 } title="私有部署,数据自有" desc="所有数据与模型运行在您的环境中,安全可控。" /> } title="知识沉淀,结构清晰" desc="从收集到整理,形成可复用的团队知识库。" /> diff --git a/apps/web_v1/src/pages/projects/project-rail.tsx b/apps/web_v1/src/pages/projects/project-rail.tsx index 2874c0d..0d8bb10 100644 --- a/apps/web_v1/src/pages/projects/project-rail.tsx +++ b/apps/web_v1/src/pages/projects/project-rail.tsx @@ -1,6 +1,6 @@ import type { CSSProperties } from 'react' import { Badge, Button, Layout, Space } from '@arco-design/web-react' -import { IconCompass, IconDashboard, IconPlus } from '@arco-design/web-react/icon' +import { IconCompass, IconPlus } from '@arco-design/web-react/icon' import type { Project, WorkbenchView } from './project-types' const { Sider } = Layout @@ -26,10 +26,10 @@ export function ProjectRail({