svamp-cli 0.1.46 → 0.1.48
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/dist/cli.mjs +261 -67
- package/dist/commands-8Wmq0uak.mjs +1407 -0
- package/dist/commands-B-XaqFDB.mjs +1407 -0
- package/dist/commands-BEhSQqTp.mjs +507 -0
- package/dist/commands-BTEmyf2m.mjs +1407 -0
- package/dist/commands-BVuE0VQU.mjs +507 -0
- package/dist/commands-BY09VTpk.mjs +1375 -0
- package/dist/commands-BdvvRQIo.mjs +1415 -0
- package/dist/commands-Bgg_dvDw.mjs +1683 -0
- package/dist/commands-Bi0zYJvj.mjs +1407 -0
- package/dist/commands-C6KDr9Yp.mjs +1407 -0
- package/dist/commands-C9TOoTCv.mjs +1395 -0
- package/dist/commands-C9TdN_El.mjs +1683 -0
- package/dist/commands-CQz67Rm1.mjs +1395 -0
- package/dist/commands-CToIvBFX.mjs +1375 -0
- package/dist/commands-CYMSyqYC.mjs +1395 -0
- package/dist/commands-CdyCWC3y.mjs +1395 -0
- package/dist/commands-CrdvbXPI.mjs +1395 -0
- package/dist/commands-D7-NHH5q.mjs +1407 -0
- package/dist/commands-DBv6A3aJ.mjs +507 -0
- package/dist/commands-DVw-P6-0.mjs +1407 -0
- package/dist/commands-DsIoygTL.mjs +1395 -0
- package/dist/commands-DypTF36z.mjs +506 -0
- package/dist/commands-EUMJqBCs.mjs +1407 -0
- package/dist/commands-Jk5no-DX.mjs +1407 -0
- package/dist/commands-O1Q9g00y.mjs +1395 -0
- package/dist/commands-OwMfbBrU.mjs +1395 -0
- package/dist/commands-S_MFQ9n1.mjs +354 -0
- package/dist/commands-T3q8VKCY.mjs +1407 -0
- package/dist/commands-Ugz9TtRu.mjs +1420 -0
- package/dist/commands-g-1n3_Rp.mjs +1395 -0
- package/dist/commands-otgzprjb.mjs +1375 -0
- package/dist/commands-rhHI6Wb2.mjs +1420 -0
- package/dist/index.mjs +1 -1
- package/dist/package-BMCjXPI9.mjs +58 -0
- package/dist/package-BaGfG8vL.mjs +58 -0
- package/dist/package-DG0AkZdm.mjs +58 -0
- package/dist/package-k3XsdP9k.mjs +58 -0
- package/dist/run-4li60ojK.mjs +1051 -0
- package/dist/run-6dwQnoBL.mjs +1051 -0
- package/dist/run-B-PWtXF-.mjs +5894 -0
- package/dist/run-B1ivovUl.mjs +5964 -0
- package/dist/run-BE_AIJ7z.mjs +1051 -0
- package/dist/run-BG3279Kg.mjs +1051 -0
- package/dist/run-BVcPemGr.mjs +5947 -0
- package/dist/run-BWqEmIiz.mjs +5964 -0
- package/dist/run-BjZ6SyFy.mjs +1051 -0
- package/dist/run-Bl8OkKyC.mjs +5969 -0
- package/dist/run-Bmx5wEBF.mjs +1051 -0
- package/dist/run-ByOVDgvx.mjs +6115 -0
- package/dist/run-BzRP6Q5t.mjs +1051 -0
- package/dist/run-C0dyMP62.mjs +1051 -0
- package/dist/run-CC2C8P-U.mjs +6031 -0
- package/dist/run-CDBKhQ1Z.mjs +1051 -0
- package/dist/run-CEB6sYzn.mjs +5962 -0
- package/dist/run-CIFezmkC.mjs +5949 -0
- package/dist/run-CLA9zw7J.mjs +5907 -0
- package/dist/run-CSUAy5T5.mjs +1051 -0
- package/dist/run-C_KIew8H.mjs +1051 -0
- package/dist/run-CcYaXgCy.mjs +6091 -0
- package/dist/run-CdihMx0V.mjs +1051 -0
- package/dist/run-Cf2Dl_ck.mjs +1051 -0
- package/dist/run-CkbDK6jA.mjs +1051 -0
- package/dist/run-Ckyg9-fm.mjs +6079 -0
- package/dist/run-Ct--DWF1.mjs +1051 -0
- package/dist/run-CuIMdkKF.mjs +6099 -0
- package/dist/run-CzIY4_RE.mjs +6093 -0
- package/dist/run-D0ow-xms.mjs +5905 -0
- package/dist/run-D2X3jEqg.mjs +1051 -0
- package/dist/run-D3Lqxasl.mjs +1051 -0
- package/dist/run-D691XPXy.mjs +6031 -0
- package/dist/run-DA-YBjNw.mjs +6018 -0
- package/dist/run-DByI8mI0.mjs +1051 -0
- package/dist/run-DDF-tRbn.mjs +5954 -0
- package/dist/run-DOPaGRT2.mjs +6027 -0
- package/dist/run-DP7KSZqR.mjs +1051 -0
- package/dist/run-D_W5YF0D.mjs +6046 -0
- package/dist/run-DaReJPf8.mjs +1051 -0
- package/dist/run-DfuHUDIJ.mjs +1051 -0
- package/dist/run-DfwfyFqj.mjs +5975 -0
- package/dist/run-DgUDGHZy.mjs +1051 -0
- package/dist/run-Dm3U4FB5.mjs +6018 -0
- package/dist/run-DzXohf8-.mjs +1051 -0
- package/dist/run-HU4XjZfs.mjs +6023 -0
- package/dist/run-ZDa17iLg.mjs +6060 -0
- package/dist/run-ZN0qMdS_.mjs +1051 -0
- package/package.json +2 -2
package/dist/cli.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as stopDaemon, s as startDaemon, d as daemonStatus } from './run-
|
|
1
|
+
import { b as stopDaemon, s as startDaemon, d as daemonStatus } from './run-ByOVDgvx.mjs';
|
|
2
2
|
import 'os';
|
|
3
3
|
import 'fs/promises';
|
|
4
4
|
import 'fs';
|
|
@@ -103,12 +103,14 @@ async function main() {
|
|
|
103
103
|
await handleSessionCommand();
|
|
104
104
|
} else if (subcommand === "machine") {
|
|
105
105
|
await handleMachineCommand();
|
|
106
|
+
} else if (subcommand === "skills") {
|
|
107
|
+
await handleSkillsCommand();
|
|
106
108
|
} else if (subcommand === "--help" || subcommand === "-h") {
|
|
107
109
|
printHelp();
|
|
108
110
|
} else if (!subcommand || subcommand === "start") {
|
|
109
111
|
await handleInteractiveCommand();
|
|
110
112
|
} else if (subcommand === "--version" || subcommand === "-v") {
|
|
111
|
-
const pkg = await import('./package-
|
|
113
|
+
const pkg = await import('./package-BaGfG8vL.mjs').catch(() => ({ default: { version: "unknown" } }));
|
|
112
114
|
console.log(`svamp version: ${pkg.default.version}`);
|
|
113
115
|
} else {
|
|
114
116
|
console.error(`Unknown command: ${subcommand}`);
|
|
@@ -117,7 +119,7 @@ async function main() {
|
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
121
|
async function handleInteractiveCommand() {
|
|
120
|
-
const { runInteractive } = await import('./run-
|
|
122
|
+
const { runInteractive } = await import('./run-BjZ6SyFy.mjs');
|
|
121
123
|
const interactiveArgs = subcommand === "start" ? args.slice(1) : args;
|
|
122
124
|
let directory = process.cwd();
|
|
123
125
|
let resumeSessionId;
|
|
@@ -162,7 +164,7 @@ async function handleAgentCommand() {
|
|
|
162
164
|
return;
|
|
163
165
|
}
|
|
164
166
|
if (agentArgs[0] === "list") {
|
|
165
|
-
const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-
|
|
167
|
+
const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-ByOVDgvx.mjs').then(function (n) { return n.i; });
|
|
166
168
|
console.log("Known agents:");
|
|
167
169
|
for (const [name, config2] of Object.entries(KNOWN_ACP_AGENTS)) {
|
|
168
170
|
console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")} (ACP)`);
|
|
@@ -174,7 +176,7 @@ async function handleAgentCommand() {
|
|
|
174
176
|
console.log('Use "svamp agent -- <command> [args]" for a custom ACP agent.');
|
|
175
177
|
return;
|
|
176
178
|
}
|
|
177
|
-
const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-
|
|
179
|
+
const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-ByOVDgvx.mjs').then(function (n) { return n.i; });
|
|
178
180
|
let cwd = process.cwd();
|
|
179
181
|
const filteredArgs = [];
|
|
180
182
|
for (let i = 0; i < agentArgs.length; i++) {
|
|
@@ -198,12 +200,12 @@ async function handleAgentCommand() {
|
|
|
198
200
|
console.log(`Starting ${config.agentName} agent in ${cwd}...`);
|
|
199
201
|
let backend;
|
|
200
202
|
if (KNOWN_MCP_AGENTS[config.agentName]) {
|
|
201
|
-
const { CodexMcpBackend } = await import('./run-
|
|
203
|
+
const { CodexMcpBackend } = await import('./run-ByOVDgvx.mjs').then(function (n) { return n.j; });
|
|
202
204
|
backend = new CodexMcpBackend({ cwd, log: logFn });
|
|
203
205
|
} else {
|
|
204
|
-
const { AcpBackend } = await import('./run-
|
|
205
|
-
const { GeminiTransport } = await import('./run-
|
|
206
|
-
const { DefaultTransport } = await import('./run-
|
|
206
|
+
const { AcpBackend } = await import('./run-ByOVDgvx.mjs').then(function (n) { return n.h; });
|
|
207
|
+
const { GeminiTransport } = await import('./run-ByOVDgvx.mjs').then(function (n) { return n.G; });
|
|
208
|
+
const { DefaultTransport } = await import('./run-ByOVDgvx.mjs').then(function (n) { return n.D; });
|
|
207
209
|
const transportHandler = config.agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(config.agentName);
|
|
208
210
|
backend = new AcpBackend({
|
|
209
211
|
agentName: config.agentName,
|
|
@@ -321,7 +323,7 @@ async function handleSessionCommand() {
|
|
|
321
323
|
printSessionHelp();
|
|
322
324
|
return;
|
|
323
325
|
}
|
|
324
|
-
const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionQueueAdd, sessionQueueList, sessionQueueClear } = await import('./commands-
|
|
326
|
+
const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionQueueAdd, sessionQueueList, sessionQueueClear } = await import('./commands-C9TdN_El.mjs');
|
|
325
327
|
const parseFlagStr = (flag, shortFlag) => {
|
|
326
328
|
for (let i = 1; i < sessionArgs.length; i++) {
|
|
327
329
|
if ((sessionArgs[i] === flag || shortFlag) && i + 1 < sessionArgs.length) {
|
|
@@ -355,13 +357,21 @@ async function handleSessionCommand() {
|
|
|
355
357
|
}
|
|
356
358
|
const message = parseFlagStr("--message");
|
|
357
359
|
const wait = hasFlag("--wait");
|
|
360
|
+
const worktree = hasFlag("--worktree");
|
|
358
361
|
const isolate = hasFlag("--isolate");
|
|
362
|
+
const permissionMode = parseFlagStr("--permission-mode") || parseFlagStr("-p");
|
|
359
363
|
const securityContextPath = parseFlagStr("--security-context");
|
|
360
364
|
const denyNetwork = hasFlag("--deny-network");
|
|
365
|
+
const parentSessionId = parseFlagStr("--parent");
|
|
366
|
+
const tagsFlag = parseFlagStr("--tags");
|
|
361
367
|
const share = [];
|
|
362
368
|
const denyRead = [];
|
|
363
369
|
const allowWrite = [];
|
|
364
370
|
const allowDomain = [];
|
|
371
|
+
const tags = [];
|
|
372
|
+
if (tagsFlag) {
|
|
373
|
+
tags.push(...tagsFlag.split(",").map((t) => t.trim()).filter(Boolean));
|
|
374
|
+
}
|
|
365
375
|
for (let i = 1; i < sessionArgs.length; i++) {
|
|
366
376
|
if (sessionArgs[i] === "--share" && i + 1 < sessionArgs.length) {
|
|
367
377
|
share.push(sessionArgs[++i]);
|
|
@@ -373,18 +383,22 @@ async function handleSessionCommand() {
|
|
|
373
383
|
allowDomain.push(sessionArgs[++i]);
|
|
374
384
|
}
|
|
375
385
|
}
|
|
376
|
-
const { parseShareArg } = await import('./commands-
|
|
386
|
+
const { parseShareArg } = await import('./commands-C9TdN_El.mjs');
|
|
377
387
|
const shareEntries = share.map((s) => parseShareArg(s));
|
|
378
388
|
await sessionSpawn(agent, dir, targetMachineId, {
|
|
379
389
|
message,
|
|
380
390
|
wait,
|
|
391
|
+
worktree,
|
|
381
392
|
isolate,
|
|
393
|
+
permissionMode,
|
|
382
394
|
securityContextPath,
|
|
383
395
|
share: shareEntries.length > 0 ? shareEntries : void 0,
|
|
384
396
|
denyRead: denyRead.length > 0 ? denyRead : void 0,
|
|
385
397
|
allowWrite: allowWrite.length > 0 ? allowWrite : void 0,
|
|
386
398
|
denyNetwork,
|
|
387
|
-
allowDomain: allowDomain.length > 0 ? allowDomain : void 0
|
|
399
|
+
allowDomain: allowDomain.length > 0 ? allowDomain : void 0,
|
|
400
|
+
tags: tags.length > 0 ? tags : void 0,
|
|
401
|
+
parentSessionId
|
|
388
402
|
});
|
|
389
403
|
} else if (sessionSubcommand === "stop") {
|
|
390
404
|
if (!sessionArgs[1]) {
|
|
@@ -402,12 +416,13 @@ async function handleSessionCommand() {
|
|
|
402
416
|
});
|
|
403
417
|
} else if (sessionSubcommand === "messages" || sessionSubcommand === "msgs") {
|
|
404
418
|
if (!sessionArgs[1]) {
|
|
405
|
-
console.error("Usage: svamp session messages <session-id> [--last N] [--json] [--after N] [--limit N]");
|
|
419
|
+
console.error("Usage: svamp session messages <session-id> [--last N] [--json] [--raw] [--after N] [--limit N]");
|
|
406
420
|
process.exit(1);
|
|
407
421
|
}
|
|
408
422
|
await sessionMessages(sessionArgs[1], targetMachineId, {
|
|
409
423
|
last: parseFlagInt("--last"),
|
|
410
424
|
json: hasFlag("--json"),
|
|
425
|
+
raw: hasFlag("--raw"),
|
|
411
426
|
after: parseFlagInt("--after"),
|
|
412
427
|
limit: parseFlagInt("--limit")
|
|
413
428
|
});
|
|
@@ -429,21 +444,43 @@ async function handleSessionCommand() {
|
|
|
429
444
|
});
|
|
430
445
|
} else if (sessionSubcommand === "wait") {
|
|
431
446
|
if (!sessionArgs[1]) {
|
|
432
|
-
console.error("Usage: svamp session wait <session-id> [--timeout N]");
|
|
447
|
+
console.error("Usage: svamp session wait <session-id> [--timeout N] [--json]");
|
|
433
448
|
process.exit(1);
|
|
434
449
|
}
|
|
435
450
|
await sessionWait(sessionArgs[1], targetMachineId, {
|
|
436
|
-
timeout: parseFlagInt("--timeout")
|
|
451
|
+
timeout: parseFlagInt("--timeout"),
|
|
452
|
+
json: hasFlag("--json")
|
|
437
453
|
});
|
|
438
454
|
} else if (sessionSubcommand === "share") {
|
|
439
455
|
if (!sessionArgs[1]) {
|
|
440
|
-
console.error("Usage: svamp session share <session-id> --add <email>[:<role>] | --remove <email> | --list");
|
|
456
|
+
console.error("Usage: svamp session share <session-id> --add <email>[:<role>] | --remove <email> | --list | --public <view|interact|off>");
|
|
441
457
|
process.exit(1);
|
|
442
458
|
}
|
|
443
459
|
await sessionShare(sessionArgs[1], targetMachineId, {
|
|
444
460
|
add: parseFlagStr("--add"),
|
|
445
461
|
remove: parseFlagStr("--remove"),
|
|
446
|
-
list: hasFlag("--list")
|
|
462
|
+
list: hasFlag("--list"),
|
|
463
|
+
public: parseFlagStr("--public")
|
|
464
|
+
});
|
|
465
|
+
} else if (sessionSubcommand === "approve") {
|
|
466
|
+
if (!sessionArgs[1]) {
|
|
467
|
+
console.error("Usage: svamp session approve <session-id> [request-id] [--json]");
|
|
468
|
+
process.exit(1);
|
|
469
|
+
}
|
|
470
|
+
const { sessionApprove } = await import('./commands-C9TdN_El.mjs');
|
|
471
|
+
const approveReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
|
|
472
|
+
await sessionApprove(sessionArgs[1], approveReqId, targetMachineId, {
|
|
473
|
+
json: hasFlag("--json")
|
|
474
|
+
});
|
|
475
|
+
} else if (sessionSubcommand === "deny") {
|
|
476
|
+
if (!sessionArgs[1]) {
|
|
477
|
+
console.error("Usage: svamp session deny <session-id> [request-id] [--json]");
|
|
478
|
+
process.exit(1);
|
|
479
|
+
}
|
|
480
|
+
const { sessionDeny } = await import('./commands-C9TdN_El.mjs');
|
|
481
|
+
const denyReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
|
|
482
|
+
await sessionDeny(sessionArgs[1], denyReqId, targetMachineId, {
|
|
483
|
+
json: hasFlag("--json")
|
|
447
484
|
});
|
|
448
485
|
} else if (sessionSubcommand === "ralph-start" || sessionSubcommand === "ralph") {
|
|
449
486
|
if (!sessionArgs[1] || !sessionArgs[2]) {
|
|
@@ -505,7 +542,7 @@ async function handleMachineCommand() {
|
|
|
505
542
|
return;
|
|
506
543
|
}
|
|
507
544
|
if (machineSubcommand === "share") {
|
|
508
|
-
const { machineShare } = await import('./commands-
|
|
545
|
+
const { machineShare } = await import('./commands-C9TdN_El.mjs');
|
|
509
546
|
let machineId;
|
|
510
547
|
const shareArgs = [];
|
|
511
548
|
for (let i = 1; i < machineArgs.length; i++) {
|
|
@@ -541,6 +578,51 @@ async function handleMachineCommand() {
|
|
|
541
578
|
}
|
|
542
579
|
process.exit(0);
|
|
543
580
|
}
|
|
581
|
+
async function handleSkillsCommand() {
|
|
582
|
+
const skillsArgs = args.slice(1);
|
|
583
|
+
const skillsSubcommand = skillsArgs[0];
|
|
584
|
+
if (!skillsSubcommand || skillsSubcommand === "--help" || skillsSubcommand === "-h") {
|
|
585
|
+
printSkillsHelp();
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
const { skillsFind, skillsInstall, skillsList, skillsRemove, skillsPublish } = await import('./commands-BVuE0VQU.mjs');
|
|
589
|
+
if (skillsSubcommand === "find" || skillsSubcommand === "search") {
|
|
590
|
+
const query = skillsArgs.slice(1).filter((a) => !a.startsWith("--")).join(" ");
|
|
591
|
+
if (!query) {
|
|
592
|
+
console.error("Usage: svamp skills find <query> [--json]");
|
|
593
|
+
process.exit(1);
|
|
594
|
+
}
|
|
595
|
+
await skillsFind(query, { json: skillsArgs.includes("--json") });
|
|
596
|
+
} else if (skillsSubcommand === "install" || skillsSubcommand === "add") {
|
|
597
|
+
if (!skillsArgs[1]) {
|
|
598
|
+
console.error("Usage: svamp skills install <name> [--force]");
|
|
599
|
+
process.exit(1);
|
|
600
|
+
}
|
|
601
|
+
await skillsInstall(skillsArgs[1], { force: skillsArgs.includes("--force") });
|
|
602
|
+
} else if (skillsSubcommand === "list" || skillsSubcommand === "ls") {
|
|
603
|
+
await skillsList();
|
|
604
|
+
} else if (skillsSubcommand === "remove" || skillsSubcommand === "rm") {
|
|
605
|
+
if (!skillsArgs[1]) {
|
|
606
|
+
console.error("Usage: svamp skills remove <name>");
|
|
607
|
+
process.exit(1);
|
|
608
|
+
}
|
|
609
|
+
await skillsRemove(skillsArgs[1]);
|
|
610
|
+
} else if (skillsSubcommand === "publish") {
|
|
611
|
+
const publishArgs = skillsArgs.slice(1).filter((a) => !a.startsWith("--"));
|
|
612
|
+
if (!publishArgs[0]) {
|
|
613
|
+
console.error("Usage: svamp skills publish <path> [--version <tag>]");
|
|
614
|
+
process.exit(1);
|
|
615
|
+
}
|
|
616
|
+
const versionIdx = skillsArgs.indexOf("--version");
|
|
617
|
+
const versionTag = versionIdx !== -1 ? skillsArgs[versionIdx + 1] : void 0;
|
|
618
|
+
await skillsPublish(publishArgs[0], { version: versionTag });
|
|
619
|
+
} else {
|
|
620
|
+
console.error(`Unknown skills command: ${skillsSubcommand}`);
|
|
621
|
+
printSkillsHelp();
|
|
622
|
+
process.exit(1);
|
|
623
|
+
}
|
|
624
|
+
process.exit(0);
|
|
625
|
+
}
|
|
544
626
|
async function loginToHypha() {
|
|
545
627
|
const serverUrl = args[1] || process.env.HYPHA_SERVER_URL;
|
|
546
628
|
if (!serverUrl) {
|
|
@@ -850,25 +932,34 @@ function printHelp() {
|
|
|
850
932
|
svamp \u2014 AI workspace on Hypha Cloud
|
|
851
933
|
|
|
852
934
|
Usage:
|
|
853
|
-
svamp
|
|
854
|
-
svamp start [-d <path>]
|
|
855
|
-
svamp login [url]
|
|
856
|
-
svamp daemon start
|
|
857
|
-
svamp daemon stop
|
|
858
|
-
svamp daemon restart
|
|
859
|
-
svamp daemon status
|
|
860
|
-
svamp daemon install
|
|
861
|
-
svamp session list
|
|
862
|
-
svamp session spawn
|
|
863
|
-
svamp session
|
|
864
|
-
svamp session
|
|
865
|
-
svamp session
|
|
866
|
-
svamp
|
|
867
|
-
svamp
|
|
868
|
-
svamp
|
|
869
|
-
svamp
|
|
870
|
-
svamp
|
|
871
|
-
svamp --help
|
|
935
|
+
svamp Start interactive Claude session (synced to cloud)
|
|
936
|
+
svamp start [-d <path>] Same as above, with explicit directory
|
|
937
|
+
svamp login [url] Login to Hypha (opens browser, stores token)
|
|
938
|
+
svamp daemon start Start the daemon (detached)
|
|
939
|
+
svamp daemon stop Stop the daemon (sessions preserved for restart)
|
|
940
|
+
svamp daemon restart Restart the daemon (sessions resume seamlessly)
|
|
941
|
+
svamp daemon status Show daemon status
|
|
942
|
+
svamp daemon install Install as system service (launchd/systemd/wrapper)
|
|
943
|
+
svamp session list List active sessions
|
|
944
|
+
svamp session spawn Spawn a new session on the daemon
|
|
945
|
+
svamp session send <id> <m> Send message to a session
|
|
946
|
+
svamp session wait <id> Wait for agent to become idle
|
|
947
|
+
svamp session info <id> Show session status & pending permissions
|
|
948
|
+
svamp session messages <id> Show message history
|
|
949
|
+
svamp session approve <id> Approve pending permission request
|
|
950
|
+
svamp session deny <id> Deny pending permission request
|
|
951
|
+
svamp session attach <id> Attach to a session (interactive terminal)
|
|
952
|
+
svamp session share <id> Manage session sharing
|
|
953
|
+
svamp session --help Show all session commands
|
|
954
|
+
svamp machine share Manage machine sharing & security contexts
|
|
955
|
+
svamp machine --help Show all machine commands
|
|
956
|
+
svamp skills find <query> Search the skills marketplace
|
|
957
|
+
svamp skills install <n> Install a skill from the marketplace
|
|
958
|
+
svamp skills --help Show all skill commands
|
|
959
|
+
svamp agent list List known agents
|
|
960
|
+
svamp agent <name> Start local agent session (gemini, codex)
|
|
961
|
+
svamp --version Show version
|
|
962
|
+
svamp --help Show this help
|
|
872
963
|
|
|
873
964
|
Interactive mode:
|
|
874
965
|
When you run 'svamp' with no arguments, Claude starts in your terminal
|
|
@@ -903,26 +994,87 @@ function printSessionHelp() {
|
|
|
903
994
|
console.log(`
|
|
904
995
|
svamp session \u2014 Manage daemon sessions (Claude, Gemini, Codex)
|
|
905
996
|
|
|
906
|
-
|
|
907
|
-
svamp session list [--active] [--json]
|
|
908
|
-
svamp session machines
|
|
909
|
-
svamp session spawn <agent> [-d <path>] [
|
|
910
|
-
|
|
911
|
-
svamp session
|
|
912
|
-
svamp session info <id> [--json] Show session metadata + activity
|
|
997
|
+
Commands:
|
|
998
|
+
svamp session list [--active] [--json] List sessions (alias: ls)
|
|
999
|
+
svamp session machines List discoverable machines
|
|
1000
|
+
svamp session spawn <agent> [-d <path>] [options] Spawn a new session
|
|
1001
|
+
svamp session stop <id> Stop a session
|
|
1002
|
+
svamp session info <id> [--json] Show status, activity & pending permissions
|
|
913
1003
|
svamp session send <id> <message> [--wait] [--timeout N] [--json]
|
|
914
|
-
|
|
915
|
-
svamp session wait <id> [--timeout N]
|
|
916
|
-
svamp session messages <id> [--last N] [--json] [--after N] [--limit N]
|
|
917
|
-
|
|
918
|
-
svamp session attach <id>
|
|
1004
|
+
Send a message to a session
|
|
1005
|
+
svamp session wait <id> [--timeout N] [--json] Wait for agent to become idle
|
|
1006
|
+
svamp session messages <id> [--last N] [--json] [--raw] [--after N] [--limit N]
|
|
1007
|
+
Show messages (alias: msgs)
|
|
1008
|
+
svamp session attach <id> Attach to session (interactive terminal)
|
|
1009
|
+
svamp session approve <id> [request-id] [--json] Approve pending permission(s)
|
|
1010
|
+
svamp session deny <id> [request-id] [--json] Deny pending permission(s)
|
|
1011
|
+
|
|
1012
|
+
Spawn options:
|
|
1013
|
+
-d, --directory <path> Working directory (default: cwd)
|
|
1014
|
+
-p, --permission-mode <mode> Agent permission mode (see "Permission modes" below)
|
|
1015
|
+
--message <msg> Send initial message after spawn
|
|
1016
|
+
--wait Wait for agent to become idle before returning
|
|
1017
|
+
--worktree Create a git worktree branch (at .dev/worktree/<name>)
|
|
1018
|
+
--isolate Force OS-level sandbox isolation
|
|
1019
|
+
--security-context <path> Apply security context config (JSON file)
|
|
1020
|
+
--share <email>[:<role>] Share with user (repeatable). Role: view, interact, admin
|
|
1021
|
+
--deny-network Block all network access
|
|
1022
|
+
--deny-read <path> Deny reading path (repeatable)
|
|
1023
|
+
--allow-write <path> Allow writing path (repeatable)
|
|
1024
|
+
--allow-domain <domain> Allow network domain (repeatable)
|
|
1025
|
+
|
|
1026
|
+
Permission modes (-p, --permission-mode):
|
|
1027
|
+
default Prompt for each tool use (default)
|
|
1028
|
+
acceptEdits Auto-approve file edits, prompt for bash/dangerous tools
|
|
1029
|
+
bypassPermissions Auto-approve all tools (no prompts)
|
|
1030
|
+
|
|
1031
|
+
Permission workflow:
|
|
1032
|
+
When an agent runs with 'default' or 'acceptEdits' permission mode, it pauses
|
|
1033
|
+
when it needs to use a tool that requires approval. Use these commands to manage:
|
|
1034
|
+
|
|
1035
|
+
1. Check status: svamp session info <id> --json
|
|
1036
|
+
\u2192 shows pendingPermissions array when agent is blocked
|
|
1037
|
+
2. Wait & detect: svamp session wait <id> --json
|
|
1038
|
+
\u2192 exits with code 2 if permission pending (see exit codes)
|
|
1039
|
+
3. Approve: svamp session approve <id> (approve all pending)
|
|
1040
|
+
svamp session approve <id> <rid> (approve specific request)
|
|
1041
|
+
4. Deny: svamp session deny <id> (deny all pending)
|
|
1042
|
+
svamp session deny <id> <rid> (deny specific request)
|
|
1043
|
+
|
|
1044
|
+
Request IDs support prefix matching (e.g., "abc1" matches "abc12345-...").
|
|
1045
|
+
|
|
1046
|
+
Messages options:
|
|
1047
|
+
--last N Show only the last N messages
|
|
1048
|
+
--after N Start after sequence number N
|
|
1049
|
+
--limit N Max messages to fetch from server (default: 1000, cap: 500 per page)
|
|
1050
|
+
--json Output as JSON (FormattedMessage: id, seq, role, text, createdAt)
|
|
1051
|
+
--raw With --json: output full raw message objects (includes tool_use args,
|
|
1052
|
+
tool_result content, thinking blocks \u2014 use for programmatic parsing)
|
|
1053
|
+
|
|
1054
|
+
Exit codes (wait, send --wait, spawn --wait):
|
|
1055
|
+
0 Agent is idle (task completed)
|
|
1056
|
+
1 Error (timeout, connection failure, session not found)
|
|
1057
|
+
2 Agent is waiting for permission approval \u2014 use approve/deny to continue
|
|
1058
|
+
|
|
1059
|
+
Global options:
|
|
1060
|
+
--machine <id>, -m <id> Target a specific machine (prefix match supported)
|
|
1061
|
+
|
|
1062
|
+
Agents: claude (default), gemini, codex
|
|
1063
|
+
Session and machine IDs support prefix matching (e.g., "abc1" matches "abc12345-...").
|
|
1064
|
+
|
|
1065
|
+
Sharing:
|
|
919
1066
|
svamp session share <id> --list List shared users
|
|
920
1067
|
svamp session share <id> --add <email>[:<role>] Share with user
|
|
921
1068
|
svamp session share <id> --remove <email> Remove shared user
|
|
1069
|
+
svamp session share <id> --public <view|interact|off> Set public link access
|
|
922
1070
|
|
|
923
1071
|
Options:
|
|
924
1072
|
--machine <id>, -m <id> Target a specific machine (prefix match supported)
|
|
925
1073
|
|
|
1074
|
+
Spawn options:
|
|
1075
|
+
-p, --permission-mode <mode> Agent permission mode: default, acceptEdits, bypassPermissions
|
|
1076
|
+
--worktree Create a git worktree branch as working directory
|
|
1077
|
+
|
|
926
1078
|
Spawn isolation options:
|
|
927
1079
|
--share <email>[:<role>] Share session (repeatable). Role: view, interact, admin
|
|
928
1080
|
--security-context <path> Path to security context JSON config file
|
|
@@ -932,38 +1084,56 @@ Spawn isolation options:
|
|
|
932
1084
|
--deny-network Deny all network access
|
|
933
1085
|
--allow-domain <domain> Allow network access to domain (repeatable)
|
|
934
1086
|
|
|
1087
|
+
Spawn grouping options:
|
|
1088
|
+
--tags <tag1,tag2> Comma-separated tags
|
|
1089
|
+
--parent <sessionId> Set parent session (auto-detected from SVAMP_SESSION_ID)
|
|
1090
|
+
|
|
935
1091
|
Agents: claude (default), gemini, codex
|
|
936
1092
|
|
|
937
1093
|
Session and machine IDs can be abbreviated (prefix match, like Docker).
|
|
938
1094
|
|
|
1095
|
+
NOTE: By default, spawned agents run with 'default' permission mode, which means
|
|
1096
|
+
the agent may pause to request permission for tool use (file edits, bash, etc.).
|
|
1097
|
+
Use -p bypassPermissions to run without approval prompts.
|
|
1098
|
+
|
|
939
1099
|
Attach commands:
|
|
940
1100
|
/quit, /detach Detach (session keeps running)
|
|
941
1101
|
/abort, /cancel Cancel current agent turn
|
|
942
1102
|
/kill Stop the session
|
|
943
1103
|
/info Show session status
|
|
944
1104
|
|
|
945
|
-
|
|
946
|
-
svamp session spawn claude -d ~/projects/myapp --message "Fix the bug" --wait
|
|
947
|
-
svamp session spawn claude -d /tmp/sandbox --isolate --deny-network
|
|
948
|
-
svamp session spawn claude -d /tmp/proj --share alice@example.com:admin --deny-read /etc
|
|
949
|
-
svamp session spawn claude --security-context ./security.json
|
|
950
|
-
svamp session share abc12345 --add bob@example.com:view
|
|
951
|
-
svamp session share abc12345 --list
|
|
952
|
-
|
|
953
|
-
Ralph Loop (iterative task loop):
|
|
1105
|
+
Ralph Loop (iterative task automation):
|
|
954
1106
|
svamp session ralph-start <id> "<task>" [--completion-promise TEXT] [--max-iterations N]
|
|
955
|
-
|
|
956
|
-
svamp session ralph-
|
|
957
|
-
svamp session ralph-status <id> Show Ralph loop status
|
|
1107
|
+
svamp session ralph-cancel <id>
|
|
1108
|
+
svamp session ralph-status <id>
|
|
958
1109
|
|
|
959
1110
|
Message Queue:
|
|
960
|
-
svamp session queue add <id> "<message>"
|
|
961
|
-
svamp session queue list <id>
|
|
962
|
-
svamp session queue clear <id>
|
|
1111
|
+
svamp session queue add <id> "<message>"
|
|
1112
|
+
svamp session queue list <id>
|
|
1113
|
+
svamp session queue clear <id>
|
|
963
1114
|
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
svamp session
|
|
1115
|
+
Examples:
|
|
1116
|
+
# Spawn with bypassed permissions (no prompts)
|
|
1117
|
+
svamp session spawn claude -d ./proj -p bypassPermissions --message "fix tests" --wait
|
|
1118
|
+
|
|
1119
|
+
# Spawn with default permissions, handle approval via CLI
|
|
1120
|
+
svamp session spawn claude -d ./proj --message "refactor auth"
|
|
1121
|
+
svamp session wait abc1 --json # exits with code 2 if permission pending
|
|
1122
|
+
svamp session approve abc1 # approve all pending permissions
|
|
1123
|
+
svamp session wait abc1 # wait for completion
|
|
1124
|
+
|
|
1125
|
+
# Monitor session messages (raw for full tool details)
|
|
1126
|
+
svamp session messages abc1 --last 10 --json --raw
|
|
1127
|
+
|
|
1128
|
+
# Send message and wait for completion
|
|
1129
|
+
svamp session send abc1 "run the tests" --wait --json
|
|
1130
|
+
|
|
1131
|
+
# Isolation & sharing
|
|
1132
|
+
svamp session spawn claude -d /tmp/sandbox --isolate --deny-network
|
|
1133
|
+
svamp session spawn claude -d /tmp/proj --share alice@example.com:admin
|
|
1134
|
+
|
|
1135
|
+
# Ralph Loop
|
|
1136
|
+
svamp session ralph-start abc1 "Fix all linting errors" --max-iterations 10
|
|
967
1137
|
`);
|
|
968
1138
|
}
|
|
969
1139
|
function printMachineHelp() {
|
|
@@ -1003,6 +1173,30 @@ Examples:
|
|
|
1003
1173
|
svamp machine share --list
|
|
1004
1174
|
`);
|
|
1005
1175
|
}
|
|
1176
|
+
function printSkillsHelp() {
|
|
1177
|
+
console.log(`
|
|
1178
|
+
svamp skills \u2014 Agent skills marketplace
|
|
1179
|
+
|
|
1180
|
+
Usage:
|
|
1181
|
+
svamp skills find <query> [--json] Search for skills in the marketplace
|
|
1182
|
+
svamp skills install <name> [--force] Install skill to ~/.claude/skills/<name>/
|
|
1183
|
+
svamp skills list List locally installed skills
|
|
1184
|
+
svamp skills remove <name> Remove an installed skill
|
|
1185
|
+
svamp skills publish <path> [--version <tag>] Publish a skill to the marketplace
|
|
1186
|
+
|
|
1187
|
+
Skills are stored in ~/.claude/skills/ and automatically detected by Claude Code.
|
|
1188
|
+
Each skill contains a SKILL.md file with instructions and metadata.
|
|
1189
|
+
Skills use git-backed storage \u2014 you can also clone and push via git.
|
|
1190
|
+
|
|
1191
|
+
Browse online: https://hypha.aicell.io/hypha-cloud/artifacts/marketplace
|
|
1192
|
+
|
|
1193
|
+
Examples:
|
|
1194
|
+
svamp skills find "code review"
|
|
1195
|
+
svamp skills install code-review
|
|
1196
|
+
svamp skills publish ./my-skill/
|
|
1197
|
+
svamp skills publish ./my-skill/ --version v1.0
|
|
1198
|
+
`);
|
|
1199
|
+
}
|
|
1006
1200
|
function printInteractiveHelp() {
|
|
1007
1201
|
console.log(`
|
|
1008
1202
|
svamp \u2014 Interactive Claude session with cloud sync
|