@tomorrowos/sdk 0.9.66 → 0.9.67

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 CHANGED
@@ -79,7 +79,7 @@ Follow @tomorrowos/sdk (an NPM package) VERCEL_SETUP.md and set up my TomorrowOS
79
79
 
80
80
  Open VERCEL_QUESTIONS.md first.
81
81
  For Q1, Q2, Q3: paste each question block VERBATIM. Do not rephrase options.
82
- For Q3: DO NOT ask a branding question or offer choices. Immediately open one form with ALL SEVEN optional inputs visible at once (Product Name, Tagline, Primary/Background/Text/Secondary colour, Logo Upload above Logo URL). Never only Name + Primary colour. Blanks = brand.json defaults.
82
+ For Q3: DO NOT ask a branding choice. Open one form with ALL SEVEN optional inputs at once, then HARD STOP and WAIT for my submit or "skip". Never auto-continue with defaults without my reply. Never only Name + Primary colour. Logo = Upload above Logo URL.
83
83
  After Q1 database choice, YOU set TOMORROWOS_STORE and DATABASE_SSL. Do not ask me to fill those.
84
84
  After Q2 media storage choice, YOU set TOMORROWOS_MEDIA. Do not ask me to fill those.
85
85
  Run: npx @tomorrowos/sdk@latest init . --hosting v0 --force
@@ -94,7 +94,7 @@ after deploy verify: GET /status → JSON, GET / → Control Panel, WebSocket on
94
94
  pair devices against the Production URL only
