@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
@@ -0,0 +1,159 @@
1
+ import { getAdapter } from "../adapters/types.js";
2
+ export class WorkerManager {
3
+ teamName;
4
+ sessionManager;
5
+ worktreeManager;
6
+ workers = new Map();
7
+ constructor(teamName, sessionManager, worktreeManager) {
8
+ this.teamName = teamName;
9
+ this.sessionManager = sessionManager;
10
+ this.worktreeManager = worktreeManager;
11
+ }
12
+ /**
13
+ * Create a new worker: create worktree + tmux pane, cd into worktree
14
+ */
15
+ async spawnWorker(id, cli) {
16
+ if (this.workers.has(id)) {
17
+ throw new Error(`Worker "${id}" already exists`);
18
+ }
19
+ // Validate CLI adapter exists
20
+ const adapter = getAdapter(cli);
21
+ if (!adapter) {
22
+ throw new Error(`Unknown CLI adapter: "${cli}"`);
23
+ }
24
+ // Create git worktree
25
+ const worktreePath = await this.worktreeManager.create(id, this.teamName);
26
+ const branch = `zc/${this.teamName}/${id}`;
27
+ // Create tmux pane and cd into worktree
28
+ const paneId = await this.sessionManager.createPane(`zc-${this.teamName}`, `cd "${worktreePath}"`);
29
+ const info = {
30
+ id,
31
+ cli,
32
+ status: "idle",
33
+ paneId,
34
+ worktree: worktreePath,
35
+ branch,
36
+ };
37
+ this.workers.set(id, info);
38
+ return { ...info };
39
+ }
40
+ /**
41
+ * Assign a task to a worker: start CLI in its tmux pane
42
+ */
43
+ async assignTask(workerId, taskId, prompt, model) {
44
+ const worker = this.getWorkerOrThrow(workerId);
45
+ if (worker.status === "dead") {
46
+ throw new Error(`Worker "${workerId}" is dead`);
47
+ }
48
+ if (worker.status === "busy") {
49
+ throw new Error(`Worker "${workerId}" is already busy`);
50
+ }
51
+ const adapter = getAdapter(worker.cli);
52
+ if (!adapter) {
53
+ throw new Error(`CLI adapter "${worker.cli}" not found`);
54
+ }
55
+ // Build CLI command string based on adapter name
56
+ const cmd = this.buildCliCommand(worker.cli, prompt, model);
57
+ // Send command to tmux pane
58
+ await this.sessionManager.sendKeys(worker.paneId, cmd);
59
+ // Update worker status
60
+ worker.status = "busy";
61
+ worker.currentTask = taskId;
62
+ }
63
+ /**
64
+ * Get worker's current output via tmux capture
65
+ */
66
+ async getOutput(workerId) {
67
+ const worker = this.getWorkerOrThrow(workerId);
68
+ return this.sessionManager.captureOutput(worker.paneId);
69
+ }
70
+ /**
71
+ * Check if a worker's tmux pane is still alive
72
+ */
73
+ async healthCheck(workerId) {
74
+ const worker = this.getWorkerOrThrow(workerId);
75
+ try {
76
+ await this.sessionManager.captureOutput(worker.paneId, 1);
77
+ return true;
78
+ }
79
+ catch {
80
+ worker.status = "dead";
81
+ return false;
82
+ }
83
+ }
84
+ /**
85
+ * Kill a single worker: destroy pane, remove worktree
86
+ */
87
+ async killWorker(workerId) {
88
+ const worker = this.workers.get(workerId);
89
+ if (!worker)
90
+ return;
91
+ // Kill tmux pane
92
+ await this.sessionManager.killPane(worker.paneId);
93
+ // Remove worktree
94
+ try {
95
+ await this.worktreeManager.remove(worker.worktree);
96
+ }
97
+ catch {
98
+ // worktree may already be removed
99
+ }
100
+ worker.status = "dead";
101
+ this.workers.delete(workerId);
102
+ }
103
+ /**
104
+ * Shutdown all workers and kill the tmux session
105
+ */
106
+ async shutdownAll() {
107
+ const ids = Array.from(this.workers.keys());
108
+ for (const id of ids) {
109
+ await this.killWorker(id);
110
+ }
111
+ // Kill the team session
112
+ await this.sessionManager.killSession(`zc-${this.teamName}`);
113
+ }
114
+ /**
115
+ * List all workers
116
+ */
117
+ listWorkers() {
118
+ return Array.from(this.workers.values()).map((w) => ({ ...w }));
119
+ }
120
+ /**
121
+ * Get all idle workers
122
+ */
123
+ getIdleWorkers() {
124
+ return this.listWorkers().filter((w) => w.status === "idle");
125
+ }
126
+ // --- private helpers ---
127
+ getWorkerOrThrow(workerId) {
128
+ const worker = this.workers.get(workerId);
129
+ if (!worker) {
130
+ throw new Error(`Worker "${workerId}" not found`);
131
+ }
132
+ return worker;
133
+ }
134
+ buildCliCommand(cli, prompt, model) {
135
+ // Escape prompt for shell
136
+ const escaped = prompt.replace(/'/g, "'\\''");
137
+ if (cli === "codex") {
138
+ const parts = ["codex", "--quiet"];
139
+ if (model)
140
+ parts.push("--model", model);
141
+ parts.push(`'${escaped}'`);
142
+ return parts.join(" ");
143
+ }
144
+ if (cli === "qwen-code") {
145
+ const parts = ["qwen", "chat", "--agent"];
146
+ if (model)
147
+ parts.push("--model", model);
148
+ parts.push("--message", `'${escaped}'`);
149
+ return parts.join(" ");
150
+ }
151
+ // Fallback: just use cli name with prompt
152
+ const parts = [cli];
153
+ if (model)
154
+ parts.push("--model", model);
155
+ parts.push(`'${escaped}'`);
156
+ return parts.join(" ");
157
+ }
158
+ }
159
+ //# sourceMappingURL=worker-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-manager.js","sourceRoot":"","sources":["../../src/team/worker-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ export interface PlatformInfo {
2
+ os: "macos" | "linux" | "windows-wsl" | "windows-native" | "unknown";
3
+ tmux: {
4
+ available: boolean;
5
+ version?: string;
6
+ };
7
+ git: {
8
+ available: boolean;
9
+ version?: string;
10
+ };
11
+ node: {
12
+ version: string;
13
+ meetsMinimum: boolean;
14
+ };
15
+ }
16
+ export declare function detectPlatform(): Promise<PlatformInfo>;
17
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,GAAG,OAAO,GAAG,aAAa,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACrE,IAAI,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,GAAG,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;CAClD;AA4BD,wBAAsB,cAAc,IAAI,OAAO,CAAC,YAAY,CAAC,CAc5D"}
@@ -0,0 +1,46 @@
1
+ import { exec } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { platform } from "node:os";
4
+ const execAsync = promisify(exec);
5
+ async function checkCommand(cmd) {
6
+ try {
7
+ const { stdout } = await execAsync(cmd);
8
+ return { available: true, version: stdout.trim() };
9
+ }
10
+ catch {
11
+ return { available: false };
12
+ }
13
+ }
14
+ async function detectOS() {
15
+ const os = platform();
16
+ if (os === "darwin")
17
+ return "macos";
18
+ if (os === "linux") {
19
+ // Check if running in WSL
20
+ try {
21
+ const { stdout } = await execAsync("cat /proc/version");
22
+ if (stdout.toLowerCase().includes("microsoft") || stdout.toLowerCase().includes("wsl")) {
23
+ return "windows-wsl";
24
+ }
25
+ }
26
+ catch { /* ignore */ }
27
+ return "linux";
28
+ }
29
+ if (os === "win32")
30
+ return "windows-native";
31
+ return "unknown";
32
+ }
33
+ export async function detectPlatform() {
34
+ const os = await detectOS();
35
+ const tmux = await checkCommand("tmux -V");
36
+ const git = await checkCommand("git --version");
37
+ const nodeVersion = process.version;
38
+ const major = parseInt(nodeVersion.slice(1).split(".")[0], 10);
39
+ return {
40
+ os,
41
+ tmux: { available: tmux.available, version: tmux.version },
42
+ git: { available: git.available, version: git.version?.replace("git version ", "") },
43
+ node: { version: nodeVersion, meetsMinimum: major >= 20 },
44
+ };
45
+ }
46
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AASlC,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IACtB,IAAI,EAAE,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IACpC,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QACnB,0BAA0B;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,mBAAmB,CAAC,CAAC;YACxD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvF,OAAO,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,EAAE,KAAK,OAAO;QAAE,OAAO,gBAAgB,CAAC;IAC5C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;IAEhD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE/D,OAAO;QACL,EAAE;QACF,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;QAC1D,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE;QACpF,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,IAAI,EAAE,EAAE;KAC1D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { CLIAdapter } from "../adapters/types.js";
2
+ export interface SkillMeta {
3
+ name: string;
4
+ path: string;
5
+ content: string;
6
+ }
7
+ export interface CommandMeta {
8
+ name: string;
9
+ path: string;
10
+ content: string;
11
+ }
12
+ export interface AgentMeta {
13
+ name: string;
14
+ path: string;
15
+ content: string;
16
+ }
17
+ export declare const SKILL_KEYWORD_MAP: Record<string, string[]>;
18
+ export interface SkillMatcher {
19
+ match(task: string, skills: SkillMeta[]): SkillMeta[] | Promise<SkillMeta[]>;
20
+ }
21
+ /**
22
+ * Scan `<rootDir>/skills/` SKILL.md` for all skills.
23
+ */
24
+ export declare function discoverSkills(rootDir?: string): Promise<SkillMeta[]>;
25
+ /**
26
+ * Scan `<rootDir>/commands/*.md` for all commands.
27
+ */
28
+ export declare function discoverCommands(rootDir?: string): Promise<CommandMeta[]>;
29
+ /**
30
+ * Scan `<rootDir>/agents/*.md` for all agent definitions.
31
+ */
32
+ export declare function discoverAgents(rootDir?: string): Promise<AgentMeta[]>;
33
+ /**
34
+ * Match skills to a task description using simple keyword matching.
35
+ * Matches skill name segments (split by `-`) against task text.
36
+ */
37
+ export declare function matchSkills(task: string, skills: SkillMeta[]): SkillMeta[];
38
+ export declare class KeywordSkillMatcher implements SkillMatcher {
39
+ match(task: string, skills: SkillMeta[]): SkillMeta[];
40
+ }
41
+ export declare class AISkillMatcher implements SkillMatcher {
42
+ private adapter;
43
+ constructor(adapter: CLIAdapter);
44
+ match(task: string, skills: SkillMeta[]): Promise<SkillMeta[]>;
45
+ }
46
+ //# sourceMappingURL=skill-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/utils/skill-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA6BtD,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CAC9E;AAsBD;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAyB3E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAyB/E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAyB3E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAsC1E;AAED,qBAAa,mBAAoB,YAAW,YAAY;IACtD,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;CAGtD;AAED,qBAAa,cAAe,YAAW,YAAY;IACrC,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU;IAEjC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CA0BrE"}
@@ -0,0 +1,210 @@
1
+ import { readdir, readFile, access } from "node:fs/promises";
2
+ import { join, resolve, basename } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export const SKILL_KEYWORD_MAP = {
5
+ "debugging-and-error-recovery": ["调试", "debug", "bug", "错误", "报错", "异常", "排错", "fix"],
6
+ "test-driven-development": ["测试", "test", "tdd", "单测", "用例"],
7
+ "code-review-and-quality": ["审查", "review", "代码审查", "评审", "质量"],
8
+ "performance-optimization": ["性能", "优化", "perf", "慢", "延迟", "卡顿"],
9
+ "security-and-hardening": ["安全", "security", "漏洞", "加固", "xss", "csrf"],
10
+ "code-simplification": ["简化", "重构", "refactor", "简洁", "清理"],
11
+ "spec-driven-development": ["规格", "需求", "spec", "定义"],
12
+ "planning-and-task-breakdown": ["拆解", "计划", "plan", "任务分解"],
13
+ "incremental-implementation": ["实现", "开发", "implement", "编码"],
14
+ "frontend-ui-engineering": ["前端", "ui", "界面", "组件", "页面", "样式"],
15
+ "api-and-interface-design": ["接口", "api", "设计"],
16
+ "documentation-and-adrs": ["文档", "doc", "adr", "记录"],
17
+ "shipping-and-launch": ["发布", "上线", "deploy", "ship"],
18
+ "ci-cd-and-automation": ["ci", "cd", "流水线", "自动化", "pipeline"],
19
+ "deprecation-and-migration": ["迁移", "废弃", "migrate", "升级"],
20
+ "git-workflow-and-versioning": ["git", "提交", "分支", "版本"],
21
+ "safety-guardrails": ["安全护栏", "防护", "guardrail", "锁定"],
22
+ "context-engineering": ["上下文", "context", "窗口"],
23
+ "verification-before-completion": ["验证", "verify", "检查", "确认"],
24
+ "codebase-onboarding": ["入门", "上手", "onboard", "了解代码"],
25
+ "sdd-tdd-workflow": ["sdd", "tdd", "工作流", "开发流程"],
26
+ "continuous-learning": ["学习", "learn", "提炼", "经验"],
27
+ "brainstorming-and-design": ["头脑风暴", "设计", "brainstorm", "创意"],
28
+ "idea-refine": ["想法", "idea", "细化", "构思"],
29
+ "source-driven-development": ["源码驱动", "官方文档", "source"],
30
+ "team-orchestration": ["团队", "编排", "team", "协作"],
31
+ "sprint-retrospective": ["回顾", "retrospective", "sprint", "复盘"],
32
+ "multi-perspective-review": ["多视角", "评审", "perspective"],
33
+ };
34
+ /**
35
+ * Resolve the project root directory.
36
+ * Root = zc/ parent directory (i.e. path.resolve(__dirname, '../../..'))
37
+ */
38
+ function resolveRoot(rootDir) {
39
+ if (rootDir)
40
+ return rootDir;
41
+ const thisFile = fileURLToPath(import.meta.url);
42
+ // thisFile is zc/src/utils/skill-loader.ts → go up 3 levels to project root
43
+ return resolve(thisFile, "../../../..");
44
+ }
45
+ async function dirExists(dir) {
46
+ try {
47
+ await access(dir);
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ /**
55
+ * Scan `<rootDir>/skills/` SKILL.md` for all skills.
56
+ */
57
+ export async function discoverSkills(rootDir) {
58
+ const root = resolveRoot(rootDir);
59
+ const skillsDir = join(root, "skills");
60
+ if (!(await dirExists(skillsDir)))
61
+ return [];
62
+ const entries = await readdir(skillsDir, { withFileTypes: true });
63
+ const skills = [];
64
+ for (const entry of entries) {
65
+ if (!entry.isDirectory())
66
+ continue;
67
+ const skillPath = join(skillsDir, entry.name, "SKILL.md");
68
+ try {
69
+ const content = await readFile(skillPath, "utf-8");
70
+ skills.push({
71
+ name: entry.name,
72
+ path: skillPath,
73
+ content,
74
+ });
75
+ }
76
+ catch {
77
+ // SKILL.md not found in this directory, skip
78
+ }
79
+ }
80
+ return skills.sort((a, b) => a.name.localeCompare(b.name));
81
+ }
82
+ /**
83
+ * Scan `<rootDir>/commands/*.md` for all commands.
84
+ */
85
+ export async function discoverCommands(rootDir) {
86
+ const root = resolveRoot(rootDir);
87
+ const commandsDir = join(root, "commands");
88
+ if (!(await dirExists(commandsDir)))
89
+ return [];
90
+ const entries = await readdir(commandsDir, { withFileTypes: true });
91
+ const commands = [];
92
+ for (const entry of entries) {
93
+ if (!entry.isFile() || !entry.name.endsWith(".md"))
94
+ continue;
95
+ const cmdPath = join(commandsDir, entry.name);
96
+ try {
97
+ const content = await readFile(cmdPath, "utf-8");
98
+ commands.push({
99
+ name: basename(entry.name, ".md"),
100
+ path: cmdPath,
101
+ content,
102
+ });
103
+ }
104
+ catch {
105
+ // skip unreadable files
106
+ }
107
+ }
108
+ return commands.sort((a, b) => a.name.localeCompare(b.name));
109
+ }
110
+ /**
111
+ * Scan `<rootDir>/agents/*.md` for all agent definitions.
112
+ */
113
+ export async function discoverAgents(rootDir) {
114
+ const root = resolveRoot(rootDir);
115
+ const agentsDir = join(root, "agents");
116
+ if (!(await dirExists(agentsDir)))
117
+ return [];
118
+ const entries = await readdir(agentsDir, { withFileTypes: true });
119
+ const agents = [];
120
+ for (const entry of entries) {
121
+ if (!entry.isFile() || !entry.name.endsWith(".md"))
122
+ continue;
123
+ const agentPath = join(agentsDir, entry.name);
124
+ try {
125
+ const content = await readFile(agentPath, "utf-8");
126
+ agents.push({
127
+ name: basename(entry.name, ".md"),
128
+ path: agentPath,
129
+ content,
130
+ });
131
+ }
132
+ catch {
133
+ // skip unreadable files
134
+ }
135
+ }
136
+ return agents.sort((a, b) => a.name.localeCompare(b.name));
137
+ }
138
+ /**
139
+ * Match skills to a task description using simple keyword matching.
140
+ * Matches skill name segments (split by `-`) against task text.
141
+ */
142
+ export function matchSkills(task, skills) {
143
+ const taskLower = task.toLowerCase();
144
+ const matched = [];
145
+ for (const skill of skills) {
146
+ const keywords = skill.name.split("-").filter((k) => k.length > 2);
147
+ let score = 0;
148
+ // Check full skill name match
149
+ if (taskLower.includes(skill.name)) {
150
+ score += 10;
151
+ }
152
+ // Check individual keyword matches
153
+ for (const kw of keywords) {
154
+ if (taskLower.includes(kw)) {
155
+ score += 1;
156
+ }
157
+ }
158
+ // Check alias matches from SKILL_KEYWORD_MAP
159
+ const aliases = SKILL_KEYWORD_MAP[skill.name];
160
+ if (aliases) {
161
+ for (const alias of aliases) {
162
+ if (taskLower.includes(alias.toLowerCase())) {
163
+ score += 2;
164
+ }
165
+ }
166
+ }
167
+ if (score > 0) {
168
+ matched.push({ skill, score });
169
+ }
170
+ }
171
+ return matched
172
+ .sort((a, b) => b.score - a.score)
173
+ .map((m) => m.skill);
174
+ }
175
+ export class KeywordSkillMatcher {
176
+ match(task, skills) {
177
+ return matchSkills(task, skills);
178
+ }
179
+ }
180
+ export class AISkillMatcher {
181
+ adapter;
182
+ constructor(adapter) {
183
+ this.adapter = adapter;
184
+ }
185
+ async match(task, skills) {
186
+ if (!this.adapter.query) {
187
+ throw new Error(`Adapter "${this.adapter.name}" does not support query()`);
188
+ }
189
+ const skillList = skills.map(s => `- ${s.name}`).join("\n");
190
+ const prompt = [
191
+ "Given the task and available skills below, select up to 3 most relevant skills.",
192
+ "Return ONLY skill names, one per line, no explanations.",
193
+ "",
194
+ `Task: ${task}`,
195
+ "",
196
+ "Available skills:",
197
+ skillList,
198
+ ].join("\n");
199
+ const response = await this.adapter.query(prompt, { timeout: 15000 });
200
+ const selectedNames = response
201
+ .trim()
202
+ .split("\n")
203
+ .map((s) => s.trim().replace(/^-\s*/, ""))
204
+ .filter(Boolean);
205
+ return selectedNames
206
+ .map((name) => skills.find((s) => s.name === name))
207
+ .filter((s) => s !== undefined);
208
+ }
209
+ }
210
+ //# sourceMappingURL=skill-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/utils/skill-loader.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@zmice/zc",
3
+ "version": "0.1.0",
4
+ "description": "Multi-CLI team orchestration runtime for AI development workflows",
5
+ "keywords": ["cli", "orchestration", "tmux", "team", "ai", "codex", "multi-agent"],
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "bin": {
9
+ "zc": "./dist/cli/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "!dist/**/__tests__",
14
+ "!dist/**/*.test.*",
15
+ "README.md",
16
+ "LICENSE"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "tsc --watch",
21
+ "test": "vitest",
22
+ "lint": "tsc --noEmit",
23
+ "prepublishOnly": "npm run lint && npm run test -- --run && npm run build"
24
+ },
25
+ "dependencies": {
26
+ "commander": "^13.0.0"
27
+ },
28
+ "devDependencies": {
29
+ "typescript": "^5.7.0",
30
+ "@types/node": "^22.0.0",
31
+ "vitest": "^3.0.0"
32
+ },
33
+ "engines": {
34
+ "node": ">=20.0.0"
35
+ }
36
+ }