Skip to content

Commit 17c79e9

Browse files
committed
v0.4.0 — Agent 模式 + 自动更新 + GitHub Actions CI/CD
- 集成 Claude Agent SDK,实现 Agent 会话模式 - 工作区管理、MCP 配置、Skills 系统、文件浏览器 - electron-updater 应用内检查更新(关于页手动检查 + 后台静默下载) - GitHub Actions 多平台自动打包发布(macOS/Windows/Linux) - electron-builder 配置 GitHub Releases 发布 - 默认 Skills 模板(docx/pdf/pptx/xlsx 等)
1 parent 7485669 commit 17c79e9

262 files changed

Lines changed: 86045 additions & 120 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/release.yml

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# GitHub Actions: 自动打包分发
2+
#
3+
# 触发条件:推送 v* tag(如 v0.1.22)
4+
# 构建所有平台产物并发布到 GitHub Releases
5+
#
6+
# 所需 GitHub Secrets(macOS 签名/公证,可选):
7+
# - MAC_CERTS: Base64 编码的 macOS Developer ID Application 证书 (.p12)
8+
# - MAC_CERTS_PASSWORD: 证书密码
9+
# - APPLE_ID: Apple ID(公证用)
10+
# - APPLE_APP_SPECIFIC_PASSWORD: App-Specific 密码(公证用)
11+
# - APPLE_TEAM_ID: Apple Developer Team ID
12+
# GITHUB_TOKEN 由 GitHub Actions 自动提供,无需手动配置
13+
14+
name: Release
15+
16+
on:
17+
push:
18+
tags:
19+
- 'v*'
20+
21+
permissions:
22+
contents: write
23+
24+
jobs:
25+
build:
26+
strategy:
27+
fail-fast: false
28+
matrix:
29+
include:
30+
- os: macos-latest
31+
platform: mac
32+
- os: ubuntu-latest
33+
platform: linux
34+
- os: windows-latest
35+
platform: win
36+
37+
runs-on: ${{ matrix.os }}
38+
39+
steps:
40+
- name: 检出代码
41+
uses: actions/checkout@v4
42+
43+
- name: 安装 Bun
44+
uses: oven-sh/setup-bun@v2
45+
with:
46+
bun-version: latest
47+
48+
- name: 安装 Node.js
49+
uses: actions/setup-node@v4
50+
with:
51+
node-version: 20
52+
53+
- name: 安装依赖
54+
run: bun install
55+
56+
- name: 下载各平台 Bun 二进制
57+
run: bun run build:vendor
58+
working-directory: apps/electron
59+
60+
# macOS 代码签名准备
61+
- name: 导入 macOS 签名证书
62+
if: matrix.platform == 'mac'
63+
env:
64+
MAC_CERTS: ${{ secrets.MAC_CERTS }}
65+
MAC_CERTS_PASSWORD: ${{ secrets.MAC_CERTS_PASSWORD }}
66+
run: |
67+
# 创建临时 keychain
68+
KEYCHAIN_PATH=$RUNNER_TEMP/build.keychain
69+
KEYCHAIN_PASSWORD=$(openssl rand -base64 32)
70+
71+
security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
72+
security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
73+
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
74+
75+
# 导入证书
76+
echo "$MAC_CERTS" | base64 --decode > $RUNNER_TEMP/cert.p12
77+
security import $RUNNER_TEMP/cert.p12 -P "$MAC_CERTS_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH"
78+
security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
79+
security list-keychain -d user -s "$KEYCHAIN_PATH"
80+
81+
rm $RUNNER_TEMP/cert.p12
82+
83+
# 构建应用
84+
- name: 构建 Electron 应用
85+
run: bun run electron:build
86+
working-directory: .
87+
88+
# 打包并发布到 GitHub Releases
89+
- name: 打包并发布 (macOS)
90+
if: matrix.platform == 'mac'
91+
env:
92+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
93+
APPLE_ID: ${{ secrets.APPLE_ID }}
94+
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
95+
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
96+
run: npx electron-builder --mac --publish always
97+
working-directory: apps/electron
98+
99+
- name: 打包并发布 (Linux)
100+
if: matrix.platform == 'linux'
101+
env:
102+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
103+
run: npx electron-builder --linux --publish always
104+
working-directory: apps/electron
105+
106+
- name: 打包并发布 (Windows)
107+
if: matrix.platform == 'win'
108+
env:
109+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
110+
run: npx electron-builder --win --publish always
111+
working-directory: apps/electron

