@zmice/zc 0.1.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 +87 -0
- package/dist/adapters/codex.d.ts +13 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +61 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/qwen-code.d.ts +13 -0
- package/dist/adapters/qwen-code.d.ts.map +1 -0
- package/dist/adapters/qwen-code.js +60 -0
- package/dist/adapters/qwen-code.js.map +1 -0
- package/dist/adapters/types.d.ts +29 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +11 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli/doctor.d.ts +3 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +98 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +22 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/msg.d.ts +3 -0
- package/dist/cli/msg.d.ts.map +1 -0
- package/dist/cli/msg.js +20 -0
- package/dist/cli/msg.js.map +1 -0
- package/dist/cli/run.d.ts +17 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +70 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/setup.d.ts +3 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +41 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/task.d.ts +3 -0
- package/dist/cli/task.d.ts.map +1 -0
- package/dist/cli/task.js +20 -0
- package/dist/cli/task.js.map +1 -0
- package/dist/cli/team.d.ts +3 -0
- package/dist/cli/team.d.ts.map +1 -0
- package/dist/cli/team.js +169 -0
- package/dist/cli/team.js.map +1 -0
- package/dist/runtime/logger.d.ts +2 -0
- package/dist/runtime/logger.d.ts.map +1 -0
- package/dist/runtime/logger.js +2 -0
- package/dist/runtime/logger.js.map +1 -0
- package/dist/runtime/session-manager.d.ts +39 -0
- package/dist/runtime/session-manager.d.ts.map +1 -0
- package/dist/runtime/session-manager.js +107 -0
- package/dist/runtime/session-manager.js.map +1 -0
- package/dist/runtime/state.d.ts +9 -0
- package/dist/runtime/state.d.ts.map +1 -0
- package/dist/runtime/state.js +22 -0
- package/dist/runtime/state.js.map +1 -0
- package/dist/runtime/worktree-manager.d.ts +39 -0
- package/dist/runtime/worktree-manager.d.ts.map +1 -0
- package/dist/runtime/worktree-manager.js +123 -0
- package/dist/runtime/worktree-manager.js.map +1 -0
- package/dist/team/mailbox.d.ts +22 -0
- package/dist/team/mailbox.d.ts.map +1 -0
- package/dist/team/mailbox.js +52 -0
- package/dist/team/mailbox.js.map +1 -0
- package/dist/team/orchestrator.d.ts +68 -0
- package/dist/team/orchestrator.d.ts.map +1 -0
- package/dist/team/orchestrator.js +248 -0
- package/dist/team/orchestrator.js.map +1 -0
- package/dist/team/task-queue.d.ts +34 -0
- package/dist/team/task-queue.d.ts.map +1 -0
- package/dist/team/task-queue.js +97 -0
- package/dist/team/task-queue.js.map +1 -0
- package/dist/team/worker-manager.d.ts +54 -0
- package/dist/team/worker-manager.d.ts.map +1 -0
- package/dist/team/worker-manager.js +159 -0
- package/dist/team/worker-manager.js.map +1 -0
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +2 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/platform.d.ts +17 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +46 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/skill-loader.d.ts +46 -0
- package/dist/utils/skill-loader.d.ts.map +1 -0
- package/dist/utils/skill-loader.js +210 -0
- package/dist/utils/skill-loader.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# zc — Multi-CLI Team Orchestration
|
|
2
|
+
|
|
3
|
+
zc 是一个多 CLI 智能体团队编排运行时,支持将 Codex、Qwen Code 等 AI CLI 工具组建为协作团队,并行处理开发任务。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
### 全局安装(推荐)
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g @zmice/zc
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### 从源码安装
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone <repo-url>
|
|
17
|
+
cd ai-coding/zc
|
|
18
|
+
npm install && npm run build
|
|
19
|
+
npm link
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 快速开始
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 检查环境
|
|
26
|
+
zc doctor
|
|
27
|
+
|
|
28
|
+
# 单任务运行
|
|
29
|
+
zc run "实现用户登录功能"
|
|
30
|
+
|
|
31
|
+
# 启动团队(2 个 worker 并行处理 3 个任务)
|
|
32
|
+
zc team start \
|
|
33
|
+
-w "w1:codex,w2:qwen-code" \
|
|
34
|
+
-t "实现登录API" \
|
|
35
|
+
-t "编写登录页面" \
|
|
36
|
+
-t "添加认证中间件"
|
|
37
|
+
|
|
38
|
+
# 查看团队状态
|
|
39
|
+
zc team status <team-name>
|
|
40
|
+
|
|
41
|
+
# 发送消息
|
|
42
|
+
zc msg send w1 "优先处理API端点"
|
|
43
|
+
|
|
44
|
+
# 关闭团队
|
|
45
|
+
zc team shutdown <team-name>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 命令速览
|
|
49
|
+
|
|
50
|
+
| 命令 | 说明 |
|
|
51
|
+
|------|------|
|
|
52
|
+
| `zc doctor` | 检查环境依赖(Node.js、git、tmux、CLI 工具) |
|
|
53
|
+
| `zc setup` | 初始化项目配置 |
|
|
54
|
+
| `zc run <prompt>` | 单 worker 运行任务 |
|
|
55
|
+
| `zc team start` | 启动多 worker 团队 |
|
|
56
|
+
| `zc team status` | 查看团队运行状态 |
|
|
57
|
+
| `zc team shutdown` | 关闭团队 |
|
|
58
|
+
| `zc team log` | 查看 worker 日志 |
|
|
59
|
+
| `zc task list/claim/done/fail` | 任务管理 |
|
|
60
|
+
| `zc msg send/read/broadcast` | 团队消息 |
|
|
61
|
+
|
|
62
|
+
## 新增功能:智能技能匹配
|
|
63
|
+
|
|
64
|
+
zc 支持三种技能匹配模式,为任务自动注入相关 Skill 上下文:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# 默认:关键词匹配(支持中英文)
|
|
68
|
+
zc team start -w "w1:codex" -t "修复登录bug"
|
|
69
|
+
|
|
70
|
+
# 手动指定 skills
|
|
71
|
+
zc team start -w "w1:codex" -t "任务描述" \
|
|
72
|
+
--skills debugging-and-error-recovery security-and-hardening
|
|
73
|
+
|
|
74
|
+
# AI 智能匹配
|
|
75
|
+
zc team start -w "w1:codex" -t "任务描述" \
|
|
76
|
+
--skill-match ai
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 系统要求
|
|
80
|
+
|
|
81
|
+
- Node.js >= 20
|
|
82
|
+
- git
|
|
83
|
+
- tmux(macOS/Linux/WSL,团队模式需要)
|
|
84
|
+
|
|
85
|
+
## License
|
|
86
|
+
|
|
87
|
+
MIT
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CLIAdapter, SpawnOptions, WorkerProcess } from "./types.js";
|
|
2
|
+
export declare class CodexAdapter implements CLIAdapter {
|
|
3
|
+
readonly name = "codex";
|
|
4
|
+
detect(): Promise<boolean>;
|
|
5
|
+
version(): Promise<string>;
|
|
6
|
+
spawn(opts: SpawnOptions): Promise<WorkerProcess>;
|
|
7
|
+
injectContext(ctx: string): Promise<void>;
|
|
8
|
+
healthCheck(): Promise<boolean>;
|
|
9
|
+
query(prompt: string, opts?: {
|
|
10
|
+
timeout?: number;
|
|
11
|
+
}): Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI1E,qBAAa,YAAa,YAAW,UAAU;IAC7C,QAAQ,CAAC,IAAI,WAAW;IAElB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAS1B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAS1B,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBjD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAK1E"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { exec, spawn } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
export class CodexAdapter {
|
|
5
|
+
name = "codex";
|
|
6
|
+
async detect() {
|
|
7
|
+
try {
|
|
8
|
+
await execAsync("codex --version");
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async version() {
|
|
16
|
+
try {
|
|
17
|
+
const { stdout } = await execAsync("codex --version");
|
|
18
|
+
return stdout.trim();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return "not installed";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async spawn(opts) {
|
|
25
|
+
const args = ["--quiet"];
|
|
26
|
+
if (opts.model)
|
|
27
|
+
args.push("--model", opts.model);
|
|
28
|
+
if (opts.prompt)
|
|
29
|
+
args.push(opts.prompt);
|
|
30
|
+
if (opts.args)
|
|
31
|
+
args.push(...opts.args);
|
|
32
|
+
const proc = spawn("codex", args, {
|
|
33
|
+
cwd: opts.workdir,
|
|
34
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
35
|
+
env: { ...process.env, ...opts.env },
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
pid: proc.pid ?? -1,
|
|
39
|
+
process: proc,
|
|
40
|
+
async kill() {
|
|
41
|
+
if (!proc.killed) {
|
|
42
|
+
proc.kill("SIGTERM");
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async injectContext(ctx) {
|
|
48
|
+
// Codex reads AGENTS.md from project root automatically
|
|
49
|
+
// Additional context injected via stdin/prompt
|
|
50
|
+
void ctx;
|
|
51
|
+
}
|
|
52
|
+
async healthCheck() {
|
|
53
|
+
return this.detect();
|
|
54
|
+
}
|
|
55
|
+
async query(prompt, opts) {
|
|
56
|
+
const timeout = opts?.timeout ?? 15000;
|
|
57
|
+
const { stdout } = await execAsync(`codex --quiet ${JSON.stringify(prompt)}`, { timeout });
|
|
58
|
+
return stdout.trim();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,OAAO,CAAC;IAExB,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,iBAAiB,CAAC,CAAC;YACtD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAkB;QAC5B,MAAM,IAAI,GAAa,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YAChC,GAAG,EAAE,IAAI,CAAC,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;SACrC,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YACnB,OAAO,EAAE,IAAI;YACb,KAAK,CAAC,IAAI;gBACR,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAW;QAC7B,wDAAwD;QACxD,+CAA+C;QAC/C,KAAK,GAAG,CAAC;IACX,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,IAA2B;QACrD,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC;QACvC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQvE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACpC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { registerAdapter, getAdapter, listAdapters } from "./types.js";
|
|
2
|
+
import { CodexAdapter } from "./codex.js";
|
|
3
|
+
import { QwenCodeAdapter } from "./qwen-code.js";
|
|
4
|
+
// Auto-register built-in adapters
|
|
5
|
+
registerAdapter(new CodexAdapter());
|
|
6
|
+
registerAdapter(new QwenCodeAdapter());
|
|
7
|
+
export { getAdapter, listAdapters };
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,kCAAkC;AAClC,eAAe,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;AACpC,eAAe,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CLIAdapter, SpawnOptions, WorkerProcess } from "./types.js";
|
|
2
|
+
export declare class QwenCodeAdapter implements CLIAdapter {
|
|
3
|
+
readonly name = "qwen-code";
|
|
4
|
+
detect(): Promise<boolean>;
|
|
5
|
+
version(): Promise<string>;
|
|
6
|
+
spawn(opts: SpawnOptions): Promise<WorkerProcess>;
|
|
7
|
+
injectContext(ctx: string): Promise<void>;
|
|
8
|
+
healthCheck(): Promise<boolean>;
|
|
9
|
+
query(prompt: string, opts?: {
|
|
10
|
+
timeout?: number;
|
|
11
|
+
}): Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=qwen-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen-code.d.ts","sourceRoot":"","sources":["../../src/adapters/qwen-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI1E,qBAAa,eAAgB,YAAW,UAAU;IAChD,QAAQ,CAAC,IAAI,eAAe;IAEtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAS1B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAS1B,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBjD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAK1E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { exec, spawn } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
export class QwenCodeAdapter {
|
|
5
|
+
name = "qwen-code";
|
|
6
|
+
async detect() {
|
|
7
|
+
try {
|
|
8
|
+
await execAsync("qwen --version");
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async version() {
|
|
16
|
+
try {
|
|
17
|
+
const { stdout } = await execAsync("qwen --version");
|
|
18
|
+
return stdout.trim();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return "not installed";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async spawn(opts) {
|
|
25
|
+
const args = ["chat", "--agent"];
|
|
26
|
+
if (opts.model)
|
|
27
|
+
args.push("--model", opts.model);
|
|
28
|
+
if (opts.prompt)
|
|
29
|
+
args.push("--message", opts.prompt);
|
|
30
|
+
if (opts.args)
|
|
31
|
+
args.push(...opts.args);
|
|
32
|
+
const proc = spawn("qwen", args, {
|
|
33
|
+
cwd: opts.workdir,
|
|
34
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
35
|
+
env: { ...process.env, ...opts.env },
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
pid: proc.pid ?? -1,
|
|
39
|
+
process: proc,
|
|
40
|
+
async kill() {
|
|
41
|
+
if (!proc.killed) {
|
|
42
|
+
proc.kill("SIGTERM");
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async injectContext(ctx) {
|
|
48
|
+
// Qwen Code reads QWEN.md from extensions automatically
|
|
49
|
+
void ctx;
|
|
50
|
+
}
|
|
51
|
+
async healthCheck() {
|
|
52
|
+
return this.detect();
|
|
53
|
+
}
|
|
54
|
+
async query(prompt, opts) {
|
|
55
|
+
const timeout = opts?.timeout ?? 15000;
|
|
56
|
+
const { stdout } = await execAsync(`qwen chat --message ${JSON.stringify(prompt)}`, { timeout });
|
|
57
|
+
return stdout.trim();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=qwen-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen-code.js","sourceRoot":"","sources":["../../src/adapters/qwen-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,OAAO,eAAe;IACjB,IAAI,GAAG,WAAW,CAAC;IAE5B,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;YACrD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAkB;QAC5B,MAAM,IAAI,GAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;YAC/B,GAAG,EAAE,IAAI,CAAC,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;SACrC,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YACnB,OAAO,EAAE,IAAI;YACb,KAAK,CAAC,IAAI;gBACR,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAW;QAC7B,wDAAwD;QACxD,KAAK,GAAG,CAAC;IACX,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc,EAAE,IAA2B;QACrD,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC;QACvC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjG,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ChildProcess } from "node:child_process";
|
|
2
|
+
export interface SpawnOptions {
|
|
3
|
+
workdir: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
prompt?: string;
|
|
6
|
+
args?: string[];
|
|
7
|
+
env?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export interface WorkerProcess {
|
|
10
|
+
pid: number;
|
|
11
|
+
process: ChildProcess;
|
|
12
|
+
kill(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export interface CLIAdapter {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
detect(): Promise<boolean>;
|
|
17
|
+
version(): Promise<string>;
|
|
18
|
+
spawn(opts: SpawnOptions): Promise<WorkerProcess>;
|
|
19
|
+
injectContext(ctx: string): Promise<void>;
|
|
20
|
+
healthCheck(): Promise<boolean>;
|
|
21
|
+
/** One-shot AI query — send prompt, get text response */
|
|
22
|
+
query?(prompt: string, opts?: {
|
|
23
|
+
timeout?: number;
|
|
24
|
+
}): Promise<string>;
|
|
25
|
+
}
|
|
26
|
+
export declare function registerAdapter(adapter: CLIAdapter): void;
|
|
27
|
+
export declare function getAdapter(name: string): CLIAdapter | undefined;
|
|
28
|
+
export declare function listAdapters(): string[];
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAClD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,yDAAyD;IACzD,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtE;AAID,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAEzD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE/D;AAED,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const adapters = new Map();
|
|
2
|
+
export function registerAdapter(adapter) {
|
|
3
|
+
adapters.set(adapter.name, adapter);
|
|
4
|
+
}
|
|
5
|
+
export function getAdapter(name) {
|
|
6
|
+
return adapters.get(name);
|
|
7
|
+
}
|
|
8
|
+
export function listAdapters() {
|
|
9
|
+
return Array.from(adapters.keys());
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AA2BA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE/C,MAAM,UAAU,eAAe,CAAC,OAAmB;IACjD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwF5D"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { detectPlatform } from "../utils/platform.js";
|
|
2
|
+
function ok(msg) {
|
|
3
|
+
console.log(` \x1b[32m[OK]\x1b[0m ${msg}`);
|
|
4
|
+
}
|
|
5
|
+
function warn(msg) {
|
|
6
|
+
console.log(` \x1b[33m[WARN]\x1b[0m ${msg}`);
|
|
7
|
+
}
|
|
8
|
+
function fail(msg) {
|
|
9
|
+
console.log(` \x1b[31m[FAIL]\x1b[0m ${msg}`);
|
|
10
|
+
}
|
|
11
|
+
export function registerDoctorCommand(program) {
|
|
12
|
+
program
|
|
13
|
+
.command("doctor")
|
|
14
|
+
.description("诊断运行环境")
|
|
15
|
+
.action(async () => {
|
|
16
|
+
console.log("\n🔍 zc doctor — 环境诊断\n");
|
|
17
|
+
const info = await detectPlatform();
|
|
18
|
+
let hasError = false;
|
|
19
|
+
// OS
|
|
20
|
+
switch (info.os) {
|
|
21
|
+
case "macos":
|
|
22
|
+
ok("Platform: macOS");
|
|
23
|
+
break;
|
|
24
|
+
case "linux":
|
|
25
|
+
ok("Platform: Linux");
|
|
26
|
+
break;
|
|
27
|
+
case "windows-wsl":
|
|
28
|
+
ok("Platform: Windows (WSL Ubuntu)");
|
|
29
|
+
break;
|
|
30
|
+
case "windows-native":
|
|
31
|
+
warn("Platform: Windows (native) — 建议使用 WSL Ubuntu 以获得完整 tmux 支持");
|
|
32
|
+
break;
|
|
33
|
+
default:
|
|
34
|
+
warn(`Platform: unknown (${process.platform})`);
|
|
35
|
+
}
|
|
36
|
+
// Node.js
|
|
37
|
+
if (info.node.meetsMinimum) {
|
|
38
|
+
ok(`Node.js: ${info.node.version}`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
fail(`Node.js: ${info.node.version} — 需要 >= 20.0.0`);
|
|
42
|
+
hasError = true;
|
|
43
|
+
}
|
|
44
|
+
// git
|
|
45
|
+
if (info.git.available) {
|
|
46
|
+
ok(`git: ${info.git.version}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
fail("git: not found — 请安装 git");
|
|
50
|
+
hasError = true;
|
|
51
|
+
}
|
|
52
|
+
// tmux
|
|
53
|
+
if (info.tmux.available) {
|
|
54
|
+
ok(`tmux: ${info.tmux.version}`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
if (info.os === "windows-wsl" || info.os === "linux") {
|
|
58
|
+
warn("tmux: not found — 安装: sudo apt install tmux");
|
|
59
|
+
}
|
|
60
|
+
else if (info.os === "macos") {
|
|
61
|
+
warn("tmux: not found — 安装: brew install tmux");
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
warn("tmux: not found");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// CLI detection
|
|
68
|
+
console.log("");
|
|
69
|
+
const { exec: execCb } = await import("node:child_process");
|
|
70
|
+
const { promisify } = await import("node:util");
|
|
71
|
+
const execAsync = promisify(execCb);
|
|
72
|
+
// Codex CLI check
|
|
73
|
+
try {
|
|
74
|
+
const { stdout } = await execAsync("codex --version");
|
|
75
|
+
ok(`Codex CLI: ${stdout.trim()}`);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
warn("Codex CLI: not found (install: npm i -g @openai/codex)");
|
|
79
|
+
}
|
|
80
|
+
// Qwen Code check
|
|
81
|
+
try {
|
|
82
|
+
const { stdout } = await execAsync("qwen --version");
|
|
83
|
+
ok(`Qwen Code: ${stdout.trim()}`);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
warn("Qwen Code: not found (install: npm i -g @anthropic/qwen-code)");
|
|
87
|
+
}
|
|
88
|
+
console.log("");
|
|
89
|
+
if (hasError) {
|
|
90
|
+
console.log(" ❌ 存在关键问题,请先修复后再使用 zc");
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
console.log(" ✅ 环境就绪");
|
|
94
|
+
}
|
|
95
|
+
console.log("");
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { registerTeamCommand } from "./team.js";
|
|
4
|
+
import { registerTaskCommand } from "./task.js";
|
|
5
|
+
import { registerMsgCommand } from "./msg.js";
|
|
6
|
+
import { registerDoctorCommand } from "./doctor.js";
|
|
7
|
+
import { registerSetupCommand } from "./setup.js";
|
|
8
|
+
import { registerRunCommand } from "./run.js";
|
|
9
|
+
const program = new Command();
|
|
10
|
+
program
|
|
11
|
+
.name("zc")
|
|
12
|
+
.description("zmice的AI CLI — 多 CLI 团队编排运行时")
|
|
13
|
+
.version("0.1.0");
|
|
14
|
+
// Register subcommands
|
|
15
|
+
registerTeamCommand(program);
|
|
16
|
+
registerTaskCommand(program);
|
|
17
|
+
registerMsgCommand(program);
|
|
18
|
+
registerDoctorCommand(program);
|
|
19
|
+
registerSetupCommand(program);
|
|
20
|
+
registerRunCommand(program);
|
|
21
|
+
program.parse();
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,8BAA8B,CAAC;KAC3C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,uBAAuB;AACvB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAE5B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"msg.d.ts","sourceRoot":"","sources":["../../src/cli/msg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqBzD"}
|
package/dist/cli/msg.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function registerMsgCommand(program) {
|
|
2
|
+
const msg = program
|
|
3
|
+
.command("msg")
|
|
4
|
+
.description("消息通信命令");
|
|
5
|
+
msg.command("send").description("发送消息")
|
|
6
|
+
.argument("<to>", "目标 worker")
|
|
7
|
+
.argument("<body>", "消息内容")
|
|
8
|
+
.action(async (to, body) => {
|
|
9
|
+
console.log(`[zc msg send] To: ${to}, Body: ${body}`);
|
|
10
|
+
});
|
|
11
|
+
msg.command("broadcast").description("广播消息")
|
|
12
|
+
.argument("<body>", "消息内容")
|
|
13
|
+
.action(async (body) => {
|
|
14
|
+
console.log(`[zc msg broadcast] Body: ${body}`);
|
|
15
|
+
});
|
|
16
|
+
msg.command("list").description("查看消息").action(async () => {
|
|
17
|
+
console.log("[zc msg list] TODO");
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=msg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"msg.js","sourceRoot":"","sources":["../../src/cli/msg.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEzB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;SACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;SAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC1B,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAAY,EAAE,EAAE;QACzC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEL,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;SACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC1B,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEL,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACxD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
export interface RunOptions {
|
|
3
|
+
cli: string;
|
|
4
|
+
model?: string;
|
|
5
|
+
workdir: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseRunOptions(prompt: string | undefined, opts: {
|
|
8
|
+
cli?: string;
|
|
9
|
+
model?: string;
|
|
10
|
+
workdir?: string;
|
|
11
|
+
}): {
|
|
12
|
+
prompt?: string;
|
|
13
|
+
options: RunOptions;
|
|
14
|
+
};
|
|
15
|
+
export declare function executeRun(prompt: string | undefined, options: RunOptions): Promise<void>;
|
|
16
|
+
export declare function registerRunCommand(program: Command): void;
|
|
17
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAS1C;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CA0Df;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgBzD"}
|
package/dist/cli/run.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { getAdapter, listAdapters } from "../adapters/index.js";
|
|
2
|
+
export function parseRunOptions(prompt, opts) {
|
|
3
|
+
return {
|
|
4
|
+
prompt: prompt || undefined,
|
|
5
|
+
options: {
|
|
6
|
+
cli: opts.cli ?? "codex",
|
|
7
|
+
model: opts.model,
|
|
8
|
+
workdir: opts.workdir ?? process.cwd(),
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export async function executeRun(prompt, options) {
|
|
13
|
+
const adapter = getAdapter(options.cli);
|
|
14
|
+
if (!adapter) {
|
|
15
|
+
const available = listAdapters();
|
|
16
|
+
console.error(`[zc run] 错误: 未知的 CLI 适配器 "${options.cli}"。可用: ${available.join(", ")}`);
|
|
17
|
+
process.exitCode = 1;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const detected = await adapter.detect();
|
|
21
|
+
if (!detected) {
|
|
22
|
+
console.error(`[zc run] 错误: "${options.cli}" CLI 未安装或不可用。请先安装后重试。`);
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const worker = await adapter.spawn({
|
|
27
|
+
workdir: options.workdir,
|
|
28
|
+
model: options.model,
|
|
29
|
+
prompt,
|
|
30
|
+
});
|
|
31
|
+
console.log(`[zc run] 已启动 ${options.cli} worker (PID: ${worker.pid})`);
|
|
32
|
+
// Forward stdout/stderr to current terminal
|
|
33
|
+
worker.process.stdout?.on("data", (data) => {
|
|
34
|
+
process.stdout.write(data);
|
|
35
|
+
});
|
|
36
|
+
worker.process.stderr?.on("data", (data) => {
|
|
37
|
+
process.stderr.write(data);
|
|
38
|
+
});
|
|
39
|
+
// Graceful shutdown on signals
|
|
40
|
+
const handleSignal = async () => {
|
|
41
|
+
console.log("\n[zc run] 收到终止信号,正在关闭 worker...");
|
|
42
|
+
await worker.kill();
|
|
43
|
+
};
|
|
44
|
+
process.on("SIGINT", handleSignal);
|
|
45
|
+
process.on("SIGTERM", handleSignal);
|
|
46
|
+
// Wait for process to exit
|
|
47
|
+
const exitCode = await new Promise((resolve) => {
|
|
48
|
+
worker.process.on("close", (code) => {
|
|
49
|
+
resolve(code ?? 0);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
// Cleanup signal handlers
|
|
53
|
+
process.removeListener("SIGINT", handleSignal);
|
|
54
|
+
process.removeListener("SIGTERM", handleSignal);
|
|
55
|
+
process.exitCode = exitCode;
|
|
56
|
+
}
|
|
57
|
+
export function registerRunCommand(program) {
|
|
58
|
+
program
|
|
59
|
+
.command("run")
|
|
60
|
+
.description("启动单个 CLI worker 执行任务")
|
|
61
|
+
.argument("[prompt]", "任务描述 / prompt")
|
|
62
|
+
.option("--cli <cli>", "CLI 适配器名称 (codex | qwen-code)", "codex")
|
|
63
|
+
.option("-m, --model <model>", "指定模型")
|
|
64
|
+
.option("-w, --workdir <dir>", "工作目录", process.cwd())
|
|
65
|
+
.action(async (prompt, opts) => {
|
|
66
|
+
const { prompt: parsedPrompt, options } = parseRunOptions(prompt, opts);
|
|
67
|
+
await executeRun(parsedPrompt, options);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2C3D"}
|