95
95
  ```
96
96
 
97
- Agents must paste questions from [`VERCEL_QUESTIONS.md`](./VERCEL_QUESTIONS.md) verbatim. Q1/Q2 are choice questions; **Q3 is a form only** — open **all seven** optional inputs at once (never a branding choice first; never only Name + Primary colour). Logo = Upload above Logo URL; blanks keep `brand.json` defaults. WebSockets require Fluid compute. The agent sets `cms.hostingTarget` to `"vercel"`.
97
+ Agents must paste questions from [`VERCEL_QUESTIONS.md`](./VERCEL_QUESTIONS.md) verbatim. Q1/Q2 are choice questions; **Q3 is a form only** — open **all seven** optional inputs at once, then **wait** for submit or `"skip"` (never auto-skip because fields are optional; never a branding choice first; never only Name + Primary colour). Logo = Upload above Logo URL. WebSockets require Fluid compute. The agent sets `cms.hostingTarget` to `"vercel"`.
98
98
 
99
99
  Upgrading an existing Vercel / v0 CMS instead:
100
100
 
@@ -1,10 +1,11 @@
1
1
  # Vercel / v0 - Verbatim question bank
2
2
 
3
- > **Protocol:** `vercel-questions/1.4` (pairs with `VERCEL_SETUP.md` 1.12+ / `@tomorrowos/sdk` 0.9.66+)
3
+ > **Protocol:** `vercel-questions/1.5` (pairs with `VERCEL_SETUP.md` 1.13+ / `@tomorrowos/sdk` 0.9.67+)
4
4
  > **For Agents:** When asking the user a setup question, **copy-paste the block below for that step EXACTLY**.
5
5
  > Do **not** paraphrase, reorder, rename options, or invent alternatives (no S3, no Supabase Storage, no "Blob recommended", no "disable media").
6
6
  > After each answer, configure per `VERCEL_SETUP.md`, then paste the **next** block.
7
- > **Q1 and Q2 are choice questions. Q3 is a form only - never a multiple-choice question.**
7
+ > **Q1 and Q2 are choice questions. Q3 is a form only - never a multiple-choice question.**
8
+ > **HARD STOP on Q3:** show the form, then **wait** for the user's reply. Optional fields do **not** mean you may auto-skip.
8
9
 
9
10
  ---
10
11
 
@@ -45,17 +46,21 @@ Reply with **1** or **2** (or "Cloudinary" / "Vercel Blob").
45
46
 
46
47
  ---
47
48
 
48
- ## Q3 - Brand form (NOT a question - open this form immediately)
49
+ ## Q3 - Brand form (NOT a question - open this form, then WAIT)
49
50
 
50
51
  **STOP - read before doing anything for branding:**
51
52
 
52
- 1. Q3 is **not** a chat question and **not** a multiple-choice step.
53
+ 1. Q3 is **not** a chat multiple-choice step.
53
54
  2. **Do not** ask: "Want to customize branding?", "Option A / Option B", "skip or customize?", or any other choice first.
54
55
  3. **Do not** open a form with only Product Name + Primary colour (or any subset).
55
- 4. **Immediately** open **one** multi-input form with **all seven fields visible at the same time**. User submits **once**. Every field is **optional**.
56
+ 4. **Immediately** open **one** multi-input form with **all seven fields visible at the same time**.
57
+ 5. **HARD STOP and WAIT** for the user to submit the form, reply with values, or say **"skip"**.
58
+ - Fields being optional means blanks keep defaults **after** the user responds.
59
+ - Fields being optional does **NOT** mean you may continue scaffolding without a user reply.
60
+ - **Forbidden:** "fields are optional so I'll proceed with defaults" / auto-skip / thinking past Q3 in the same turn.
56
61
 
57
62
  **Title:** Brand your TomorrowOS experience
58
- **Helper:** All fields optional. Leave blank to keep starter brand.json defaults. Submit once.
63
+ **Helper:** All fields optional. Leave blank to keep starter brand.json defaults. Submit once (or reply "skip"). I will wait for your reply before continuing setup.
59
64
 
60
65
  **Create exactly these seven controls - all on screen together (no Next / no wizard steps):**
61
66
 
@@ -71,12 +76,15 @@ Reply with **1** or **2** (or "Cloudinary" / "Vercel Blob").
71
76
 
72
77
  **Pass / fail check before showing the user:** count the text inputs. If you see fewer than **six** text fields (Product Name, Tagline, Primary, Background, Text, Secondary) plus the Logo Upload+URL row, **do not show it** - rebuild the form with all seven.
73
78
 
74
- **Forbidden Q3 UIs:**
79
+ **Forbidden Q3 UIs / behaviors:**
75
80
 
76
81
  - Any multiple-choice / radio / "1 or 2" / Option A vs B
77
82
  - A preliminary question before the form
78
83
  - Only Name + Primary colour (or any 1-2 field subset)
79
84
  - One freeform / Other box for all brand values
80
85
  - Field-by-field Next wizard
86
+ - Auto-continuing to init/scaffold/deploy without a user Q3 reply or explicit "skip"
87
+ - Interpreting "do not re-ask" as "do not wait for the first reply"
81
88
 
89
+ After the user submits (including all-blank) or says "skip": apply `brand.json`, then continue. **Do not** re-ask Q3 a second time.
82
90
  Blank fields -> keep existing `brand.json`. Logo blank -> `./assets/logo.svg`.
package/VERCEL_SETUP.md CHANGED
@@ -5,10 +5,10 @@
5
5
  >
6
6
  > **On Vercel, this file is the setup questionnaire** (not `REPLIT_SETUP.md`).
7
7
  >
8
- > Protocol id: `vercel-setup/1.12` - pairs with `@tomorrowos/sdk` **0.9.66+** (`templates/cms-starter-v0`, Fluid Functions WebSockets).
8
+ > Protocol id: `vercel-setup/1.13` - pairs with `@tomorrowos/sdk` **0.9.67+** (`templates/cms-starter-v0`, Fluid Functions WebSockets).
9
9
  >
10
10
  > **Questions source of truth:** `VERCEL_QUESTIONS.md` - Agents must **open that file and paste each Q block verbatim**. Do not paraphrase.
11
- > **Q1/Q2 = choice questions. Q3 = form only:** immediately open **all seven optional inputs at once**. Never ask a branding choice first. Never show only Name + Primary colour. Logo = **Upload** above **Logo URL**. Blanks keep starter `brand.json`.
11
+ > **Q1/Q2 = choice questions. Q3 = form only:** open **all seven optional inputs at once**, then **HARD STOP and WAIT** for submit or "skip". Never auto-skip because fields are optional. Never ask a branding choice first. Never show only Name + Primary colour. Logo = **Upload** above **Logo URL**.
12
12
  > **Copy questions verbatim from `VERCEL_QUESTIONS.md`.** Do not invent alternate Q2 options (no "Supabase Storage", no S3, no "disable media", no making Blob the recommended option).
13
13
  > **`TOMORROWOS_STORE` and `DATABASE_SSL` are agent-only** - set them automatically after Q1; never put them in a user-facing Env form for the customer to type.
14
14
 
@@ -38,7 +38,7 @@ Follow @tomorrowos/sdk (an NPM package) VERCEL_SETUP.md and set up my TomorrowOS
38
38
 
39
39
  Open VERCEL_QUESTIONS.md first.
40
40
  For Q1, Q2, Q3: paste each question block VERBATIM. Do not rephrase options.
41
- For Q3: DO NOT ask a branding question or offer choices. Immediately open one form with ALL SEVEN optional inputs visible at once (Product Name, Tagline, Primary/Background/Text/Secondary colour, Logo Upload above Logo URL). Never only Name + Primary colour. Blanks = brand.json defaults.
41
+ For Q3: DO NOT ask a branding choice. Open one form with ALL SEVEN optional inputs at once, then HARD STOP and WAIT for my submit or "skip". Never auto-continue with defaults without my reply. Never only Name + Primary colour. Logo = Upload above Logo URL.
42
42
  After Q1 database choice, YOU set TOMORROWOS_STORE and DATABASE_SSL. Do not ask me to fill those.
43
43
  After Q2 media storage choice, YOU set TOMORROWOS_MEDIA. Do not ask me to fill those.
44
44
  Run: npx @tomorrowos/sdk@latest init . --hosting v0 --force
@@ -219,9 +219,9 @@ Then ask **Question 1**.
219
219
  16. **No inventing CMS login** from a branding URL.
220
220
  17. **Skip ??invent.** Stay on Q1?Q3 only.
221
221
  18. **Publish gate:** `/status` JSON + WebSocket 101; no static `public/` trap.
222
- 19. **Q3 is a form, not a question.** After Q2, **immediately** open one dialog with **all seven** optional inputs visible together. **Never** ask a preliminary branding choice. **Never** show only Product Name + Primary colour. **Never** use multiple-choice / Option A-B for branding. Logo = **Upload** above **Logo URL**.
222
+ 19. **Q3 is a form, not a question ? and you must WAIT.** After Q2, open one dialog with **all seven** optional inputs visible together, then **stop and wait** for submit or explicit **"skip"**. **Never** auto-continue because fields are optional. **Never** ask a preliminary branding choice. **Never** show only Product Name + Primary colour. **Never** use multiple-choice / Option A-B for branding. Logo = **Upload** above **Logo URL**.
223
223
 
224
- **Question order:** Q1 -> (auto-set store env) -> Q2 -> Q3 form -> execution checklist.
224
+ **Question order:** Q1 -> (auto-set store env) -> Q2 -> Q3 form (**wait for user**) -> execution checklist.
225
225
 
226
226
  ---
227
227
 
@@ -752,28 +752,32 @@ import { put } from "@vercel/blob";
752
752
 
753
753
  ---
754
754
 
755
- ## Question 3 - Brand form (`brand.json` only; **not a choice question**)
755
+ ## Question 3 - Brand form (`brand.json` only; **not a choice question**; **must wait**)
756
756
 
757
757
  > Updates **only** `brand.json`. Does **not** change Vercel project settings, Env Vars, `vercel.json`, or `server.ts` store wiring beyond what Q1-Q2 already required.
758
758
  >
759
- > **IRON RULE - form, not question:** As soon as Q2 is done, **open the brand form**. Do **not** ask the user anything in chat first. Do **not** offer choices. Show **all seven optional fields on one screen at the same time**. User fills what they want (or leaves blank) and submits **once**.
759
+ > **IRON RULE - form, not question; show then WAIT:** As soon as Q2 is done, **open the brand form**. Do **not** ask a choice first. Show **all seven optional fields on one screen at the same time**. Then **HARD STOP** until the user submits the form, replies with values, or says **"skip"**.
760
+ >
761
+ > **Optional fields ? optional step.** Leaving a field blank keeps the starter default **after the user responds**. It does **not** authorize you to skip waiting or auto-apply defaults in the same turn.
760
762
  >
761
763
  > - **Forbidden:** any preliminary question ("customize branding?", "skip or set brand?", Option A/B)
762
764
  > - **Forbidden:** multiple-choice / radio / "reply 1 or 2" for branding
763
765
  > - **Forbidden:** showing only Product Name + Primary colour (or any subset under 7)
764
766
  > - **Forbidden:** field-by-field Next wizard (name -> wait -> tagline -> ...)
765
767
  > - **Forbidden:** one freeform / Other box for all brand values
766
- > - **Required:** six text inputs + Logo Upload above Logo URL, all visible together before submit
768
+ > - **Forbidden:** auto-continuing to init / scaffold / env / deploy because "fields are optional" or "I shouldn't re-ask"
769
+ > - **Required:** six text inputs + Logo Upload above Logo URL, all visible together
770
+ > - **Required:** wait for one user action (submit / values / "skip") before scaffolding continues
767
771
  >
768
772
  > **Self-check:** If the UI you are about to show has fewer than six text fields for name/tagline/four colours, **abort and rebuild** - that UI is off-protocol.
769
773
  >
770
- > **Every field is optional.** Blank / skip / "use defaults" -> keep starter **`brand.json`** values (from `templates/cms-starter-v0/brand.json` / project `brand.json` after `init`). **Do not** re-ask for missing fields. **Do not** invent a second branding prompt.
774
+ > **Every field is optional** once the form is shown. After the user submits (including all-blank) or says "skip": keep starter **`brand.json`** for blanks; **do not** re-ask Q3 a second time. **Do not** invent a second branding prompt.
771
775
  >
772
776
  > Default TomorrowOS Control Panel has **no login**. Do **not** scaffold login/auth unless the user explicitly asks.
773
777
 
774
- ### Preferred UI (open immediately - all seven at once)
778
+ ### Preferred UI (open immediately - all seven at once - then wait)
775
779
 
776
- Open **one** dialog titled **Brand your TomorrowOS experience**. Render **each row as its own control**. All rows must appear **together** on first paint - not revealed after a choice, not after filling a previous field.
780
+ Open **one** dialog titled **Brand your TomorrowOS experience**. Render **each row as its own control**. All rows must appear **together** on first paint - not revealed after a choice, not after filling a previous field. After opening, **end your turn** and wait.
777
781
 
778
782
  | # | Exact label | Control type | Blank default |
779
783
  |---|-------------|--------------|---------------|
@@ -785,15 +789,15 @@ Open **one** dialog titled **Brand your TomorrowOS experience**. Render **each r
785
789
  | 6 | **Secondary colour** | text input (hex) | e.g. `#F5F3EF` |
