wizards 0.3.8 → 0.4.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.
Files changed (91) hide show
  1. package/README.md +28 -14
  2. package/apps/runtime/dist/agents/studio-assistant.js +67 -20
  3. package/apps/runtime/dist/auth/account.js +36 -4
  4. package/apps/runtime/dist/auth/device.js +101 -0
  5. package/apps/runtime/dist/auth/index.js +4 -4
  6. package/apps/runtime/dist/cli/account.js +289 -0
  7. package/apps/runtime/dist/cli/install-env.js +33 -0
  8. package/apps/runtime/dist/cli/main.js +17 -3
  9. package/apps/runtime/dist/cli/menu.js +19 -5
  10. package/apps/runtime/dist/cli/setup.js +9 -16
  11. package/apps/runtime/dist/cli/status.js +4 -1
  12. package/apps/runtime/dist/cli/ui.js +14 -0
  13. package/apps/runtime/dist/docs/dev/plugins/reference.md +7 -4
  14. package/apps/runtime/dist/docs/dev/plugins/server.md +3 -1
  15. package/apps/runtime/dist/docs/dev/plugins/space.md +19 -1
  16. package/apps/runtime/dist/docs/dev/plugins/studio.md +43 -6
  17. package/apps/runtime/dist/docs/dev/plugins/styling.md +8 -1
  18. package/apps/runtime/dist/docs/user/command-line.md +3 -2
  19. package/apps/runtime/dist/docs/user/create-account.md +47 -0
  20. package/apps/runtime/dist/docs/user/first-start.md +9 -1
  21. package/apps/runtime/dist/docs/user/index.md +16 -12
  22. package/apps/runtime/dist/docs/user/install.md +3 -1
  23. package/apps/runtime/dist/docs/user/local-only.md +38 -0
  24. package/apps/runtime/dist/docs/user/meta.json +3 -1
  25. package/apps/runtime/dist/docs/user/models.md +3 -2
  26. package/apps/runtime/dist/docs/user/space.md +4 -4
  27. package/apps/runtime/dist/engine/steps.js +3 -2
  28. package/apps/runtime/dist/engine/template.js +14 -10
  29. package/apps/runtime/dist/film/project.js +15 -3
  30. package/apps/runtime/dist/manage.js +12 -0
  31. package/apps/runtime/dist/plugins/loader.js +38 -2
  32. package/apps/runtime/dist/plugins/pro.js +16 -16
  33. package/apps/runtime/dist/routes/studio.js +69 -3
  34. package/apps/runtime/dist/services/brand.js +61 -1
  35. package/apps/runtime/dist/services/cloud.js +10 -10
  36. package/apps/runtime/dist/services/onboarding.js +152 -0
  37. package/apps/runtime/dist/services/projects.js +19 -10
  38. package/apps/runtime/dist/tools/plugin.js +11 -3
  39. package/apps/web/dist/assets/AboutDialog-CXEpsI6L.js +1 -0
  40. package/apps/web/dist/assets/{ChangelogDialog-DsSEkayM.js → ChangelogDialog-Cc2APUGI.js} +1 -1
  41. package/apps/web/dist/assets/ChatView-B2r4dW_m.js +10 -0
  42. package/apps/web/dist/assets/EditorPage-CNAYlSms.js +3 -0
  43. package/apps/web/dist/assets/{FlowPreview-C_x5Kc2j.js → FlowPreview-DzU1nGDb.js} +1 -1
  44. package/apps/web/dist/assets/{Harness-CvvtSTZC.js → Harness-ALQ9Csm6.js} +2 -2
  45. package/apps/web/dist/assets/NewWizardChannels-DMPqHkCF.js +1 -0
  46. package/apps/web/dist/assets/NewWizardPage-pi053e8N.js +7 -0
  47. package/apps/web/dist/assets/OnboardingPage-TYNX6Umd.js +1 -0
  48. package/apps/web/dist/assets/ProjectPage-CvEkx_Ux.js +1 -0
  49. package/apps/web/dist/assets/PublicRunner-BrivKNHo.js +1 -0
  50. package/apps/web/dist/assets/{ReadOnly-C1UcqOlS.js → ReadOnly-DQPHmvS0.js} +1 -1
  51. package/apps/web/dist/assets/RunDrawer-3osugizk.js +4 -0
  52. package/apps/web/dist/assets/{RunnerView-ii-PP5c-.js → RunnerView-Ci4_WzVv.js} +1 -1
  53. package/apps/web/dist/assets/SettingsPage-DKntf7-9.js +1 -0
  54. package/apps/web/dist/assets/SetupPage-DZQxEQyk.js +1 -0
  55. package/apps/web/dist/assets/SharePage-B9l4KthU.js +1 -0
  56. package/apps/web/dist/assets/changelog-CxdXZo3V.js +1 -0
  57. package/apps/web/dist/assets/{circle-alert-D-Q6DK7b.js → circle-alert-DCBV7n5k.js} +1 -1
  58. package/apps/web/dist/assets/{esm-CTna4iL0.js → esm-CuqXcPS3.js} +1 -1
  59. package/apps/web/dist/assets/index-CmxVazOf.css +1 -0
  60. package/apps/web/dist/assets/index-j09nLtEs.js +14 -0
  61. package/apps/web/dist/assets/{lock-DwGN_KOC.js → lock-DlzTfwxP.js} +1 -1
  62. package/apps/web/dist/assets/{phone-XIVIe17d.js → phone-BFD815nc.js} +1 -1
  63. package/apps/web/dist/assets/{settings-menu-JuSRq6NP.js → settings-menu-C7VsRpe9.js} +1 -1
  64. package/apps/web/dist/assets/ui-DTuixH4y.js +134 -0
  65. package/apps/web/dist/assets/{upload-CDxTpAqx.js → upload-BEf5-d6X.js} +1 -1
  66. package/apps/web/dist/index.html +4 -5
  67. package/apps/web/dist/install.sh +17 -7
  68. package/apps/web/dist/mcp/flow.html +2 -2
  69. package/node_modules/@engenty-wizards/plugin-sdk/dist/index.d.ts +36 -2
  70. package/node_modules/@engenty-wizards/plugin-sdk/dist/studio.d.ts +44 -1
  71. package/node_modules/@engenty-wizards/shared/dist/feature-flags.d.ts +18 -0
  72. package/node_modules/@engenty-wizards/shared/dist/feature-flags.js +18 -0
  73. package/node_modules/@engenty-wizards/shared/dist/projects.d.ts +22 -6
  74. package/node_modules/@engenty-wizards/shared/dist/projects.js +20 -0
  75. package/package.json +1 -1
  76. package/apps/web/dist/assets/AboutDialog-ClV4gNiW.js +0 -1
  77. package/apps/web/dist/assets/ChatView-BdYCnDLk.js +0 -10
  78. package/apps/web/dist/assets/EditorPage-7PZzkNBT.js +0 -3
  79. package/apps/web/dist/assets/NewWizardChannels-g1qCd_tQ.js +0 -1
  80. package/apps/web/dist/assets/NewWizardPage-B3hswj5r.js +0 -7
  81. package/apps/web/dist/assets/ProjectPage-CFDncRxT.js +0 -1
  82. package/apps/web/dist/assets/PublicRunner-C9N5r-sT.js +0 -1
  83. package/apps/web/dist/assets/RunDrawer-B8YzFvgz.js +0 -4
  84. package/apps/web/dist/assets/SettingsPage-ClEP5Q0t.js +0 -1
  85. package/apps/web/dist/assets/SetupPage-CDFzo6LT.js +0 -1
  86. package/apps/web/dist/assets/SharePage-BV2S0g84.js +0 -1
  87. package/apps/web/dist/assets/changelog-wZI-UaUi.js +0 -1
  88. package/apps/web/dist/assets/index-DUjJx-uk.css +0 -1
  89. package/apps/web/dist/assets/index-DnQgOKOQ.js +0 -15
  90. package/apps/web/dist/assets/logo-C4V2_3Ar.js +0 -1
  91. package/apps/web/dist/assets/ui-DrjXmHdO.js +0 -133
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: The space
3
3
  description: Knowledge a plugin writes, a block and tools for every AI step of a space, texts in its search index, tools and cards of its assistant.
