@volter/world 3.0.38 → 3.0.40

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.
@@ -54,6 +54,8 @@ refusals are the command's: act on a refusal's reason rather than working around
54
54
 
55
55
  ## Run through the World
56
56
 
57
+ For a recipe's browser walk or sign-in, follow the [cookbook browser password rule](../../cookbook/README.md).
58
+
57
59
  Run apps and tests inside a World, never bare. For a repo with `.volter/world.json`:
58
60
 
59
61
  ```bash
@@ -147,7 +149,7 @@ An app that answers as its own production hostnames (`app.example.com`) records
147
149
 
148
150
  Sandbox mode refuses untwinned destinations in cooperating clients, including Node sockets a
149
151
  client opens around the injector. It does not constrain binaries or non-Node processes that
150
- ignore the injector/proxy; network isolation needs an enforced boundary.
152
+ ignore the injector/proxy; network isolation needs an enforced boundary. See [transport coverage](../../docs/contributing/architecture.md#outbound-transport-coverage) for mediated seams and native bypasses.
151
153
  Do not disable routing to hide a coverage gap.
152
154
 
153
155
  Current packages are `@volter/world`, `@volter/world-core`, `@volter/world-runtime`,
package/dist/src/cli.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // verb. `volter world …` acts on the world of the cwd the way git acts on the repository of the
4
4
  // cwd; `volter twin <vendor> …` runs one twin on its own; `volter remote …` is the hosted remote.
5
5
  // One client of `World`; it adds nothing the SDK does not have.
6
- import { detectRepoVendors, formatInitReport, resolveCatalog, findInstalledPackage, packCli, serveConsoleFor } from '@volter/world-runtime';
6
+ import { detectRepoVendors, errorMessage, formatInitReport, resolveCatalog, findInstalledPackage, packCli, serveConsoleFor } from '@volter/world-runtime';
7
7
  import { readFileSync, realpathSync } from 'node:fs';
8
8
  import { fileURLToPath } from 'node:url';
9
9
  import { spawn, spawnSync } from 'node:child_process';
@@ -1099,7 +1099,7 @@ const isEntryPoint = import.meta.main ?? (process.argv[1] !== undefined && exist
1099
1099
  && realpathSync(process.argv[1]) === fileURLToPath(import.meta.url));
1100
1100
  if (isEntryPoint) {
1101
1101
  main().catch((error) => {
1102
- process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
1102
+ process.stderr.write(`${errorMessage(error)}\n`);
1103
1103
  process.exit(process.exitCode && process.exitCode !== 0 ? Number(process.exitCode) : 1);
1104
1104
  });
1105
1105
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volter/world",
3
- "version": "3.0.38",
3
+ "version": "3.0.40",
4
4
  "description": "Run your app against a world of twins. `World` and `Repo` — one method per verb: init, up, run, log, diff, reset, branch, checkout, clone, fetch, changeset, push — and the `volter` command, one client of them.",
5
5
  "keywords": [
6
6
  "volter",
@@ -30,12 +30,12 @@
30
30
  ],
31
31
  "dependencies": {
32
32
  "@modelcontextprotocol/sdk": "^1.30.1",
33
- "@volter/world-core": "3.0.38",
34
- "@volter/world-runtime": "3.0.38",
33
+ "@volter/world-core": "3.0.40",
34
+ "@volter/world-runtime": "3.0.40",
35
35
  "zod": "^4.6.5"
36
36
  },
37
37
  "peerDependencies": {
38
- "@volter/world-console": "3.0.33"
38
+ "@volter/world-console": "3.0.35"
39
39
  },
40
40
  "peerDependenciesMeta": {
41
41
  "@volter/world-console": {
@@ -43,7 +43,7 @@
43
43
  }
44
44
  },
45
45
  "devDependencies": {
46
- "@volter/world-console": "3.0.33"
46
+ "@volter/world-console": "3.0.35"
47
47
  },
48
48
  "bin": {
49
49
  "volter": "dist/src/cli.js"
@@ -54,6 +54,8 @@ refusals are the command's: act on a refusal's reason rather than working around
54
54
 
55
55
  ## Run through the World
56
56
 
57
+ For a recipe's browser walk or sign-in, follow the [cookbook browser password rule](../../cookbook/README.md).
58
+
57
59
  Run apps and tests inside a World, never bare. For a repo with `.volter/world.json`:
58
60
 
59
61
  ```bash
@@ -147,7 +149,7 @@ An app that answers as its own production hostnames (`app.example.com`) records
147
149
 
148
150
  Sandbox mode refuses untwinned destinations in cooperating clients, including Node sockets a