CLAUDE.md

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Bun workspace monorepo:
2424
proma/
2525
├── packages/
2626
│ ├── core/ # AI Provider 适配器、代码高亮服务 (Shiki)
27-
│ ├── shared/ # 共享类型、IPC 通道常量、配置
27+
│ ├── shared/ # 共享类型、IPC 通道常量、配置、Agent 工具匹配
2828
│ └── ui/ # 共享 UI 组件 (CodeBlock, MermaidBlock, useSmoothStream)
2929
└── apps/
3030
└── electron/ # Electron 桌面应用
@@ -110,12 +110,16 @@ bun run generate:icons # 生成应用图标
110110
| `channel-manager.ts` | 渠道 CRUD、API Key AES-256-GCM 加密(Electron safeStorage)、连接测试、模型获取 |
111111
| `conversation-manager.ts` | 对话 CRUD、JSONL 消息存储、置顶、上下文分割 |
112112
| `chat-service.ts` | AI 流式调用编排、Provider 适配器集成、消息持久化、AbortController |
113+
| `agent-service.ts` | Agent SDK 调用编排、流式事件转换与推送、AbortController |
114+
| `agent-session-manager.ts` | Agent 会话 CRUD、JSONL 消息存储 |
115+
| `agent-prompt-builder.ts` | Agent 系统提示词构建(注入工作区上下文) |
116+
| `agent-workspace-manager.ts` | 工作区管理、MCP Server 配置、Skills 配置 |
113117
| `attachment-service.ts` | 附件存储/读取/删除、文件对话框 |
114118
| `document-parser.ts` | 文档文本提取(PDF/Office/文本文件) |
115119
| `user-profile-service.ts` | 用户档案持久化 |
116120
| `settings-service.ts` | 应用设置持久化(主题等) |
117121
| `config-paths.ts` | `~/.proma/` 目录路径管理 |
118-
| `runtime-init.ts` | Bun/Git 运行时检测 |
122+
| `runtime-init.ts` | Bun/Git 运行时检测`bun-finder.ts``git-detector.ts``shell-env.ts` |
119123

120124
### AI Provider 适配器(`packages/core/src/providers/`
121125

@@ -133,17 +137,21 @@ bun run generate:icons # 生成应用图标
133137
| Atom 文件 | 管理的状态 |
134138
|-----------|-----------|
135139
| `chat-atoms.ts` | 对话列表、当前消息、流式状态(Map 结构支持多对话并行)、模型选择、上下文设置、并排模式、思考模式、待上传附件 |
140+
| `agent-atoms.ts` | Agent 会话列表、当前会话、流式状态(`AgentStreamState`)、工作区选择、渠道选择 |
136141
| `active-view.ts` | 主面板视图切换('conversations' / 'settings') |
137142
| `app-mode.ts` | 应用模式(Chat / Agent) |
138143
| `settings-tab.ts` | 设置面板当前标签页 |
139144
| `theme.ts` | 主题模式(light / dark / system) |
140145
| `user-profile.ts` | 用户档案(姓名 + 头像) |
146+
| `updater.ts` | 自动更新状态(检查/下载/安装),优雅降级(updater 不可用时保持 idle) |
141147

142148
### 渲染进程组件架构(`renderer/components/`
143149

144150
- **`app-shell/`**:三面板布局(LeftSidebar | NavigatorPanel | MainContentPanel),侧边栏含模式切换、置顶对话、日期分组列表、流式指示器
145151
- **`chat/`**:聊天核心 — ChatView(消息加载/流式订阅)、ChatHeader(模型选择/上下文设置)、ChatInput(Tiptap 富文本编辑器)、ChatMessages(消息列表/自动滚动)、ParallelChatMessages(并排模式)
146-
- **`settings/`**:设置面板 — GeneralSettings(用户档案)、AppearanceSettings(主题)、ChannelSettings(渠道管理)、ChannelForm(Provider 配置);含 `primitives/` 可复用表单组件
152+
- **`agent/`**:Agent 模式 — AgentView(会话主视图)、AgentHeader(渠道/模型选择)、AgentMessages(消息列表 + 工具活动)、ToolActivityItem(工具调用展示)、WorkspaceSelector(工作区切换)
153+
- **`settings/`**:设置面板 — GeneralSettings(用户档案)、AppearanceSettings(主题)、ChannelSettings(渠道管理)、ChannelForm(Provider 配置)、AgentSettings(Agent 渠道/工作区/MCP)、McpServerForm(MCP 服务器配置)、AboutSettings(版本/更新);含 `primitives/` 可复用表单组件
154+
- **`file-browser/`**:文件浏览器 — FileBrowser(工作区文件树浏览)
147155
- **`ai-elements/`**:AI 展示组件 — Markdown 渲染、代码块、Mermaid 图、推理折叠、上下文分割线、富文本输入
148156
- **`ui/`**:ShadcnUI 组件(new-york 风格,CSS 变量主题)
149157