4
- version: 0.3.2
4
+ version: 0.3.7
5
5
  ---
6
6
 
7
7
  A space holds what all its wizards share: a title, logos, colours, facts, and Knowledge —
@@ -93,6 +93,24 @@ server.registerSpaceContext({
93
93
  - A model on the device calls no tools: Apple Intelligence on a Mac, or the phone a run is
94
94
  followed on, which answers only steps that list no tools themselves. The step then gets the
95
95
  block without the tools.
96
+ - `steps` says which steps get it: `["agent"]` when left out. `"html"` is the steps that write a
97
+ document or a dashboard as HTML; they get the block without the tools, after the space's
98
+ brand: how the brand's elements look, say.
99
+
100
+ ## The space's brand
101
+
102
+ `server.spaces.brand(space)` reads what Info & brand holds of the space's look, for a block, a
103
+ page or a model call in it:
104
+
105
+ ```ts
106
+ const brand = await server.spaces.brand(space.id);
107
+ // { name: "Mira Kaffee", colors: [{ name: "Primär", value: "#7a3e1d" }, …],
108
+ // fonts: [{ family: "Fraunces", role: "Headings", weights: [600] }, …] }
109
+ ```
110
+
111
+ - The first colour is the accent. A font's `role` is what it is for, in the person's words.
112
+ - `null` for a space the tenant does not have. The studio half gets the same as
113
+ `studio.useSpace().brand`.
96
114
 
97
115
  ## The search index
98
116
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: The studio half
3
3
  description: Pages, icons in the app bar, sections of the settings and of the space page — written in React, built once, drawn inside the studio.
4
- version: 0.3.4
4
+ version: 0.3.7
5
5
  ---
6
6
 
7
7
  The studio half is `ui/plugin.tsx`. Its default export is a function; the studio calls it after
@@ -123,7 +123,7 @@ space page, behind the house icon (Space) in the app bar, shows them in four par
123
123
 
124
124
  | Part | `group` | Holds |
125
125
  |---|---|---|
126
- | Info & brand | `info` | Basics, Logos, Colours, Assets, Facts |
126
+ | Info & brand | `info` | Basics, Facts, Logos, Colours, Brand assets |
127
127
  | Knowledge | `knowledge` | Documents, pages, tables and files with their Kategorien: what every AI step looks things up in |
128
128
  | Data | `data` | What the wizards keep |
129
129
  | Results | `results` | The runs that reached their result |
@@ -157,13 +157,50 @@ studio.registerSpaceSection({
157
157
  - `id` is the section's anchor: `/studio/space/data#contacts` opens the page there, and so does
158
158
  `/studio/space#contacts`. In Knowledge a section is a page of its own:
159
159
  `/studio/space/knowledge?show=s:<id>`, where `#<id>` leads too. Ids are unique on the whole
160
- page; the space's own are taken: `base`, `logos`, `colors`, `assets`, `documents`, `facts`.
161
- - `studio.useSpace()` is a hook: `{ id, name, readOnly }`, or `null` while there is none. A
162
- component that calls it draws again when the person picks another space. `readOnly`: the
163
- space came from a local install, or nothing is built on this runtime; show it, change nothing.
160
+ page; the space's own are taken: `base`, `facts`, `logos`, `colors`, `typography`, `assets`,
161
+ `documents`.
162
+ - `studio.useSpace()` is a hook: `{ id, name, readOnly, brand }`, or `null` while there is none.
163
+ A component that calls it draws again when the person picks another space, or changes its
164
+ brand. `readOnly`: the space came from a local install, or nothing is built on this runtime;
165
+ show it, change nothing. `brand` is what Info & brand holds of the look: `name`, `colors`
166
+ (`{ name, value }`, the first is the accent) and `fonts` (`{ family, role, weights }`).
164
167
  - Every wizard belongs to a space: a [run event](./events.md) names it as
165
168
  `wizard.projectId`. Keep it with what the plugin stores to show a space's part of it.
166
169
 
170
+ ### A part of the plugin's own
171
+
172
+ A plugin whose subject is as big as one of the parts adds a part of its own: an entry in the
173
+ parts' menu, with a page at `/studio/space/<id>` that the plugin draws whole. The part's menu
174
+ lists what the page holds; `studio.useSpaceMenu` fills it while the page is drawn.
175
+
176
+ ```tsx
177
+ function Library() {
178
+ const space = studio.useSpace();
179
+ const sections = useSections(space?.id);
180
+ studio.useSpaceMenu(sections.map((s) => ({ id: s.id, label: s.title, icon: Component })));
181
+ return sections.map((s) => (
182
+ <Anchor key={s.id} id={s.id}>
183
+ <Section title={s.title}>…</Section>
184
+ </Anchor>
185
+ ));
186
+ }
187
+
188
+ studio.registerSpacePart({
189
+ id: "library",
190
+ label: () => t("title"),
191
+ icon: Blocks,
192
+ after: "info",
193
+ component: Library,
194
+ });
195
+ ```
196
+
197
+ - `id` is the address: `/studio/space/library`. The parts' own (`info`, `knowledge`, `data`,
198
+ `results`) are taken.
199
+ - `after` is the part it follows in the menu: `info`, `knowledge` or `data` (default).
200
+ - Each entry of `useSpaceMenu` jumps to the element with its `id` in what the part draws, and
201
+ the menu marks the one in view. `Anchor` and `Section` draw them as the space's own parts do.
202
+ - The component is drawn again for another space: keep the space's data under its id.
203
+
167
204
  ## Words in two languages
168
205
 
169
206
  The studio speaks German and English. `studio.i18n.register` takes the plugin's words and gives
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Styles and components
3
3
  description: The studio's components, Tailwind against the studio's theme, and why a plugin's styles never leak.
4
- version: 0.3.2
4
+ version: 0.3.7
5
5
  ---
6
6
 
7
7
  A plugin's page should look like the studio. Two things make that easy: the studio's components
@@ -34,6 +34,13 @@ and its theme.
34
34
  | `LinkedText` | A sentence with its web addresses as links, named by their host | `text` |
35
35
  | `cn(...)` | Joins class names, skipping what is false | |
36
36
  | `dateText(date, withWeekday?)` | A "YYYY-MM-DD" date in the studio's language: "Wed 14 Oct 2026" | |
37
+ | `Anchor`, `Section` | A section of the space page and the spot the menu jumps to: the heading and its hint above the card | `id` on the anchor · `title`, `hint`, `save` (how the last save went), `action` (beside the heading), `plain` (the content draws its own cards) |
38
+ | `InlineText` | Text edited where it stands, without a field's frame | `value`, `onChange`, `placeholder`, `label`, `maxLength`, `fit` (as wide as its text) |
39
+ | `AddMenu` | The "Add" menu of a section's heading | `entries: { label, icon, onPick }[]` |
40
+ | `AddRow` | A quiet "+ …" row at the end of a list | `label`, `onClick` |
41
+ | `RuleRows`, `useRuleRows(saved)` | Rules as rows, each with its sign (bullet, do, don't, to check, important, numbered) | `rules` (what the hook gives), `placeholder`, `readOnly` |
42
+ | `useAutosave(value, save)` | Saves a value a moment after it last changed; gives the state for a section's `save` | |
43
+ | `newId()` | A short id for something new | |
37
44
 
38
45
  ```tsx
39
46
  import { Button, Card, Chip, Label, Input } from "@engenty-wizards/web/ui";
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Command line
3
3
  description: The wizards command — start, setup, status, update — and the install's settings file.
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  ---
6
6
 
7
7
  ## Commands
@@ -11,7 +11,8 @@ version: 0.3.2
11
11
  | `wizards` | What runs, and a menu: open the studio, restart and stop while it runs, "Start as service" or "Start here" (in this terminal) while it does not; update, which restarts what runs into the new version; "Service settings" (start at login); connect AI apps, status, setup, help. The first time, the setup runs first. Needs a terminal |
12
12
  | `wizards start` | Starts it and opens the studio. It runs in that terminal; Ctrl-C stops it. The first time, the setup runs first |
13
13
  | `wizards studio` | Opens the studio in your browser. When it does not run, it starts as a service first |
14
- | `wizards setup` | The guided setup again: an AI client to think with, the browser and ffmpeg, start at login, your AI apps |
14
+ | `wizards setup` | The guided setup again: your account, an AI client to think with, the browser and ffmpeg, start at login, your AI apps. `--local` leaves the account out ([Local only](./local-only.md)) |
15
+ | `wizards account` | How the install stands to your account: signed in as whom, which team, the credits. `sign-in` shows a code and opens the browser; `sign-out` disconnects the install |
15
16
  | `wizards open` | Lets this browser into the running studio. `--print` only shows the link; it works once, within a minute |
16
17
  | `wizards status` | What is installed and what runs, with the browser the app uses for PDF, PNG and websites |
17
18
  | `wizards doctor` | Status, and what is wrong |
@@ -0,0 +1,47 @@
1
+ ---
2
+ title: Create an account
3
+ description: Your team, its space and your wizards live in your account at engenty.ai. Sign up with an invitation code, answer four questions, build.
4
+ version: 0.3.4
5
+ ---
6
+
7
+ engenty wizards is in a closed beta: a new account needs an invitation code. "Get started" on
8
+ [engenty.ai](https://engenty.ai) takes your e-mail and puts you on the list; the code comes by
9
+ mail as soon as a seat is free. With a code, the same step opens the sign-up.
10
+
11
+ ## Sign up
12
+
13
+ 1. Type the code at [account.engenty.ai/sign-up](https://account.engenty.ai/sign-up). The link
14
+ in the invitation mail has it filled in.
15
+ 2. Sign in with Google, GitHub, or a link by mail. There is no password.
16
+ 3. The studio opens at [engenty.ai/studio](https://engenty.ai/studio).
17
+
18
+ Your account is a **team**: it holds your credits, your spaces and, on the Team plan, your
19
+ colleagues. It starts with credits, some of which end on a date; the account pages at
20
+ [account.engenty.ai](https://account.engenty.ai) show them.
21
+
22
+ ## The first visit
23
+
24
+ The studio asks four things, one per page. Each but the first can be skipped and changed later.
25
+
26
+ | Page | Asks | Goes to |
27
+ |---|---|---|
28
+ | Who you are | What your team is called: your company, your club, or just your name | The team's name at account.engenty.ai |
29
+ | About you & your brand | Your website. engenty reads your name, what you do, your logo and colours from it; or you write a line about yourself | [Space → Info & brand](./space.md#info--brand) |
30
+ | Knowledge | Documents the wizards may look things up in: price lists, your terms, an FAQ | [Space → Knowledge](./space.md#knowledge) |
31
+ | Your space | Nothing: it explains the space that holds all of this, "Meine Wizards" | — |
32
+
33
+ Then "Build your first wizard" opens the studio's start: describe a task in a sentence, or pick
34
+ a template. See [Build a wizard](./build-a-wizard.md).
35
+
36
+ ## What the cloud does
37
+
38
+ - Wizards built here run behind a link that works day and night, on the team's credits.
39
+ - Share links, the tag for your website, QR codes and the channels of [Test and share](./test-and-share.md) work as on an install.
40
+ - What the wizards think with is the team's: [Models and account](./models.md).
41
+
42
+ ## Also on your computer
43
+
44
+ The same account works on your own computer: [install](./install.md) engenty wizards there and
45
+ sign in during the setup. It thinks with your Claude, ChatGPT, Gemini or Cursor subscription,
46
+ reads your local files and browses for you; what you publish there runs in the cloud too, behind
47
+ the same links. "Also on your computer" on the studio's start page mails you the command.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: First start
3
3
  description: Choose what engenty wizards thinks with. The studio opens once a test call works.
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  ---
6
6
 
7
7
  The first page of the studio is the setup, "Choose your Engine". It asks one thing: what should
@@ -9,10 +9,18 @@ engenty think with?
9
9
 
10
10
  ![The setup: choose the engine, an installed AI client or your own keys](../../assets/setup.png)
11
11
 
12
+ ## Your account
13
+
14
+ Above the engines stands your account: signed in during the [install](./install.md), it shows
15
+ your name, your team and your credits, and your team's space is on this computer. Not signed in
16
+ yet, "Sign in" opens your browser for it; an install that is [local only](./local-only.md)
17
+ shows nothing here.
18
+
12
19
  ## Choose your engine
13
20
 
14
21
  | Engine | Runs on | Needs |
15
22
  |---|---|---|
23
+ | engenty credits | Your account's credits, like in the cloud | An account signed in. Shown only then |
16
24
  | Claude Code | Your Claude subscription | The client installed and signed in |
17
25
  | Codex | Your ChatGPT subscription | The client installed and signed in |
18
26
  | Gemini CLI | Your Google account | The client installed and signed in |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: User Guide
3
3
  description: Install engenty wizards, build a wizard, run and share it.
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  ---
6
6
 
7
7
  engenty wizards turns something you do again and again into a wizard: pages that ask what it
@@ -17,30 +17,34 @@ briefing, an invoice, a quote, a damage report.
17
17
  | **Describe it** | Say in plain words what the wizard should do. The assistant builds the flow; you see it as a diagram and change any step. |
18
18
  | **Let AI steps work** | They research the web, write, draw images, render video, read PDFs, scans and mails, build documents and dashboards, and write into other services. Anything that changes an account asks first. |
19
19
  | **Share a link** | Anyone runs the wizard in a browser, on a phone too. Results download as PDF, Word, HTML, Markdown, PNG, MP4, MP3, CSV, Excel or JSON, or go out as a link. |
20
- | **Keep it on your machine** | It thinks with Codex, Claude Code, Gemini CLI or Cursor Agent on your own subscription, with your own keys, or with a local model. Wizards and results stay in a folder on your computer. |
20
+ | **In the cloud, or on your computer** | Sign up and build in the browser; links run on your team's credits. Or install it on your computer: it thinks with Codex, Claude Code, Gemini CLI or Cursor Agent on your own subscription, with your own keys, or with a local model, and your files stay with you. |
21
21
 
22
22
  ## Where to start
23
23
 
24
- 1. [Install](./install.md) it: one command on macOS or Linux.
25
- 2. At the [first start](./first-start.md), choose what it thinks with.
26
- 3. [Build a wizard](./build-a-wizard.md) from a sentence or a template.
27
- 4. [Test and share](./test-and-share.md) it.
24
+ 1. [Create an account](./create-account.md) at engenty.ai, with an invitation code.
25
+ 2. [Build a wizard](./build-a-wizard.md) from a sentence or a template.
26
+ 3. [Test and share](./test-and-share.md) it.
27
+ 4. Also on your computer: [install](./install.md) it there, signed in to the same account, and at the [first start](./first-start.md) choose what it thinks with.
28
28
  5. Use it from your [AI apps](./ai-apps.md): Claude Desktop, Cursor, Codex and others.
29
29
 
30
30
  ## Words used here
31
31
 
32
32
  | Word | Means |
33
33
  |---|---|
34
- | Studio | Where you build wizards: `/studio` of your install |
34
+ | Account | You, signed in at engenty.ai with Google, GitHub or a link by mail |
35
+ | Team | What the sign-up creates: it holds your credits, your spaces and, on the Team plan, your colleagues |
36
+ | Space | What all your wizards know and produce: name, logo, colours, facts, documents, data, results. A team's first one is "Meine Wizards" |
37
+ | Studio | Where you build wizards: engenty.ai/studio, or `/studio` of your install |
35
38
  | Wizard | A flow of steps a person walks through on a link |
36
39
  | Step | One part of the flow: a page, an AI step, a review, the result |
37
40
  | Run | One person going through a wizard once |
38
- | Space | What all your wizards know: name, logo, colours, facts, documents |
39
41
  | Model class | The kind of model a step needs. Which model serves a class is a setting, not part of the wizard |
40
42
 
41
43
  ## Two places it runs
42
44
 
43
- This guide describes the install on your own computer: there you build. engenty.ai is the cloud:
44
- with an account, what you publish on your computer also runs there, behind a link that works
45
- while your computer is off, on the account's credits. The studio at engenty.ai shows those
46
- wizards and their runs and changes nothing ([Test and share](./test-and-share.md#in-the-cloud)).
45
+ Your team, its space and your wizards live in your account. engenty.ai is the cloud: you build
46
+ there in the browser, and links run day and night on the team's credits. Your computer can join:
47
+ [install](./install.md) engenty wizards there, signed in to the same account, and it thinks with
48
+ the AI clients and keys on that machine; what you publish there runs in the cloud as well
49
+ ([Test and share](./test-and-share.md#in-the-cloud)). An install without an account is
50
+ [local only](./local-only.md).
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Install
3
3
  description: One command on macOS or Linux. It brings its own Node.js and asks for no password.
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  ---
6
6
 
7
7
  ## Install
@@ -18,6 +18,7 @@ command into `~/.local/bin` and then walks you through the rest:
18
18
 
19
19
  | Step | What it does |
20
20
  |---|---|
21
+ | Your engenty account | Shows a code and opens the browser for the sign-in at account.engenty.ai (no account yet? the page takes an invitation code). Signed in, your team's space comes down to this computer, and what you publish here runs in the cloud too. "Later" skips it: `wizards account sign-in` does it any time. `--local` leaves the account out altogether: [Local only](./local-only.md) |
21
22
  | Something to think with | Looks for Codex, Claude Code, Gemini CLI and Cursor Agent and offers to install the ones that are missing. It proposes the one whose app (ChatGPT, Claude, Cursor) is on your Mac first, as that subscription is most likely yours already. You can also use an API key, [Ollama](https://ollama.com) or, on a Mac with Apple silicon and macOS 26, Apple Intelligence: the studio's [first page](./first-start.md) offers them |
22
23
  | A browser and ffmpeg | Names the browser for PDF and PNG exports and steps on websites: the first of Chrome, Edge and Chromium it finds (on a Mac also Brave). The app uses that one; [`CHROME_PATH`](./command-line.md#settings) picks another. Says whether there is ffmpeg for MP4 videos of animated widgets; with Homebrew it offers to install it |
23
24
  | Start at login (optional) | engenty wizards starts in the background when you log in, so links and AI clients always reach it. A LaunchAgent on a Mac, a systemd user service on Linux |
@@ -37,6 +38,7 @@ You install once; from then on you use the `wizards` command.
37
38
  | `wizards stop` | Stops it. Your data is kept |
38
39
  | `wizards status` | Whether it runs, and where |
39
40
  | `wizards restart` | Stops it and starts it again |
41
+ | `wizards account` | How the install stands to your account; `sign-in` and `sign-out` |
40
42
  | `wizards` | A menu with all of it |
41
43
 
42
44
  The studio is at
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: Local only
3
+ description: An install without an account. Nothing leaves the computer; links answer on it only. The flag, what it means, and how to connect an account later.
4
+ version: 0.3.4
5
+ ---
6
+
7
+ An install normally signs in to your account during the setup: your team's space comes down to
8
+ the computer, and what you publish runs in the cloud too. An install can also stay alone.
9
+
10
+ ## The flag
11
+
12
+ ```bash
13
+ curl -fsSL https://engenty.ai/install.sh | bash -s -- --local
14
+ ```
15
+
16
+ `--local` skips the account step of the setup and switches the account off for this install.
17
+ On an install that is there already: `wizards setup --local`.
18
+
19
+ ## What it means
20
+
21
+ - No account, nothing leaves this computer. Wizards, the space and results stay in
22
+ `~/.engenty/wizards/data` ([Your data](./data.md)).
23
+ - Links answer on this computer only: `http://localhost:24368/w/…`. For others to open them,
24
+ run it [on a server](./server.md) of your own.
25
+ - It thinks with your AI clients, your own keys, Ollama or Apple Intelligence
26
+ ([First start](./first-start.md)). Without an account, video and voice need a key of your own.
27
+ - The studio shows no account surfaces: no sign-in offer, no credits, no cloud copy. The feature
28
+ switch `account` is off in the install's `.features` file; `wizards features` lists it.
29
+
30
+ ## Connect an account later
31
+
32
+ ```bash
33
+ wizards account sign-in
34
+ ```
35
+
36
+ The command shows a code and opens the browser for the sign-in; afterwards the install is
37
+ connected, and the switch is on again. `wizards account` says how the install stands,
38
+ `wizards account sign-out` disconnects it. Settings → Account in the studio does the same.
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "title": "User Guide",
3
- "description": "Install engenty wizards, build a wizard, run and share it.",
3
+ "description": "Create an account, build a wizard, run and share it, install it on your computer.",
4
4
  "root": true,
5
5
  "icon": "LifeBuoy",
6
6
  "pages": [
7
7
  "index",
8
8
  "---Start---",
9
+ "create-account",
9
10
  "install",
10
11
  "first-start",
11
12
  "---Wizards---",
@@ -24,6 +25,7 @@
24
25
  "---Your install---",
25
26
  "command-line",
26
27
  "data",
28
+ "local-only",
27
29
  "server",
28
30
  "troubleshooting"
29
31
  ]
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Models and account
3
3
  description: Who does what your wizards ask for — an installed AI client, your own API keys, a local model, or credits.
4
- version: 0.3.2
4
+ version: 0.3.4
5
5
  ---
6
6
 
7
7
  Settings → Models decides who does what your wizards ask for. On your computer it is yours; on
@@ -125,7 +125,8 @@ Text & reasoning) picks what builds your wizards in the editor's conversation:
125
125
 
126
126
  ## Account
127
127
 
128
- An account is optional. With it you
128
+ An install normally signs in to your account during the setup ([Install](./install.md)); one
129
+ without an account is [local only](./local-only.md). With an account you
129
130
 
130
131
  - use credits instead of your own keys (the editor's note about missing models says so where
131
132
  text, image or video models are missing),
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: Space
3
3
  description: What your wizards share and produce — who you are, what they look things up in, and the results of their runs.
4
- version: 0.3.2
4
+ version: 0.3.7
5
5
  ---
6
6
 
7
7
  The house in the app bar, after the space's tile, opens your space: what all your wizards share,
@@ -13,7 +13,7 @@ the top leads back. On a phone the parts, a part's sections and the page take tu
13
13
 
14
14
  | Part | Sections | Used for |
15
15
  |---|---|---|
16
- | Info & brand | Basics, Logos, Colours, Assets, Facts | Who you are and how you look |
16
+ | Info & brand | Basics, Facts, Logos, Colours, Brand assets | Who you are and how you look |
17
17
  | Knowledge | All, then each Kategorie, then the sections plugins add | What every AI step looks things up in |
18
18
  | Data | All data, then each wizard | Tables and pages the wizards keep |
19
19
  | Results | All results, then each wizard | The runs that reached their result |
@@ -23,10 +23,10 @@ the top leads back. On a phone the parts, a part's sections and the page take tu
23
23
  | Section | Holds | Used for |
24
24
  |---|---|---|
25
25
  | Basics | Title and "About": what you do, for whom, and the tone you write in | Texts sound like you. People who run a wizard see the title too |
26
+ | Facts | Labelled values: address, VAT id, opening hours | Steps use them as written |
26
27
  | Logos | One or several, each with a description of what it is for | People see the main logo. The description tells a step what a variant is for |
27
28
  | Colours | Named colours, each with a note on its use | The first colour is the accent of documents, dashboards and public pages |
28
- | Assets | Images, graphics, videos, each with a description | AI steps place them in documents and choose by the description |
29
- | Facts | Labelled values: address, VAT id, opening hours | Steps use them as written |
29
+ | Brand assets | Images, graphics, videos, sound, PDFs, fonts, Lottie and 3D files, in tabs | AI steps place pictures in documents and choose by the description |
30
30
 
31
31
  ## Knowledge
32
32
 
@@ -29,7 +29,6 @@ function today(ctx) {
29
29
  day: "numeric",
30
30
  });
31
31
  }
32
- const sectionTitle = (s) => s.description ? `${s.title} – ${s.description}` : s.title;
33
32
  function brandBlock(ctx) {
34
33
  const b = ctx.scope.brand;
35
34
  const parts = [
@@ -688,7 +687,7 @@ function placeableImages(step, ctx) {
688
687
  if (file) {
689
688
  out.push({
690
689
  id: file.id,
691
- label: `${p.tile ? "Pattern to tile" : "Background fill"}: ${p.name || file.name}${section ? ` (${sectionTitle(section)})` : ""}`,
690
+ label: `${p.tile ? "Pattern to tile" : "Background fill"}: ${p.name || file.name}${p.description ? ` – ${p.description}` : ""}${section ? ` (${section.title})` : ""}`,
692
691
  });
693
692
  }
694
693
  }
@@ -725,6 +724,8 @@ async function writeHtml(step, ctx, kind) {
725
724
  `Today is ${today(ctx)}.`,
726
725
  brandBlock(ctx),
727
726
  guide,
727
+ // What plugins hold for the space's look: a UI library, say.
728
+ ...(await spaceContextOf(ctx)).html,
728
729
  images.length
729
730
  ? `Images you can place with <img src="asset://ID">. Use those the brief asks for (a header image, a logo) and size them with CSS:\n${images.map((i) => `- asset://${i.id} — ${i.label}`).join("\n")}`
730
731
  : "",
@@ -1,5 +1,5 @@
1
1
  import { allFields, isAudioValue, isLocationValue, itemsTotals, LOCALES, locationText, wizardLang, } from "@engenty-wizards/shared/definition";
2
- import { gradientCss, textStyleLine, } from "@engenty-wizards/shared/projects";
2
+ import { fontLicenseWords, gradientCss, textStyleLine, } from "@engenty-wizards/shared/projects";
3
3
  import { listAsMarkdown } from "@engenty-wizards/shared/store";
4
4
  const TEMPLATE_RE = /\{\{\s*([^}]+?)\s*\}\}/g;
5
5
  function money(n, currency, locale) {
@@ -36,8 +36,8 @@ export function factLines(facts) {
36
36
  return facts.map((f) => `${f.label}: ${f.value}`).join("\n");
37
37
  }
38
38
  /**
39
- * The colours as a model reads them; a section's after the standard ones, with when to use them.
40
- * A gradients section names its gradients as CSS.
39
+ * The colours as a model reads them; a section's after the standard ones. A gradients section
40
+ * names its gradients as CSS, each with what it is for.
41
41
  */
42
42
  export function colorLine(colors, sections = [], gradients = []) {
43
43
  const line = (list) => list.map((c) => (c.name ? `${c.name} ${c.value}` : c.value)).join(", ");
@@ -45,29 +45,33 @@ export function colorLine(colors, sections = [], gradients = []) {
45
45
  return [
46
46
  line(colors.filter((c) => !known(c))),
47
47
  ...sections.map((s) => {
48
- const head = s.description ? `${s.title} (${s.description})` : s.title;
49
48
  if (s.kind === "gradients") {
50
49
  const own = gradients.filter((g) => g.section === s.id);
51
- return own.length
52
- ? `${head}: ${own.map((g) => `${g.name || "gradient"} ${gradientCss(g)}`).join("; ")}`
53
- : "";
50
+ const one = (g) => `${g.name || "gradient"}${g.description ? ` (${g.description})` : ""} ${gradientCss(g)}`;
51
+ return own.length ? `${s.title}: ${own.map(one).join("; ")}` : "";
54
52
  }
55
53
  const own = colors.filter((c) => c.section === s.id);
56
- return own.length ? `${head}: ${line(own)}` : "";
54
+ return own.length ? `${s.title}: ${line(own)}` : "";
57
55
  }),
58
56
  ]
59
57
  .filter(Boolean)
60
58
  .join(" · ");
61
59
  }
62
- /** The brand's type as a model reads it: its fonts, then its text styles. */
60
+ /**
61
+ * The brand's type as a model reads it: its fonts with their licences, then its text styles. A
62
+ * licence that names its uses is binding.
63
+ */
63
64
  export function typeLines(fonts = [], styles = []) {
64
65
  const families = fonts.map((f) => {
65
66
  const weights = f.weights.length ? `, weights ${f.weights.join("/")}` : "";
66
- return `- ${f.family}${f.role ? ` (${f.role})` : ""}${weights}`;
67
+ return `- ${f.family}${f.role ? ` (${f.role})` : ""}${weights}${fontLicenseWords(f)}`;
67
68
  });
68
69
  const scale = styles.map((s) => `- ${s.name}: ${textStyleLine(s, fonts)}`);
69
70
  return [
70
71
  families.length ? `Fonts:\n${families.join("\n")}` : "",
72
+ fonts.some((f) => f.uses?.length)
73
+ ? "A font's licence is binding: use a font only for what it may be used for, and set anything else in a system font."
74
+ : "",
71
75
  scale.length ? `Text styles:\n${scale.join("\n")}` : "",
72
76
  ]
73
77
  .filter(Boolean)
@@ -137,7 +137,12 @@ export async function prepareFilmFolder(step, ctx) {
137
137
  const { data } = await projectFileContent(f.projectId, f.id);
138
138
  const name = `patterns/${safeName(f.name.replace(/\.[^.]+$/, ""))}.${extFor(f.mime) === "bin" ? (f.name.split(".").pop() ?? "bin") : extFor(f.mime)}`;
139
139
  await put(join(root, "brand"), name, data);
140
- patterns.push({ file: name, name: p.name, tile: Boolean(p.tile) });
140
+ patterns.push({
141
+ file: name,
142
+ name: p.name,
143
+ ...(p.description ? { description: p.description } : {}),
144
+ tile: Boolean(p.tile),
145
+ });
141
146
  }
142
147
  }
143
148
  catch {
@@ -161,7 +166,7 @@ export async function prepareFilmFolder(step, ctx) {
161
166
  }
162
167
  }
163
168
  await put(join(root, "brand"), "brand.json", JSON.stringify({
164
- note: "The space's brand. Colours are named by what they are for; the first is the accent. A logo's or a colour's section says when to use it; colorRules, logoRules and typeRules, where there are any, say how colours, logos and type may be used; text is set in the fonts.",
169
+ note: "The space's brand. Colours are named by what they are for; the first is the accent. A logo's section, a gradient's or a pattern's description says when to use it; colorRules, logoRules and typeRules, where there are any, say how colours, logos and type may be used; text is set in the fonts — a font with `uses` that leave out video is not used in a film: its text gets a system font.",
165
170
  name: b.name ?? "",
166
171
  about: b.about ?? "",
167
172
  colors: (b.colors ?? []).map((c) => {
@@ -172,6 +177,7 @@ export async function prepareFilmFolder(step, ctx) {
172
177
  ? {
173
178
  gradients: b.gradients.map((g) => ({
174
179
  name: g.name,
180
+ ...(g.description ? { description: g.description } : {}),
175
181
  section: b.colorSections?.find((x) => x.id === g.section)?.title,
176
182
  css: gradientCss(g),
177
183
  })),
@@ -182,7 +188,13 @@ export async function prepareFilmFolder(step, ctx) {
182
188
  ...(b.colorRules?.length ? { colorRules: ruleLines(b.colorRules).split("\n") } : {}),
183
189
  ...(b.fonts?.length
184
190
  ? {
185
- fonts: b.fonts.map(({ family, role, weights }) => ({ family, role, weights })),
191
+ fonts: b.fonts.map(({ family, role, weights, license, uses }) => ({
192
+ family,
193
+ role,
194
+ weights,
195
+ ...(license ? { license } : {}),
196
+ ...(uses?.length ? { uses } : {}),
197
+ })),
186
198
  }
187
199
  : {}),
188
200
  ...(b.textStyles?.length
@@ -145,6 +145,18 @@ export async function tenantInfo(id, fresh = false) {
145
145
  export function forgetTenant(id) {
146
146
  tenants.delete(id);
147
147
  }
148
+ /** Renames the team at the Manage-App; what it answers is the tenant as it stands now. */
149
+ export async function renameTenant(id, name) {
150
+ const value = await call("PATCH", `/v1/tenants/${encodeURIComponent(id)}`, {
151
+ name,
152
+ });
153
+ tenants.set(id, { at: Date.now(), value });
154
+ return value;
155
+ }
156
+ /** The Manage-App mails the install command and the first steps to one of the team's people. */
157
+ export function installMail(email, lang) {
158
+ return call("POST", "/v1/install-mail", { email, lang });
159
+ }
148
160
  export function verifyKey(key) {
149
161
  return call("POST", "/v1/keys/verify", { key });
150
162
  }