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.
Files changed (87) hide show
  1. package/dist/cli.mjs +261 -67
  2. package/dist/commands-8Wmq0uak.mjs +1407 -0
  3. package/dist/commands-B-XaqFDB.mjs +1407 -0
  4. package/dist/commands-BEhSQqTp.mjs +507 -0
  5. package/dist/commands-BTEmyf2m.mjs +1407 -0
  6. package/dist/commands-BVuE0VQU.mjs +507 -0
  7. package/dist/commands-BY09VTpk.mjs +1375 -0
  8. package/dist/commands-BdvvRQIo.mjs +1415 -0
  9. package/dist/commands-Bgg_dvDw.mjs +1683 -0
  10. package/dist/commands-Bi0zYJvj.mjs +1407 -0
  11. package/dist/commands-C6KDr9Yp.mjs +1407 -0
  12. package/dist/commands-C9TOoTCv.mjs +1395 -0
  13. package/dist/commands-C9TdN_El.mjs +1683 -0
  14. package/dist/commands-CQz67Rm1.mjs +1395 -0
  15. package/dist/commands-CToIvBFX.mjs +1375 -0
  16. package/dist/commands-CYMSyqYC.mjs +1395 -0
  17. package/dist/commands-CdyCWC3y.mjs +1395 -0
  18. package/dist/commands-CrdvbXPI.mjs +1395 -0
  19. package/dist/commands-D7-NHH5q.mjs +1407 -0
  20. package/dist/commands-DBv6A3aJ.mjs +507 -0
  21. package/dist/commands-DVw-P6-0.mjs +1407 -0
  22. package/dist/commands-DsIoygTL.mjs +1395 -0
  23. package/dist/commands-DypTF36z.mjs +506 -0
  24. package/dist/commands-EUMJqBCs.mjs +1407 -0
  25. package/dist/commands-Jk5no-DX.mjs +1407 -0
  26. package/dist/commands-O1Q9g00y.mjs +1395 -0
  27. package/dist/commands-OwMfbBrU.mjs +1395 -0
  28. package/dist/commands-S_MFQ9n1.mjs +354 -0
  29. package/dist/commands-T3q8VKCY.mjs +1407 -0
  30. package/dist/commands-Ugz9TtRu.mjs +1420 -0
  31. package/dist/commands-g-1n3_Rp.mjs +1395 -0
  32. package/dist/commands-otgzprjb.mjs +1375 -0
  33. package/dist/commands-rhHI6Wb2.mjs +1420 -0
  34. package/dist/index.mjs +1 -1
  35. package/dist/package-BMCjXPI9.mjs +58 -0
  36. package/dist/package-BaGfG8vL.mjs +58 -0
  37. package/dist/package-DG0AkZdm.mjs +58 -0
  38. package/dist/package-k3XsdP9k.mjs +58 -0
  39. package/dist/run-4li60ojK.mjs +1051 -0
  40. package/dist/run-6dwQnoBL.mjs +1051 -0
  41. package/dist/run-B-PWtXF-.mjs +5894 -0
  42. package/dist/run-B1ivovUl.mjs +5964 -0
  43. package/dist/run-BE_AIJ7z.mjs +1051 -0
  44. package/dist/run-BG3279Kg.mjs +1051 -0
  45. package/dist/run-BVcPemGr.mjs +5947 -0
  46. package/dist/run-BWqEmIiz.mjs +5964 -0
  47. package/dist/run-BjZ6SyFy.mjs +1051 -0
  48. package/dist/run-Bl8OkKyC.mjs +5969 -0
  49. package/dist/run-Bmx5wEBF.mjs +1051 -0
  50. package/dist/run-ByOVDgvx.mjs +6115 -0
  51. package/dist/run-BzRP6Q5t.mjs +1051 -0
  52. package/dist/run-C0dyMP62.mjs +1051 -0
  53. package/dist/run-CC2C8P-U.mjs +6031 -0
  54. package/dist/run-CDBKhQ1Z.mjs +1051 -0
  55. package/dist/run-CEB6sYzn.mjs +5962 -0
  56. package/dist/run-CIFezmkC.mjs +5949 -0
  57. package/dist/run-CLA9zw7J.mjs +5907 -0
  58. package/dist/run-CSUAy5T5.mjs +1051 -0
  59. package/dist/run-C_KIew8H.mjs +1051 -0
  60. package/dist/run-CcYaXgCy.mjs +6091 -0
  61. package/dist/run-CdihMx0V.mjs +1051 -0
  62. package/dist/run-Cf2Dl_ck.mjs +1051 -0
  63. package/dist/run-CkbDK6jA.mjs +1051 -0
  64. package/dist/run-Ckyg9-fm.mjs +6079 -0
  65. package/dist/run-Ct--DWF1.mjs +1051 -0
  66. package/dist/run-CuIMdkKF.mjs +6099 -0
  67. package/dist/run-CzIY4_RE.mjs +6093 -0
  68. package/dist/run-D0ow-xms.mjs +5905 -0
  69. package/dist/run-D2X3jEqg.mjs +1051 -0
  70. package/dist/run-D3Lqxasl.mjs +1051 -0
  71. package/dist/run-D691XPXy.mjs +6031 -0
  72. package/dist/run-DA-YBjNw.mjs +6018 -0
  73. package/dist/run-DByI8mI0.mjs +1051 -0
  74. package/dist/run-DDF-tRbn.mjs +5954 -0
  75. package/dist/run-DOPaGRT2.mjs +6027 -0
  76. package/dist/run-DP7KSZqR.mjs +1051 -0
  77. package/dist/run-D_W5YF0D.mjs +6046 -0
  78. package/dist/run-DaReJPf8.mjs +1051 -0
  79. package/dist/run-DfuHUDIJ.mjs +1051 -0
  80. package/dist/run-DfwfyFqj.mjs +5975 -0
  81. package/dist/run-DgUDGHZy.mjs +1051 -0
  82. package/dist/run-Dm3U4FB5.mjs +6018 -0
  83. package/dist/run-DzXohf8-.mjs +1051 -0
  84. package/dist/run-HU4XjZfs.mjs +6023 -0
  85. package/dist/run-ZDa17iLg.mjs +6060 -0
  86. package/dist/run-ZN0qMdS_.mjs +1051 -0
  87. 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-C_8iOjO1.mjs';
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-rasGC9_z.mjs').catch(() => ({ default: { version: "unknown" } }));
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-D3bhRCCb.mjs');
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-C_8iOjO1.mjs').then(function (n) { return n.i; });
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-C_8iOjO1.mjs').then(function (n) { return n.i; });
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-C_8iOjO1.mjs').then(function (n) { return n.j; });
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-C_8iOjO1.mjs').then(function (n) { return n.h; });
205
- const { GeminiTransport } = await import('./run-C_8iOjO1.mjs').then(function (n) { return n.G; });
206
- const { DefaultTransport } = await import('./run-C_8iOjO1.mjs').then(function (n) { return n.D; });
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-Cc73uUnP.mjs');
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-Cc73uUnP.mjs');
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-Cc73uUnP.mjs');
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 Start interactive Claude session (synced to cloud)
854
- svamp start [-d <path>] Same as above, with explicit directory
855
- svamp login [url] Login to Hypha (opens browser, stores token)
856
- svamp daemon start Start the daemon (detached)
857
- svamp daemon stop Stop the daemon (sessions preserved for restart)
858
- svamp daemon restart Restart the daemon (sessions resume seamlessly)
859
- svamp daemon status Show daemon status
860
- svamp daemon install Install as system service (launchd/systemd/wrapper)
861
- svamp session list List active sessions
862
- svamp session spawn Spawn a new session on the daemon
863
- svamp session share <id> Manage session sharing
864
- svamp session attach <id> Attach to a session
865
- svamp session --help Show all session commands
866
- svamp machine share Manage machine sharing & security contexts
867
- svamp machine --help Show all machine commands
868
- svamp agent list List known agents
869
- svamp agent <name> Start local agent session (gemini, codex)
870
- svamp --version Show version
871
- svamp --help Show this 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
- Usage:
907
- svamp session list [--active] [--json] List sessions (alias: ls)
908
- svamp session machines List discoverable machines
909
- svamp session spawn <agent> [-d <path>] [--message <msg>] [--wait]
910
- Spawn a new session
911
- svamp session stop <id> Stop a 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
- Send a message to a session
915
- svamp session wait <id> [--timeout N] Wait for agent to become idle
916
- svamp session messages <id> [--last N] [--json] [--after N] [--limit N]
917
- Show messages (alias: msgs)
918
- svamp session attach <id> Attach to session (interactive)
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
- Examples:
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
- Start a Ralph loop
956
- svamp session ralph-cancel <id> Cancel active Ralph loop
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>" Add message to queue
961
- svamp session queue list <id> List queued messages
962
- svamp session queue clear <id> Clear the queue
1111
+ svamp session queue add <id> "<message>"
1112
+ svamp session queue list <id>
1113
+ svamp session queue clear <id>
963
1114
 
964
- Ralph Loop Examples:
965
- svamp session ralph-start abc12 "Fix all linting errors" --completion-promise "All linting errors fixed" --max-iterations 10
966
- svamp session ralph-cancel abc12
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