@substrat-run/cli 0.2.0 → 0.3.1
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 +44 -0
- package/dist/cli.js +64 -1
- package/dist/cli.js.map +1 -1
- package/dist/listing.d.ts +26 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +28 -0
- package/dist/listing.js.map +1 -0
- package/dist/push.d.ts +16 -0
- package/dist/push.d.ts.map +1 -1
- package/dist/push.js +21 -1
- package/dist/push.js.map +1 -1
- package/dist/scope.d.ts +11 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +95 -0
- package/dist/scope.js.map +1 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# @substrat-run/cli
|
|
2
|
+
|
|
3
|
+
The `substrat` command — authenticated deploy tooling for
|
|
4
|
+
[Substrat](https://github.com/substrat-run/substrat). It pushes a vertical to the
|
|
5
|
+
platform, then manages its versions and release channels.
|
|
6
|
+
|
|
7
|
+
A vertical is uploaded once and promoted deliberately: `push` uploads an immutable,
|
|
8
|
+
content-addressed version; `promote` binds a channel (e.g. a scope's production
|
|
9
|
+
pointer) to a version; `publish`/`unpublish` control the marketplace catalog. Nothing
|
|
10
|
+
goes live as a side effect of uploading.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
# one-off
|
|
16
|
+
pnpm dlx @substrat-run/cli push ./my-vertical
|
|
17
|
+
|
|
18
|
+
# or add it to a vertical's devDependencies
|
|
19
|
+
pnpm add -D @substrat-run/cli
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Commands
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
substrat login # authenticate against the control plane
|
|
26
|
+
substrat whoami # show the current identity + reachable tenants
|
|
27
|
+
substrat push <dir> # upload a vertical as a new immutable version
|
|
28
|
+
substrat versions <slug> # list a vertical's uploaded versions
|
|
29
|
+
substrat promote <slug> <ver> # point a channel at a version (the deliberate go-live)
|
|
30
|
+
substrat publish <slug> # list the vertical in the marketplace catalog
|
|
31
|
+
substrat unpublish <slug> # remove it from the catalog
|
|
32
|
+
substrat help # full usage
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Run `substrat help` for the authoritative flag set — this list is a map, not the spec.
|
|
36
|
+
|
|
37
|
+
## Documentation
|
|
38
|
+
|
|
39
|
+
**https://substrat.net/guide/deploying** — authentication, the push/promote model, channels,
|
|
40
|
+
and the marketplace flow, end to end.
|
|
41
|
+
|
|
42
|
+
## Status
|
|
43
|
+
|
|
44
|
+
Pre-release (0.x): commands and flags change without notice until the platform GAs.
|
package/dist/cli.js
CHANGED
|
@@ -21,7 +21,9 @@ import { browserLogin } from './login.js';
|
|
|
21
21
|
import { push, readVerticalMeta, nextVersion } from './push.js';
|
|
22
22
|
import { printVersions } from './versions.js';
|
|
23
23
|
import { promote } from './promote.js';
|
|
24
|
+
import { setListing, requestPublish } from './listing.js';
|
|
24
25
|
import { fetchWhoami } from './whoami.js';
|
|
26
|
+
import { pullScope, resolveTenantId } from './scope.js';
|
|
25
27
|
const argv = process.argv.slice(2);
|
|
26
28
|
/** `--name value` → value, else undefined. */
|
|
27
29
|
function flag(name) {
|
|
@@ -47,7 +49,13 @@ Usage:
|
|
|
47
49
|
substrat push [dir] push a vertical (slug/name/version default
|
|
48
50
|
from package.json; version auto-bumps)
|
|
49
51
|
substrat promote <slug> --channel dev|staging --version <versionId>
|
|
52
|
+
substrat publish <slug> request listing on the public marketplace (staff reviews)
|
|
53
|
+
substrat unpublish <slug> remove from the public marketplace (staff)
|
|
50
54
|
substrat versions <slug> list a vertical's versions + channels
|
|
55
|
+
substrat scope pull <scopeId> [--full] [--out <dir>]
|
|
56
|
+
pull a scope's data to a local SQLite file
|
|
57
|
+
(masked by default; --full is break-glass,
|
|
58
|
+
audited server-side; 'global' scopes only)
|
|
51
59
|
|
|
52
60
|
'substrat push' defaults everything from the vertical's package.json — run it from inside the
|
|
53
61
|
directory with no flags. Override any of: --slug, --name, --version. The slug/name come from a
|
|
@@ -122,7 +130,15 @@ async function cmdPush() {
|
|
|
122
130
|
// Version defaults to the registry's latest, patch-bumped — no hand-tracking. --version wins.
|
|
123
131
|
const version = flag('version') ?? (await nextVersion(controlPlaneUrl, header, slug, meta.versionSeed));
|
|
124
132
|
console.log(`pushing ${slug}@${version}${name && name !== slug ? ` (${name})` : ''} …`);
|
|
125
|
-
const v = await push({
|
|
133
|
+
const v = await push({
|
|
134
|
+
dir, slug, version, name,
|
|
135
|
+
envSpec: meta.envSpec,
|
|
136
|
+
ownerGrants: meta.ownerGrants,
|
|
137
|
+
entitlements: meta.entitlements,
|
|
138
|
+
provides: meta.provides,
|
|
139
|
+
requires: meta.requires,
|
|
140
|
+
controlPlaneUrl, authHeader: header,
|
|
141
|
+
});
|
|
126
142
|
console.log(`✓ pushed. version ${v.id} (${version}) is ${v.admission}; deploymentRef=${v.deploymentRef}`);
|
|
127
143
|
console.log(' admit it in the console to let a scope bind it.');
|
|
128
144
|
}
|
|
@@ -148,6 +164,47 @@ async function cmdPromote() {
|
|
|
148
164
|
const ch = await promote({ controlPlaneUrl, header, slug, channel, versionId: version });
|
|
149
165
|
console.log(`✓ ${slug} → ${ch.channel} now points at ${ch.versionId}`);
|
|
150
166
|
}
|
|
167
|
+
async function cmdPublish() {
|
|
168
|
+
const slug = argv[1];
|
|
169
|
+
if (!slug || slug.startsWith('--')) {
|
|
170
|
+
console.error('usage: substrat publish <slug>');
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
const { controlPlaneUrl, header, as } = resolveAuth({ cp: flag('cp'), token: flag('token'), tenant: flag('tenant') });
|
|
174
|
+
console.log(`authenticating with ${as}`);
|
|
175
|
+
await requestPublish({ controlPlaneUrl, header, slug });
|
|
176
|
+
console.log(`✓ publish requested for ${slug} — a Substrat operator will review it`);
|
|
177
|
+
}
|
|
178
|
+
async function cmdUnpublish() {
|
|
179
|
+
const slug = argv[1];
|
|
180
|
+
if (!slug || slug.startsWith('--')) {
|
|
181
|
+
console.error('usage: substrat unpublish <slug>');
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
const { controlPlaneUrl, header, as } = resolveAuth({ cp: flag('cp'), token: flag('token'), tenant: flag('tenant') });
|
|
185
|
+
console.log(`authenticating with ${as}`);
|
|
186
|
+
const r = await setListing({ controlPlaneUrl, header, slug, listed: false });
|
|
187
|
+
console.log(`✓ ${r.slug} unpublished`);
|
|
188
|
+
}
|
|
189
|
+
async function cmdScope() {
|
|
190
|
+
const sub = argv[1];
|
|
191
|
+
const scope = argv[2];
|
|
192
|
+
if (sub !== 'pull' || !scope || scope.startsWith('--')) {
|
|
193
|
+
console.error('usage: substrat scope pull <scopeId> [--full] [--out <dir>] [--tenant <id-or-slug>]');
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
const { controlPlaneUrl, header, as } = resolveAuth({ cp: flag('cp'), token: flag('token'), tenant: flag('tenant') });
|
|
197
|
+
console.log(`authenticating with ${as}`);
|
|
198
|
+
const tenantId = await resolveTenantId(controlPlaneUrl, header, flag('tenant') ?? process.env.SUBSTRAT_TENANT ?? loadConfig().defaultTenant);
|
|
199
|
+
await pullScope({
|
|
200
|
+
controlPlaneUrl,
|
|
201
|
+
header,
|
|
202
|
+
tenantId,
|
|
203
|
+
scopeId: scope,
|
|
204
|
+
full: argv.includes('--full'),
|
|
205
|
+
outDir: flag('out') ?? '.substrat',
|
|
206
|
+
});
|
|
207
|
+
}
|
|
151
208
|
async function cmdWhoami() {
|
|
152
209
|
const { controlPlaneUrl, header } = resolveAuth({ cp: flag('cp'), token: flag('token'), tenant: flag('tenant') });
|
|
153
210
|
const { user, tenants } = await fetchWhoami(controlPlaneUrl, header);
|
|
@@ -172,8 +229,14 @@ async function main() {
|
|
|
172
229
|
return cmdPush();
|
|
173
230
|
case 'promote':
|
|
174
231
|
return cmdPromote();
|
|
232
|
+
case 'publish':
|
|
233
|
+
return cmdPublish();
|
|
234
|
+
case 'unpublish':
|
|
235
|
+
return cmdUnpublish();
|
|
175
236
|
case 'whoami':
|
|
176
237
|
return cmdWhoami();
|
|
238
|
+
case 'scope':
|
|
239
|
+
return cmdScope();
|
|
177
240
|
case 'help':
|
|
178
241
|
case '--help':
|
|
179
242
|
case '-h':
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `substrat publish <slug>` / `substrat unpublish <slug>` — list/unlist a vertical on the
|
|
3
|
+
* PUBLIC marketplace (marketplace-publish.md §5). The control-plane `/verticals/:slug/listing`
|
|
4
|
+
* endpoint is STAFF-only, so a builder is refused (the review gate); a staff/platform caller
|
|
5
|
+
* flips it. Once `listed`, `availableCatalog` offers the vertical to every tenant.
|
|
6
|
+
*/
|
|
7
|
+
export interface ListingOptions {
|
|
8
|
+
controlPlaneUrl: string;
|
|
9
|
+
header: Record<string, string>;
|
|
10
|
+
slug: string;
|
|
11
|
+
listed: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function setListing(opts: ListingOptions): Promise<{
|
|
14
|
+
slug: string;
|
|
15
|
+
listed: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* `substrat publish <slug>` — a builder REQUESTS listing (marketplace-publish.md §5). Any owner
|
|
19
|
+
* may ask; a staff operator then reviews and lists it. Owner-checked control-plane-side.
|
|
20
|
+
*/
|
|
21
|
+
export declare function requestPublish(opts: {
|
|
22
|
+
controlPlaneUrl: string;
|
|
23
|
+
header: Record<string, string>;
|
|
24
|
+
slug: string;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=listing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listing.d.ts","sourceRoot":"","sources":["../src/listing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAWjG;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnI"}
|
package/dist/listing.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export async function setListing(opts) {
|
|
2
|
+
const base = opts.controlPlaneUrl.replace(/\/$/, '');
|
|
3
|
+
const url = `${base}/verticals/${encodeURIComponent(opts.slug)}/listing`;
|
|
4
|
+
const res = await fetch(url, {
|
|
5
|
+
method: 'POST',
|
|
6
|
+
headers: { ...opts.header, 'content-type': 'application/json' },
|
|
7
|
+
body: JSON.stringify({ listed: opts.listed }),
|
|
8
|
+
});
|
|
9
|
+
const body = await res.text();
|
|
10
|
+
if (!res.ok)
|
|
11
|
+
throw new Error(`${opts.listed ? 'publish' : 'unpublish'} failed (${res.status}): ${body.slice(0, 300)}`);
|
|
12
|
+
return JSON.parse(body);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* `substrat publish <slug>` — a builder REQUESTS listing (marketplace-publish.md §5). Any owner
|
|
16
|
+
* may ask; a staff operator then reviews and lists it. Owner-checked control-plane-side.
|
|
17
|
+
*/
|
|
18
|
+
export async function requestPublish(opts) {
|
|
19
|
+
const base = opts.controlPlaneUrl.replace(/\/$/, '');
|
|
20
|
+
const res = await fetch(`${base}/verticals/${encodeURIComponent(opts.slug)}/publish-request`, {
|
|
21
|
+
method: 'POST',
|
|
22
|
+
headers: { ...opts.header, 'content-type': 'application/json' },
|
|
23
|
+
body: '{}',
|
|
24
|
+
});
|
|
25
|
+
if (!res.ok)
|
|
26
|
+
throw new Error(`publish request failed (${res.status}): ${(await res.text()).slice(0, 300)}`);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=listing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listing.js","sourceRoot":"","sources":["../src/listing.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAoB;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,GAAG,IAAI,cAAc,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IACzE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;KAC9C,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,YAAY,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACvH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAA+E;IAClH,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,cAAc,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAC5F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/D,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAC9G,CAAC"}
|
package/dist/push.d.ts
CHANGED
|
@@ -3,6 +3,14 @@ export interface PushOptions {
|
|
|
3
3
|
slug: string;
|
|
4
4
|
version: string;
|
|
5
5
|
name?: string;
|
|
6
|
+
/** The vertical's declared env-spec (from package.json `substrat.envSpec`), carried to the
|
|
7
|
+
* registry so the platform can render a config form for it. Validated control-plane-side. */
|
|
8
|
+
envSpec?: readonly unknown[];
|
|
9
|
+
/** Registry-driven install fields (marketplace-publish.md §3), from package.json `substrat.*`. */
|
|
10
|
+
ownerGrants?: readonly unknown[];
|
|
11
|
+
entitlements?: readonly unknown[];
|
|
12
|
+
provides?: readonly unknown[];
|
|
13
|
+
requires?: readonly unknown[];
|
|
6
14
|
controlPlaneUrl: string;
|
|
7
15
|
/** The auth header to send — a bearer session or an x-service-token (see config.resolveAuth). */
|
|
8
16
|
authHeader: Record<string, string>;
|
|
@@ -28,6 +36,14 @@ export interface VerticalMeta {
|
|
|
28
36
|
name: string;
|
|
29
37
|
/** package.json `version` — only a seed for the FIRST push of a brand-new slug. */
|
|
30
38
|
versionSeed: string | undefined;
|
|
39
|
+
/** The vertical's declared env-spec, from package.json `substrat.envSpec` — the static,
|
|
40
|
+
* code-free source the CLI can read at push time (like slug/name). Undefined if none. */
|
|
41
|
+
envSpec: readonly unknown[] | undefined;
|
|
42
|
+
/** Registry-driven install fields, from package.json `substrat.{ownerGrants,entitlements,provides,requires}`. */
|
|
43
|
+
ownerGrants: readonly unknown[] | undefined;
|
|
44
|
+
entitlements: readonly unknown[] | undefined;
|
|
45
|
+
provides: readonly unknown[] | undefined;
|
|
46
|
+
requires: readonly unknown[] | undefined;
|
|
31
47
|
}
|
|
32
48
|
/**
|
|
33
49
|
* Derive push defaults from the vertical directory's package.json (the "it's already in
|
package/dist/push.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,iGAAiG;IACjG,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;kGAC8F;IAC9F,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,kGAAkG;IAClG,WAAW,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,iGAAiG;IACjG,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CAqF/G;AAED,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IAC3B,iHAAiH;IACjH,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC;8FAC0F;IAC1F,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IACxC,iHAAiH;IACjH,WAAW,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IAC5C,YAAY,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IAC7C,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IACzC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;CAC1C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAyB1D;AAUD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,OAAO,CAAC,MAAM,CAAC,CAYjB"}
|
package/dist/push.js
CHANGED
|
@@ -68,6 +68,16 @@ export async function push(opts) {
|
|
|
68
68
|
compatibilityFlags,
|
|
69
69
|
doClasses,
|
|
70
70
|
bindings,
|
|
71
|
+
// The vertical's declared config surface, carried to the registry (control-plane-side
|
|
72
|
+
// validated) so the platform renders a settings form for it. Not part of any admission
|
|
73
|
+
// digest — it's metadata, not code.
|
|
74
|
+
...(opts.envSpec ? { envSpec: opts.envSpec } : {}),
|
|
75
|
+
// Registry-driven install metadata (marketplace-publish.md §3) — carried so the dashboard
|
|
76
|
+
// installs without a hardcoded catalog entry. Metadata, not code; not in any digest.
|
|
77
|
+
...(opts.ownerGrants ? { ownerGrants: opts.ownerGrants } : {}),
|
|
78
|
+
...(opts.entitlements ? { entitlements: opts.entitlements } : {}),
|
|
79
|
+
...(opts.provides ? { provides: opts.provides } : {}),
|
|
80
|
+
...(opts.requires ? { requires: opts.requires } : {}),
|
|
71
81
|
digests: {
|
|
72
82
|
manifest: await sha256(concat),
|
|
73
83
|
permission: await sha256(Buffer.from(JSON.stringify(bindings))),
|
|
@@ -110,7 +120,17 @@ export function readVerticalMeta(dir) {
|
|
|
110
120
|
const bare = (pkg.name ?? '').split('/').pop()?.replace(/^demo-/, '') ?? '';
|
|
111
121
|
const slug = pkg.substrat?.slug ?? bare;
|
|
112
122
|
const title = slug.replace(/[-_]+/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
|
|
113
|
-
|
|
123
|
+
const s = pkg.substrat;
|
|
124
|
+
return {
|
|
125
|
+
slug,
|
|
126
|
+
name: s?.name ?? title,
|
|
127
|
+
versionSeed: pkg.version,
|
|
128
|
+
envSpec: s?.envSpec,
|
|
129
|
+
ownerGrants: s?.ownerGrants,
|
|
130
|
+
entitlements: s?.entitlements,
|
|
131
|
+
provides: s?.provides,
|
|
132
|
+
requires: s?.requires,
|
|
133
|
+
};
|
|
114
134
|
}
|
|
115
135
|
function parseSemver(v) {
|
|
116
136
|
const m = /^(\d+)\.(\d+)\.(\d+)$/.exec(v);
|
package/dist/push.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAUxC,KAAK,UAAU,MAAM,CAAC,KAAiB;IACrC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,yEAAyE;AACzE,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;SACnC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;AACpD,CAAC;
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../src/push.ts"],"names":[],"mappings":"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"}
|
package/dist/scope.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Resolve `--tenant` (id or slug) / the stored default slug to a tenant ID. */
|
|
2
|
+
export declare function resolveTenantId(controlPlaneUrl: string, header: Record<string, string>, tenant: string | undefined): Promise<string>;
|
|
3
|
+
export declare function pullScope(opts: {
|
|
4
|
+
controlPlaneUrl: string;
|
|
5
|
+
header: Record<string, string>;
|
|
6
|
+
tenantId: string;
|
|
7
|
+
scopeId: string;
|
|
8
|
+
full: boolean;
|
|
9
|
+
outDir: string;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAmCA,gFAAgF;AAChF,wBAAsB,eAAe,CACnC,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,OAAO,CAAC,MAAM,CAAC,CAajB;AAiCD,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChB"}
|
package/dist/scope.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `substrat scope pull <scopeId>` — bring a scope's data to the local inner loop
|
|
3
|
+
* (preview-and-snapshots.md §8; the substrat analog of `vercel env pull`).
|
|
4
|
+
*
|
|
5
|
+
* The pull crosses the platform's trust boundary ON PURPOSE, so the server side is
|
|
6
|
+
* the gate: staff-gated, audited, jurisdiction-checked, and MASKED by default —
|
|
7
|
+
* `--full` is the explicit break-glass for full fidelity. This end only receives
|
|
8
|
+
* what the gate released and writes it to a file.
|
|
9
|
+
*
|
|
10
|
+
* The file is a REAL SQLite database named `<tenantId>__<scopeId>.sqlite` — exactly
|
|
11
|
+
* the shape `@substrat-run/adapter-sqlite` stores scopes in, so a local harness can
|
|
12
|
+
* run the identical vertical against it. Written with `node:sqlite` (node 22.13+);
|
|
13
|
+
* on an older node the dump lands as JSON next to where the db would have been.
|
|
14
|
+
*/
|
|
15
|
+
import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { fetchWhoami } from './whoami.js';
|
|
18
|
+
const ULID = /^[0-9A-HJKMNP-TV-Z]{26}$/i;
|
|
19
|
+
/** Resolve `--tenant` (id or slug) / the stored default slug to a tenant ID. */
|
|
20
|
+
export async function resolveTenantId(controlPlaneUrl, header, tenant) {
|
|
21
|
+
if (!tenant) {
|
|
22
|
+
throw new Error('no tenant — pass --tenant <id-or-slug> or set a default with `substrat login`');
|
|
23
|
+
}
|
|
24
|
+
if (ULID.test(tenant))
|
|
25
|
+
return tenant.toUpperCase();
|
|
26
|
+
const { tenants } = await fetchWhoami(controlPlaneUrl, header);
|
|
27
|
+
const match = tenants.find((t) => t.slug === tenant || t.id === tenant);
|
|
28
|
+
if (!match) {
|
|
29
|
+
throw new Error(`workspace '${tenant}' is not one of yours — pass --tenant with a tenant id, or check \`substrat whoami\``);
|
|
30
|
+
}
|
|
31
|
+
return match.id;
|
|
32
|
+
}
|
|
33
|
+
/** SQLite bind values are null/string/number/bigint; anything else stringifies. */
|
|
34
|
+
const bindable = (v) => v === null || typeof v === 'string' || typeof v === 'number' || typeof v === 'bigint'
|
|
35
|
+
? v
|
|
36
|
+
: JSON.stringify(v);
|
|
37
|
+
/** Write the dump as a real SQLite file. False when node:sqlite is unavailable. */
|
|
38
|
+
async function writeSqlite(path, dump) {
|
|
39
|
+
let DatabaseSync;
|
|
40
|
+
try {
|
|
41
|
+
({ DatabaseSync } = await import('node:sqlite'));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false; // node < 22.13 — the caller falls back to JSON
|
|
45
|
+
}
|
|
46
|
+
rmSync(path, { force: true });
|
|
47
|
+
const db = new DatabaseSync(path);
|
|
48
|
+
try {
|
|
49
|
+
for (const t of dump.tables) {
|
|
50
|
+
db.exec(t.ddl);
|
|
51
|
+
if (t.rows.length === 0)
|
|
52
|
+
continue;
|
|
53
|
+
const cols = t.columns.map((c) => `"${c}"`).join(', ');
|
|
54
|
+
const marks = t.columns.map(() => '?').join(', ');
|
|
55
|
+
const stmt = db.prepare(`INSERT INTO "${t.name}" (${cols}) VALUES (${marks})`);
|
|
56
|
+
for (const row of t.rows)
|
|
57
|
+
stmt.run(...row.map(bindable));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
db.close();
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
export async function pullScope(opts) {
|
|
66
|
+
const url = `${opts.controlPlaneUrl}/tenants/${encodeURIComponent(opts.tenantId)}` +
|
|
67
|
+
`/scopes/${encodeURIComponent(opts.scopeId)}/export${opts.full ? '?full=true' : ''}`;
|
|
68
|
+
const res = await fetch(url, { headers: opts.header });
|
|
69
|
+
if (!res.ok) {
|
|
70
|
+
const body = (await res.json().catch(() => null));
|
|
71
|
+
throw new Error(body?.error ?? `pull refused: ${res.status} ${res.statusText}`);
|
|
72
|
+
}
|
|
73
|
+
const dump = (await res.json());
|
|
74
|
+
mkdirSync(opts.outDir, { recursive: true });
|
|
75
|
+
const base = join(opts.outDir, `${dump.tenantId}__${dump.scopeId}`);
|
|
76
|
+
const rows = dump.tables.reduce((n, t) => n + t.rows.length, 0);
|
|
77
|
+
const wroteSqlite = await writeSqlite(`${base}.sqlite`, dump);
|
|
78
|
+
const file = wroteSqlite ? `${base}.sqlite` : `${base}.dump.json`;
|
|
79
|
+
if (!wroteSqlite) {
|
|
80
|
+
writeFileSync(file, JSON.stringify(dump, null, 2));
|
|
81
|
+
}
|
|
82
|
+
console.log(`✓ pulled ${dump.tables.length} tables (${rows} rows), captured ${dump.capturedAt}`);
|
|
83
|
+
console.log(` → ${file}`);
|
|
84
|
+
if (!wroteSqlite) {
|
|
85
|
+
console.log(' (JSON fallback — node 22.13+ writes a ready-to-run .sqlite instead)');
|
|
86
|
+
}
|
|
87
|
+
if (dump.masked) {
|
|
88
|
+
console.log(' masked: PII columns are redacted — pass --full for a break-glass full pull');
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.log(' ⚠ FULL-FIDELITY pull: this file contains real customer data.');
|
|
92
|
+
console.log(' Treat it as production data — do not share it, delete it when done.');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED