golembot 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -96
- package/README.zh-CN.md +168 -0
- package/dist/channels/wecom.js +1 -1
- package/dist/channels/wecom.js.map +1 -1
- package/dist/cli-utils.d.ts +6 -0
- package/dist/cli-utils.d.ts.map +1 -0
- package/dist/cli-utils.js +34 -0
- package/dist/cli-utils.js.map +1 -0
- package/dist/cli.js +112 -11
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +112 -0
- package/dist/doctor.js.map +1 -0
- package/dist/engine.d.ts +10 -33
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +15 -738
- package/dist/engine.js.map +1 -1
- package/dist/engines/claude-code.d.ts +10 -0
- package/dist/engines/claude-code.d.ts.map +1 -0
- package/dist/engines/claude-code.js +241 -0
- package/dist/engines/claude-code.js.map +1 -0
- package/dist/engines/codex.d.ts +27 -0
- package/dist/engines/codex.d.ts.map +1 -0
- package/dist/engines/codex.js +219 -0
- package/dist/engines/codex.js.map +1 -0
- package/dist/engines/cursor.d.ts +7 -0
- package/dist/engines/cursor.d.ts.map +1 -0
- package/dist/engines/cursor.js +240 -0
- package/dist/engines/cursor.js.map +1 -0
- package/dist/engines/opencode.d.ts +20 -0
- package/dist/engines/opencode.d.ts.map +1 -0
- package/dist/engines/opencode.js +260 -0
- package/dist/engines/opencode.js.map +1 -0
- package/dist/engines/shared.d.ts +3 -0
- package/dist/engines/shared.d.ts.map +1 -0
- package/dist/engines/shared.js +15 -0
- package/dist/engines/shared.js.map +1 -0
- package/dist/gateway.d.ts +1 -0
- package/dist/gateway.d.ts.map +1 -1
- package/dist/gateway.js +43 -4
- package/dist/gateway.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +95 -16
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +7 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +15 -0
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts +10 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +36 -3
- package/dist/session.js.map +1 -1
- package/dist/workspace.d.ts +10 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +15 -0
- package/dist/workspace.js.map +1 -1
- package/package.json +6 -1
package/README.md
CHANGED
|
@@ -1,46 +1,73 @@
|
|
|
1
|
-
|
|
1
|
+
[English](README.md) | [中文](README.zh-CN.md)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
>
|
|
5
|
-
|
|
3
|
+
<p align="center">
|
|
4
|
+
<picture>
|
|
5
|
+
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/0xranx/golembot/main/docs/assets/logo-golem-light.svg">
|
|
6
|
+
<img src="https://raw.githubusercontent.com/0xranx/golembot/main/docs/assets/logo-golem-dark.svg" alt="GolemBot" width="560">
|
|
7
|
+
</picture>
|
|
8
|
+
</p>
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
<p align="center">
|
|
11
|
+
<a href="https://github.com/0xranx/golembot/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/0xranx/golembot/ci.yml?branch=main&style=for-the-badge" alt="CI"></a>
|
|
12
|
+
<a href="https://www.npmjs.com/package/golembot"><img src="https://img.shields.io/npm/v/golembot.svg?style=for-the-badge" alt="npm version"></a>
|
|
13
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge" alt="MIT License"></a>
|
|
14
|
+
<a href="https://nodejs.org/"><img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg?style=for-the-badge" alt="Node.js"></a>
|
|
15
|
+
</p>
|
|
8
16
|
|
|
9
|
-
|
|
17
|
+
<p align="center"><strong>Your Coding Agent is trapped in a terminal. GolemBot sets it free.</strong></p>
|
|
10
18
|
|
|
11
|
-
|
|
12
|
-
- **Built-in IM Channels** — Native adapters for Feishu, DingTalk, and WeCom, no code required
|
|
13
|
-
- **Library First** — `createAssistant()` API embeds into any Node.js project
|
|
14
|
-
- **Directory = Assistant** — `ls` the directory to see what the assistant knows, what it can do, and what it has done
|
|
15
|
-
- **Skill = Capability** — Drop Markdown + scripts into the `skills/` directory, and the assistant gains new abilities automatically
|
|
16
|
-
- **Multi-User Isolation** — Routes by sessionKey, each user gets an independent session
|
|
17
|
-
- **HTTP Service** — Built-in SSE streaming API with Bearer token auth
|
|
18
|
-
- **Docker Deployment** — One-click deploy to the cloud
|
|
19
|
+
---
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
Cursor, Claude Code, OpenCode, Codex — these Coding Agents can already write code, run scripts, analyze data, and reason through complex tasks. But they're stuck in an IDE or a terminal window.
|
|
22
|
+
|
|
23
|
+
**GolemBot gives them a body.** One command connects your Coding Agent to Feishu, DingTalk, WeCom, or any HTTP client. Or embed it into your own product with 5 lines of code. No AI framework, no prompt engineering — the agent you already have *is* the brain.
|
|
24
|
+
|
|
25
|
+
## Run Your Coding Agent Everywhere
|
|
26
|
+
|
|
27
|
+
### On IM — your team's 24/7 AI teammate
|
|
21
28
|
|
|
22
29
|
```bash
|
|
23
|
-
|
|
24
|
-
|
|
30
|
+
golembot init -e claude-code -n my-bot
|
|
31
|
+
golembot gateway # connects to Feishu / DingTalk / WeCom
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Your colleagues @ the bot in group chat. It can write code, analyze files, answer questions — because behind it is a real Coding Agent, not a thin API wrapper.
|
|
25
35
|
|
|
26
|
-
|
|
27
|
-
mkdir my-assistant && cd my-assistant
|
|
28
|
-
golembot onboard
|
|
36
|
+
### In your product — full agent power, 5 lines of code
|
|
29
37
|
|
|
30
|
-
|
|
31
|
-
golembot
|
|
38
|
+
```typescript
|
|
39
|
+
import { createAssistant } from 'golembot';
|
|
40
|
+
const bot = createAssistant({ dir: './my-agent' });
|
|
32
41
|
|
|
33
|
-
|
|
34
|
-
|
|
42
|
+
for await (const event of bot.chat('Analyze last month sales data')) {
|
|
43
|
+
if (event.type === 'text') process.stdout.write(event.content);
|
|
44
|
+
}
|
|
35
45
|
```
|
|
36
46
|
|
|
37
|
-
|
|
47
|
+
Embed into Slack bots, internal tools, SaaS products, customer support — anything that speaks Node.js.
|
|
48
|
+
|
|
49
|
+
## Why GolemBot, not another AI framework?
|
|
50
|
+
|
|
51
|
+
| | GolemBot | Traditional AI Frameworks |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| **AI brain** | Cursor / Claude Code / OpenCode / Codex — battle-tested, full coding ability | You wire up LLM APIs + tools from scratch |
|
|
54
|
+
| **Setup** | `golembot init` → done | Chains, RAG, vector DB, prompt tuning... |
|
|
55
|
+
| **Auto-upgrade** | Agent gets smarter? Your assistant gets smarter. Zero code changes. | You maintain everything yourself |
|
|
56
|
+
| **Transparency** | `ls` the directory = see what the assistant knows and does | Black box pipelines |
|
|
57
|
+
| **Engine lock-in** | Change one line in config to swap engines | Rewrite everything |
|
|
58
|
+
|
|
59
|
+
## Quick Start
|
|
38
60
|
|
|
39
61
|
```bash
|
|
62
|
+
npm install -g golembot
|
|
63
|
+
|
|
40
64
|
mkdir my-bot && cd my-bot
|
|
65
|
+
golembot onboard # guided setup (recommended)
|
|
66
|
+
|
|
67
|
+
# Or manually:
|
|
41
68
|
golembot init -e claude-code -n my-bot
|
|
42
|
-
golembot run
|
|
43
|
-
#
|
|
69
|
+
golembot run # REPL conversation
|
|
70
|
+
golembot gateway # start IM + HTTP service
|
|
44
71
|
```
|
|
45
72
|
|
|
46
73
|
## Architecture
|
|
@@ -57,73 +84,29 @@ Feishu / DingTalk / WeCom / HTTP API
|
|
|
57
84
|
│
|
|
58
85
|
createAssistant()
|
|
59
86
|
│
|
|
60
|
-
|
|
61
|
-
▼ ▼ ▼
|
|
62
|
-
Cursor Claude
|
|
87
|
+
┌───────┼───────┬───────┐
|
|
88
|
+
▼ ▼ ▼ ▼
|
|
89
|
+
Cursor Claude OpenCode Codex
|
|
63
90
|
Code
|
|
64
91
|
```
|
|
65
92
|
|
|
66
|
-
Core design: The Gateway is a long-running service that reuses the `createAssistant()` library API internally, with an IM channel adapter layer on top.
|
|
67
|
-
|
|
68
93
|
## Engine Comparison
|
|
69
94
|
|
|
70
|
-
| | Cursor | Claude Code | OpenCode |
|
|
71
|
-
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
| API Key | CURSOR_API_KEY | ANTHROPIC_API_KEY | Depends on Provider |
|
|
76
|
-
|
|
77
|
-
The exposed `StreamEvent` interface is identical across engines — switching engines requires zero changes to your application code.
|
|
78
|
-
|
|
79
|
-
## Usage
|
|
95
|
+
| | Cursor | Claude Code | OpenCode | Codex |
|
|
96
|
+
|---|---|---|---|---|
|
|
97
|
+
| Skill Injection | `.cursor/skills/` | `.claude/skills/` + CLAUDE.md | `.opencode/skills/` + opencode.json | `AGENTS.md` at workspace root |
|
|
98
|
+
| Session Resume | `--resume` | `--resume` | `--session` | `exec resume <thread_id>` |
|
|
99
|
+
| API Key | CURSOR_API_KEY | ANTHROPIC_API_KEY | Depends on Provider | OPENAI_API_KEY or ChatGPT OAuth |
|
|
80
100
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
golembot init # Initialize an assistant
|
|
85
|
-
golembot run # REPL conversation
|
|
86
|
-
golembot gateway # Start IM + HTTP service
|
|
87
|
-
golembot onboard # Guided setup
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### Option 2: Library Import
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
import { createAssistant } from 'golembot';
|
|
94
|
-
|
|
95
|
-
const assistant = createAssistant({ dir: './my-agent' });
|
|
96
|
-
|
|
97
|
-
for await (const event of assistant.chat('Analyze the competitor data')) {
|
|
98
|
-
if (event.type === 'text') process.stdout.write(event.content);
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Option 3: Embed Anywhere
|
|
103
|
-
|
|
104
|
-
```typescript
|
|
105
|
-
import { createAssistant } from 'golembot';
|
|
106
|
-
const bot = createAssistant({ dir: './slack-bot' });
|
|
107
|
-
|
|
108
|
-
slackApp.message(async ({ message, say }) => {
|
|
109
|
-
let reply = '';
|
|
110
|
-
for await (const event of bot.chat(message.text, {
|
|
111
|
-
sessionKey: `slack:${message.user}`,
|
|
112
|
-
})) {
|
|
113
|
-
if (event.type === 'text') reply += event.content;
|
|
114
|
-
}
|
|
115
|
-
await say(reply);
|
|
116
|
-
});
|
|
117
|
-
```
|
|
101
|
+
The `StreamEvent` interface is identical across all engines — switching requires zero code changes.
|
|
118
102
|
|
|
119
103
|
## Configuration
|
|
120
104
|
|
|
121
|
-
`golem.yaml` — the single config file
|
|
105
|
+
`golem.yaml` — the single config file:
|
|
122
106
|
|
|
123
107
|
```yaml
|
|
124
108
|
name: my-assistant
|
|
125
109
|
engine: claude-code
|
|
126
|
-
model: openrouter/anthropic/claude-sonnet-4
|
|
127
110
|
|
|
128
111
|
channels:
|
|
129
112
|
feishu:
|
|
@@ -138,34 +121,27 @@ gateway:
|
|
|
138
121
|
token: ${GOLEM_TOKEN}
|
|
139
122
|
```
|
|
140
123
|
|
|
141
|
-
Sensitive fields support `${ENV_VAR}` references
|
|
124
|
+
Sensitive fields support `${ENV_VAR}` references.
|
|
142
125
|
|
|
143
126
|
## Skill System
|
|
144
127
|
|
|
145
|
-
A Skill is
|
|
128
|
+
A Skill is a directory containing `SKILL.md` + optional scripts. Drop it in, the assistant gains new abilities. Remove it, the ability is gone.
|
|
146
129
|
|
|
147
130
|
```
|
|
148
131
|
skills/
|
|
149
|
-
├── general/ #
|
|
132
|
+
├── general/ # Built-in: general assistant
|
|
150
133
|
│ └── SKILL.md
|
|
151
|
-
├── im-adapter/ # IM reply conventions
|
|
134
|
+
├── im-adapter/ # Built-in: IM reply conventions
|
|
152
135
|
│ └── SKILL.md
|
|
153
|
-
└── my-custom-skill/ # Your own
|
|
136
|
+
└── my-custom-skill/ # Your own
|
|
154
137
|
├── SKILL.md
|
|
155
138
|
└── analyze.py
|
|
156
139
|
```
|
|
157
140
|
|
|
158
|
-
|
|
141
|
+
`ls skills/` is the complete list of what your assistant can do.
|
|
159
142
|
|
|
160
143
|
## Docker Deployment
|
|
161
144
|
|
|
162
|
-
```bash
|
|
163
|
-
# In the assistant directory
|
|
164
|
-
docker compose up -d
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
Or use a Dockerfile:
|
|
168
|
-
|
|
169
145
|
```dockerfile
|
|
170
146
|
FROM node:22-slim
|
|
171
147
|
RUN npm install -g golembot
|
|
@@ -182,8 +158,9 @@ git clone https://github.com/0xranx/golembot.git
|
|
|
182
158
|
cd golembot
|
|
183
159
|
pnpm install
|
|
184
160
|
pnpm run build
|
|
185
|
-
pnpm run test # Unit tests
|
|
186
|
-
pnpm run e2e:opencode # End-to-end tests (
|
|
161
|
+
pnpm run test # Unit tests (676+)
|
|
162
|
+
pnpm run e2e:opencode # End-to-end tests (OpenCode)
|
|
163
|
+
pnpm run e2e:codex # End-to-end tests (Codex)
|
|
187
164
|
```
|
|
188
165
|
|
|
189
166
|
## License
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
[English](README.md) | [中文](README.zh-CN.md)
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<picture>
|
|
5
|
+
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/0xranx/golembot/main/docs/assets/logo-golem-light.svg">
|
|
6
|
+
<img src="https://raw.githubusercontent.com/0xranx/golembot/main/docs/assets/logo-golem-dark.svg" alt="GolemBot" width="560">
|
|
7
|
+
</picture>
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<a href="https://github.com/0xranx/golembot/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/0xranx/golembot/ci.yml?branch=main&style=for-the-badge" alt="CI"></a>
|
|
12
|
+
<a href="https://www.npmjs.com/package/golembot"><img src="https://img.shields.io/npm/v/golembot.svg?style=for-the-badge" alt="npm version"></a>
|
|
13
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge" alt="MIT License"></a>
|
|
14
|
+
<a href="https://nodejs.org/"><img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg?style=for-the-badge" alt="Node.js"></a>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center"><strong>你的 Coding Agent 被困在终端里。GolemBot 把它释放出来。</strong></p>
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
Cursor、Claude Code、OpenCode、Codex —— 这些 Coding Agent 已经能写代码、跑脚本、分析数据、进行复杂推理。但它们被困在 IDE 或终端窗口里。
|
|
22
|
+
|
|
23
|
+
**GolemBot 给它们一个身体。** 一条命令就能把你的 Coding Agent 接入飞书、钉钉、企业微信,或任何 HTTP 客户端。也可以 5 行代码嵌入你自己的产品。不需要 AI 框架,不需要 prompt 工程 —— 你已有的 Agent 就是大脑。
|
|
24
|
+
|
|
25
|
+
## 让你的 Coding Agent 跑在任何地方
|
|
26
|
+
|
|
27
|
+
### 接入 IM —— 团队的 7x24 AI 队友
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
golembot init -e claude-code -n my-bot
|
|
31
|
+
golembot gateway # 接入飞书 / 钉钉 / 企业微信
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
同事在群里 @ 机器人,它能写代码、分析文件、回答问题 —— 因为背后是一个真正的 Coding Agent,不是套壳 API。
|
|
35
|
+
|
|
36
|
+
### 嵌入你的产品 —— 5 行代码,完整 Agent 能力
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import { createAssistant } from 'golembot';
|
|
40
|
+
const bot = createAssistant({ dir: './my-agent' });
|
|
41
|
+
|
|
42
|
+
for await (const event of bot.chat('分析上个月的销售数据')) {
|
|
43
|
+
if (event.type === 'text') process.stdout.write(event.content);
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
嵌入 Slack 机器人、内部工具、SaaS 产品、客服系统 —— 任何跑 Node.js 的地方。
|
|
48
|
+
|
|
49
|
+
## 为什么选 GolemBot,而不是其他 AI 框架?
|
|
50
|
+
|
|
51
|
+
| | GolemBot | 传统 AI 框架 |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| **AI 大脑** | Cursor / Claude Code / OpenCode / Codex —— 久经考验,完整编码能力 | 你自己从 LLM API + 工具开始拼装 |
|
|
54
|
+
| **上手成本** | `golembot init` → 搞定 | Chains、RAG、向量数据库、prompt 调优…… |
|
|
55
|
+
| **自动升级** | Agent 变强了?你的助手自动变强,零代码改动 | 你自己维护所有东西 |
|
|
56
|
+
| **透明度** | `ls` 目录 = 看到助手知道什么、做了什么 | 黑盒流水线 |
|
|
57
|
+
| **引擎锁定** | 改一行配置换引擎 | 全部重写 |
|
|
58
|
+
|
|
59
|
+
## 快速开始
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm install -g golembot
|
|
63
|
+
|
|
64
|
+
mkdir my-bot && cd my-bot
|
|
65
|
+
golembot onboard # 引导式安装(推荐)
|
|
66
|
+
|
|
67
|
+
# 或手动:
|
|
68
|
+
golembot init -e claude-code -n my-bot
|
|
69
|
+
golembot run # REPL 对话
|
|
70
|
+
golembot gateway # 启动 IM + HTTP 服务
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 架构
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
飞书 / 钉钉 / 企业微信 / HTTP API
|
|
77
|
+
│
|
|
78
|
+
▼
|
|
79
|
+
┌─────────────────────────┐
|
|
80
|
+
│ Gateway 服务 │
|
|
81
|
+
│ (通道适配器 + │
|
|
82
|
+
│ HTTP 服务) │
|
|
83
|
+
└────────────┬────────────┘
|
|
84
|
+
│
|
|
85
|
+
createAssistant()
|
|
86
|
+
│
|
|
87
|
+
┌───────┼───────┬───────┐
|
|
88
|
+
▼ ▼ ▼ ▼
|
|
89
|
+
Cursor Claude OpenCode Codex
|
|
90
|
+
Code
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## 引擎对比
|
|
94
|
+
|
|
95
|
+
| | Cursor | Claude Code | OpenCode | Codex |
|
|
96
|
+
|---|---|---|---|---|
|
|
97
|
+
| Skill 注入 | `.cursor/skills/` | `.claude/skills/` + CLAUDE.md | `.opencode/skills/` + opencode.json | workspace 根目录的 `AGENTS.md` |
|
|
98
|
+
| 会话恢复 | `--resume` | `--resume` | `--session` | `exec resume <thread_id>` |
|
|
99
|
+
| API Key | CURSOR_API_KEY | ANTHROPIC_API_KEY | 取决于 Provider | OPENAI_API_KEY 或 ChatGPT OAuth |
|
|
100
|
+
|
|
101
|
+
所有引擎暴露的 `StreamEvent` 接口完全一致 —— 切换引擎无需改任何代码。
|
|
102
|
+
|
|
103
|
+
## 配置
|
|
104
|
+
|
|
105
|
+
`golem.yaml` —— 唯一的配置文件:
|
|
106
|
+
|
|
107
|
+
```yaml
|
|
108
|
+
name: my-assistant
|
|
109
|
+
engine: claude-code
|
|
110
|
+
|
|
111
|
+
channels:
|
|
112
|
+
feishu:
|
|
113
|
+
appId: ${FEISHU_APP_ID}
|
|
114
|
+
appSecret: ${FEISHU_APP_SECRET}
|
|
115
|
+
dingtalk:
|
|
116
|
+
clientId: ${DINGTALK_CLIENT_ID}
|
|
117
|
+
clientSecret: ${DINGTALK_CLIENT_SECRET}
|
|
118
|
+
|
|
119
|
+
gateway:
|
|
120
|
+
port: 3000
|
|
121
|
+
token: ${GOLEM_TOKEN}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
敏感字段支持 `${ENV_VAR}` 引用环境变量。
|
|
125
|
+
|
|
126
|
+
## Skill 系统
|
|
127
|
+
|
|
128
|
+
Skill 就是一个目录:`SKILL.md` + 可选脚本。放进去,助手获得新能力;删掉,能力消失。
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
skills/
|
|
132
|
+
├── general/ # 内置:通用助手
|
|
133
|
+
│ └── SKILL.md
|
|
134
|
+
├── im-adapter/ # 内置:IM 回复规范
|
|
135
|
+
│ └── SKILL.md
|
|
136
|
+
└── my-custom-skill/ # 你自己的
|
|
137
|
+
├── SKILL.md
|
|
138
|
+
└── analyze.py
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`ls skills/` 就是助手能力的完整清单。
|
|
142
|
+
|
|
143
|
+
## Docker 部署
|
|
144
|
+
|
|
145
|
+
```dockerfile
|
|
146
|
+
FROM node:22-slim
|
|
147
|
+
RUN npm install -g golembot
|
|
148
|
+
WORKDIR /assistant
|
|
149
|
+
COPY . .
|
|
150
|
+
EXPOSE 3000
|
|
151
|
+
CMD ["golembot", "gateway"]
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## 开发
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
git clone https://github.com/0xranx/golembot.git
|
|
158
|
+
cd golembot
|
|
159
|
+
pnpm install
|
|
160
|
+
pnpm run build
|
|
161
|
+
pnpm run test # 单元测试 (676+)
|
|
162
|
+
pnpm run e2e:opencode # 端到端测试(OpenCode)
|
|
163
|
+
pnpm run e2e:codex # 端到端测试(Codex)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## 许可证
|
|
167
|
+
|
|
168
|
+
[MIT](LICENSE)
|
package/dist/channels/wecom.js
CHANGED
|
@@ -118,7 +118,7 @@ export class WecomAdapter {
|
|
|
118
118
|
res.writeHead(405);
|
|
119
119
|
res.end();
|
|
120
120
|
});
|
|
121
|
-
const port = 9000;
|
|
121
|
+
const port = this.config.port ?? 9000;
|
|
122
122
|
this.server.listen(port, () => {
|
|
123
123
|
console.log(`[wecom] Webhook server started on port ${port}, callback path: /wecom`);
|
|
124
124
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wecom.js","sourceRoot":"","sources":["../../src/channels/wecom.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"wecom.js","sourceRoot":"","sources":["../../src/channels/wecom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI formatting helpers — tool call display and string truncation.
|
|
3
|
+
*/
|
|
4
|
+
export declare function truncate(s: string, max: number): string;
|
|
5
|
+
export declare function formatToolCall(name: string, argsJson: string): string;
|
|
6
|
+
//# sourceMappingURL=cli-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-utils.d.ts","sourceRoot":"","sources":["../src/cli-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqBrE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI formatting helpers — tool call display and string truncation.
|
|
3
|
+
*/
|
|
4
|
+
export function truncate(s, max) {
|
|
5
|
+
if (s.length <= max)
|
|
6
|
+
return s;
|
|
7
|
+
return s.slice(0, max - 1) + '\u2026';
|
|
8
|
+
}
|
|
9
|
+
export function formatToolCall(name, argsJson) {
|
|
10
|
+
let detail = '';
|
|
11
|
+
try {
|
|
12
|
+
const args = JSON.parse(argsJson);
|
|
13
|
+
if (typeof args === 'object' && args !== null) {
|
|
14
|
+
// Pick the most informative argument to display
|
|
15
|
+
const path = args.file_path ?? args.path ?? args.filename;
|
|
16
|
+
const command = args.command;
|
|
17
|
+
const query = args.query ?? args.pattern ?? args.search;
|
|
18
|
+
if (path) {
|
|
19
|
+
detail = ` ${truncate(String(path), 60)}`;
|
|
20
|
+
}
|
|
21
|
+
else if (command) {
|
|
22
|
+
detail = ` ${truncate(String(command), 60)}`;
|
|
23
|
+
}
|
|
24
|
+
else if (query) {
|
|
25
|
+
detail = ` ${truncate(String(query), 60)}`;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// not valid JSON — show nothing extra
|
|
31
|
+
}
|
|
32
|
+
return `${name}${detail}`;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=cli-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-utils.js","sourceRoot":"","sources":["../src/cli-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,GAAW;IAC7C,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,QAAgB;IAC3D,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,gDAAgD;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC;YACxD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC5C,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/C,CAAC;iBAAM,IAAI,KAAK,EAAE,CAAC;gBACjB,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IACD,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;AAC5B,CAAC"}
|