@volter/twin-standard 1.0.109 → 1.0.111

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/README.md CHANGED
@@ -35,7 +35,9 @@ assessment World starts. The journey refuses candidate or kernel imports from ev
35
35
  app's own lockfile against the assessed integrity. Older evidence without this installation identity does not satisfy
36
36
  the current completion check. The public
37
37
  `runConsumerWorkflow(packDir, consumer)` lets a builder walk only that entry journey while authoring; it runs no
38
- grade or conformance checks. Installed readiness requires ordinary CLI initialization against the exact candidate,
38
+ grade or conformance checks. Its CLI is `twin-standard walk-consumer <pack dir> --prepared-consumer <options.json>
39
+ --out <walk.json>`, using the options written by `prepare-consumer`. Run it inside a World after installing the
40
+ prepared app's dependencies. Installed readiness requires ordinary CLI initialization against the exact candidate,
39
41
  SDK assertions, read-only state inspection after stop/resume for stored workflows, and verified teardown. A
40
42
  stateless workflow records why retained-state inspection does not apply. Empty SDK case execution fails.
41
43
 
package/dist/src/cli.js CHANGED
@@ -31,7 +31,7 @@ import { standardPackageFile } from "./package-file.js";
31
31
  import { gatePublished } from "./published.js";
32
32
  const [command, ...args] = process.argv.slice(2);
33
33
  const usage = () => {
34
- console.error('usage: twin-standard gate <repo> [units…] | gate-published <name>@<version>… [--registry <url>] | grade <unit>… [--static] [--form] | derive <unit> [--out <dir>] | read-page <url> [--raw] | check-sources <unit> [--recheck] | conform <pack dir> | <name>@<version> [--registry <url>] | create <dir> --init <vendor> --package <@scope/name> | create <unit> --index | facts <pack dir> [--out <file>] | prepare-consumer <pack dir> --app <new dir> --cli <volter executable> --integrity <sha512> --out <json> [--candidate <tgz>] | assess <pack dir> --prepared-consumer <json> [--browser] [--out <file>] | --version');
34
+ console.error('usage: twin-standard gate <repo> [units…] | gate-published <name>@<version>… [--registry <url>] | grade <unit>… [--static] [--form] | derive <unit> [--out <dir>] | read-page <url> [--raw] | check-sources <unit> [--recheck] | conform <pack dir> | <name>@<version> [--registry <url>] | create <dir> --init <vendor> --package <@scope/name> | create <unit> --index | facts <pack dir> [--out <file>] | prepare-consumer <pack dir> --app <new dir> --cli <volter executable> --integrity <sha512> --out <json> [--candidate <tgz>] | walk-consumer <pack dir> --prepared-consumer <json> [--out <file>] | assess <pack dir> --prepared-consumer <json> [--browser] [--out <file>] | --version');
35
35
  process.exit(2);
36
36
  };
