wizards 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +28 -14
  2. package/apps/runtime/dist/auth/account.js +36 -4
  3. package/apps/runtime/dist/auth/device.js +101 -0
  4. package/apps/runtime/dist/auth/index.js +4 -4
  5. package/apps/runtime/dist/cli/account.js +289 -0
  6. package/apps/runtime/dist/cli/install-env.js +33 -0
  7. package/apps/runtime/dist/cli/main.js +17 -3
  8. package/apps/runtime/dist/cli/menu.js +19 -5
  9. package/apps/runtime/dist/cli/setup.js +9 -16
  10. package/apps/runtime/dist/cli/status.js +4 -1
  11. package/apps/runtime/dist/cli/ui.js +14 -0
  12. package/apps/runtime/dist/docs/user/command-line.md +3 -2
  13. package/apps/runtime/dist/docs/user/create-account.md +47 -0
  14. package/apps/runtime/dist/docs/user/first-start.md +9 -1
  15. package/apps/runtime/dist/docs/user/index.md +16 -12
  16. package/apps/runtime/dist/docs/user/install.md +3 -1
  17. package/apps/runtime/dist/docs/user/local-only.md +38 -0
  18. package/apps/runtime/dist/docs/user/meta.json +3 -1
  19. package/apps/runtime/dist/docs/user/models.md +3 -2
  20. package/apps/runtime/dist/manage.js +12 -0
  21. package/apps/runtime/dist/plugins/pro.js +16 -16
  22. package/apps/runtime/dist/routes/studio.js +41 -2
  23. package/apps/runtime/dist/services/cloud.js +10 -10
  24. package/apps/runtime/dist/services/onboarding.js +152 -0
  25. package/apps/web/dist/assets/{AboutDialog-ClV4gNiW.js → AboutDialog-CPQiN7H9.js} +1 -1
  26. package/apps/web/dist/assets/{ChangelogDialog-DsSEkayM.js → ChangelogDialog-DynvQuuR.js} +1 -1
  27. package/apps/web/dist/assets/{ChatView-BdYCnDLk.js → ChatView-CKo_9IZD.js} +1 -1
  28. package/apps/web/dist/assets/{EditorPage-7PZzkNBT.js → EditorPage-CDIJXC4T.js} +1 -1
  29. package/apps/web/dist/assets/{FlowPreview-C_x5Kc2j.js → FlowPreview-BZLnG7GV.js} +1 -1
  30. package/apps/web/dist/assets/{Harness-CvvtSTZC.js → Harness-CNh3nbB_.js} +1 -1
  31. package/apps/web/dist/assets/{NewWizardChannels-g1qCd_tQ.js → NewWizardChannels-C1Ss9UMY.js} +1 -1
  32. package/apps/web/dist/assets/{NewWizardPage-B3hswj5r.js → NewWizardPage-2qLAbvDL.js} +1 -1
  33. package/apps/web/dist/assets/OnboardingPage-C1FJwEsT.js +1 -0
  34. package/apps/web/dist/assets/{ProjectPage-CFDncRxT.js → ProjectPage-CGuLUuOs.js} +1 -1
  35. package/apps/web/dist/assets/{PublicRunner-C9N5r-sT.js → PublicRunner-BKw1lOW4.js} +1 -1
  36. package/apps/web/dist/assets/{ReadOnly-C1UcqOlS.js → ReadOnly-DTjv2Jzm.js} +1 -1
  37. package/apps/web/dist/assets/{RunDrawer-B8YzFvgz.js → RunDrawer-D1I5xqVf.js} +1 -1
  38. package/apps/web/dist/assets/{RunnerView-ii-PP5c-.js → RunnerView-BPPmlv9z.js} +1 -1
  39. package/apps/web/dist/assets/{SettingsPage-ClEP5Q0t.js → SettingsPage-zbomQfGy.js} +1 -1
  40. package/apps/web/dist/assets/SetupPage-D3F7M6Pz.js +1 -0
  41. package/apps/web/dist/assets/{SharePage-BV2S0g84.js → SharePage-BY49IJgT.js} +1 -1
  42. package/apps/web/dist/assets/changelog-DYZC2E6q.js +1 -0
  43. package/apps/web/dist/assets/{circle-alert-D-Q6DK7b.js → circle-alert-CVOH4wAv.js} +1 -1
  44. package/apps/web/dist/assets/{esm-CTna4iL0.js → esm-BfXdeWaI.js} +1 -1
  45. package/apps/web/dist/assets/index-B9xVkr2X.css +1 -0
  46. package/apps/web/dist/assets/index-BH0PYgov.js +15 -0
  47. package/apps/web/dist/assets/{lock-DwGN_KOC.js → lock-DHBh62LA.js} +1 -1
  48. package/apps/web/dist/assets/{phone-XIVIe17d.js → phone-Bt1cyWpY.js} +1 -1
  49. package/apps/web/dist/assets/{settings-menu-JuSRq6NP.js → settings-menu-ace1vI3i.js} +1 -1
  50. package/apps/web/dist/assets/{ui-DrjXmHdO.js → ui-D2SqIZeQ.js} +1 -1
  51. package/apps/web/dist/assets/{upload-CDxTpAqx.js → upload-CCEq88l4.js} +1 -1
  52. package/apps/web/dist/index.html +3 -3
  53. package/apps/web/dist/install.sh +17 -7
  54. package/apps/web/dist/mcp/flow.html +2 -2
  55. package/package.json +1 -1
  56. package/apps/web/dist/assets/SetupPage-CDFzo6LT.js +0 -1
  57. package/apps/web/dist/assets/changelog-wZI-UaUi.js +0 -1
  58. package/apps/web/dist/assets/index-DUjJx-uk.css +0 -1
  59. package/apps/web/dist/assets/index-DnQgOKOQ.js +0 -15