786
790
  | 7 | **Logo** | **Upload** (SVG/PNG file picker) **above** **Logo URL** (text input) | keep `./assets/logo.svg` |
787
791
 
788
- Helper text: *All fields optional. Leave blank to keep starter brand.json defaults. Submit once. For logo: upload a file or paste a URL.*
792
+ Helper text: *All fields optional. Leave blank to keep starter brand.json defaults. Submit once, or reply "skip". I will wait before continuing setup.*
789
793
 
790
794
  **Logo UX:** Upload control directly above Logo URL. Either is fine; if both provided, prefer the uploaded file.
791
795
 
792
- ### If a form UI is unavailable - one chat message only (still no choice question)
796
+ ### If a form UI is unavailable - one chat message only (still wait)
793
797
 
794
- Only when the platform **cannot** render multi-field forms. Do **not** ask a choice first. Send **exactly one** message listing all seven fields (user may answer partially, attach a logo, or say "skip"):
798
+ Only when the platform **cannot** render multi-field forms. Do **not** ask a choice first. Send **exactly one** message listing all seven fields, then **end your turn and wait** (user may answer partially, attach a logo, or say "skip"):
795
799
 
796
- > Brand your TomorrowOS experience (**all optional - reply once**). Leave any field blank to keep starter `brand.json` defaults:
800
+ > Brand your TomorrowOS experience (**all optional - reply once**). Leave any field blank to keep starter `brand.json` defaults. I will wait for your reply before scaffolding:
797
801
  >
