svamp-cli 0.2.328 → 0.2.329

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 (28) hide show
  1. package/README.md +27 -6
  2. package/dist/{adminCommands-DotiO7jx.mjs → adminCommands-C-p7ayqB.mjs} +1 -1
  3. package/dist/{agentCommands-DefL1pIo.mjs → agentCommands-B4sCl_5R.mjs} +5 -5
  4. package/dist/{auth-DLK3tc_f.mjs → auth-X_CjxN_J.mjs} +1 -1
  5. package/dist/{cli-BCN1uAze.mjs → cli-BY4DQnRs.mjs} +79 -78
  6. package/dist/cli.mjs +2 -2
  7. package/dist/{commands-BD6Qfv3u.mjs → commands-6uHR7YHf.mjs} +11 -11
  8. package/dist/{commands-DH2WCdPH.mjs → commands-BInj_IDQ.mjs} +3 -3
  9. package/dist/{commands-gO42Ijz3.mjs → commands-BQjZb1eL.mjs} +3 -3
  10. package/dist/{commands-xhA5FWM8.mjs → commands-BR5FB3lB.mjs} +10 -2
  11. package/dist/{commands-BEnXz1U_.mjs → commands-C8uGnx2z.mjs} +2 -2
  12. package/dist/{commands-BFlfbiey.mjs → commands-CEURyD-l.mjs} +1 -1
  13. package/dist/{commands-DEZLlXJ3.mjs → commands-rKfH5E8g.mjs} +34 -27
  14. package/dist/{commands-uN_gulw0.mjs → commands-rmxjAHLz.mjs} +12 -4
  15. package/dist/{fleet-CbKnESdR.mjs → fleet-CxxkWc3z.mjs} +8 -4
  16. package/dist/{headlessCli-2wTVI-Kj.mjs → headlessCli-NkXGxjrT.mjs} +2 -2
  17. package/dist/index.mjs +1 -1
  18. package/dist/{notifyCommands--tpDRdrL.mjs → notifyCommands-CEvdTCIS.mjs} +1 -1
  19. package/dist/package-BNriEfp8.mjs +64 -0
  20. package/dist/{rpc-BCLZpI5H.mjs → rpc-fZm83jEI.mjs} +2 -1
  21. package/dist/{rpc-CZqCc9Pr.mjs → rpc-q5KTMSRl.mjs} +1 -1
  22. package/dist/{run-CSV6OgQ8.mjs → run-1CHjd0_g.mjs} +84 -22
  23. package/dist/{run-BAYXQ4-N.mjs → run-C7JwLKGe.mjs} +1 -1
  24. package/dist/{scheduler-s_j089nA.mjs → scheduler-DTRcVW02.mjs} +1 -1
  25. package/dist/{serveCommands-C4779W5n.mjs → serveCommands-CXlZ6Bdy.mjs} +10 -10
  26. package/dist/{sideband-B7sDP61Z.mjs → sideband-C4QaSCEM.mjs} +1 -1
  27. package/package.json +4 -4
  28. package/dist/package-BORyBEey.mjs +0 -64
package/README.md CHANGED
@@ -92,7 +92,7 @@ svamp session deny <id> # Deny pending permission
92
92
 
93
93
  ```bash
94
94
  svamp session share <id> --list
95
- svamp session share <id> --add <email>[:<role>] # Roles: view, interact, admin
95
+ svamp session share <id> --add <email> # Added users get FULL (owner-equivalent) access
96
96
  svamp session share <id> --remove <email>
97
97
  ```
98
98
 
@@ -100,24 +100,45 @@ svamp session share <id> --remove <email>
100
100
 
101
101
  ```bash
102
102
  svamp session spawn claude -d <path> --isolate
103
- svamp session spawn claude -d <path> --share alice@example.com:admin
103
+ svamp session spawn claude -d <path> --share alice@example.com
104
104
  svamp session spawn claude -d <path> --security-context ./context.json
105
105
  svamp session spawn claude -d <path> --deny-network
106
106
  svamp session spawn claude -d <path> --deny-read /etc --allow-write /tmp/work
107
107
  svamp session spawn claude -d <path> --allow-domain api.anthropic.com
108
108
  ```
109
109
 
