@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.
Files changed (90) hide show
  1. package/README.md +87 -0
  2. package/dist/adapters/codex.d.ts +13 -0
  3. package/dist/adapters/codex.d.ts.map +1 -0
  4. package/dist/adapters/codex.js +61 -0
  5. package/dist/adapters/codex.js.map +1 -0
  6. package/dist/adapters/index.d.ts +4 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +8 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/qwen-code.d.ts +13 -0
  11. package/dist/adapters/qwen-code.d.ts.map +1 -0
  12. package/dist/adapters/qwen-code.js +60 -0
  13. package/dist/adapters/qwen-code.js.map +1 -0
  14. package/dist/adapters/types.d.ts +29 -0
  15. package/dist/adapters/types.d.ts.map +1 -0
  16. package/dist/adapters/types.js +11 -0
  17. package/dist/adapters/types.js.map +1 -0
  18. package/dist/cli/doctor.d.ts +3 -0
  19. package/dist/cli/doctor.d.ts.map +1 -0
  20. package/dist/cli/doctor.js +98 -0
  21. package/dist/cli/doctor.js.map +1 -0
  22. package/dist/cli/index.d.ts +3 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +22 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/cli/msg.d.ts +3 -0
  27. package/dist/cli/msg.d.ts.map +1 -0
  28. package/dist/cli/msg.js +20 -0
  29. package/dist/cli/msg.js.map +1 -0
  30. package/dist/cli/run.d.ts +17 -0
  31. package/dist/cli/run.d.ts.map +1 -0
  32. package/dist/cli/run.js +70 -0
  33. package/dist/cli/run.js.map +1 -0
  34. package/dist/cli/setup.d.ts +3 -0
  35. package/dist/cli/setup.d.ts.map +1 -0
  36. package/dist/cli/setup.js +41 -0
  37. package/dist/cli/setup.js.map +1 -0
  38. package/dist/cli/task.d.ts +3 -0
  39. package/dist/cli/task.d.ts.map +1 -0
  40. package/dist/cli/task.js +20 -0
  41. package/dist/cli/task.js.map +1 -0
  42. package/dist/cli/team.d.ts +3 -0
  43. package/dist/cli/team.d.ts.map +1 -0
  44. package/dist/cli/team.js +169 -0
  45. package/dist/cli/team.js.map +1 -0
  46. package/dist/runtime/logger.d.ts +2 -0
  47. package/dist/runtime/logger.d.ts.map +1 -0
  48. package/dist/runtime/logger.js +2 -0
  49. package/dist/runtime/logger.js.map +1 -0
  50. package/dist/runtime/session-manager.d.ts +39 -0
  51. package/dist/runtime/session-manager.d.ts.map +1 -0
  52. package/dist/runtime/session-manager.js +107 -0
  53. package/dist/runtime/session-manager.js.map +1 -0
  54. package/dist/runtime/state.d.ts +9 -0
  55. package/dist/runtime/state.d.ts.map +1 -0
  56. package/dist/runtime/state.js +22 -0
  57. package/dist/runtime/state.js.map +1 -0
  58. package/dist/runtime/worktree-manager.d.ts +39 -0
  59. package/dist/runtime/worktree-manager.d.ts.map +1 -0
  60. package/dist/runtime/worktree-manager.js +123 -0
  61. package/dist/runtime/worktree-manager.js.map +1 -0
  62. package/dist/team/mailbox.d.ts +22 -0
  63. package/dist/team/mailbox.d.ts.map +1 -0
  64. package/dist/team/mailbox.js +52 -0
  65. package/dist/team/mailbox.js.map +1 -0
  66. package/dist/team/orchestrator.d.ts +68 -0
  67. package/dist/team/orchestrator.d.ts.map +1 -0
  68. package/dist/team/orchestrator.js +248 -0
  69. package/dist/team/orchestrator.js.map +1 -0
  70. package/dist/team/task-queue.d.ts +34 -0
  71. package/dist/team/task-queue.d.ts.map +1 -0
  72. package/dist/team/task-queue.js +97 -0
  73. package/dist/team/task-queue.js.map +1 -0
  74. package/dist/team/worker-manager.d.ts +54 -0
  75. package/dist/team/worker-manager.d.ts.map +1 -0
  76. package/dist/team/worker-manager.js +159 -0
  77. package/dist/team/worker-manager.js.map +1 -0
  78. package/dist/utils/config.d.ts +2 -0
  79. package/dist/utils/config.d.ts.map +1 -0
  80. package/dist/utils/config.js +2 -0
  81. package/dist/utils/config.js.map +1 -0
  82. package/dist/utils/platform.d.ts +17 -0
  83. package/dist/utils/platform.d.ts.map +1 -0
  84. package/dist/utils/platform.js +46 -0
  85. package/dist/utils/platform.js.map +1 -0
  86. package/dist/utils/skill-loader.d.ts +46 -0
  87. package/dist/utils/skill-loader.d.ts.map +1 -0
  88. package/dist/utils/skill-loader.js +210 -0
  89. package/dist/utils/skill-loader.js.map +1 -0
  90. 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,4 @@
1
+ import { getAdapter, listAdapters } from "./types.js";
2
+ export { getAdapter, listAdapters };
3
+ export type { CLIAdapter, SpawnOptions, WorkerProcess } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerDoctorCommand(program: Command): void;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerMsgCommand(program: Command): void;
3
+ //# sourceMappingURL=msg.d.ts.map
@@ -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"}
@@ -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"}
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerSetupCommand(program: Command): void;
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -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"}