@volter/world 3.0.38 → 3.0.39
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(`${
|
|
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.
|
|
3
|
+
"version": "3.0.39",
|
|
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.
|
|
34
|
-
"@volter/world-runtime": "3.0.
|
|
33
|
+
"@volter/world-core": "3.0.39",
|
|
34
|
+
"@volter/world-runtime": "3.0.39",
|
|
35
35
|
"zod": "^4.6.5"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
|
-
"@volter/world-console": "3.0.
|
|
38
|
+
"@volter/world-console": "3.0.34"
|
|
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.
|
|
46
|
+
"@volter/world-console": "3.0.34"
|
|
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(`${
|
|
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,
|
|
6
|
-
//
|
|
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('
|
|
47
|
+
expect((scenario.handlers ?? []).map((h) => h.id)).toContain('draft-result');
|
|
50
48
|
});
|
|
51
49
|
});
|
package/src/journeys/tutorial.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// The tutorial runner — a tutorial page IS its journey
|
|
2
|
-
//
|
|
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
|