@@ -1,6 +1,9 @@
1
+ import "./install-env.js";
2
+ import { accountCommand } from "./account.js";
1
3
  import { apps, connectCommand } from "./connect.js";
2
4
  import { featuresCommand } from "./features.js";
3
5
  import { command, layout, packageVersion, readInstallNote } from "./home.js";
6
+ import { startedIn } from "./install-env.js";
4
7
  import { CLIENTS, nodeIsCurrent } from "./machine.js";
5
8
  import { mcp } from "./mcp.js";
6
9
  import { menu } from "./menu.js";
@@ -16,7 +19,9 @@ const HELP = `engenty wizards ${packageVersion()}
16
19
  (needs a terminal)
17
20
  ${command()} start start it and open the studio; it runs in this terminal until Ctrl-C
18
21
  ${command()} studio open the studio; when it does not run, it starts as a service first
19
- ${command()} setup guided setup: an AI client to think with, ffmpeg, start at login
22
+ ${command()} setup guided setup: your engenty account, an AI client to think with, ffmpeg,
23
+ start at login
24
+ ${command()} account your engenty account: status, sign-in, sign-out
20
25
  ${command()} open let this browser into the running studio (--print: only show the link)
21
26
  ${command()} status what is installed and what runs
22
27
  ${command()} doctor status, and what is wrong
@@ -37,6 +42,7 @@ const HELP = `engenty wizards ${packageVersion()}
37
42
  checked on import
38
43
 
39
44
  --yes, -y ask nothing and install nothing optional
45
+ --local setup without an account: nothing leaves this computer
40
46
  --client <name> install this AI client without asking: ${CLIENTS.map((c) => c.id).join(", ")}
41
47
  --no-open start without opening the browser