149
151
  client opens around the injector. It does not constrain binaries or non-Node processes that
150
- ignore the injector/proxy; network isolation needs an enforced boundary.
152
+ ignore the injector/proxy; network isolation needs an enforced boundary. See [transport coverage](../../docs/contributing/architecture.md#outbound-transport-coverage) for mediated seams and native bypasses.
151
153
  Do not disable routing to hide a coverage gap.
152
154
 
153
155
  Current packages are `@volter/world`, `@volter/world-core`, `@volter/world-runtime`,
package/src/cli.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // verb. `volter world …` acts on the world of the cwd the way git acts on the repository of the
4
4
  // cwd; `volter twin <vendor> …` runs one twin on its own; `volter remote …` is the hosted remote.
5
5
  // One client of `World`; it adds nothing the SDK does not have.
6
- import { detectRepoVendors, formatInitReport, resolveCatalog, findInstalledPackage, packCli, serveConsoleFor } from '@volter/world-runtime';
6
+ import { detectRepoVendors, errorMessage, formatInitReport, resolveCatalog, findInstalledPackage, packCli, serveConsoleFor } from '@volter/world-runtime';
7
7
  import { readFileSync, realpathSync } from 'node:fs';
8
8
  import { fileURLToPath } from 'node:url';
9
9
  import { spawn, spawnSync } from 'node:child_process';
@@ -792,7 +792,7 @@ const isEntryPoint = import.meta.main ?? (process.argv[1] !== undefined && exist
792
792
  && realpathSync(process.argv[1]) === fileURLToPath(import.meta.url));
793
793
  if (isEntryPoint) {
794
794
  main().catch((error: unknown) => {
795
- process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
795
+ process.stderr.write(`${errorMessage(error)}\n`);
796
796
  process.exit(process.exitCode && process.exitCode !== 0 ? Number(process.exitCode) : 1);
797
797
  });
798
798
  }
@@ -2,8 +2,8 @@
2
2
  // #the-config-and-the-running-world): init copies a twin's starter handlers to .volter/handlers/<vendor>.json and
3
3
  // names that path relative to the world root, so the committed config reads the same on every
4
4
  // machine; `up` resolves it against the root on both the spawn path (--scenario) and the colocated
5
- // host (scenarioPath). Proven against the real anthropic twin, installed with starter handlers of the test's own (no
6
- // pack of the catalog ships any): its files linked from the pack repository, its `defaults/handlers.json` written here.
5
+ // host (scenarioPath). Proven against the real anthropic twin, its files linked from the pack repository: its starter
6
+ // handlers are the scripted turns of its own life (journeys/scenario.json).
7
7
  import { afterAll, describe, expect, test } from 'bun:test';
8
8
  import { copyFileSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, symlinkSync, writeFileSync } from 'node:fs';
9
9
  import { tmpdir } from 'node:os';
@@ -23,8 +23,6 @@ function app(): string {
23
23
  if (entry === 'package.json') copyFileSync(join(PACKS, 'anthropic', entry), join(installed, entry));
24
24
  else symlinkSync(join(PACKS, 'anthropic', entry), join(installed, entry));
25
25
  }
26
- mkdirSync(join(installed, 'defaults'));
27
- writeFileSync(join(installed, 'defaults', 'handlers.json'), `${JSON.stringify({ handlers: [{ id: 'demo-answer', on: {}, respond: { text: 'hi' } }] }, null, 2)}\n`);
28
26
  return dir;
29
27
  }
30
28
 
@@ -46,6 +44,6 @@ describe('handlers in the app repo', () => {
46
44
  const instance = await world.up({ seed: false });
47
45
  const url = instance.services.anthropic!.url!;
48
46
  const scenario = await fetch(`${url}/twin/scenario`).then((r) => r.json()) as { handlers?: Array<{ id: string }> };
49
- expect((scenario.handlers ?? []).map((h) => h.id)).toContain('demo-answer');
47
+ expect((scenario.handlers ?? []).map((h) => h.id)).toContain('draft-result');
50
48
  });
51
49
  });
@@ -1,5 +1,5 @@
1
- // The tutorial runner — a tutorial page IS its journey (owner, 2026-09-05: "the journeys should
2
- // ONLY be what happens in the tutorials — that way to keep the tutorials up to date and proven").
1
+ // The tutorial runner — a tutorial page IS its journey: the journeys are only what happens in the tutorials, which keeps
2
+ // the tutorials up to date and proven.
3
3
  //
4
4
  // A page is read for its fences, in order:
5
5
  // ```bash every non-comment line is one command the reader types, run in ONE bash