37
37
  if (command === '--version') {
@@ -130,6 +130,27 @@ else if (command === 'prepare-consumer') {
130
130
  writeFileSync(out, JSON.stringify({ appDir, cli, artifactIntegrity }, null, 2) + '\n');
131
131
  console.log(JSON.stringify({ appDir, fixture, preparedConsumer: out, next: 'Install the app SDK, candidate and kernel dependencies with scripts disabled before assessing inside a World' }));
132
132
  }
133
+ else if (command === 'walk-consumer') {
134
+ if (!args[0])
135
+ usage();
136
+ const at = args.indexOf('--prepared-consumer');
137
+ if (at < 0 || !args[at + 1])
138
+ usage();
139
+ const outputAt = args.indexOf('--out');
140
+ if (outputAt >= 0 && !args[outputAt + 1])
141
+ usage();
142
+ const consumer = JSON.parse(readFileSync(resolve(args[at + 1]), 'utf8'));
143
+ const { runConsumerWorkflow } = await import("./consumer.js");
144
+ const report = await runConsumerWorkflow(resolve(args[0]), consumer);
145
+ const text = `${JSON.stringify(report, null, 2)}\n`;
146
+ if (outputAt >= 0) {
147
+ const { writeFileSync } = await import('node:fs');
148
+ writeFileSync(resolve(args[outputAt + 1]), text);
149
+ }
150
+ else
151
+ console.log(text);
152
+ process.exit(report.passed ? 0 : 1);
153
+ }
133
154
  else if (command === 'assess') {
134
155
  if (!args[0])
135
156
  usage();
@@ -227,7 +227,7 @@ export async function walk(journey, root, collect, opts) {
227
227
  const factory = await vendorFetch(journey.vendor);
228
228
  const views = await vendorAnswerViews(packsDir(), journey.vendor, dependenciesDir());
229
229
  if (!factory) {
230
- collect.push({ step: '(setup)', beat: 'ADAPTER', detail: `no create<Name>TwinFetch adapter enrolled for ${journey.vendor}` });
230
+ collect.push({ step: '(setup)', beat: 'ADAPTER', detail: `no create<Name>Fetch adapter resolved for ${journey.vendor}` });
231
231
  return {};
232
232
  }
233
233
  // the life's companions (`companions`): the packs its vendor calls, each over this walk's root, on the same World and
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volter/twin-standard",
3
- "version": "1.0.109",
3
+ "version": "1.0.111",
4
4
  "description": "The Protocol 3 standard for Volter twin packs: the criteria a pack is graded by, the grader, the gate a pack repository and the twin catalog run on every change and submission, and the spec derivation the grade checks against. Pin a version: every place a pack is judged judges by that standard.",
5
5
  "keywords": [
6
6
  "twin",
@@ -75,7 +75,7 @@
75
75
  "yaml": "2.9.0"
76
76
  },
77
77
  "peerDependencies": {
78
- "@volter/world-core": "3.0.117",
78
+ "@volter/world-core": "3.0.119",
79
79
  "@volter/world-runtime": "*",
80
80
  "playwright": "^1.63.0"
81
81
  },
package/src/cli.ts CHANGED
@@ -24,7 +24,7 @@ import { gatePublished } from './published.ts';
24
24
 
25
25
  const [command, ...args] = process.argv.slice(2);
26
26
  const usage = (): never => {
27
- console.error('usage: twin-standard gate <repo> [units…] | gate-published <name>@<version>… [--registry <url>] | grade <unit>… [--static] [--form] | derive <unit> [--out <dir>] | read-page <url> [--raw] | check-sources <unit> [--recheck] | conform <pack dir> | <name>@<version> [--registry <url>] | create <dir> --init <vendor> --package <@scope/name> | create <unit> --index | facts <pack dir> [--out <file>] | prepare-consumer <pack dir> --app <new dir> --cli <volter executable> --integrity <sha512> --out <json> [--candidate <tgz>] | assess <pack dir> --prepared-consumer <json> [--browser] [--out <file>] | --version');
27
+ console.error('usage: twin-standard gate <repo> [units…] | gate-published <name>@<version>… [--registry <url>] | grade <unit>… [--static] [--form] | derive <unit> [--out <dir>] | read-page <url> [--raw] | check-sources <unit> [--recheck] | conform <pack dir> | <name>@<version> [--registry <url>] | create <dir> --init <vendor> --package <@scope/name> | create <unit> --index | facts <pack dir> [--out <file>] | prepare-consumer <pack dir> --app <new dir> --cli <volter executable> --integrity <sha512> --out <json> [--candidate <tgz>] | walk-consumer <pack dir> --prepared-consumer <json> [--out <file>] | assess <pack dir> --prepared-consumer <json> [--browser] [--out <file>] | --version');
28
28
  process.exit(2);
29
29
  };
30
30
 
@@ -89,6 +89,21 @@ if (command === '--version') {
89
89
  const { writeFileSync } = await import('node:fs');
90
90
  writeFileSync(out, JSON.stringify({ appDir, cli, artifactIntegrity }, null, 2) + '\n');
91
91
  console.log(JSON.stringify({ appDir, fixture, preparedConsumer: out, next: 'Install the app SDK, candidate and kernel dependencies with scripts disabled before assessing inside a World' }));
92
+ } else if (command === 'walk-consumer') {
93
+ if (!args[0]) usage();
94
+ const at = args.indexOf('--prepared-consumer');
95
+ if (at < 0 || !args[at + 1]) usage();
96
+ const outputAt = args.indexOf('--out');
97
+ if (outputAt >= 0 && !args[outputAt + 1]) usage();
98
+ const consumer = JSON.parse(readFileSync(resolve(args[at + 1]!), 'utf8'));
99
+ const { runConsumerWorkflow } = await import('./consumer.ts');
100
+ const report = await runConsumerWorkflow(resolve(args[0]!), consumer);
101
+ const text = `${JSON.stringify(report, null, 2)}\n`;
102
+ if (outputAt >= 0) {
103
+ const { writeFileSync } = await import('node:fs');
104
+ writeFileSync(resolve(args[outputAt + 1]!), text);
105
+ } else console.log(text);
106
+ process.exit(report.passed ? 0 : 1);
92
107
  } else if (command === 'assess') {
93
108
  if (!args[0]) usage();
94
109
  const { assessPack } = await import('./assessment.ts');
@@ -218,7 +218,7 @@ export async function walk(journey: Journey, root: string, collect: Failure[], o
218
218
  if (journey.host !== undefined && !/^[A-Za-z0-9.-]+(:\d+)?$/.test(journey.host)) { collect.push({ step: '(setup)', beat: 'HOST', detail: `the life's host "${journey.host}" is no hostname: write the vendor's host alone (api.example.com), no scheme or path` }); return {}; }
219
219
  const factory = await vendorFetch(journey.vendor);
220
220
  const views = await vendorAnswerViews(packsDir(), journey.vendor, dependenciesDir());
221
- if (!factory) { collect.push({ step: '(setup)', beat: 'ADAPTER', detail: `no create<Name>TwinFetch adapter enrolled for ${journey.vendor}` }); return {}; }
221
+ if (!factory) { collect.push({ step: '(setup)', beat: 'ADAPTER', detail: `no create<Name>Fetch adapter resolved for ${journey.vendor}` }); return {}; }
222
222
  // the life's companions (`companions`): the packs its vendor calls, each over this walk's root, on the same World and
223
223
  // clock; reached in process by the vendor's ctx.vendorFetch and by a step to a URL their host rules claim
224
224
  const companions: Array<{ vendor: string; keys: string[]; fetch: InProcessTwin }> = [];