42
48
  --service, -s start as a service, detached from this terminal; \`${command()} stop\` stops it
@@ -52,6 +58,7 @@ function parse(argv) {
52
58
  paths: [],
53
59
  json: false,
54
60
  yes: false,
61
+ local: false,
55
62
  open: true,
56
63
  service: false,
57
64
  print: false,
@@ -62,6 +69,9 @@ function parse(argv) {
62
69
  if (arg === "--yes" || arg === "-y") {
63
70
  args.yes = true;
64
71
  }
72
+ else if (arg === "--local") {
73
+ args.local = true;
74
+ }
65
75
  else if (arg === "--no-open") {
66
76
  args.open = false;
67
77
  }
@@ -90,7 +100,7 @@ function parse(argv) {
90
100
  else if (arg.startsWith("-")) {
91
101
  return `Unknown option ${arg}.`;
92
102
  }
93
- else if ((args.command === "autostart" || args.command === "logs") && !args.value) {
103
+ else if (["autostart", "logs", "account"].includes(args.command) && !args.value) {
94
104
  args.value = arg;
95
105
  }
96
106
  else if (["connect", "disconnect", "features"].includes(args.command)) {
@@ -115,7 +125,7 @@ async function main(argv) {
115
125
  return 2;
116
126
  }
117
127
  const paths = layout();
118
- const setupOptions = { yes: args.yes, clients: args.clients };
128
+ const setupOptions = { yes: args.yes, clients: args.clients, local: args.local };
119
129
  if (!args.command) {
120
130
  // Without a command: the menu, which needs a terminal. Starting is \`start\`.
121
131
  if (args.service || !args.open || args.print) {
@@ -168,6 +178,8 @@ async function main(argv) {
168
178
  return update(paths);
169
179
  case "autostart":
170
180
  return autostart(paths, args.value);
181
+ case "account":
182
+ return accountCommand(paths, args.value, { yes: args.yes });
171
183
  case "connect":
172
184
  case "disconnect":
173
185
  return connectCommand(paths, args.apps, args.command === "disconnect");
@@ -176,6 +188,8 @@ async function main(argv) {
176
188
  case "features":
177
189
  return featuresCommand(args.apps);
178
190
  case "validate":
191
+ // The paths are the person's, from where they typed the command (install-env.ts).
192
+ process.chdir(startedIn);
179
193
  return validateCommand(args.paths, args.json);
180
194
  default:
181
195
  console.error(`Unknown command ${args.command}.\n\n${HELP}`);
@@ -1,5 +1,6 @@
1
1
  import * as p from "@clack/prompts";
2
2
  import { updateStatus } from "../update.js";
3
+ import { accountMenu, accountState, describeAccount } from "./account.js";
3
4
  import { autostartState, setAutostart } from "./autostart.js";
4
5
  import { connectCommand } from "./connect.js";
5
6
  import { command, packageVersion, readInstallNote } from "./home.js";
@@ -10,14 +11,15 @@ import { badge, cyan, dim, no, ok } from "./ui.js";
10
11
  import { update } from "./update.js";
11
12
  async function look(paths) {
12
13
  const { dataDir } = settings(paths);
13
- const [running, atLogin, release] = await Promise.all([
14
+ const [running, atLogin, release, account] = await Promise.all([
14
15
  runningRuntime(dataDir),
15
16
  autostartState(paths),
16
17
  updateStatus().catch(() => null),
18
+ accountState(),
17
19
  ]);
18
- return { running, atLogin, release };
20
+ return { running, atLogin, release, account };
19
21
  }
20
- function report({ running, atLogin, release }) {
22
+ function report({ running, atLogin, release, account }) {
21
23
  const lines = [
22
24
  running
23
25
  ? `${ok} running ${cyan(running.url)} ${dim(`pid ${running.pid}, since ${new Date(running.startedAt).toLocaleString()}`)}`
@@ -26,12 +28,15 @@ function report({ running, atLogin, release }) {
26
28
  if (!("unavailable" in atLogin)) {
27
29
  lines.push(atLogin.on ? `${ok} starts at login` : `${no} does not start at login`);
28
30
  }
31
+ lines.push(account.kind === "linked"
32
+ ? `${ok} signed in as ${describeAccount(account)}`
33
+ : `${no} ${describeAccount(account)}`);
29
34
  if (release?.newer) {
30
35
  lines.push(`${cyan("↑")} ${release.latest} is out ${dim(`(you have ${release.current})`)}`);
31
36
  }
32
37
  return lines.join("\n");
33
38
  }
34
- function choices({ running, atLogin, release }) {
39
+ function choices({ running, atLogin, release, account }) {
35
40
  const options = running
36
41
  ? [
37
42
  { value: "open", label: "Open the studio", hint: "in your browser" },
@@ -58,7 +63,13 @@ function choices({ running, atLogin, release }) {
58
63
  hint: atLogin.on ? "starts at login" : "does not start at login",
59
64
  });
60
65
  }
61
- options.push({ value: "connect", label: "Connect AI apps", hint: "your wizards in Claude, Cursor, Codex …" }, { value: "status", label: "Status", hint: "what is installed, and what is wrong" }, { value: "setup", label: "Setup", hint: "AI client, ffmpeg, start at login" }, { value: "help", label: "Help", hint: "every command" }, { value: "quit", label: "Quit", hint: running ? "it keeps running" : undefined });
66
+ options.push({ value: "connect", label: "Connect AI apps", hint: "your wizards in Claude, Cursor, Codex …" }, {
67
+ value: "account",
68
+ label: "Account",
69
+ hint: account.kind === "linked"
70
+ ? `signed in as ${describeAccount(account)}`
71
+ : describeAccount(account),
72
+ }, { value: "status", label: "Status", hint: "what is installed, and what is wrong" }, { value: "setup", label: "Setup", hint: "account, AI client, ffmpeg, start at login" }, { value: "help", label: "Help", hint: "every command" }, { value: "quit", label: "Quit", hint: running ? "it keeps running" : undefined });
62
73
  return options;
63
74
  }
64
75
  /** How the service runs: whether it starts at login. Esc goes back to the menu. */
@@ -153,6 +164,9 @@ export async function menu(paths, setupOptions, help) {
153
164
  case "connect":
154
165
  await connectCommand(paths, [], false);
155
166
  break;
167
+ case "account":
168
+ await accountMenu(paths);
169
+ break;
156
170
  case "status":
157
171
  await status(paths, true);
158
172
  break;
@@ -2,6 +2,7 @@ import { appendFileSync, existsSync, readFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { delimiter, join } from "node:path";
4
4
  import * as p from "@clack/prompts";
5
+ import { accountStep } from "./account.js";
5
6
  import { autostartState, setAutostart } from "./autostart.js";
6
7
  import { installClient, installCommand } from "./clients.js";
7
8
  import { appStates, connectApps } from "./connect.js";
@@ -9,21 +10,9 @@ import { runLogged } from "./exec.js";
9
10
  import { command, installedByScript, isCheckout, packageVersion, readInstallNote, writeInstallNote, } from "./home.js";
10
11
  import { CLIENTS, detectClients, findChrome, findFfmpeg, findOnPath, suggestedClient, vendorApp, } from "./machine.js";
11
12
  import { runningRuntime, settings } from "./start.js";
12
- import { badge, cyan, dim, tilde } from "./ui.js";
13
+ import { badge, busy, cyan, dim, tilde } from "./ui.js";
13
14
  /** The studio as an app of its own: Chrome (or Edge) installs it from the page. */
14
15
  const CHROME_APP = "Tip: in Chrome or Edge the studio installs as an app, in a window of its own with its own icon. The studio offers it at the top; or use the install icon in the address bar.";
15
- /** A spinner on a terminal; where nobody watches, only what came of it. */
16
- function busy(message) {
17
- if (!process.stdout.isTTY) {
18
- return { stop: (text) => p.log.step(text), fail: (text) => p.log.warn(text) };
19
- }
20
- const spinner = p.spinner();
21
- spinner.start(message);
22
- return {
23
- stop: (text) => spinner.stop(text),
24
- fail: (text) => spinner.error(text),
25
- };
26
- }
27
16
  function cancelled(value) {
28
17
  if (p.isCancel(value)) {
29
18
  p.cancel(`Setup stopped. Run it again with \`${command()} setup\`.`);
