@coralai/sps-cli 0.57.15 → 0.58.1
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-CN.md +123 -2
- package/README.md +123 -2
- package/dist/commands/codexProxyCommand.d.ts +2 -0
- package/dist/commands/codexProxyCommand.d.ts.map +1 -0
- package/dist/commands/codexProxyCommand.js +81 -0
- package/dist/commands/codexProxyCommand.js.map +1 -0
- package/dist/commands/graphCommand.d.ts +2 -0
- package/dist/commands/graphCommand.d.ts.map +1 -0
- package/dist/commands/graphCommand.js +97 -0
- package/dist/commands/graphCommand.js.map +1 -0
- package/dist/commands/imCommand.d.ts +2 -0
- package/dist/commands/imCommand.d.ts.map +1 -0
- package/dist/commands/imCommand.js +34 -0
- package/dist/commands/imCommand.js.map +1 -0
- package/dist/commands/pipelineTick.d.ts.map +1 -1
- package/dist/commands/pipelineTick.js +9 -0
- package/dist/commands/pipelineTick.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +3 -0
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/tick.d.ts.map +1 -1
- package/dist/commands/tick.js +10 -0
- package/dist/commands/tick.js.map +1 -1
- package/dist/console/index.d.ts.map +1 -1
- package/dist/console/index.js +25 -13
- package/dist/console/index.js.map +1 -1
- package/dist/console/routes/channels.d.ts +3 -0
- package/dist/console/routes/channels.d.ts.map +1 -0
- package/dist/console/routes/channels.js +43 -0
- package/dist/console/routes/channels.js.map +1 -0
- package/dist/console/routes/chat.d.ts.map +1 -1
- package/dist/console/routes/chat.js +49 -7
- package/dist/console/routes/chat.js.map +1 -1
- package/dist/console/routes/codexProxy.d.ts +11 -0
- package/dist/console/routes/codexProxy.d.ts.map +1 -0
- package/dist/console/routes/codexProxy.js +58 -0
- package/dist/console/routes/codexProxy.js.map +1 -0
- package/dist/console/routes/graph.d.ts +13 -0
- package/dist/console/routes/graph.d.ts.map +1 -0
- package/dist/console/routes/graph.js +65 -0
- package/dist/console/routes/graph.js.map +1 -0
- package/dist/console/routes/providers.d.ts.map +1 -1
- package/dist/console/routes/providers.js +6 -2
- package/dist/console/routes/providers.js.map +1 -1
- package/dist/console-assets/assets/index-CKM0zA_z.js +666 -0
- package/dist/console-assets/assets/index-DVnv2TaM.css +10 -0
- package/dist/console-assets/index.html +2 -2
- package/dist/core/agents/sidecar/CodexProxyManager.d.ts +74 -0
- package/dist/core/agents/sidecar/CodexProxyManager.d.ts.map +1 -0
- package/dist/core/agents/sidecar/CodexProxyManager.js +292 -0
- package/dist/core/agents/sidecar/CodexProxyManager.js.map +1 -0
- package/dist/core/agents/workerAnthropicEnv.d.ts +23 -0
- package/dist/core/agents/workerAnthropicEnv.d.ts.map +1 -0
- package/dist/core/agents/workerAnthropicEnv.js +22 -0
- package/dist/core/agents/workerAnthropicEnv.js.map +1 -0
- package/dist/core/claudeJsonl.d.ts +2 -0
- package/dist/core/claudeJsonl.d.ts.map +1 -1
- package/dist/core/claudeJsonl.js +29 -0
- package/dist/core/claudeJsonl.js.map +1 -1
- package/dist/core/codegraph/CodeGraphService.d.ts +45 -0
- package/dist/core/codegraph/CodeGraphService.d.ts.map +1 -0
- package/dist/core/codegraph/CodeGraphService.js +141 -0
- package/dist/core/codegraph/CodeGraphService.js.map +1 -0
- package/dist/engines/StageEngine.d.ts.map +1 -1
- package/dist/engines/StageEngine.js +14 -0
- package/dist/engines/StageEngine.js.map +1 -1
- package/dist/engines/smartarrange/runner.d.ts.map +1 -1
- package/dist/engines/smartarrange/runner.js +2 -0
- package/dist/engines/smartarrange/runner.js.map +1 -1
- package/dist/im/IMAdapter.d.ts +40 -0
- package/dist/im/IMAdapter.d.ts.map +1 -0
- package/dist/im/IMAdapter.js +2 -0
- package/dist/im/IMAdapter.js.map +1 -0
- package/dist/im/IMGatewayManager.d.ts +13 -0
- package/dist/im/IMGatewayManager.d.ts.map +1 -0
- package/dist/im/IMGatewayManager.js +90 -0
- package/dist/im/IMGatewayManager.js.map +1 -0
- package/dist/im/adapters/dingtalkAdapter.d.ts +46 -0
- package/dist/im/adapters/dingtalkAdapter.d.ts.map +1 -0
- package/dist/im/adapters/dingtalkAdapter.js +157 -0
- package/dist/im/adapters/dingtalkAdapter.js.map +1 -0
- package/dist/im/adapters/discordAdapter.d.ts +43 -0
- package/dist/im/adapters/discordAdapter.d.ts.map +1 -0
- package/dist/im/adapters/discordAdapter.js +170 -0
- package/dist/im/adapters/discordAdapter.js.map +1 -0
- package/dist/im/adapters/feishuAdapter.d.ts +44 -0
- package/dist/im/adapters/feishuAdapter.d.ts.map +1 -0
- package/dist/im/adapters/feishuAdapter.js +154 -0
- package/dist/im/adapters/feishuAdapter.js.map +1 -0
- package/dist/im/adapters/matrixAdapter.d.ts +42 -0
- package/dist/im/adapters/matrixAdapter.d.ts.map +1 -0
- package/dist/im/adapters/matrixAdapter.js +106 -0
- package/dist/im/adapters/matrixAdapter.js.map +1 -0
- package/dist/im/adapters/slackAdapter.d.ts +41 -0
- package/dist/im/adapters/slackAdapter.d.ts.map +1 -0
- package/dist/im/adapters/slackAdapter.js +129 -0
- package/dist/im/adapters/slackAdapter.js.map +1 -0
- package/dist/im/adapters/telegramAdapter.d.ts +43 -0
- package/dist/im/adapters/telegramAdapter.d.ts.map +1 -0
- package/dist/im/adapters/telegramAdapter.js +147 -0
- package/dist/im/adapters/telegramAdapter.js.map +1 -0
- package/dist/im/binding.d.ts +24 -0
- package/dist/im/binding.d.ts.map +1 -0
- package/dist/im/binding.js +57 -0
- package/dist/im/binding.js.map +1 -0
- package/dist/im/chatBridge.d.ts +39 -0
- package/dist/im/chatBridge.d.ts.map +1 -0
- package/dist/im/chatBridge.js +215 -0
- package/dist/im/chatBridge.js.map +1 -0
- package/dist/im/router.d.ts +29 -0
- package/dist/im/router.d.ts.map +1 -0
- package/dist/im/router.js +120 -0
- package/dist/im/router.js.map +1 -0
- package/dist/im/types.d.ts +71 -0
- package/dist/im/types.d.ts.map +1 -0
- package/dist/im/types.js +25 -0
- package/dist/im/types.js.map +1 -0
- package/dist/main.js +29 -1
- package/dist/main.js.map +1 -1
- package/dist/manager/makeBackendFactory.d.ts.map +1 -1
- package/dist/manager/makeBackendFactory.js +4 -1
- package/dist/manager/makeBackendFactory.js.map +1 -1
- package/dist/shared/runtimeSchemas.d.ts +0 -2
- package/dist/shared/runtimeSchemas.d.ts.map +1 -1
- package/dist/shared/runtimeSchemas.js +3 -1
- package/dist/shared/runtimeSchemas.js.map +1 -1
- package/package.json +4 -1
- package/project-template/.claude/CLAUDE.md +81 -0
- package/project-template/.claude/hooks/start.sh +44 -0
- package/project-template/.claude/hooks/stop.sh +54 -0
- package/project-template/.claude/rules/.gitkeep +0 -0
- package/project-template/.claude/settings.json +32 -0
- package/project-template/.claude/settings.local.json.template +3 -0
- package/project-template/.claude/skills/.gitkeep +0 -0
- package/project-template/README.md +10 -0
- package/project-template/batch_scheduler.sh +8 -0
- package/project-template/conf.template +61 -0
- package/project-template/deploy.sh +3 -0
- package/project-template/pm_meta/.gitkeep +0 -0
- package/skills/sps-memory/SKILL.md +51 -0
- package/skills/sps-pipeline/SKILL.md +476 -0
- package/dist/console-assets/assets/index-BAA5k08F.js +0 -641
- package/dist/console-assets/assets/index-nY53xZWk.css +0 -10
package/README-CN.md
CHANGED
|
@@ -21,6 +21,7 @@ v0.51 头条特性是 **Wiki 知识库** — per-project 可选,结构化互
|
|
|
21
21
|
## 目录
|
|
22
22
|
|
|
23
23
|
- [安装与初始化](#安装与初始化)
|
|
24
|
+
- [部署(服务化 / 源码构建)](#部署服务化--源码构建)
|
|
24
25
|
- [Harness 模式(`sps agent`)](#harness-模式sps-agent)
|
|
25
26
|
- [Console 模式(`sps console`)](#console-模式sps-console)
|
|
26
27
|
- [Pipeline 模式(`sps tick`)](#pipeline-模式sps-tick)
|
|
@@ -38,7 +39,7 @@ v0.51 头条特性是 **Wiki 知识库** — per-project 可选,结构化互
|
|
|
38
39
|
## 安装与初始化
|
|
39
40
|
|
|
40
41
|
```bash
|
|
41
|
-
npm install -g @coralai/sps-cli # 最新 0.
|
|
42
|
+
npm install -g @coralai/sps-cli # 最新 0.57.x
|
|
42
43
|
sps setup # 交互式向导(首次必跑)
|
|
43
44
|
```
|
|
44
45
|
|
|
@@ -51,7 +52,127 @@ sps setup # 交互式向导(首次必跑)
|
|
|
51
52
|
|
|
52
53
|
`sps setup --force` 重跑(保留旧值作默认)。**升级 sps-cli 后必须跑 `sps skill sync --force`** 才能拉新版 skill SOP(默认 sync 是非破坏性的,不会覆盖已有 skill)。
|
|
53
54
|
|
|
54
|
-
**前置条件**:Node ≥ 18
|
|
55
|
+
**前置条件**:Node ≥ 18(**建议 ≥ 22** —— 代码图谱功能用了 `node:sqlite`,只有 Node 22+ 才有);Anthropic API key(或 Claude Pro / Max 订阅);`claude` CLI 在 PATH。
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 部署(服务化 / 源码构建)
|
|
60
|
+
|
|
61
|
+
要把 sps-cli 作为长驻服务跑(Console 网页 + IM 网关 + 流水线),走**源码构建**部署。下面步骤 AI 或运维照着从头到尾即可完成。
|
|
62
|
+
|
|
63
|
+
### 装完 npm 包后必补(否则跑不起来)
|
|
64
|
+
|
|
65
|
+
`npm install -g @coralai/sps-cli` **只给你 `sps` 命令**。要真正跑起来,还得补:
|
|
66
|
+
|
|
67
|
+
1. **Node ≥ 22**(代码图谱用 `node:sqlite`;CLI 其余 ≥ 18 即可)。
|
|
68
|
+
2. **`claude` CLI 在 PATH** —— worker 后端连的就是它(`sps doctor` 检查 `which claude`):
|
|
69
|
+
```bash
|
|
70
|
+
npm install -g @anthropic-ai/claude-code
|
|
71
|
+
```
|
|
72
|
+
3. **Claude 鉴权**(三选一):`claude` 登录订阅(Pro / Max → `~/.claude/.credentials.json`)、或设 `ANTHROPIC_API_KEY`、或让 worker 指向第三方 Anthropic 端点 / codex-proxy。
|
|
73
|
+
4. **跑一次 `sps setup`** —— 建 `~/.coral/`、全局装 ACP 传输层 `@agentclientprotocol/claude-agent-acp`、写 `~/.coral/env`。
|
|
74
|
+
5. **git** —— 流水线在目标 repo 里开 worktree/分支。
|
|
75
|
+
|
|
76
|
+
**模型/订阅配置在包外**(secret,本机自配):官方订阅(`claude` 登录)开箱即用;第三方端点写 `~/.coral/game-platform/providers.json`;worker 默认模型 `~/.coral/agents/smartarrange.json`(可省)。
|
|
77
|
+
|
|
78
|
+
**自检机器是否就绪**:
|
|
79
|
+
```bash
|
|
80
|
+
sps project init demo
|
|
81
|
+
sps doctor demo --fix # 查 Node、claude 在不在 PATH、目录、配置——缺啥直接报
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
按需补(用到才配):ChatGPT 订阅 worker → `sps codex-proxy install && sps codex-proxy auth`;IM 网关 → `~/.coral/im/config.json`;远程 Console → `SPS_CONSOLE_TOKEN`。
|
|
85
|
+
|
|
86
|
+
### 依赖
|
|
87
|
+
|
|
88
|
+
- **Node ≥ 22** + npm(代码图谱用 `node:sqlite` 的 `DatabaseSync`,需 Node ≥ 22;CLI 其余部分 ≥ 18 即可)。
|
|
89
|
+
- **git**。
|
|
90
|
+
- **Worker 的 Claude 鉴权**:环境里有 `ANTHROPIC_API_KEY`,或已登录的 `claude` CLI(Pro / Max 订阅)。`sps setup` 会全局装 worker 传输层 `@agentclientprotocol/claude-agent-acp`。
|
|
91
|
+
- 无 native/编译依赖 —— `@colbymchenry/codegraph` 等都是纯 JS,普通 `npm install` 即可。
|
|
92
|
+
|
|
93
|
+
### 1. 克隆、装依赖、构建
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
git clone <repo-url> sps-cli && cd sps-cli
|
|
97
|
+
npm install # 根依赖
|
|
98
|
+
npm run build # 唯一正确的构建 —— 见下方警告
|
|
99
|
+
sps setup # 或 node dist/main.js setup —— 一次性搭 ~/.coral + skills + claude-agent-acp
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`npm run build` 会跑**两半**,是唯一正确的构建命令:
|
|
103
|
+
|
|
104
|
+
- `build:cli` → `rm -rf dist && tsc`(把 `src/` 编译到 `dist/`)。
|
|
105
|
+
- `build:console` → `cd console && npm install && vite build`,再把 `console/dist` 拷到 `dist/console-assets`。**console 有自己独立的 `node_modules`,这一步会帮你装好** —— 你不用单独进 `console/` 再 install。
|
|
106
|
+
|
|
107
|
+
> ⚠️ **绝不要单跑 `npm run build:cli`。** 它的 `rm -rf dist` 会连 `dist/console-assets` 一起删掉,Console 网页就 500 / 找不到 `index.html`。永远用完整的 `npm run build`。
|
|
108
|
+
|
|
109
|
+
暴露命令,或直接调 `dist/main.js`:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm link # 把 `sps` 挂到 PATH → dist/main.js
|
|
113
|
+
# 或不 link,直接:
|
|
114
|
+
node dist/main.js <command>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 2. 启动各服务
|
|
118
|
+
|
|
119
|
+
**Console(网页):**
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
sps console # 本机:127.0.0.1:4311
|
|
123
|
+
# 服务器:绑所有网卡 + 必须带鉴权 token
|
|
124
|
+
SPS_CONSOLE_TOKEN=$(openssl rand -hex 24) sps console --host 0.0.0.0 --port 4321 --no-open
|
|
125
|
+
# 然后访问 http://<host>:4321/?token=<token>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
`SPS_CONSOLE_TOKEN` 控制访问。**绑 `0.0.0.0` 时务必设它** —— 不设 token 网页在网络上就是无鉴权的。启动 banner 会打印带 token 的 URL。
|
|
129
|
+
|
|
130
|
+
**IM 网关(`sps im`)** —— Telegram / 钉钉(Stream)/ 飞书-Lark / Slack / Discord / Matrix 的收发机器人,支持在会话里切换项目:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
sps im # 前台阻塞;读 ~/.coral/im/config.json
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
推荐在 Console → **插件 → 频道** 页配置(左频道列表、右设置,自动写文件)。也可直接编辑 `~/.coral/im/config.json`:
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"console": { "url": "http://localhost:4321", "token": "<SPS_CONSOLE_TOKEN>", "agentKind": "claude" },
|
|
141
|
+
"adapters": [
|
|
142
|
+
{ "kind": "telegram", "token": "<bot-token>", "allowedChatIds": [123456789] }
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
`console.url` + `token` 把 IM 纯文本消息桥接到项目 agent 对话。**改完配置要重启 `sps im`** 才生效。(只有飞书需要公网回调,其余适配器无需入站端口。)
|
|
148
|
+
|
|
149
|
+
**流水线:**
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
sps tick my-app # 单项目前台 tick 循环
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 3. 保活
|
|
156
|
+
|
|
157
|
+
`sps console`、`sps im`、`sps tick` 都是前台进程。用 nohup 或 systemd 保活:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# nohup(简单)
|
|
161
|
+
SPS_CONSOLE_TOKEN=<hex> nohup node dist/main.js console --host 0.0.0.0 --port 4321 --no-open > ~/console.log 2>&1 &
|
|
162
|
+
nohup node dist/main.js im > ~/im.log 2>&1 &
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
systemd `--user` 服务:`ExecStart=node /abs/path/sps-cli/dist/main.js console --host 0.0.0.0 --port 4321 --no-open`,并 `Environment=SPS_CONSOLE_TOKEN=...`。
|
|
166
|
+
|
|
167
|
+
### 4. 升级
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
git pull && npm install && npm run build
|
|
171
|
+
sps skill sync --force # 升级后刷新 skill SOP
|
|
172
|
+
# 然后重启 console + im 进程,让新代码/路由加载
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
新增的 Console API 路由(如 `/api/channels`)**必须重启 console 进程**才生效 —— 光重新构建不够。
|
|
55
176
|
|
|
56
177
|
---
|
|
57
178
|
|
package/README.md
CHANGED
|
@@ -21,6 +21,7 @@ The headline feature in v0.51 is the **Wiki Knowledge Base** — opt-in per proj
|
|
|
21
21
|
## Table of contents
|
|
22
22
|
|
|
23
23
|
- [Install & setup](#install--setup)
|
|
24
|
+
- [Deployment (server / from source)](#deployment-server--from-source)
|
|
24
25
|
- [Harness mode (`sps agent`)](#harness-mode-sps-agent)
|
|
25
26
|
- [Console mode (`sps console`)](#console-mode-sps-console)
|
|
26
27
|
- [Pipeline mode (`sps tick`)](#pipeline-mode-sps-tick)
|
|
@@ -38,7 +39,7 @@ The headline feature in v0.51 is the **Wiki Knowledge Base** — opt-in per proj
|
|
|
38
39
|
## Install & setup
|
|
39
40
|
|
|
40
41
|
```bash
|
|
41
|
-
npm install -g @coralai/sps-cli # latest 0.
|
|
42
|
+
npm install -g @coralai/sps-cli # latest 0.57.x
|
|
42
43
|
sps setup # interactive wizard (must run once)
|
|
43
44
|
```
|
|
44
45
|
|
|
@@ -51,7 +52,127 @@ sps setup # interactive wizard (must run once)
|
|
|
51
52
|
|
|
52
53
|
Re-run safe with `sps setup --force` (keeps existing values as defaults). After upgrading sps-cli later, run **`sps skill sync --force`** to pull updated skill SOPs (default sync is non-destructive — won't overwrite existing skills).
|
|
53
54
|
|
|
54
|
-
**Prerequisites**: Node ≥ 18; an Anthropic API key (or Claude Pro / Max subscription); `claude` CLI in PATH.
|
|
55
|
+
**Prerequisites**: Node ≥ 18 (**≥ 22 recommended** — the code-graph feature uses `node:sqlite`, only available in Node 22+); an Anthropic API key (or Claude Pro / Max subscription); `claude` CLI in PATH.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Deployment (server / from source)
|
|
60
|
+
|
|
61
|
+
For running sps-cli as long-lived services (Console web UI + IM gateway + pipeline) on a server, deploy **from source**. An AI or operator can follow the steps below end to end.
|
|
62
|
+
|
|
63
|
+
### After installing the npm package — required extras
|
|
64
|
+
|
|
65
|
+
`npm install -g @coralai/sps-cli` gives you the `sps` CLI **only**. To actually run it, also provide:
|
|
66
|
+
|
|
67
|
+
1. **Node ≥ 22** (code-graph uses `node:sqlite`; the rest of the CLI runs on ≥ 18).
|
|
68
|
+
2. **Claude Code CLI in PATH** — the worker backend drives it (`sps doctor` checks `which claude`):
|
|
69
|
+
```bash
|
|
70
|
+
npm install -g @anthropic-ai/claude-code
|
|
71
|
+
```
|
|
72
|
+
3. **Claude auth** (one of): log in with `claude` (Pro / Max → `~/.claude/.credentials.json`), or set `ANTHROPIC_API_KEY`, or point workers at a third-party Anthropic endpoint / codex-proxy.
|
|
73
|
+
4. **Run `sps setup` once** — scaffolds `~/.coral/`, installs the ACP transport `@agentclientprotocol/claude-agent-acp` globally, writes `~/.coral/env`.
|
|
74
|
+
5. **git** — pipelines run worktrees/branches inside the target repo.
|
|
75
|
+
|
|
76
|
+
**Model / subscription config lives outside the package** (secrets, per machine): the official subscription (`claude` login) works out of the box; third-party endpoints go in `~/.coral/game-platform/providers.json`; the worker's default model in `~/.coral/agents/smartarrange.json` (optional).
|
|
77
|
+
|
|
78
|
+
**Verify the box is ready**:
|
|
79
|
+
```bash
|
|
80
|
+
sps project init demo
|
|
81
|
+
sps doctor demo --fix # checks Node, claude-in-PATH, dirs, config — reports what's missing
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Per-feature extras (only if used): ChatGPT-subscription worker → `sps codex-proxy install && sps codex-proxy auth`; IM gateway → `~/.coral/im/config.json`; remote Console → `SPS_CONSOLE_TOKEN`.
|
|
85
|
+
|
|
86
|
+
### Dependencies
|
|
87
|
+
|
|
88
|
+
- **Node ≥ 22** and npm (the code-graph feature imports `node:sqlite` — `DatabaseSync` — which requires Node ≥ 22; the rest of the CLI runs on ≥ 18).
|
|
89
|
+
- **git**.
|
|
90
|
+
- **Claude auth for workers**: either `ANTHROPIC_API_KEY` in the environment, or a logged-in `claude` CLI (Pro / Max subscription). `sps setup` installs the worker transport `@agentclientprotocol/claude-agent-acp` globally.
|
|
91
|
+
- No native/compiled dependencies — `@colbymchenry/codegraph` and the rest are pure JS; a plain `npm install` is enough.
|
|
92
|
+
|
|
93
|
+
### 1. Clone, install, build
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
git clone <repo-url> sps-cli && cd sps-cli
|
|
97
|
+
npm install # root dependencies
|
|
98
|
+
npm run build # THE build — see warning below
|
|
99
|
+
sps setup # or: node dist/main.js setup — one-time ~/.coral scaffold + skills + claude-agent-acp
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`npm run build` runs **both** halves and is the only correct build command:
|
|
103
|
+
|
|
104
|
+
- `build:cli` → `rm -rf dist && tsc` (compiles `src/` → `dist/`).
|
|
105
|
+
- `build:console` → `cd console && npm install && vite build`, then copies `console/dist` → `dist/console-assets`. **The console has its own `node_modules`; this step installs it for you** — you do not run a separate install in `console/`.
|
|
106
|
+
|
|
107
|
+
> ⚠️ **Never run `npm run build:cli` alone.** Its `rm -rf dist` wipes `dist/console-assets`, so the Console web UI breaks with a 500 / missing `index.html`. Always use the full `npm run build`.
|
|
108
|
+
|
|
109
|
+
Expose the binary, or invoke `dist/main.js` directly:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm link # puts `sps` on PATH → dist/main.js
|
|
113
|
+
# or, without linking:
|
|
114
|
+
node dist/main.js <command>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 2. Run the services
|
|
118
|
+
|
|
119
|
+
**Console (web UI):**
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
sps console # local: 127.0.0.1:4311
|
|
123
|
+
# server: bind all interfaces + REQUIRED auth token
|
|
124
|
+
SPS_CONSOLE_TOKEN=$(openssl rand -hex 24) sps console --host 0.0.0.0 --port 4321 --no-open
|
|
125
|
+
# then open http://<host>:4321/?token=<the-token>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
`SPS_CONSOLE_TOKEN` gates access. **When binding to `0.0.0.0`, always set it** — without a token the UI is unauthenticated on the network. The startup banner prints the tokenized URL.
|
|
129
|
+
|
|
130
|
+
**IM gateway (`sps im`)** — inbound + outbound bots for Telegram / DingTalk (Stream) / Feishu-Lark / Slack / Discord / Matrix, with in-chat project switching:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
sps im # foreground; reads ~/.coral/im/config.json
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Configure channels the easy way in the Console → **Plugins → Channel** page (left = channel list, right = settings; it writes the file for you). Or edit `~/.coral/im/config.json` directly:
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"console": { "url": "http://localhost:4321", "token": "<SPS_CONSOLE_TOKEN>", "agentKind": "claude" },
|
|
141
|
+
"adapters": [
|
|
142
|
+
{ "kind": "telegram", "token": "<bot-token>", "allowedChatIds": [123456789] }
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
`console.url` + `token` bridge IM plain-text messages to project-agent chat. **After changing the config, restart `sps im`** for it to take effect. (Feishu is the only adapter needing a public callback; the rest work without inbound ports.)
|
|
148
|
+
|
|
149
|
+
**Pipeline:**
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
sps tick my-app # foreground tick loop for one project
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 3. Keep the services alive
|
|
156
|
+
|
|
157
|
+
`sps console`, `sps im`, and `sps tick` are foreground processes. Use nohup or a systemd unit for persistence:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# nohup (simple)
|
|
161
|
+
SPS_CONSOLE_TOKEN=<hex> nohup node dist/main.js console --host 0.0.0.0 --port 4321 --no-open > ~/console.log 2>&1 &
|
|
162
|
+
nohup node dist/main.js im > ~/im.log 2>&1 &
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
For a systemd `--user` service, point `ExecStart=node /abs/path/sps-cli/dist/main.js console --host 0.0.0.0 --port 4321 --no-open` and set `Environment=SPS_CONSOLE_TOKEN=...`.
|
|
166
|
+
|
|
167
|
+
### 4. Upgrading
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
git pull && npm install && npm run build
|
|
171
|
+
sps skill sync --force # refresh skill SOPs after an upgrade
|
|
172
|
+
# then restart the console + im processes so new code/routes load
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Newly added Console API routes (e.g. `/api/channels`) only take effect after the console process restarts — rebuild alone is not enough.
|
|
55
176
|
|
|
56
177
|
---
|
|
57
178
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexProxyCommand.d.ts","sourceRoot":"","sources":["../../src/commands/codexProxyCommand.ts"],"names":[],"mappings":"AAoBA,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoErF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/codexProxyCommand
|
|
3
|
+
* @description `sps codex-proxy <start|stop|status>` —— 手动管 claude-code-proxy 后台单例
|
|
4
|
+
* (ChatGPT 订阅→Anthropic 兼容翻译)。tick 会在 worker=codex-proxy 时自动拉起,
|
|
5
|
+
* 本命令供手动起停/排障。
|
|
6
|
+
* @layer command
|
|
7
|
+
* @boundedContext worker-lifecycle
|
|
8
|
+
*/
|
|
9
|
+
import { spawnSync } from 'node:child_process';
|
|
10
|
+
import { CODEX_PROXY_INSTALL_SH, codexProxyBinPath, codexProxyStatus, ensureCodexProxyRunning, stopCodexProxy, } from '../core/agents/sidecar/CodexProxyManager.js';
|
|
11
|
+
const INSTALL_SH = CODEX_PROXY_INSTALL_SH;
|
|
12
|
+
const RELEASES = 'https://github.com/raine/claude-code-proxy/releases';
|
|
13
|
+
export async function executeCodexProxyCommand(sub) {
|
|
14
|
+
switch (sub) {
|
|
15
|
+
case 'install': {
|
|
16
|
+
if (codexProxyBinPath()) {
|
|
17
|
+
process.stdout.write('claude-code-proxy 已安装。授权:sps codex-proxy auth\n');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (spawnSync('which', ['curl']).status !== 0) {
|
|
21
|
+
process.stderr.write(`需要 curl。手动装:见 ${RELEASES}(或 brew install raine/claude-code-proxy/claude-code-proxy)\n`);
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// 官方安装脚本:检测 os/arch → 下 release 二进制 → /usr/local/bin(可写)否则 ~/.local/bin(无需 sudo)。
|
|
26
|
+
// CLAUDE_CODE_PROXY_VERSION 可锁版本,CLAUDE_CODE_PROXY_INSTALL_DIR 可指定目录(透传自当前 env)。
|
|
27
|
+
process.stdout.write(`运行官方安装脚本:curl -fsSL ${INSTALL_SH} | bash\n`);
|
|
28
|
+
const r = spawnSync('bash', ['-c', `curl -fsSL ${INSTALL_SH} | bash`], { stdio: 'inherit' });
|
|
29
|
+
if (r.status !== 0) {
|
|
30
|
+
process.stderr.write(`\n安装脚本失败;可手动装:${RELEASES}\n`);
|
|
31
|
+
process.exitCode = r.status ?? 1;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (codexProxyBinPath()) {
|
|
35
|
+
process.stdout.write('装好。下一步授权:sps codex-proxy auth\n');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// 多半落在 ~/.local/bin 而不在 PATH。
|
|
39
|
+
process.stdout.write('已安装,但当前 PATH 未找到——把 ~/.local/bin 加入 PATH(或见脚本输出的路径),再跑 sps codex-proxy auth\n');
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
case 'auth': {
|
|
44
|
+
if (!codexProxyBinPath()) {
|
|
45
|
+
process.stderr.write('未装 claude-code-proxy。先跑:sps codex-proxy install\n');
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// 交互式设备码授权,继承 stdio。
|
|
50
|
+
const r = spawnSync('claude-code-proxy', ['codex', 'auth', 'device'], { stdio: 'inherit' });
|
|
51
|
+
process.exitCode = r.status ?? 0;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
case 'start': {
|
|
55
|
+
const { baseUrl } = await ensureCodexProxyRunning();
|
|
56
|
+
process.stdout.write(`codex-proxy 运行中:${baseUrl}\n`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
case 'stop': {
|
|
60
|
+
const stopped = stopCodexProxy();
|
|
61
|
+
process.stdout.write(stopped ? 'codex-proxy 已停\n' : 'codex-proxy 未在运行\n');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
case 'status':
|
|
65
|
+
case undefined: {
|
|
66
|
+
const s = await codexProxyStatus();
|
|
67
|
+
process.stdout.write([
|
|
68
|
+
`binary: ${s.binInstalled ? '已安装' : '缺失(sps codex-proxy install)'}`,
|
|
69
|
+
`auth: ${s.authed ? `已授权${s.account ? ` (account ${s.account})` : ''}` : '未授权(sps codex-proxy auth)'}`,
|
|
70
|
+
`running: ${s.running ? `是 (pid ${s.pid})` : '否'}`,
|
|
71
|
+
`healthy: ${s.healthy ? '是' : '否'}`,
|
|
72
|
+
`baseUrl: ${s.baseUrl}`,
|
|
73
|
+
].join('\n') + '\n');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
default:
|
|
77
|
+
process.stderr.write(`未知子命令 '${sub}'。用法:sps codex-proxy <install|auth|start|stop|status>\n`);
|
|
78
|
+
process.exitCode = 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=codexProxyCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexProxyCommand.js","sourceRoot":"","sources":["../../src/commands/codexProxyCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphCommand.d.ts","sourceRoot":"","sources":["../../src/commands/graphCommand.ts"],"names":[],"mappings":"AA0CA,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CA4Df"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/graphCommand
|
|
3
|
+
* @description `sps graph <build|sync|status> [projectOrPath]` —— 项目级代码图谱建图/增量/状态。
|
|
4
|
+
* 目标目录:受管项目名→其 repoDir;否则当作路径;省略则当前目录(便于对 sps-cli 自身建图)。
|
|
5
|
+
* @layer command
|
|
6
|
+
* @boundedContext codegraph
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, statSync } from 'node:fs';
|
|
9
|
+
import { resolve } from 'node:path';
|
|
10
|
+
import { ProjectContext } from '../core/context.js';
|
|
11
|
+
import { buildGraph, READ_SUBCOMMANDS, readGraphStatus, runGraphQuery, syncGraph, } from '../core/codegraph/CodeGraphService.js';
|
|
12
|
+
/** 把 <projectOrPath> 解析成实际代码目录。 */
|
|
13
|
+
function resolveTargetDir(projectOrPath) {
|
|
14
|
+
if (!projectOrPath)
|
|
15
|
+
return { dir: process.cwd(), label: process.cwd() };
|
|
16
|
+
// 优先当作受管项目名(conf 能加载就用其 repoDir)。
|
|
17
|
+
try {
|
|
18
|
+
const ctx = ProjectContext.load(projectOrPath);
|
|
19
|
+
return { dir: ctx.paths.repoDir, label: `${projectOrPath} → ${ctx.paths.repoDir}` };
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// 退化:当作目录路径。
|
|
23
|
+
const p = resolve(projectOrPath);
|
|
24
|
+
if (existsSync(p) && statSync(p).isDirectory())
|
|
25
|
+
return { dir: p, label: p };
|
|
26
|
+
throw new Error(`"${projectOrPath}" 既不是受管项目,也不是有效目录`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function printStatus(st) {
|
|
30
|
+
const mb = (st.dbSizeBytes / 1024 / 1024).toFixed(2);
|
|
31
|
+
console.log(` 文件 ${st.files} 节点 ${st.nodes.toLocaleString()} 边 ${st.edges.toLocaleString()} db ${mb} MB`);
|
|
32
|
+
const kinds = Object.entries(st.nodesByKind).sort((a, b) => b[1] - a[1]).slice(0, 6);
|
|
33
|
+
if (kinds.length)
|
|
34
|
+
console.log(` 主要节点:${kinds.map(([k, c]) => `${k} ${c}`).join(' · ')}`);
|
|
35
|
+
}
|
|
36
|
+
export async function executeGraphCommand(subcommand, projectOrPath, positionals, flags) {
|
|
37
|
+
const json = Boolean(flags.json);
|
|
38
|
+
// ── 只读查询(worker 用:`sps graph explore <关键词>` 一次拿回相关代码,省 token)──
|
|
39
|
+
// 目标目录 = 当前工作目录(worker 的 cwd 即项目);第一个位置参数起都算查询词。
|
|
40
|
+
if (subcommand && READ_SUBCOMMANDS.includes(subcommand)) {
|
|
41
|
+
const queryArgs = [projectOrPath, ...positionals].filter((s) => !!s);
|
|
42
|
+
const r = await runGraphQuery(process.cwd(), subcommand, queryArgs);
|
|
43
|
+
console.log(r.output || '(无结果)');
|
|
44
|
+
if (!r.ok)
|
|
45
|
+
process.exit(1);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (!subcommand || !['build', 'sync', 'status'].includes(subcommand)) {
|
|
49
|
+
console.error('Usage: sps graph <build|sync|status|explore|node|query|callers|callees|impact> [args] [--json]');
|
|
50
|
+
process.exit(2);
|
|
51
|
+
}
|
|
52
|
+
let target;
|
|
53
|
+
try {
|
|
54
|
+
target = resolveTargetDir(projectOrPath);
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
console.error(e instanceof Error ? e.message : String(e));
|
|
58
|
+
process.exit(2);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (subcommand === 'status') {
|
|
62
|
+
const st = readGraphStatus(target.dir);
|
|
63
|
+
if (json) {
|
|
64
|
+
console.log(JSON.stringify(st ?? { exists: false }, null, 2));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (!st) {
|
|
68
|
+
console.log(`(未建图:${target.label}) 跑 sps graph build 生成`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
console.log(`代码图谱 · ${target.label}`);
|
|
72
|
+
printStatus(st);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const verb = subcommand === 'build' ? '建图' : '增量同步';
|
|
76
|
+
if (!json)
|
|
77
|
+
console.log(`${verb}中 · ${target.label} …`);
|
|
78
|
+
try {
|
|
79
|
+
const st = subcommand === 'build' ? await buildGraph(target.dir) : await syncGraph(target.dir);
|
|
80
|
+
if (json) {
|
|
81
|
+
console.log(JSON.stringify(st, null, 2));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
console.log(`✓ ${verb}完成`);
|
|
85
|
+
printStatus(st);
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
if (json) {
|
|
89
|
+
console.log(JSON.stringify({ ok: false, error: e instanceof Error ? e.message : String(e) }, null, 2));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.error(`✗ ${verb}失败:${e instanceof Error ? e.message : String(e)}`);
|
|
93
|
+
}
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=graphCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphCommand.js","sourceRoot":"","sources":["../../src/commands/graphCommand.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,SAAS,GAGV,MAAM,uCAAuC,CAAC;AAE/C,mCAAmC;AACnC,SAAS,gBAAgB,CAAC,aAA6B;IACrD,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IACxE,kCAAkC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/C,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,aAAa,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,aAAa;QACb,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACjC,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,IAAI,aAAa,mBAAmB,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAe;IAClC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9G,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAyB,EACzB,aAA4B,EAC5B,WAAqB,EACrB,KAA8B;IAE9B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjC,iEAAiE;IACjE,iDAAiD;IACjD,IAAI,UAAU,IAAK,gBAAsC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/E,MAAM,SAAS,GAAG,CAAC,aAAa,EAAE,GAAG,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAA4B,EAAE,SAAS,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,gGAAgG,CAAC,CAAC;QAChH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAsC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,KAAK,yBAAyB,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACtC,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACpD,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/F,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;QAC3B,WAAW,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACzG,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imCommand.d.ts","sourceRoot":"","sources":["../../src/commands/imCommand.ts"],"names":[],"mappings":"AASA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BtD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module commands/imCommand
|
|
3
|
+
* @description `sps im` —— 启动 IM 网关(前台阻塞,像 sps console)。读 ~/.coral/im/config.json,
|
|
4
|
+
* 加载/启动各平台适配器,把 IM 消息路由到项目命令/(P2)agent 对话。Ctrl+C 优雅停。
|
|
5
|
+
* @layer command
|
|
6
|
+
* @boundedContext im-gateway
|
|
7
|
+
*/
|
|
8
|
+
import { IMGatewayManager } from '../im/IMGatewayManager.js';
|
|
9
|
+
export async function executeImCommand() {
|
|
10
|
+
const mgr = new IMGatewayManager();
|
|
11
|
+
const n = mgr.load();
|
|
12
|
+
if (n === 0) {
|
|
13
|
+
console.log(' 没有可用的 IM 适配器。请配置 ~/.coral/im/config.json,例如:');
|
|
14
|
+
console.log(' { "adapters": [ { "kind": "telegram", "token": "<BotFather token>", "allowedChatIds": [123456] } ] }');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const shutdown = async (sig) => {
|
|
18
|
+
process.stderr.write(`\n[im] ${sig} — 停止网关...\n`);
|
|
19
|
+
await mgr.stop();
|
|
20
|
+
process.exit(0);
|
|
21
|
+
};
|
|
22
|
+
process.on('SIGINT', () => void shutdown('SIGINT'));
|
|
23
|
+
process.on('SIGTERM', () => void shutdown('SIGTERM'));
|
|
24
|
+
mgr.start();
|
|
25
|
+
console.log('');
|
|
26
|
+
console.log(` ┌───────────────────────────────────────────────┐`);
|
|
27
|
+
console.log(` │ SPS IM Gateway 运行中(${String(n).padEnd(2)} 个适配器) │`);
|
|
28
|
+
console.log(` │ IM 里发 /help 看命令。Ctrl+C 停。 │`);
|
|
29
|
+
console.log(` └───────────────────────────────────────────────┘`);
|
|
30
|
+
console.log('');
|
|
31
|
+
// 保持进程活到 SIGINT
|
|
32
|
+
await new Promise(() => { });
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=imCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imCommand.js","sourceRoot":"","sources":["../../src/commands/imCommand.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACnC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,wGAAwG,CAAC,CAAC;QACtH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;QACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC;QAClD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtD,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,gBAAgB;IAChB,MAAM,IAAI,OAAO,CAAO,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipelineTick.d.ts","sourceRoot":"","sources":["../../src/commands/pipelineTick.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipelineTick.d.ts","sourceRoot":"","sources":["../../src/commands/pipelineTick.ts"],"names":[],"mappings":"AAcA,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAmEf"}
|
|
@@ -9,10 +9,19 @@ import { ProcessSupervisor } from '../manager/supervisor.js';
|
|
|
9
9
|
import { WorkerManagerImpl } from '../manager/worker-manager-impl.js';
|
|
10
10
|
import { createNotifier, createRepoBackend, createTaskBackend } from '../providers/registry.js';
|
|
11
11
|
import { makeBackendFactory } from '../manager/makeBackendFactory.js';
|
|
12
|
+
import { ensureCodexProxyIfNeeded } from '../core/agents/sidecar/CodexProxyManager.js';
|
|
12
13
|
export async function executePipelineTick(project, flags) {
|
|
13
14
|
const log = new Logger('pipeline', project);
|
|
14
15
|
const jsonOutput = !!flags.json;
|
|
15
16
|
const dryRun = !!flags['dry-run'];
|
|
17
|
+
// codex-proxy(ChatGPT 订阅)worker → 先确保翻译 sidecar 在跑;worker≠codex-proxy 则 no-op。
|
|
18
|
+
try {
|
|
19
|
+
await ensureCodexProxyIfNeeded();
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
log.error(`codex-proxy 启动失败:${err instanceof Error ? err.message : String(err)}`);
|
|
23
|
+
process.exit(4);
|
|
24
|
+
}
|
|
16
25
|
let ctx;
|
|
17
26
|
try {
|
|
18
27
|
ctx = ProjectContext.load(project);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipelineTick.js","sourceRoot":"","sources":["../../src/commands/pipelineTick.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"pipelineTick.js","sourceRoot":"","sources":["../../src/commands/pipelineTick.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAsB3C,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAsB3C,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA0LhF;AASD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAyB1D"}
|
package/dist/commands/setup.js
CHANGED
|
@@ -226,6 +226,9 @@ export async function executeSetup(flags) {
|
|
|
226
226
|
console.log(' 5. Run health check:');
|
|
227
227
|
console.log(' sps doctor <project-name> --fix');
|
|
228
228
|
console.log('');
|
|
229
|
+
console.log(' (可选) 无 Claude 订阅?用 ChatGPT 订阅跑 worker:');
|
|
230
|
+
console.log(' sps codex-proxy install # 装 claude-code-proxy + 授权,再在控制台模型页选 codex-proxy');
|
|
231
|
+
console.log('');
|
|
229
232
|
prompt.close();
|
|
230
233
|
}
|
|
231
234
|
// ─── Skill Sync ──────────────────────────────────────────────────
|