@volter/twin-catalog 0.2.30 → 0.2.32
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/catalog.json +1 -1
- package/docs/contributing.md +9 -5
- package/package.json +2 -2
- package/policy.json +4 -4
- package/runner/prepare.mjs +10 -3
package/catalog.json
CHANGED
package/docs/contributing.md
CHANGED
|
@@ -16,7 +16,10 @@ bunx --bun twin-standard create stripe --init stripe --package @example/payments
|
|
|
16
16
|
The generated files contain explicit fill markers. Author the vendored spec and its provenance, demand, manifest,
|
|
17
17
|
stored resource states, decision table, handlers and customer journey in the standard's required order. Start the
|
|
18
18
|
outline from the vendor quickstart and pinned SDK's ordinary default requests, app environment and issued identity.
|
|
19
|
-
|
|
19
|
+
Write the executable customer entry as `journeys/first-use.json` at this outline stage, before implementing
|
|
20
|
+
resource semantics; its format is below. Walk it through `runConsumerWorkflow` while building, using a new
|
|
21
|
+
prepared app for each walk. Fix the pack or shared mechanism when an ordinary SDK call fails; keep the SDK
|
|
22
|
+
request unchanged. Source coverage reports describe source journeys and do not establish installed readiness. The package
|
|
20
23
|
README describes its vendor surface, refusals and limits. Declare your own public GitHub repository and license in
|
|
21
24
|
package.json. Complete source requirements before derivation:
|
|
22
25
|
|
|
@@ -34,9 +37,9 @@ consumers while retaining the TypeScript source the pinned standard reads. Use T
|
|
|
34
37
|
bin at their compiled entrypoints. A `files` list includes `src`, `dist`, `generated`, `spec`, `journeys`, README and
|
|
35
38
|
LICENSE. A build and `npm pack --dry-run` must show those paths; no platform-specific prepack script is required.
|
|
36
39
|
|
|
37
|
-
##
|
|
40
|
+
## Customer entry and release qualification
|
|
38
41
|
|
|
39
|
-
|
|
42
|
+
Author the customer entry with the outline, then package it in `journeys/first-use.json`. It has `schemaVersion: 1`, the upstream `source`, an
|
|
40
43
|
`about` describing its scope, and a `files` map of relative paths to text. Include `package.json` with exact registry
|
|
41
44
|
SDK dependencies, `.env.example` with the names the app reads, and its unchanged client script with result
|
|
42
45
|
assertions. `run` is an argument array such as `["node", "workflow.mjs"]`. For stored workflows,
|
|
@@ -54,8 +57,9 @@ twin-standard prepare-consumer <installed pack dir> --app <new app dir> --cli <a
|
|
|
54
57
|
npm install --prefix <new app dir> --ignore-scripts --no-audit --no-fund
|
|
55
58
|
```
|
|
56
59
|
|
|
57
|
-
This preparation writes fixture files only; SDK dependency installation precedes offline execution.
|
|
58
|
-
|
|
60
|
+
This preparation writes fixture files only; SDK dependency installation precedes offline execution. Select `--cli` from the installed `@volter/world` package's declared `bin.volter`, rather than the shared
|
|
61
|
+
`node_modules/.bin/volter`: another package may claim that shortcut. The runner invokes compiled JavaScript
|
|
62
|
+
through Node and records the actual entrypoint, command and Node version. The product CLI must resolve the installed candidate through that app's parent dependency directory. For the final assessment,
|
|
59
63
|
run the released standard through a World:
|
|
60
64
|
|
|
61
65
|
Create `assessment.world.config.json`:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volter/twin-catalog",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.32",
|
|
4
4
|
"description": "The moderated twin distribution: approved versions and submission tooling for independent publishers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"evidence"
|
|
39
39
|
],
|
|
40
40
|
"catalog": {
|
|
41
|
-
"sourceCommit": "
|
|
41
|
+
"sourceCommit": "8139c5d489b73762bf5ba34d4cf37235eb30bb46",
|
|
42
42
|
"digest": "3195c901d6068ef7be8e9e23676b9b6ec58fb4e50c2d5604bbea390fefec9fdb"
|
|
43
43
|
}
|
|
44
44
|
}
|
package/policy.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"registry": "https://registry.npmjs.org",
|
|
4
4
|
"tools": {
|
|
5
|
-
"@volter/world-core": "3.0.
|
|
6
|
-
"@volter/world-runtime": "3.0.
|
|
7
|
-
"@volter/twin-standard": "1.0.
|
|
5
|
+
"@volter/world-core": "3.0.108",
|
|
6
|
+
"@volter/world-runtime": "3.0.108",
|
|
7
|
+
"@volter/twin-standard": "1.0.100",
|
|
8
8
|
"playwright": "1.63.0",
|
|
9
|
-
"@volter/world": "3.0.
|
|
9
|
+
"@volter/world": "3.0.108"
|
|
10
10
|
},
|
|
11
11
|
"bun": "1.4.2",
|
|
12
12
|
"nodeImage": "node:24-bookworm-slim",
|
package/runner/prepare.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// No credentials enter this container. This phase downloads data; scripts are disabled.
|
|
2
|
-
import { readFileSync, writeFileSync, mkdirSync, cpSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
2
|
+
import { readFileSync, writeFileSync, mkdirSync, cpSync, realpathSync } from 'node:fs';
|
|
3
|
+
import { join, relative } from 'node:path';
|
|
4
4
|
import { spawnSync } from 'node:child_process';
|
|
5
5
|
import { createRequire } from 'node:module';
|
|
6
6
|
import { x } from 'tar';
|
|
@@ -92,7 +92,14 @@ for (const [path, entry] of Object.entries(consumerLock.packages ?? {})) {
|
|
|
92
92
|
requireThat(!entry.link && entry.resolved && entry.integrity, `${path}: customer dependency is not a locked registry artifact`);
|
|
93
93
|
registryURL(entry.resolved, policy.registry);
|
|
94
94
|
}
|
|
95
|
-
|
|
95
|
+
// Other dependencies can own the flattened volter shortcut; use the exact product's declared entry.
|
|
96
|
+
const productRoot = '/work/node_modules/@volter/world';
|
|
97
|
+
const product = read(join(productRoot, 'package.json'));
|
|
98
|
+
requireThat(product.name === '@volter/world' && product.version === policy.tools['@volter/world'], 'customer CLI differs from the product pin');
|
|
99
|
+
requireThat(typeof product.bin?.volter === 'string', 'product has no declared volter entry');
|
|
100
|
+
const cli = realpathSync(join(productRoot, product.bin.volter));
|
|
101
|
+
requireThat(!relative(realpathSync(productRoot), cli).startsWith('..'), 'CLI entry is outside the installed product');
|
|
102
|
+
const consumer = { appDir, cli, artifactIntegrity: s.integrity };
|
|
96
103
|
// Retain listing facts from these exact bytes, never the registry's moving latest metadata.
|
|
97
104
|
const packageMetadata = {
|
|
98
105
|
description: typeof pack.description === 'string' ? pack.description : null,
|