@@ -298,9 +287,10 @@ async function howToUse(paths) {
298
287
  ].join("\n"));
299
288
  }
300
289
  /**
301
- * The guided setup: what this machine has, what is missing, and what to install — an AI client
302
- * to think with, ffmpeg, starting at login. It starts nothing; it ends with what runs and how to
303
- * start, stop and check it. Returns false when it was stopped.
290
+ * The guided setup: the account this computer joins, then what this machine has, what is
291
+ * missing, and what to install — an AI client to think with, ffmpeg, starting at login. It
292
+ * starts nothing; it ends with what runs and how to start, stop and check it. Returns false
293
+ * when it was stopped.
304
294
  */
305
295
  export async function setup(paths, options) {
306
296
  const interactive = !options.yes && Boolean(process.stdin.isTTY && process.stdout.isTTY);
@@ -310,6 +300,9 @@ export async function setup(paths, options) {
310
300
  `Install ${tilde(paths.home)}${installedByScript() ? "" : dim(` (data; the code runs from ${isCheckout() ? "this checkout" : "npm"})`)}`,
311
301
  `Node ${process.version} ${dim(tilde(process.execPath))}`,
312
302
  ].join("\n"));
303
+ if ((await accountStep(paths, options, interactive)) === "cancelled") {
304
+ return false;
305
+ }
313
306
  if ((await clientsStep(paths, options, interactive)) === "cancelled") {
314
307
  return false;
315
308
  }
