@swarmify/agents-cli 1.5.13 → 1.5.15
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 +93 -213
- package/dist/index.js +1194 -173
- package/dist/index.js.map +1 -1
- package/dist/lib/agents.d.ts.map +1 -1
- package/dist/lib/agents.js +19 -2
- package/dist/lib/agents.js.map +1 -1
- package/dist/lib/artifact-actions.d.ts +22 -0
- package/dist/lib/artifact-actions.d.ts.map +1 -0
- package/dist/lib/artifact-actions.js +55 -0
- package/dist/lib/artifact-actions.js.map +1 -0
- package/dist/lib/commands.d.ts.map +1 -1
- package/dist/lib/commands.js +3 -5
- package/dist/lib/commands.js.map +1 -1
- package/dist/lib/daemon.d.ts +22 -0
- package/dist/lib/daemon.d.ts.map +1 -0
- package/dist/lib/daemon.js +303 -0
- package/dist/lib/daemon.js.map +1 -0
- package/dist/lib/drive-server.d.ts +9 -0
- package/dist/lib/drive-server.d.ts.map +1 -0
- package/dist/lib/drive-server.js +217 -0
- package/dist/lib/drive-server.js.map +1 -0
- package/dist/lib/drives.d.ts +34 -0
- package/dist/lib/drives.d.ts.map +1 -0
- package/dist/lib/drives.js +267 -0
- package/dist/lib/drives.js.map +1 -0
- package/dist/lib/instructions.d.ts +31 -0
- package/dist/lib/instructions.d.ts.map +1 -0
- package/dist/lib/instructions.js +161 -0
- package/dist/lib/instructions.js.map +1 -0
- package/dist/lib/jobs.d.ts +53 -0
- package/dist/lib/jobs.d.ts.map +1 -0
- package/dist/lib/jobs.js +242 -0
- package/dist/lib/jobs.js.map +1 -0
- package/dist/lib/runner.d.ts +12 -0
- package/dist/lib/runner.d.ts.map +1 -0
- package/dist/lib/runner.js +266 -0
- package/dist/lib/runner.js.map +1 -0
- package/dist/lib/sandbox.d.ts +10 -0
- package/dist/lib/sandbox.d.ts.map +1 -0
- package/dist/lib/sandbox.js +166 -0
- package/dist/lib/sandbox.js.map +1 -0
- package/dist/lib/scheduler.d.ts +18 -0
- package/dist/lib/scheduler.d.ts.map +1 -0
- package/dist/lib/scheduler.js +64 -0
- package/dist/lib/scheduler.js.map +1 -0
- package/dist/lib/shims.d.ts +32 -0
- package/dist/lib/shims.d.ts.map +1 -0
- package/dist/lib/shims.js +175 -0
- package/dist/lib/shims.js.map +1 -0
- package/dist/lib/state.d.ts +5 -0
- package/dist/lib/state.d.ts.map +1 -1
- package/dist/lib/state.js +35 -0
- package/dist/lib/state.js.map +1 -1
- package/dist/lib/template.d.ts +24 -0
- package/dist/lib/template.d.ts.map +1 -0
- package/dist/lib/template.js +57 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/lib/types.d.ts +11 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/versions.d.ts +79 -0
- package/dist/lib/versions.d.ts.map +1 -0
- package/dist/lib/versions.js +289 -0
- package/dist/lib/versions.js.map +1 -0
- package/package.json +8 -5
- package/scripts/postinstall.js +72 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { spawn, execSync } from 'child_process';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as os from 'os';
|
|
5
|
+
import { getAgentsDir } from './state.js';
|
|
6
|
+
import { listJobs as listAllJobs } from './jobs.js';
|
|
7
|
+
import { JobScheduler } from './scheduler.js';
|
|
8
|
+
import { executeJobDetached, monitorRunningJobs } from './runner.js';
|
|
9
|
+
const PID_FILE = 'daemon.pid';
|
|
10
|
+
const LOG_FILE = 'daemon.log';
|
|
11
|
+
const PLIST_NAME = 'co.swarmify.agents-daemon';
|
|
12
|
+
const SYSTEMD_UNIT = 'agents-daemon.service';
|
|
13
|
+
function getPidPath() {
|
|
14
|
+
return path.join(getAgentsDir(), PID_FILE);
|
|
15
|
+
}
|
|
16
|
+
function getLogPath() {
|
|
17
|
+
return path.join(getAgentsDir(), LOG_FILE);
|
|
18
|
+
}
|
|
19
|
+
function getLaunchdPlistPath() {
|
|
20
|
+
return path.join(os.homedir(), 'Library', 'LaunchAgents', `${PLIST_NAME}.plist`);
|
|
21
|
+
}
|
|
22
|
+
function getSystemdUnitPath() {
|
|
23
|
+
return path.join(os.homedir(), '.config', 'systemd', 'user', `${SYSTEMD_UNIT}`);
|
|
24
|
+
}
|
|
25
|
+
export function readDaemonPid() {
|
|
26
|
+
const pidPath = getPidPath();
|
|
27
|
+
if (!fs.existsSync(pidPath))
|
|
28
|
+
return null;
|
|
29
|
+
try {
|
|
30
|
+
const pid = parseInt(fs.readFileSync(pidPath, 'utf-8').trim(), 10);
|
|
31
|
+
return isNaN(pid) ? null : pid;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function writeDaemonPid(pid) {
|
|
38
|
+
fs.writeFileSync(getPidPath(), String(pid), 'utf-8');
|
|
39
|
+
}
|
|
40
|
+
export function removeDaemonPid() {
|
|
41
|
+
const pidPath = getPidPath();
|
|
42
|
+
if (fs.existsSync(pidPath)) {
|
|
43
|
+
fs.unlinkSync(pidPath);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function isDaemonRunning() {
|
|
47
|
+
const pid = readDaemonPid();
|
|
48
|
+
if (!pid)
|
|
49
|
+
return false;
|
|
50
|
+
try {
|
|
51
|
+
process.kill(pid, 0);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
removeDaemonPid();
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function log(level, message) {
|
|
60
|
+
const timestamp = new Date().toISOString();
|
|
61
|
+
const line = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
|
|
62
|
+
fs.appendFileSync(getLogPath(), line, 'utf-8');
|
|
63
|
+
}
|
|
64
|
+
export async function runDaemon() {
|
|
65
|
+
writeDaemonPid(process.pid);
|
|
66
|
+
log('INFO', `Daemon started (PID: ${process.pid})`);
|
|
67
|
+
const scheduler = new JobScheduler(async (config) => {
|
|
68
|
+
log('INFO', `Triggering job '${config.name}' (agent: ${config.agent})`);
|
|
69
|
+
try {
|
|
70
|
+
const meta = await executeJobDetached(config);
|
|
71
|
+
log('INFO', `Job '${config.name}' spawned (run: ${meta.runId}, PID: ${meta.pid})`);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
log('ERROR', `Job '${config.name}' failed to spawn: ${err.message}`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
scheduler.loadAll();
|
|
78
|
+
const scheduled = scheduler.listScheduled();
|
|
79
|
+
log('INFO', `Loaded ${scheduled.length} jobs`);
|
|
80
|
+
for (const job of scheduled) {
|
|
81
|
+
log('INFO', ` ${job.name} -> next: ${job.nextRun?.toISOString() || 'unknown'}`);
|
|
82
|
+
}
|
|
83
|
+
const monitorInterval = setInterval(() => {
|
|
84
|
+
monitorRunningJobs();
|
|
85
|
+
}, 60_000);
|
|
86
|
+
const handleReload = () => {
|
|
87
|
+
log('INFO', 'Reloading jobs (SIGHUP)');
|
|
88
|
+
scheduler.reloadAll();
|
|
89
|
+
const reloaded = scheduler.listScheduled();
|
|
90
|
+
log('INFO', `Reloaded ${reloaded.length} jobs`);
|
|
91
|
+
};
|
|
92
|
+
const handleShutdown = () => {
|
|
93
|
+
log('INFO', 'Daemon shutting down');
|
|
94
|
+
scheduler.stopAll();
|
|
95
|
+
clearInterval(monitorInterval);
|
|
96
|
+
removeDaemonPid();
|
|
97
|
+
process.exit(0);
|
|
98
|
+
};
|
|
99
|
+
process.on('SIGHUP', handleReload);
|
|
100
|
+
process.on('SIGTERM', handleShutdown);
|
|
101
|
+
process.on('SIGINT', handleShutdown);
|
|
102
|
+
await new Promise(() => { });
|
|
103
|
+
}
|
|
104
|
+
export function generateLaunchdPlist() {
|
|
105
|
+
const agentsBin = getAgentsBinPath();
|
|
106
|
+
const logPath = getLogPath();
|
|
107
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
108
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
109
|
+
<plist version="1.0">
|
|
110
|
+
<dict>
|
|
111
|
+
<key>Label</key>
|
|
112
|
+
<string>${PLIST_NAME}</string>
|
|
113
|
+
<key>ProgramArguments</key>
|
|
114
|
+
<array>
|
|
115
|
+
<string>${agentsBin}</string>
|
|
116
|
+
<string>daemon</string>
|
|
117
|
+
<string>_run</string>
|
|
118
|
+
</array>
|
|
119
|
+
<key>RunAtLoad</key>
|
|
120
|
+
<true/>
|
|
121
|
+
<key>KeepAlive</key>
|
|
122
|
+
<true/>
|
|
123
|
+
<key>StandardOutPath</key>
|
|
124
|
+
<string>${logPath}</string>
|
|
125
|
+
<key>StandardErrorPath</key>
|
|
126
|
+
<string>${logPath}</string>
|
|
127
|
+
<key>EnvironmentVariables</key>
|
|
128
|
+
<dict>
|
|
129
|
+
<key>PATH</key>
|
|
130
|
+
<string>/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin:${os.homedir()}/.bun/bin:${os.homedir()}/.nvm/versions/node/v24.0.0/bin</string>
|
|
131
|
+
</dict>
|
|
132
|
+
</dict>
|
|
133
|
+
</plist>`;
|
|
134
|
+
}
|
|
135
|
+
export function generateSystemdUnit() {
|
|
136
|
+
const agentsBin = getAgentsBinPath();
|
|
137
|
+
return `[Unit]
|
|
138
|
+
Description=Agents Daemon - Scheduled Job Runner
|
|
139
|
+
After=network.target
|
|
140
|
+
|
|
141
|
+
[Service]
|
|
142
|
+
Type=simple
|
|
143
|
+
ExecStart=${agentsBin} daemon _run
|
|
144
|
+
Restart=always
|
|
145
|
+
RestartSec=10
|
|
146
|
+
Environment=PATH=/usr/local/bin:/usr/bin:/bin:${os.homedir()}/.nvm/versions/node/v24.0.0/bin
|
|
147
|
+
|
|
148
|
+
[Install]
|
|
149
|
+
WantedBy=default.target`;
|
|
150
|
+
}
|
|
151
|
+
function getAgentsBinPath() {
|
|
152
|
+
try {
|
|
153
|
+
return execSync('which agents', { encoding: 'utf-8' }).trim();
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return 'agents';
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export function startDaemon() {
|
|
160
|
+
if (isDaemonRunning()) {
|
|
161
|
+
const pid = readDaemonPid();
|
|
162
|
+
return { pid, method: 'already-running' };
|
|
163
|
+
}
|
|
164
|
+
const platform = os.platform();
|
|
165
|
+
if (platform === 'darwin') {
|
|
166
|
+
try {
|
|
167
|
+
const plistPath = getLaunchdPlistPath();
|
|
168
|
+
const plistDir = path.dirname(plistPath);
|
|
169
|
+
if (!fs.existsSync(plistDir)) {
|
|
170
|
+
fs.mkdirSync(plistDir, { recursive: true });
|
|
171
|
+
}
|
|
172
|
+
fs.writeFileSync(plistPath, generateLaunchdPlist(), 'utf-8');
|
|
173
|
+
try {
|
|
174
|
+
execSync(`launchctl unload "${plistPath}" 2>/dev/null`, { encoding: 'utf-8' });
|
|
175
|
+
}
|
|
176
|
+
catch { }
|
|
177
|
+
execSync(`launchctl load "${plistPath}"`, { encoding: 'utf-8' });
|
|
178
|
+
const pid = waitForPid(3000);
|
|
179
|
+
return { pid, method: 'launchd' };
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return startDetached();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (platform === 'linux') {
|
|
186
|
+
try {
|
|
187
|
+
const unitPath = getSystemdUnitPath();
|
|
188
|
+
const unitDir = path.dirname(unitPath);
|
|
189
|
+
if (!fs.existsSync(unitDir)) {
|
|
190
|
+
fs.mkdirSync(unitDir, { recursive: true });
|
|
191
|
+
}
|
|
192
|
+
fs.writeFileSync(unitPath, generateSystemdUnit(), 'utf-8');
|
|
193
|
+
execSync('systemctl --user daemon-reload', { encoding: 'utf-8' });
|
|
194
|
+
execSync(`systemctl --user enable ${SYSTEMD_UNIT}`, { encoding: 'utf-8' });
|
|
195
|
+
execSync(`systemctl --user start ${SYSTEMD_UNIT}`, { encoding: 'utf-8' });
|
|
196
|
+
const pid = waitForPid(3000);
|
|
197
|
+
return { pid, method: 'systemd' };
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return startDetached();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return startDetached();
|
|
204
|
+
}
|
|
205
|
+
function startDetached() {
|
|
206
|
+
const agentsBin = getAgentsBinPath();
|
|
207
|
+
const logPath = getLogPath();
|
|
208
|
+
const logFd = fs.openSync(logPath, 'a');
|
|
209
|
+
const child = spawn(agentsBin, ['daemon', '_run'], {
|
|
210
|
+
stdio: ['ignore', logFd, logFd],
|
|
211
|
+
detached: true,
|
|
212
|
+
});
|
|
213
|
+
child.unref();
|
|
214
|
+
fs.closeSync(logFd);
|
|
215
|
+
return { pid: child.pid || null, method: 'detached' };
|
|
216
|
+
}
|
|
217
|
+
function waitForPid(timeoutMs) {
|
|
218
|
+
const start = Date.now();
|
|
219
|
+
while (Date.now() - start < timeoutMs) {
|
|
220
|
+
const pid = readDaemonPid();
|
|
221
|
+
if (pid)
|
|
222
|
+
return pid;
|
|
223
|
+
const waitUntil = Date.now() + 200;
|
|
224
|
+
while (Date.now() < waitUntil) { }
|
|
225
|
+
}
|
|
226
|
+
return readDaemonPid();
|
|
227
|
+
}
|
|
228
|
+
export function stopDaemon() {
|
|
229
|
+
const platform = os.platform();
|
|
230
|
+
if (platform === 'darwin') {
|
|
231
|
+
const plistPath = getLaunchdPlistPath();
|
|
232
|
+
if (fs.existsSync(plistPath)) {
|
|
233
|
+
try {
|
|
234
|
+
execSync(`launchctl unload "${plistPath}"`, { encoding: 'utf-8' });
|
|
235
|
+
fs.unlinkSync(plistPath);
|
|
236
|
+
}
|
|
237
|
+
catch { }
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (platform === 'linux') {
|
|
241
|
+
try {
|
|
242
|
+
execSync(`systemctl --user stop ${SYSTEMD_UNIT}`, { encoding: 'utf-8' });
|
|
243
|
+
execSync(`systemctl --user disable ${SYSTEMD_UNIT}`, { encoding: 'utf-8' });
|
|
244
|
+
}
|
|
245
|
+
catch { }
|
|
246
|
+
const unitPath = getSystemdUnitPath();
|
|
247
|
+
if (fs.existsSync(unitPath)) {
|
|
248
|
+
try {
|
|
249
|
+
fs.unlinkSync(unitPath);
|
|
250
|
+
}
|
|
251
|
+
catch { }
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const pid = readDaemonPid();
|
|
255
|
+
if (pid) {
|
|
256
|
+
try {
|
|
257
|
+
process.kill(pid, 'SIGTERM');
|
|
258
|
+
}
|
|
259
|
+
catch { }
|
|
260
|
+
setTimeout(() => {
|
|
261
|
+
try {
|
|
262
|
+
process.kill(pid, 0);
|
|
263
|
+
process.kill(pid, 'SIGKILL');
|
|
264
|
+
}
|
|
265
|
+
catch { }
|
|
266
|
+
}, 5000);
|
|
267
|
+
}
|
|
268
|
+
removeDaemonPid();
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
export function getDaemonStatus() {
|
|
272
|
+
const running = isDaemonRunning();
|
|
273
|
+
const pid = readDaemonPid();
|
|
274
|
+
let jobCount = 0;
|
|
275
|
+
try {
|
|
276
|
+
jobCount = listAllJobs().filter((j) => j.enabled).length;
|
|
277
|
+
}
|
|
278
|
+
catch { }
|
|
279
|
+
return { running, pid, jobCount, logPath: getLogPath() };
|
|
280
|
+
}
|
|
281
|
+
export function readDaemonLog(lines) {
|
|
282
|
+
const logPath = getLogPath();
|
|
283
|
+
if (!fs.existsSync(logPath))
|
|
284
|
+
return '(no log file)';
|
|
285
|
+
const content = fs.readFileSync(logPath, 'utf-8');
|
|
286
|
+
if (!lines)
|
|
287
|
+
return content;
|
|
288
|
+
const allLines = content.split('\n');
|
|
289
|
+
return allLines.slice(-lines).join('\n');
|
|
290
|
+
}
|
|
291
|
+
export function signalDaemonReload() {
|
|
292
|
+
const pid = readDaemonPid();
|
|
293
|
+
if (!pid)
|
|
294
|
+
return false;
|
|
295
|
+
try {
|
|
296
|
+
process.kill(pid, 'SIGHUP');
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/lib/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function handleGetContext(project?: string): {
|
|
2
|
+
content: string;
|
|
3
|
+
drive: string;
|
|
4
|
+
large: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function handleGetSection(project: string, file: string, section: string): string;
|
|
7
|
+
export declare function handleAddNote(project: string, title: string, content: string): string;
|
|
8
|
+
export declare function runDriveServer(): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=drive-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-server.d.ts","sourceRoot":"","sources":["../../src/lib/drive-server.ts"],"names":[],"mappings":"AA6CA,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAgDrG;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoCvF;AAMD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOrF;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuGpD"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import { readDrive, listDrives, getDriveContent, getDriveForProject, addNote, driveExists, isDriveLarge, readDriveFiles, } from './drives.js';
|
|
7
|
+
import { getDrivesDir } from './state.js';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
let _hasMq = null;
|
|
10
|
+
function hasMq() {
|
|
11
|
+
if (_hasMq !== null)
|
|
12
|
+
return _hasMq;
|
|
13
|
+
try {
|
|
14
|
+
execSync('which mq', { stdio: 'pipe' });
|
|
15
|
+
_hasMq = true;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
_hasMq = false;
|
|
19
|
+
}
|
|
20
|
+
return _hasMq;
|
|
21
|
+
}
|
|
22
|
+
function runMq(targetPath, query) {
|
|
23
|
+
try {
|
|
24
|
+
return execSync(`mq "${targetPath}" '${query}'`, {
|
|
25
|
+
encoding: 'utf-8',
|
|
26
|
+
timeout: 10000,
|
|
27
|
+
}).trim();
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
return `mq error: ${err.message}`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function handleGetContext(project) {
|
|
34
|
+
let driveName = null;
|
|
35
|
+
if (project) {
|
|
36
|
+
if (driveExists(project)) {
|
|
37
|
+
driveName = project;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const found = getDriveForProject(project);
|
|
41
|
+
if (found)
|
|
42
|
+
driveName = found.name;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const cwd = process.cwd();
|
|
47
|
+
const found = getDriveForProject(cwd);
|
|
48
|
+
if (found)
|
|
49
|
+
driveName = found.name;
|
|
50
|
+
}
|
|
51
|
+
if (!driveName) {
|
|
52
|
+
const drives = listDrives();
|
|
53
|
+
if (drives.length === 0) {
|
|
54
|
+
return { content: 'No drives configured. Create one with: agents drive create <name>', drive: '', large: false };
|
|
55
|
+
}
|
|
56
|
+
const list = drives.map((d) => `- ${d.name}${d.description ? `: ${d.description}` : ''}`).join('\n');
|
|
57
|
+
return { content: `No matching drive found. Available drives:\n${list}`, drive: '', large: false };
|
|
58
|
+
}
|
|
59
|
+
const large = isDriveLarge(driveName);
|
|
60
|
+
if (large && hasMq()) {
|
|
61
|
+
const drivesDir = getDrivesDir();
|
|
62
|
+
const drivePath = path.join(drivesDir, driveName);
|
|
63
|
+
const tree = runMq(drivePath, '.tree("full")');
|
|
64
|
+
return { content: tree, drive: driveName, large: true };
|
|
65
|
+
}
|
|
66
|
+
const content = getDriveContent(driveName);
|
|
67
|
+
if (!content) {
|
|
68
|
+
return { content: `Drive '${driveName}' exists but has no content.`, drive: driveName, large: false };
|
|
69
|
+
}
|
|
70
|
+
const drive = readDrive(driveName);
|
|
71
|
+
const header = drive?.frontmatter
|
|
72
|
+
? Object.entries(drive.frontmatter)
|
|
73
|
+
.filter(([_, v]) => v)
|
|
74
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
75
|
+
.join('\n')
|
|
76
|
+
: '';
|
|
77
|
+
return { content: header ? `${header}\n\n${content}` : content, drive: driveName, large: false };
|
|
78
|
+
}
|
|
79
|
+
export function handleGetSection(project, file, section) {
|
|
80
|
+
if (!driveExists(project)) {
|
|
81
|
+
return `Drive '${project}' not found`;
|
|
82
|
+
}
|
|
83
|
+
const drivesDir = getDrivesDir();
|
|
84
|
+
const isSingleFile = fs.existsSync(path.join(drivesDir, `${project}.md`));
|
|
85
|
+
if (hasMq()) {
|
|
86
|
+
const filePath = isSingleFile
|
|
87
|
+
? path.join(drivesDir, `${project}.md`)
|
|
88
|
+
: path.join(drivesDir, project, file);
|
|
89
|
+
return runMq(filePath, `.section("${section}") | .text`);
|
|
90
|
+
}
|
|
91
|
+
const files = readDriveFiles(project);
|
|
92
|
+
const target = isSingleFile
|
|
93
|
+
? files[0]
|
|
94
|
+
: files.find((f) => path.basename(f.path) === file);
|
|
95
|
+
if (!target) {
|
|
96
|
+
return `File '${file}' not found in drive '${project}'`;
|
|
97
|
+
}
|
|
98
|
+
const sectionRe = new RegExp(`^#{1,6}\\s+${escapeRegex(section)}\\s*$`, 'm');
|
|
99
|
+
const match = target.content.match(sectionRe);
|
|
100
|
+
if (!match || match.index === undefined) {
|
|
101
|
+
return `Section '${section}' not found in ${file}`;
|
|
102
|
+
}
|
|
103
|
+
const start = match.index;
|
|
104
|
+
const level = match[0].match(/^(#+)/)?.[1].length || 1;
|
|
105
|
+
const rest = target.content.slice(start + match[0].length);
|
|
106
|
+
const nextHeading = rest.match(new RegExp(`^#{1,${level}}\\s`, 'm'));
|
|
107
|
+
const end = nextHeading?.index !== undefined ? start + match[0].length + nextHeading.index : undefined;
|
|
108
|
+
return target.content.slice(start, end).trim();
|
|
109
|
+
}
|
|
110
|
+
function escapeRegex(s) {
|
|
111
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
112
|
+
}
|
|
113
|
+
export function handleAddNote(project, title, content) {
|
|
114
|
+
try {
|
|
115
|
+
const notePath = addNote(project, title, content);
|
|
116
|
+
return `Note saved: ${notePath}`;
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
return `Error: ${err.message}`;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export async function runDriveServer() {
|
|
123
|
+
const server = new Server({ name: 'agents-drive', version: '1.0.0' }, { capabilities: { tools: {} } });
|
|
124
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
125
|
+
tools: [
|
|
126
|
+
{
|
|
127
|
+
name: 'get_context',
|
|
128
|
+
description: 'Get project context from a drive. If project is specified, returns that drive. ' +
|
|
129
|
+
'If omitted, auto-detects from cwd. For small drives returns full content. ' +
|
|
130
|
+
'For large drives returns a structural overview (use get_section for details).',
|
|
131
|
+
inputSchema: {
|
|
132
|
+
type: 'object',
|
|
133
|
+
properties: {
|
|
134
|
+
project: {
|
|
135
|
+
type: 'string',
|
|
136
|
+
description: 'Drive name or project path. If omitted, auto-detects from cwd.',
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: 'get_section',
|
|
143
|
+
description: 'Extract a specific section from a drive file. Useful for large drives ' +
|
|
144
|
+
'where get_context returned a structural overview.',
|
|
145
|
+
inputSchema: {
|
|
146
|
+
type: 'object',
|
|
147
|
+
properties: {
|
|
148
|
+
project: { type: 'string', description: 'Drive name' },
|
|
149
|
+
file: { type: 'string', description: 'File name within the drive (e.g. "backend.md")' },
|
|
150
|
+
section: { type: 'string', description: 'Section heading to extract' },
|
|
151
|
+
},
|
|
152
|
+
required: ['project', 'file', 'section'],
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: 'add_note',
|
|
157
|
+
description: 'Add an agent-contributed note to a drive. Notes are stored as timestamped markdown ' +
|
|
158
|
+
'files in the drive\'s notes/ directory and synced on next push.',
|
|
159
|
+
inputSchema: {
|
|
160
|
+
type: 'object',
|
|
161
|
+
properties: {
|
|
162
|
+
project: { type: 'string', description: 'Drive name' },
|
|
163
|
+
title: { type: 'string', description: 'Note title' },
|
|
164
|
+
content: { type: 'string', description: 'Note content (markdown)' },
|
|
165
|
+
},
|
|
166
|
+
required: ['project', 'title', 'content'],
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
}));
|
|
171
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
172
|
+
const { name, arguments: args } = request.params;
|
|
173
|
+
try {
|
|
174
|
+
let result;
|
|
175
|
+
switch (name) {
|
|
176
|
+
case 'get_context': {
|
|
177
|
+
const { content, drive, large } = handleGetContext(args?.project);
|
|
178
|
+
const meta = drive ? `[drive: ${drive}${large ? ', structural overview' : ''}]\n\n` : '';
|
|
179
|
+
result = meta + content;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
case 'get_section': {
|
|
183
|
+
if (!args?.project || !args?.file || !args?.section) {
|
|
184
|
+
result = 'Error: project, file, and section are required';
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
result = handleGetSection(args.project, args.file, args.section);
|
|
188
|
+
}
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
case 'add_note': {
|
|
192
|
+
if (!args?.project || !args?.title || !args?.content) {
|
|
193
|
+
result = 'Error: project, title, and content are required';
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
result = handleAddNote(args.project, args.title, args.content);
|
|
197
|
+
}
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
default:
|
|
201
|
+
result = `Unknown tool: ${name}`;
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
content: [{ type: 'text', text: result }],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
return {
|
|
209
|
+
content: [{ type: 'text', text: `Error: ${err.message}` }],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
const transport = new StdioServerTransport();
|
|
214
|
+
await server.connect(transport);
|
|
215
|
+
console.error('agents-drive MCP server started');
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=drive-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-server.js","sourceRoot":"","sources":["../../src/lib/drive-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface DriveFrontmatter {
|
|
2
|
+
name: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
project?: string;
|
|
5
|
+
repo?: string;
|
|
6
|
+
updated?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DriveFile {
|
|
9
|
+
name: string;
|
|
10
|
+
path: string;
|
|
11
|
+
frontmatter: DriveFrontmatter;
|
|
12
|
+
content: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function createDrive(name: string, description?: string): string;
|
|
15
|
+
export declare function readDrive(name: string): DriveFile | null;
|
|
16
|
+
export declare function readDriveFiles(name: string): DriveFile[];
|
|
17
|
+
export declare function listDrives(): DriveFrontmatter[];
|
|
18
|
+
export declare function deleteDrive(name: string): boolean;
|
|
19
|
+
export declare function driveExists(name: string): boolean;
|
|
20
|
+
export declare function updateDriveFrontmatter(name: string, updates: Partial<DriveFrontmatter>): void;
|
|
21
|
+
export declare function getDriveContent(name: string): string | null;
|
|
22
|
+
export declare function getDriveForProject(projectPath: string): DriveFrontmatter | null;
|
|
23
|
+
export declare function addNote(driveName: string, title: string, content: string): string;
|
|
24
|
+
export declare function isDriveLarge(name: string): boolean;
|
|
25
|
+
export declare function discoverDrivesFromRepo(repoPath: string): Array<{
|
|
26
|
+
name: string;
|
|
27
|
+
path: string;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function installDriveFromSource(sourcePath: string, name: string): {
|
|
30
|
+
success: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
};
|
|
33
|
+
export declare function driveContentMatches(name: string, sourcePath: string): boolean;
|
|
34
|
+
//# sourceMappingURL=drives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drives.d.ts","sourceRoot":"","sources":["../../src/lib/drives.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,gBAAgB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAiCD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBtE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAsBxD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAqBxD;AAED,wBAAgB,UAAU,IAAI,gBAAgB,EAAE,CA6B/C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAgBjD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKjD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAM7F;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS3D;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAa/E;AAaD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBjF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAgBlD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAsB9F;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAkB7G;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAe7E"}
|