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.
- package/README.md +28 -14
- package/apps/runtime/dist/agents/studio-assistant.js +67 -20
- package/apps/runtime/dist/auth/account.js +36 -4
- package/apps/runtime/dist/auth/device.js +101 -0
- package/apps/runtime/dist/auth/index.js +4 -4
- package/apps/runtime/dist/cli/account.js +289 -0
- package/apps/runtime/dist/cli/install-env.js +33 -0
- package/apps/runtime/dist/cli/main.js +17 -3
- package/apps/runtime/dist/cli/menu.js +19 -5
- package/apps/runtime/dist/cli/setup.js +9 -16
- package/apps/runtime/dist/cli/status.js +4 -1
- package/apps/runtime/dist/cli/ui.js +14 -0
- package/apps/runtime/dist/docs/dev/plugins/reference.md +7 -4
- package/apps/runtime/dist/docs/dev/plugins/server.md +3 -1
- package/apps/runtime/dist/docs/dev/plugins/space.md +19 -1
- package/apps/runtime/dist/docs/dev/plugins/studio.md +43 -6
- package/apps/runtime/dist/docs/dev/plugins/styling.md +8 -1
- package/apps/runtime/dist/docs/user/command-line.md +3 -2
- package/apps/runtime/dist/docs/user/create-account.md +47 -0
- package/apps/runtime/dist/docs/user/first-start.md +9 -1
- package/apps/runtime/dist/docs/user/index.md +16 -12
- package/apps/runtime/dist/docs/user/install.md +3 -1
- package/apps/runtime/dist/docs/user/local-only.md +38 -0
- package/apps/runtime/dist/docs/user/meta.json +3 -1
- package/apps/runtime/dist/docs/user/models.md +3 -2
- package/apps/runtime/dist/docs/user/space.md +4 -4
- package/apps/runtime/dist/engine/steps.js +3 -2
- package/apps/runtime/dist/engine/template.js +14 -10
- package/apps/runtime/dist/film/project.js +15 -3
- package/apps/runtime/dist/manage.js +12 -0
- package/apps/runtime/dist/plugins/loader.js +38 -2
- package/apps/runtime/dist/plugins/pro.js +16 -16
- package/apps/runtime/dist/routes/studio.js +69 -3
- package/apps/runtime/dist/services/brand.js +61 -1
- package/apps/runtime/dist/services/cloud.js +10 -10
- package/apps/runtime/dist/services/onboarding.js +152 -0
- package/apps/runtime/dist/services/projects.js +19 -10
- package/apps/runtime/dist/tools/plugin.js +11 -3
- package/apps/web/dist/assets/AboutDialog-CXEpsI6L.js +1 -0
- package/apps/web/dist/assets/{ChangelogDialog-DsSEkayM.js → ChangelogDialog-Cc2APUGI.js} +1 -1
- package/apps/web/dist/assets/ChatView-B2r4dW_m.js +10 -0
- package/apps/web/dist/assets/EditorPage-CNAYlSms.js +3 -0
- package/apps/web/dist/assets/{FlowPreview-C_x5Kc2j.js → FlowPreview-DzU1nGDb.js} +1 -1
- package/apps/web/dist/assets/{Harness-CvvtSTZC.js → Harness-ALQ9Csm6.js} +2 -2
- package/apps/web/dist/assets/NewWizardChannels-DMPqHkCF.js +1 -0
- package/apps/web/dist/assets/NewWizardPage-pi053e8N.js +7 -0
- package/apps/web/dist/assets/OnboardingPage-TYNX6Umd.js +1 -0
- package/apps/web/dist/assets/ProjectPage-CvEkx_Ux.js +1 -0
- package/apps/web/dist/assets/PublicRunner-BrivKNHo.js +1 -0
- package/apps/web/dist/assets/{ReadOnly-C1UcqOlS.js → ReadOnly-DQPHmvS0.js} +1 -1
- package/apps/web/dist/assets/RunDrawer-3osugizk.js +4 -0
- package/apps/web/dist/assets/{RunnerView-ii-PP5c-.js → RunnerView-Ci4_WzVv.js} +1 -1
- package/apps/web/dist/assets/SettingsPage-DKntf7-9.js +1 -0
- package/apps/web/dist/assets/SetupPage-DZQxEQyk.js +1 -0
- package/apps/web/dist/assets/SharePage-B9l4KthU.js +1 -0
- package/apps/web/dist/assets/changelog-CxdXZo3V.js +1 -0
- package/apps/web/dist/assets/{circle-alert-D-Q6DK7b.js → circle-alert-DCBV7n5k.js} +1 -1
- package/apps/web/dist/assets/{esm-CTna4iL0.js → esm-CuqXcPS3.js} +1 -1
- package/apps/web/dist/assets/index-CmxVazOf.css +1 -0
- package/apps/web/dist/assets/index-j09nLtEs.js +14 -0
- package/apps/web/dist/assets/{lock-DwGN_KOC.js → lock-DlzTfwxP.js} +1 -1
- package/apps/web/dist/assets/{phone-XIVIe17d.js → phone-BFD815nc.js} +1 -1
- package/apps/web/dist/assets/{settings-menu-JuSRq6NP.js → settings-menu-C7VsRpe9.js} +1 -1
- package/apps/web/dist/assets/ui-DTuixH4y.js +134 -0
- package/apps/web/dist/assets/{upload-CDxTpAqx.js → upload-BEf5-d6X.js} +1 -1
- package/apps/web/dist/index.html +4 -5
- package/apps/web/dist/install.sh +17 -7
- package/apps/web/dist/mcp/flow.html +2 -2
- package/node_modules/@engenty-wizards/plugin-sdk/dist/index.d.ts +36 -2
- package/node_modules/@engenty-wizards/plugin-sdk/dist/studio.d.ts +44 -1
- package/node_modules/@engenty-wizards/shared/dist/feature-flags.d.ts +18 -0
- package/node_modules/@engenty-wizards/shared/dist/feature-flags.js +18 -0
- package/node_modules/@engenty-wizards/shared/dist/projects.d.ts +22 -6
- package/node_modules/@engenty-wizards/shared/dist/projects.js +20 -0
- package/package.json +1 -1
- package/apps/web/dist/assets/AboutDialog-ClV4gNiW.js +0 -1
- package/apps/web/dist/assets/ChatView-BdYCnDLk.js +0 -10
- package/apps/web/dist/assets/EditorPage-7PZzkNBT.js +0 -3
- package/apps/web/dist/assets/NewWizardChannels-g1qCd_tQ.js +0 -1
- package/apps/web/dist/assets/NewWizardPage-B3hswj5r.js +0 -7
- package/apps/web/dist/assets/ProjectPage-CFDncRxT.js +0 -1
- package/apps/web/dist/assets/PublicRunner-C9N5r-sT.js +0 -1
- package/apps/web/dist/assets/RunDrawer-B8YzFvgz.js +0 -4
- package/apps/web/dist/assets/SettingsPage-ClEP5Q0t.js +0 -1
- package/apps/web/dist/assets/SetupPage-CDFzo6LT.js +0 -1
- package/apps/web/dist/assets/SharePage-BV2S0g84.js +0 -1
- package/apps/web/dist/assets/changelog-wZI-UaUi.js +0 -1
- package/apps/web/dist/assets/index-DUjJx-uk.css +0 -1
- package/apps/web/dist/assets/index-DnQgOKOQ.js +0 -15
- package/apps/web/dist/assets/logo-C4V2_3Ar.js +0 -1
- 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.
|
|
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
|
+
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,
|
|
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`, `
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|

|
|
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.
|
|
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
|
-
| **
|
|
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. [
|
|
25
|
-
2.
|
|
26
|
-
3. [
|
|
27
|
-
4. [
|
|
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
|
-
|
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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.
|
|
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": "
|
|
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.
|
|
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
|
|
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.
|
|
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,
|
|
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
|
-
|
|
|
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 ? ` (${
|
|
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
|
|
40
|
-
*
|
|
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
|
-
|
|
52
|
-
|
|
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 ? `${
|
|
54
|
+
return own.length ? `${s.title}: ${line(own)}` : "";
|
|
57
55
|
}),
|
|
58
56
|
]
|
|
59
57
|
.filter(Boolean)
|
|
60
58
|
.join(" · ");
|
|
61
59
|
}
|
|
62
|
-
/**
|
|
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({
|
|
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
|
|
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 }) => ({
|
|
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
|
}
|