@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
|
@@ -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":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAalD,MAAM,OAAO,aAAa;IAIL;IACA;IACA;IALX,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEhD,YACmB,QAAgB,EAChB,cAA8B,EAC9B,eAAgC;QAFhC,aAAQ,GAAR,QAAQ,CAAQ;QAChB,mBAAc,GAAd,cAAc,CAAgB;QAC9B,oBAAe,GAAf,eAAe,CAAiB;IAChD,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU,EAAE,GAAW;QACvC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACnD,CAAC;QAED,8BAA8B;QAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,GAAG,CAAC,CAAC;QACnD,CAAC;QAED,sBAAsB;QACtB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QAE3C,wCAAwC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CACjD,MAAM,IAAI,CAAC,QAAQ,EAAE,EACrB,OAAO,YAAY,GAAG,CACvB,CAAC;QAEF,MAAM,IAAI,GAAe;YACvB,EAAE;YACF,GAAG;YACH,MAAM,EAAE,MAAM;YACd,MAAM;YACN,QAAQ,EAAE,YAAY;YACtB,MAAM;SACP,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3B,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,QAAgB,EAChB,MAAc,EACd,MAAc,EACd,KAAc;QAEd,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,WAAW,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,mBAAmB,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC;QAC3D,CAAC;QAED,iDAAiD;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAE5D,4BAA4B;QAC5B,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAEvD,uBAAuB;QACvB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,QAAgB;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,iBAAiB;QACjB,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAElD,kBAAkB;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;QAED,wBAAwB;QACxB,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,0BAA0B;IAElB,gBAAgB,CAAC,QAAgB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,aAAa,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,eAAe,CAAC,GAAW,EAAE,MAAc,EAAE,KAAc;QACjE,0BAA0B;QAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAE9C,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACnC,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;YAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAC1C,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,OAAO,GAAG,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,0CAA0C;QAC1C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -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 @@
|
|
|
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
|
+
}
|