798
802
  > 1. **Product Name**
799
803
  > 2. **Tagline**
@@ -802,6 +806,8 @@ Only when the platform **cannot** render multi-field forms. Do **not** ask a cho
802
806
  > 5. **Text colour** (hex)
803
807
  > 6. **Secondary colour** (hex)
804
808
  > 7. **Logo** - attach SVG/PNG or paste a Logo URL
809
+ >
810
+ > Or reply **skip** to keep all defaults.
805
811
 
806
812
  ### After the user submits
807
813
 
@@ -965,6 +971,7 @@ Tell the user:
965
971
  | Agent asked for OpenAI / `sk-` key during setup | Hallucinated ?AI pairing??requirement | **Refuse.** TomorrowOS does not need LLM keys. Return to Q2 media choices only |
966
972
  | Agent asked a branding choice / Option A-B / "customize?" before the form | Off-protocol Q3 | Close it; immediately open the **7-field form** (no choice step) |
967
973
  | Agent showed only Name + Primary colour (or any subset) | Off-protocol Q3 | Rebuild with **all seven** inputs visible at once |
974
+ | Agent auto-continued after showing Q3 because "fields are optional" / "shouldn't re-ask" | Off-protocol Q3 | **HARD STOP** and wait for submit or explicit "skip"; do not scaffold yet |
968
975
  | Agent asked branding as Option A URL vs Option B, or field-by-field Next | Off-protocol Q3 | Re-open Q3 as **seven separate optional inputs** in one dialog; blanks keep `brand.json` |
