@vectros-ai/cli 0.13.0 → 0.15.0
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/AUTHORING.md +27 -3
- package/CHANGELOG.md +125 -0
- package/README.md +7 -4
- package/dist/cli.js +6029 -4674
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +6000 -4645
- package/dist/cli.mjs.map +1 -1
- package/package.json +3 -3
package/AUTHORING.md
CHANGED
|
@@ -78,7 +78,11 @@ A name must be 2–50 chars: a lowercase letter, then lowercase letters / digits
|
|
|
78
78
|
```
|
|
79
79
|
|
|
80
80
|
`bootstrap` shows the same plan and asks for confirmation before minting
|
|
81
|
-
(`--yes` skips the prompt for CI/agents
|
|
81
|
+
(`--yes` skips the prompt for CI/agents). ⚠️ **`--no-merge` is NOT a dry run** — it still
|
|
82
|
+
mints/reconciles for real; it only changes where the resulting credential goes, printing the MCP
|
|
83
|
+
config snippet to stdout instead of merging it into your client's config file. To preview without
|
|
84
|
+
touching your account, stop at `blueprint plan` (offline) — `bootstrap`, with or without `--no-merge`,
|
|
85
|
+
always applies.
|
|
82
86
|
|
|
83
87
|
**Provisioning a production context — `--no-seed`.** A blueprint's `seed`
|
|
84
88
|
records are illustrative sample data: handy for a getting-started or demo
|
|
@@ -120,7 +124,10 @@ contextId: mcp # 3-31 chars, lowercase-start. The app-context the key b
|
|
|
120
124
|
schemas:
|
|
121
125
|
- typeName: thing # immutable after first apply
|
|
122
126
|
displayName: Thing
|
|
123
|
-
indexMode: HYBRID # HYBRID
|
|
127
|
+
indexMode: HYBRID # HYBRID | SEMANTIC | TEXT | NONE (store-only).
|
|
128
|
+
# Omitting it does NOT mean HYBRID: a record schema with no
|
|
129
|
+
# indexMode resolves to NONE, and a document schema with none
|
|
130
|
+
# is rejected. Declare the mode you want.
|
|
124
131
|
fields:
|
|
125
132
|
- fieldId: title
|
|
126
133
|
fieldType: string # string | number | boolean | date | enum | array | object | reference
|
|
@@ -159,6 +166,20 @@ seed:
|
|
|
159
166
|
# Seeds are illustrative sample data. They're applied by default; provision a
|
|
160
167
|
# production context with `bootstrap --no-seed` to skip them (schemas + key
|
|
161
168
|
# still apply).
|
|
169
|
+
|
|
170
|
+
issuers:
|
|
171
|
+
- issuerId: auth0-prod # your slug; 3-31 chars, lowercase letter first
|
|
172
|
+
issuer: "https://your-tenant.us.auth0.com/"
|
|
173
|
+
jwksUri: "https://your-tenant.us.auth0.com/.well-known/jwks.json"
|
|
174
|
+
audience: "https://api.your-app.example.com" # globally unique per (issuer, audience)
|
|
175
|
+
contextId: my-thing # which app context an exchanged token targets
|
|
176
|
+
# Optional trusted third-party IdP issuers (BYO-IdP token exchange). Applied
|
|
177
|
+
# in the BOOTSTRAP-token phase, alongside app-context/service-principal
|
|
178
|
+
# creation — NOT the same phase as schemas/accessProfile/roles above (see
|
|
179
|
+
# BLUEPRINT_FIELD_PHASES, exported by @vectros-ai/blueprints). Registration
|
|
180
|
+
# is create-once: re-applying an already-registered issuerId leaves it
|
|
181
|
+
# unchanged — there's no update, so an edited jwksUri/audience on a live
|
|
182
|
+
# issuer won't take effect via re-apply.
|
|
162
183
|
```
|
|
163
184
|
|
|
164
185
|
YAML or JSON are both accepted (chosen by extension). The bundled library is
|
|
@@ -277,7 +298,10 @@ reference Y", add the reference field to `lookupFields` as an equality lookup
|
|
|
277
298
|
### The scope gate — what you can and can't request
|
|
278
299
|
|
|
279
300
|
The gate allows only **data-plane** resources:
|
|
280
|
-
`records`, `schemas`, `search`, `documents`, `folders`, `inference
|
|
301
|
+
`records`, `schemas`, `search`, `documents`, `folders`, `inference`, `entities`
|
|
302
|
+
(per-namespace identity-entity CRUD — `org`/`client`/any namespace you
|
|
303
|
+
registered — ownership-gated the same way as `records`; it grants no
|
|
304
|
+
authority over the namespace *registry* itself, which stays root-key-only).
|
|
281
305
|
Operations are `c|r|u|d`, combinable (`records:cru`), with a per-resource
|
|
282
306
|
wildcard (`records:*`). Anything else — control-plane resources or the bare
|
|
283
307
|
`*` — is rejected, and there is **intentionally no override flag**. This is
|
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,131 @@
|
|
|
3
3
|
All notable changes to `@vectros-ai/cli` are documented here.
|
|
4
4
|
This project adheres to [Semantic Versioning](https://semver.org).
|
|
5
5
|
|
|
6
|
+
## 0.15.0
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- **`bootstrap` can register trusted third-party IdP issuers via a blueprint's
|
|
11
|
+
new `issuers:` block** (requires `@vectros-ai/blueprints` 0.12.0+). Each entry
|
|
12
|
+
(`issuerId`, `issuer`, `jwksUri`, `audience`, `contextId`, optional `subClaim`/
|
|
13
|
+
`emailClaim`) is applied in the bootstrap-token phase — alongside app-context
|
|
14
|
+
and service-principal creation — using the same owner-only authority that
|
|
15
|
+
creates the app context itself, never an ordinary partner-grantable scope.
|
|
16
|
+
`vectros blueprint plan` names this phase explicitly in the preview.
|
|
17
|
+
|
|
18
|
+
- **`vectros blueprint-test` now verifies a declared `issuers:` entry actually
|
|
19
|
+
registered and is readable back**, the same live-credential proof it already
|
|
20
|
+
gives schemas and roles. One limitation, surfaced explicitly in the run's
|
|
21
|
+
report rather than silently: the platform has no way to remove a registered
|
|
22
|
+
issuer yet, so (unlike every other resource `blueprint-test` provisions)
|
|
23
|
+
issuer registrations are not torn down after the test run.
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- **`key rotate` no longer silently mints a second key when `--name` defaults
|
|
28
|
+
to `'default'` and the real key you meant to rotate is named something
|
|
29
|
+
else** (e.g. a `bootstrap`-minted key, which is never named `'default'`).
|
|
30
|
+
It now refuses when the default name matches no active key but another
|
|
31
|
+
active key already exists for the same principal/context, naming the
|
|
32
|
+
other key(s) so you can re-run with the right `--name` — or `--force-new`
|
|
33
|
+
to mint a new one alongside them anyway. Previously this minted an
|
|
34
|
+
unrelated key with no error or warning, leaving the original — possibly
|
|
35
|
+
the reason you were rotating — still active.
|
|
36
|
+
|
|
37
|
+
- **`bootstrap --blueprint <file>` now accepts `--set name=value` / `--values
|
|
38
|
+
<file>`** for a file blueprint's declared `inputs:`, matching what `vectros
|
|
39
|
+
blueprint validate`/`plan` already supported. Previously there was no way
|
|
40
|
+
to apply a blueprint with a required, no-default input via `bootstrap` at
|
|
41
|
+
all — the flags simply didn't exist on that command. Supplying either flag
|
|
42
|
+
against a bundled or `--blank` blueprint (which have no `inputs:` to set)
|
|
43
|
+
is now a clear usage error rather than a silent no-op.
|
|
44
|
+
|
|
45
|
+
- **The bootstrap scope gate no longer treats `entities` (identity-entity
|
|
46
|
+
CRUD — `org`/`client`/any namespace you registered) as control-plane.**
|
|
47
|
+
It's ordinary tenant data, ownership-gated the same way as `records` —
|
|
48
|
+
creating or reading an entity grants no additional access by itself. This
|
|
49
|
+
had blocked provisioning any blueprint role that manages its own
|
|
50
|
+
entities (e.g. a user creating their own org). The namespace *registry*
|
|
51
|
+
itself (registering a new namespace type) is unaffected and stays
|
|
52
|
+
root-key-only, correctly rejected by the gate as before.
|
|
53
|
+
|
|
54
|
+
- **The displayed/stored environment (`whoami`, `keyring list`/`doctor`, `blueprint-test`'s
|
|
55
|
+
banner) now reflects the base URL a command actually resolved and sent requests to, not
|
|
56
|
+
a hidden flag default.** The two diverge whenever `VECTROS_API_BASE_URL`/`--base-url`
|
|
57
|
+
alone selects the environment (the common shape when targeting staging without also
|
|
58
|
+
passing `--env staging`) — previously this echoed the wrong environment label next to a
|
|
59
|
+
key or session that was actually minted/used against a different one.
|
|
60
|
+
|
|
61
|
+
### Changed
|
|
62
|
+
|
|
63
|
+
- **Dependency maintenance** — repinned the bundled `@vectros-ai/sdk` to `0.39.0` (the
|
|
64
|
+
trusted BYO-IdP issuer registry and RFC 8693 token exchange, `exists-by-email`, and the
|
|
65
|
+
scoped-token TTL cap narrowed to 1 hour). The CLI bundles the SDK into its published
|
|
66
|
+
binary, so this is a rebuild against its current version.
|
|
67
|
+
|
|
68
|
+
## 0.14.0
|
|
69
|
+
|
|
70
|
+
### Security
|
|
71
|
+
|
|
72
|
+
- **`bootstrap` no longer stores your minted `ssk_*` in plaintext.** The key
|
|
73
|
+
goes to this machine's OS credential store (or an encrypted file where none
|
|
74
|
+
is available); your MCP client config references it by alias only
|
|
75
|
+
(`VECTROS_KEYRING_ALIAS`), never the raw secret. **Breaking:** a config
|
|
76
|
+
merged by an older CLI keeps working, but a fresh `bootstrap` run now
|
|
77
|
+
produces the alias-only shape — if you scripted against the printed
|
|
78
|
+
snippet's `VECTROS_API_KEY` field, it's `VECTROS_KEYRING_ALIAS` now.
|
|
79
|
+
|
|
80
|
+
- **`--print` is renamed `--no-merge`, with no back-compat alias.** It was
|
|
81
|
+
never a dry run — it always applies for real and only changes where the
|
|
82
|
+
result goes. It still applies; it just skips writing your client's config
|
|
83
|
+
file. For a true preview, use `blueprint plan`.
|
|
84
|
+
|
|
85
|
+
### Added
|
|
86
|
+
|
|
87
|
+
- **`key issue --to-keyring` and `key rotate --to-keyring` store the minted secret
|
|
88
|
+
instead of printing it.** Until now the mint verbs could only *emit* a key, so on
|
|
89
|
+
a desktop the only place to put it was the MCP client's config file, in plaintext.
|
|
90
|
+
`--to-keyring` writes it to this machine's OS credential store where one is in use,
|
|
91
|
+
and to the encrypted file under `~/.vectros/secrets` otherwise — telling you which
|
|
92
|
+
of the two took it either way, because only one of them is login-gated. The key is
|
|
93
|
+
never printed to a terminal, a pipe or a transcript. Anything that resolves a
|
|
94
|
+
credential through `vectros keyring show --format raw` — the MCP server included
|
|
95
|
+
— then reads it with no `VECTROS_API_KEY` set anywhere.
|
|
96
|
+
|
|
97
|
+
`--alias <name>` names the entry (default: the context id) and `--no-activate`
|
|
98
|
+
stores it without making it the active identity. Emitting stays the **default**:
|
|
99
|
+
it is the right behaviour for a headless server, where a secrets manager
|
|
100
|
+
distributes the key and nothing should persist it locally. The two destinations
|
|
101
|
+
are mutually exclusive — `--to-keyring` with `--format raw|env|json` is rejected
|
|
102
|
+
before anything is minted, rather than storing the key and printing it anyway.
|
|
103
|
+
|
|
104
|
+
`rotate --to-keyring` proves the store will accept a write *before* it revokes
|
|
105
|
+
the old key, so a machine that cannot hold a secret fails with your existing
|
|
106
|
+
credential intact.
|
|
107
|
+
|
|
108
|
+
### Fixed
|
|
109
|
+
|
|
110
|
+
- **`bootstrap --plan` no longer claims `HYBRID` for a schema that declares no
|
|
111
|
+
`indexMode`.** The plan rendered an absent mode as `HYBRID`, but nothing
|
|
112
|
+
substitutes that default — the value is forwarded untouched, and the platform
|
|
113
|
+
then resolves an absent mode to `NONE` (store-only, never searchable) on a record
|
|
114
|
+
schema, and rejects a document schema that declares none. So the plan promised a
|
|
115
|
+
searchable type and the apply produced a store-only one, or previewed a request
|
|
116
|
+
the API would refuse. The plan now names the real outcome in both cases.
|
|
117
|
+
|
|
118
|
+
### Changed
|
|
119
|
+
|
|
120
|
+
- **A blueprint may now declare `indexMode: NONE`** (store-only: kept and looked up, never
|
|
121
|
+
searchable). The mode has always been accepted by the platform, and `bootstrap`/`validate`/`plan`
|
|
122
|
+
rejected it earlier than that — structural validation runs against this CLI's own bundled copy of
|
|
123
|
+
the blueprint format, which predated the value. That copy now carries it, so a blueprint declaring
|
|
124
|
+
`NONE` validates and applies. This governs blueprints loaded **from a file** as much as bundled
|
|
125
|
+
ones: both funnel through the same structural parse.
|
|
126
|
+
|
|
127
|
+
- **`blueprint init` scaffold and `AUTHORING.md`** document the full `indexMode` set including
|
|
128
|
+
`NONE`, and warn that omitting the field does not mean `HYBRID` — a record schema with no mode of
|
|
129
|
+
its own resolves to `NONE`, and a document schema with none is rejected.
|
|
130
|
+
|
|
6
131
|
## 0.13.0
|
|
7
132
|
|
|
8
133
|
### Added
|
package/README.md
CHANGED
|
@@ -115,7 +115,9 @@ The app-context is intentionally **not** deleted (it's idempotent and reused).
|
|
|
115
115
|
A machine can hold several Vectros identities (one per context or principal).
|
|
116
116
|
The keyring stores them as named entries plus one **active** pointer, so you can
|
|
117
117
|
switch between them without re-issuing keys. `vectros join <context>` adds an
|
|
118
|
-
entry and activates it; `vectros
|
|
118
|
+
entry and activates it; `vectros key issue`/`key rotate` add one when passed
|
|
119
|
+
`--to-keyring` (which stores the new secret instead of printing it); `vectros switch
|
|
120
|
+
<alias>` flips the active one.
|
|
119
121
|
|
|
120
122
|
```bash
|
|
121
123
|
vectros keyring list # the entries; * marks the active one
|
|
@@ -186,9 +188,10 @@ Blueprints are **untrusted input** (agent- or community-authored) and the
|
|
|
186
188
|
CLI runs under an elevated ephemeral bridge token. So the trust boundary is
|
|
187
189
|
**this binary, not the blueprint**: a hardcoded **scope gate** bounds every
|
|
188
190
|
mint to a data-plane allowlist (`records` / `schemas` / `search` / `documents`
|
|
189
|
-
/ `folders` / `inference`). Any control-plane scope (keys /
|
|
190
|
-
billing / admin) or `*` wildcard
|
|
191
|
-
exits non-zero. There is
|
|
191
|
+
/ `folders` / `inference` / `entities`). Any control-plane scope (keys /
|
|
192
|
+
profiles / users / billing / admin / namespaces) or `*` wildcard
|
|
193
|
+
**hard-rejects** — the CLI mints nothing and exits non-zero. There is
|
|
194
|
+
intentionally **no override flag**.
|
|
192
195
|
|
|
193
196
|
## Rate limits
|
|
194
197
|
|