@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 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; `--print` previews without minting).
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 (default) | SEMANTIC | TEXT
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 switch <alias>` flips the active one.
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 / profiles / users /
190
- billing / admin) or `*` wildcard **hard-rejects** — the CLI mints nothing and
191
- exits non-zero. There is intentionally **no override flag**.
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