110
+ > **⚠ Not all of these are enforced (#0878).** `--deny-read` is accepted but enforced by **no** sandbox
111
+ > backend; `--allow-write` and `--allow-domain` are **not enforced** under the docker/podman isolation
112
+ > backends. Do not rely on them as containment. To actually restrict what a session can read, narrow
113
+ > `allowedDirectories` in a `--security-context` file. See
114
+ > [`docs/sharing-and-security.md`](../../docs/sharing-and-security.md) for the full
115
+ > enforced-vs-advisory table (kept there, not duplicated here, so the two cannot drift).
116
+
110
117
  #### Loop (Self-Verifying Iterative Automation)
111
118
 
112
119
  ```bash
113
- svamp session loop-start <id> "<task>" [--criteria "..."] [--oracle "cmd"] [--max 20] [--evaluator on|off]
120
+ svamp session loop <id> "<task>" --until "<completion criteria>" [--max N]
114
121
  svamp session loop-cancel <id>
115
122
  svamp session loop-status <id>
123
+ svamp session loop-extend <id> --reason "<why>" # raise the soft iteration cap
116
124
  ```
117
125
 
118
- The loop iterates a task until it's *objectively* done: a Claude Code `Stop`-hook gate keeps the agent
119
- working until an **oracle** (a real pass/fail command) passes AND an **independent evaluator** subagent
120
- confirms completion. Task/plan/progress live in a git-visible `LOOP.md`. Powered by the `loop` skill.
126
+ The loop iterates a task until it's *objectively* done. The engine is Claude Code's **native `/goal`**
127
+ command: svamp composes a completion condition (your task + `--until` + an optional oracle command +
128
+ a turn cap) and arms `/goal` on the session; Claude's own session-scoped `Stop` hook then keeps the
129
+ agent working until a fresh, independent evaluator confirms the condition holds. Loop status is
130
+ mirrored to `.svamp/<session-id>/loop/loop-state.json` (`engine: 'goal'`) for the UI and the CLI.
131
+
132
+ An issue-backlog loop (oracle = `svamp issue pending`) is **durable**: when the backlog empties it goes
133
+ `dormant` — armed and watching, driving zero turns — and re-arms when an issue is added or reopened.
134
+
135
+ > Historical: an earlier custom engine used a `stop-gate.mjs` hook, an evaluator subagent and a
136
+ > git-visible `LOOP.md`, shipped as a `loop` skill. That engine was **retired** — `/goal` is the sole
137
+ > engine, `skills/loop/` was deleted, and the daemon now strips those leftover hooks on spawn. The
138
+ > `loop-start` / `--criteria` / `--evaluator` spellings survive only as aliases.
139
+
140
+ **Claude only** — `/goal` is a Claude Code feature, so ACP agents (Gemini, Kimi) kick a loop off but
141
+ do not self-verify.
121
142
 
122
143
  ### Machine Management
123
144
 
@@ -1,4 +1,4 @@
1
- import { c as connectToHypha, K as computeCollectionConfigUpdate, L as SYSTEM_COLLECTION_CONFIG } from './run-CSV6OgQ8.mjs';
1
+ import { c as connectToHypha, L as computeCollectionConfigUpdate, M as SYSTEM_COLLECTION_CONFIG } from './run-1CHjd0_g.mjs';
2
2
  import { existsSync, readFileSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
4
  import os from 'node:os';
@@ -2,7 +2,7 @@ import { existsSync, readFileSync, mkdirSync, writeFileSync, renameSync } from '
2
2
  import { join, dirname } from 'node:path';
3
3
  import os from 'node:os';
4
4
  import { requireNotSandboxed } from './sandboxDetect-DNTcbgWD.mjs';
5
- import { e as shortId } from './run-CSV6OgQ8.mjs';
5
+ import { e as shortId } from './run-1CHjd0_g.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -96,7 +96,7 @@ async function sessionSetTitle(title) {
96
96
  }
97
97
  async function sessionSetProjectDescription(description) {
98
98
  const dir = process.cwd();
99
- const { projectName, writeProjectInfo, sanitizeDescription, projectInfoPath } = await import('./run-CSV6OgQ8.mjs').then(function (n) { return n.as; });
99
+ const { projectName, writeProjectInfo, sanitizeDescription, projectInfoPath } = await import('./run-1CHjd0_g.mjs').then(function (n) { return n.at; });
100
100
  const desc = sanitizeDescription(description, 240);
101
101
  if (!desc) {
102
102
  console.error("Project description is empty.");
@@ -369,7 +369,7 @@ async function sessionBroadcast(action, args) {
369
369
  console.log(`Broadcast sent: ${action}`);
370
370
  }
371
371
  async function connectToMachineService() {
372
- const { connectAndGetMachine } = await import('./commands-DEZLlXJ3.mjs');
372
+ const { connectAndGetMachine } = await import('./commands-rKfH5E8g.mjs');
373
373
  return connectAndGetMachine();
374
374
  }
375
375
  function buildInboxMessage(args) {
@@ -452,7 +452,7 @@ async function inboxSend(targetSessionId, opts) {
452
452
  console.error("Message body is required.");
453
453
  process.exit(1);
454
454
  }
455
- const { connectAndResolveSession } = await import('./commands-DEZLlXJ3.mjs');
455
+ const { connectAndResolveSession } = await import('./commands-rKfH5E8g.mjs');
456
456
  let server;
457
457
  try {
458
458
  const { targetId, messageId } = await inboxSendCore(
@@ -507,7 +507,7 @@ async function inboxReply(messageId, body, opts) {
507
507
  console.error("SVAMP_SESSION_ID not set. This command must be run inside a Svamp session.");
508
508
  process.exit(1);
509
509
  }
510
- const { connectAndResolveSession } = await import('./commands-DEZLlXJ3.mjs');
510
+ const { connectAndResolveSession } = await import('./commands-rKfH5E8g.mjs');
511
511
  const { server: localServer, machine: localMachine } = await connectToMachineService();
512
512
  let localDisconnected = false;
513
513
  const disconnectLocal = async () => {
@@ -1,4 +1,4 @@
1
- import { a0 as resolveModel } from './run-CSV6OgQ8.mjs';
1
+ import { a1 as resolveModel } from './run-1CHjd0_g.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';