@@ -155,6 +163,12 @@ bun run generate:icons # 生成应用图标
155163
├── conversations.json # 对话索引(元数据,轻量)
156164
├── conversations/ # 消息存储
157165
│ └── {uuid}.jsonl # 每对话一个 JSONL 文件,追加写入
166+
├── agent-sessions.json # Agent 会话索引
167+
├── agent-sessions/ # Agent 会话消息存储
168+
│ └── {uuid}.jsonl # 每会话一个 JSONL 文件
169+
├── workspaces/ # 工作区配置
170+
│ └── {slug}/
171+
│ └── config.json # MCP Server、Skills 等配置
158172
├── attachments/ # 附件文件
159173
│ └── {conversationId}/
160174
│ └── {uuid}.ext
@@ -166,7 +180,7 @@ bun run generate:icons # 生成应用图标
166180

167181
## 构建工具
168182

169-
- **主进程/Preload**:esbuild (`--bundle --platform=node --format=cjs --external:electron`)
183+
- **主进程/Preload**:esbuild (`--bundle --platform=node --format=cjs --external:electron --external:@anthropic-ai/claude-agent-sdk`)
170184
- **渲染进程**:Vite + React 插件 + Tailwind CSS + HMR
171185
- **开发热重载**:渲染进程 Vite HMR 即时生效;主进程/Preload 通过 electronmon 监听 dist 文件变化自动重启
172186
- **打包分发**:electron-builder(配置见 `electron-builder.yml`
@@ -189,6 +203,35 @@ bun run generate:icons # 生成应用图标
189203

190204
提交代码时始终递增受影响包的 patch 版本(如 `0.1.18``0.1.19`),影响多个包则都要递增。
191205

206+
## Agent SDK 集成架构
207+
208+
基于 `@anthropic-ai/claude-agent-sdk` 实现 Agent 模式,与 Chat 模式并行:
209+
210+
### 核心流程
211+
212+
```
213+
用户输入 → agent-service.ts (SDK query) → SDK SDKMessage 流
214+
→ convertSDKMessage() → AgentEvent[] → webContents.send()
215+
→ agent-atoms.ts (applyAgentEvent) → React UI
216+
```
217+
218+
### 关键设计
219+
220+
- **SDK 调用**`sdk.query({ prompt, options: { apiKey, model, permissionMode: 'bypassPermissions', allowDangerouslySkipPermissions: true, cwd, abortController } })`
221+
- **事件转换**`convertSDKMessage()``@proma/shared`)将 SDK 原始消息转为统一的 `AgentEvent` 类型
222+
- **工具匹配**`packages/shared/src/agent/tool-matching.ts` — 无状态 `ToolIndex` + `extractToolStarts` / `extractToolResults` 解析工具调用
223+
- **状态管理**`applyAgentEvent()` 纯函数更新 `AgentStreamState`,支持流式增量更新
224+
- **工作区隔离**:每个工作区独立的 MCP Server 配置和 cwd,Agent 会话按工作区过滤
225+
226+
### 共享类型(`@proma/shared`
227+
228+
- `AgentEvent`:Agent 事件(text / tool_start / tool_result / done / error)
229+
- `AgentSessionMeta`:会话元数据(id / title / channelId / workspaceId)
230+
- `AgentMessage`:持久化消息(role + content blocks)
231+
- `AgentSendInput`:发送请求输入
232+
- `AGENT_IPC_CHANNELS`:Agent 相关 IPC 通道常量
233+
- `WorkspaceCapabilities`:工作区能力(MCP Server 列表 + Skills 列表)
234+
192235
## 创作参考
193236

