@vectros-ai/cli 0.13.0 → 0.14.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
package/CHANGELOG.md CHANGED
@@ -3,6 +3,69 @@
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.14.0
7
+
8
+ ### Security
9
+
10
+ - **`bootstrap` no longer stores your minted `ssk_*` in plaintext.** The key
11
+ goes to this machine's OS credential store (or an encrypted file where none
12
+ is available); your MCP client config references it by alias only
13
+ (`VECTROS_KEYRING_ALIAS`), never the raw secret. **Breaking:** a config
14
+ merged by an older CLI keeps working, but a fresh `bootstrap` run now
15
+ produces the alias-only shape — if you scripted against the printed
16
+ snippet's `VECTROS_API_KEY` field, it's `VECTROS_KEYRING_ALIAS` now.
17
+
18
+ - **`--print` is renamed `--no-merge`, with no back-compat alias.** It was
19
+ never a dry run — it always applies for real and only changes where the
20
+ result goes. It still applies; it just skips writing your client's config
21
+ file. For a true preview, use `blueprint plan`.
22
+
23
+ ### Added
24
+
25
+ - **`key issue --to-keyring` and `key rotate --to-keyring` store the minted secret
26
+ instead of printing it.** Until now the mint verbs could only *emit* a key, so on
27
+ a desktop the only place to put it was the MCP client's config file, in plaintext.
28
+ `--to-keyring` writes it to this machine's OS credential store where one is in use,
29
+ and to the encrypted file under `~/.vectros/secrets` otherwise — telling you which
30
+ of the two took it either way, because only one of them is login-gated. The key is
31
+ never printed to a terminal, a pipe or a transcript. Anything that resolves a
32
+ credential through `vectros keyring show --format raw` — the MCP server included
33
+ — then reads it with no `VECTROS_API_KEY` set anywhere.
34
+
35
+ `--alias <name>` names the entry (default: the context id) and `--no-activate`
36
+ stores it without making it the active identity. Emitting stays the **default**:
37
+ it is the right behaviour for a headless server, where a secrets manager
38
+ distributes the key and nothing should persist it locally. The two destinations
39
+ are mutually exclusive — `--to-keyring` with `--format raw|env|json` is rejected
40
+ before anything is minted, rather than storing the key and printing it anyway.
41
+
42
+ `rotate --to-keyring` proves the store will accept a write *before* it revokes
43
+ the old key, so a machine that cannot hold a secret fails with your existing
44
+ credential intact.
45
+
46
+ ### Fixed
47
+
48
+ - **`bootstrap --plan` no longer claims `HYBRID` for a schema that declares no
49
+ `indexMode`.** The plan rendered an absent mode as `HYBRID`, but nothing
50
+ substitutes that default — the value is forwarded untouched, and the platform
51
+ then resolves an absent mode to `NONE` (store-only, never searchable) on a record
52
+ schema, and rejects a document schema that declares none. So the plan promised a
53
+ searchable type and the apply produced a store-only one, or previewed a request
54
+ the API would refuse. The plan now names the real outcome in both cases.
55
+
56
+ ### Changed
57
+
58
+ - **A blueprint may now declare `indexMode: NONE`** (store-only: kept and looked up, never
59
+ searchable). The mode has always been accepted by the platform, and `bootstrap`/`validate`/`plan`
60
+ rejected it earlier than that — structural validation runs against this CLI's own bundled copy of
61
+ the blueprint format, which predated the value. That copy now carries it, so a blueprint declaring
62
+ `NONE` validates and applies. This governs blueprints loaded **from a file** as much as bundled
63
+ ones: both funnel through the same structural parse.
64
+
65
+ - **`blueprint init` scaffold and `AUTHORING.md`** document the full `indexMode` set including
66
+ `NONE`, and warn that omitting the field does not mean `HYBRID` — a record schema with no mode of
67
+ its own resolves to `NONE`, and a document schema with none is rejected.
68
+
6
69
  ## 0.13.0
7
70
 
8
71
  ### 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