@@ -1,5 +1,6 @@
1
1
  import { accessSync, constants, existsSync, mkdirSync } from "node:fs";
2
2
  import { join } from "node:path";
3
+ import { accountState, describeAccount } from "./account.js";
3
4
  import { autostartState, setAutostart } from "./autostart.js";
4
5
  import { installedByScript, isCheckout, packageRoot, packageVersion } from "./home.js";
5
6
  import { detectClients, findChrome, findFfmpeg, nodeIsCurrent } from "./machine.js";
@@ -11,11 +12,12 @@ import { bad, badge, cyan, dim, no, ok, tilde } from "./ui.js";
11
12
  */
12
13
  export async function status(paths, checks) {
13
14
  const { dataDir } = settings(paths);
14
- const [running, clients, ffmpeg, atLogin] = await Promise.all([
15
+ const [running, clients, ffmpeg, atLogin, account] = await Promise.all([
15
16
  runningRuntime(dataDir),
16
17
  detectClients(paths),
17
18
  findFfmpeg(),
18
19
  autostartState(paths),
20
+ accountState(),
19
21
  ]);
20
22
  const chrome = findChrome();
21
23
  const row = (label, value) => console.log(` ${label.padEnd(9)} ${value}`);
@@ -31,6 +33,7 @@ export async function status(paths, checks) {
31
33
  if (!("unavailable" in atLogin)) {
32
34
  row("At login", atLogin.on ? `${ok} starts ${dim(`(${atLogin.how})`)}` : `${no} does not start`);
33
35
  }
36
+ row("Account", `${account.kind === "linked" ? ok : no} ${describeAccount(account)}`);
34
37
  for (const { client, path, version } of clients) {
35
38
  row(client.name.split(" ")[0], path ? `${ok} ${version} ${dim(tilde(path))}` : `${no} not installed`);
36
39
  }
@@ -1,12 +1,26 @@
1
1
  import { homedir } from "node:os";
2
2
  import { styleText } from "node:util";
3
+ import * as p from "@clack/prompts";
3
4
  const colours = Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;
4
5
  /** The name on engenty's orange. */
5
6
  export const badge = (text) => colours ? `\x1b[48;2;224;83;27m\x1b[97m\x1b[1m ${text} \x1b[0m` : text;
6
7
  export const dim = (text) => styleText("dim", text);
8
+ export const bold = (text) => styleText("bold", text);
7
9
  export const cyan = (text) => styleText("cyan", text);
8
10
  export const ok = styleText("green", "✓");
9
11
  export const no = styleText("yellow", "–");
10
12
  export const bad = styleText("red", "✗");
11
13
  /** A path as the person would write it. */
12
14
  export const tilde = (path) => path.startsWith(homedir()) ? `~${path.slice(homedir().length)}` : path;
15
+ /** A spinner on a terminal; where nobody watches, only what came of it. */
16
+ export function busy(message) {
17
+ if (!process.stdout.isTTY) {
18
+ return { stop: (text) => p.log.step(text), fail: (text) => p.log.warn(text) };
19
+ }
20
+ const spinner = p.spinner();
21
+ spinner.start(message);
22
+ return {
23
+ stop: (text) => spinner.stop(text),
24
+ fail: (text) => spinner.error(text),
25
+ };
26
+ }
@@ -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),
@@ -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
  }