194237
遵循 [craft-agents-oss](https://github.com/craftship/craft-agents-oss) 的模式:

README.en.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Proma
2+
3+
Next-generation AI desktop app with integrated agents. Local-first, multi-provider, fully open source.
4+
5+
[中文](./README.md)
6+
7+
![Proma Chat Mode](https://img.erlich.fun/personal-blog/uPic/tBXRKI.png)
8+
![Proma Agent Mode](https://img.erlich.fun/personal-blog/uPic/3ZHWyA.png)
9+
![Proma Default Skills and Mcp](https://img.erlich.fun/personal-blog/uPic/PNBOSt.png)
10+
![Proma Mutili Provider Support](https://img.erlich.fun/personal-blog/uPic/uPPazd.png)
11+
12+
## Features
13+
14+
- **Multi-Provider Support** — Anthropic, OpenAI, Google, DeepSeek,MiniMax,Kimi,Zhipu GLM, and any OpenAI-compatible endpoint
15+
- **AI Agent Mode** — Autonomous general agent powered by Claude Agent SDK
16+
- **Streaming & Thinking** — Real-time streaming output with extended thinking visualization
17+
- **Rich Rendering** — Mermaid diagrams, syntax-highlighted code blocks, Markdown
18+
- **Attachments & Documents** — Upload images and parse PDF/Office/text files in conversations
19+
- **Local-First** — All data stored locally in `~/.proma/`, no database, fully portable
20+
- **Themes** — Light and dark mode with system preference detection
21+
22+
## Getting Started
23+
24+
Download the latest release for your platform:
25+
26+
**[Download Proma](https://github.com/ErlichLiu/Proma/releases)**
27+
28+
## Configuration
29+
30+
### Adding a Channel
31+
32+
Go to **Settings > Channels**, click **Add Channel**, select a provider, and enter your API Key. Proma will auto-fill the correct API endpoint. Click **Test Connection** to verify, then **Fetch Models** to load available models.
33+
34+
### Agent Mode (Anthropic Only)
35+
36+
Agent mode requires an **Anthropic** channel. After adding one, go to **Settings > Agent** to select your Anthropic channel and preferred model (Claude Sonnet 4 / Opus 4 recommended). The agent uses [Claude Agent SDK](https://github.com/anthropics/claude-agent-sdk) under the hood.
37+
38+
### Special Provider Endpoints
39+
40+
MiniMax, Kimi (Moonshot), and Zhipu GLM use dedicated API endpoints — these are auto-configured when you select the provider. All three support their **programming membership plans** for API access:
41+
42+
| Provider | Chat Mode | Agent Mode | Note |
43+
|----------|----------|----------|------|
44+
| MiniMax | `https://api.minimaxi.com/v1` | `https://api.minimaxi.com/anthropic`| Supports MiniMax Pro membership |
45+
| Kimi | `https://api.moonshot.cn/v1` | `https://api.moonshot.cn/anthropic`| Supports Moonshot developer plan |
46+
| Zhipu GLM | `https://open.bigmodel.cn/api/paas/v4` | `https://open.bigmodel.cn/api/anthropic`| Supports Zhipu developer plan |
47+
48+
## Tech Stack
49+
50+
- **Runtime** — Bun
51+
- **Framework** — Electron + React 18
52+
- **State** — Jotai
53+
- **Styling** — Tailwind CSS + shadcn/ui
54+
- **Build** — Vite (renderer) + esbuild (main/preload)
55+
- **Language** — TypeScript
56+
57+
## Credits
58+
59+
Proma is built on the shoulders of these great projects:
60+
61+
- [Shiki](https://shiki.style/) — Syntax highlighting
62+
- [Beautiful Mermaid](https://github.com/lukilabs/beautiful-mermaid) — Diagram rendering
63+
- [Cherry Studio](https://github.com/CherryHQ/cherry-studio) — Inspiration for multi-provider desktop AI
64+
- [Lobe Icons](https://github.com/lobehub/lobe-icons) — AI/LLM brand icon set
65+
- [Craft Agents OSS](https://github.com/lukilabs/craft-agents-oss) — Agent SDK integration patterns
66+
67+
## License
68+
69+
[MIT](./LICENSE)

0 commit comments

Comments
 (0)