969
976
  | Agent built a login page from branding answers | Misread brand step as product scope | Remove login; keep starter Control Panel; apply answers only to `brand.json` |
970
977
  | Secrets in git | Mistake | Rotate keys; move to Vercel Env Vars |
@@ -1013,7 +1020,9 @@ Protocol complete when:
1013
1020
 
1014
1021
  ## Protocol version
1015
1022
 
1016
- `vercel-setup/1.12` - pairs with `@tomorrowos/sdk` 0.9.66+ and `VERCEL_QUESTIONS.md` 1.4.
1023
+ `vercel-setup/1.13` - pairs with `@tomorrowos/sdk` 0.9.67+ and `VERCEL_QUESTIONS.md` 1.5.
1024
+
1025
+ **Changelog 1.13:** Q3 must **HARD STOP and WAIT** for user submit or "skip". Optional fields do **not** authorize auto-continuing with defaults. Clarifies "do not re-ask" = after the user already replied, not "skip waiting".
1017
1026
 
1018
1027
  **Changelog 1.12:** Q3 is a **form, not a question**. No preliminary branding choice. Must show **all seven** optional inputs at once (never only Name + Primary colour). Logo = Upload above Logo URL.
1019
1028
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tomorrowos/sdk",
3
- "version": "0.9.66",
3
+ "version": "0.9.67",
4
4
  "description": "TomorrowOS CMS server SDK - WebSocket transport, pairing, device commands, optional static CMS UI. Includes CLI (tomorrowos init / build) and starter templates.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "my-cms",
3
- "version": "0.9.66",
3
+ "version": "0.9.67",
4
4
  "description": "CMS server on @tomorrowos/sdk. Add your UI (React, static files, etc.) alongside this server.",
5
5
  "private": true,
6
6
  "type": "module",
@@ -13,7 +13,7 @@
13
13
  "build-player": "tomorrowos build --platform tizen"
14
14
  },
15
15
  "dependencies": {
16
- "@tomorrowos/sdk": "^0.9.66",
16
+ "@tomorrowos/sdk": "^0.9.67",
17
17
  "dotenv": "^17.2.3",
18
18
  "tsx": "^4.19.0"
19
19
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "my-cms",
3
- "version": "0.9.66",
3
+ "version": "0.9.67",
4
4
  "description": "TomorrowOS CMS for Vercel / v0 Publish (Fluid Function + WebSockets + optional Next Preview).",
5
5
  "private": true,
6
6
  "type": "module",
@@ -17,7 +17,7 @@
17
17
  "build-player": "tomorrowos build --platform tizen"
18
18
  },
19
19
  "dependencies": {
20
- "@tomorrowos/sdk": "^0.9.66",
20
+ "@tomorrowos/sdk": "^0.9.67",
21
21
  "dotenv": "^17.2.3",
22
22
  "tsx": "^4.19.0"
23
23
  },