acrylblends 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/index.d.ts +47 -2
- package/dist/index.js +2017 -32
- package/dist/index.js.map +1 -1
- package/docs/framework/agents/index.md +1 -1
- package/docs/framework/getting-started/desktop.md +23 -4
- package/docs/framework/guides/create-acrylblends.md +5 -3
- package/docs/framework/workshop/README.md +139 -153
- package/docs/framework/workshop/facilitator.md +69 -101
- package/legacy/README.md +9 -0
- package/legacy/agent/157ce3db1112/src/app.ts +98 -0
- package/legacy/agent/157ce3db1112/src/routes.ts +63 -0
- package/legacy/agent/24c681a00fca/src/app.ts +160 -0
- package/legacy/agent/24c681a00fca/src/routes.ts +83 -0
- package/legacy/agent/2e790da977b2/src/app.ts +98 -0
- package/legacy/agent/2e790da977b2/src/routes.ts +63 -0
- package/legacy/agent/6307045545dc/src/app.ts +168 -0
- package/legacy/agent/6307045545dc/src/routes.ts +83 -0
- package/legacy/agent/6a5fb9c15c53/src/app.ts +158 -0
- package/legacy/agent/6a5fb9c15c53/src/routes.ts +83 -0
- package/legacy/agent/71fb54a5a942/src/app.ts +111 -0
- package/legacy/agent/71fb54a5a942/src/routes.ts +63 -0
- package/legacy/agent/74ece148269c/src/app.ts +168 -0
- package/legacy/agent/74ece148269c/src/routes.ts +93 -0
- package/legacy/agent/855359304707/src/app.ts +168 -0
- package/legacy/agent/855359304707/src/routes.ts +126 -0
- package/legacy/agent/b5ef3c786ae4/src/app.ts +127 -0
- package/legacy/agent/b5ef3c786ae4/src/routes.ts +76 -0
- package/legacy/agent/c2f30958043b/src/app.ts +98 -0
- package/legacy/agent/c2f30958043b/src/routes.ts +53 -0
- package/legacy/blank/5a91c558af22/src/routes.ts +18 -0
- package/legacy/blank/9c650cf52bf3/src/routes.ts +14 -0
- package/legacy/blank/aea589283445/src/routes.ts +16 -0
- package/legacy/blank/b2cbb759c889/src/routes.ts +16 -0
- package/legacy/blank/d6d371c9a65e/src/routes.ts +18 -0
- package/legacy/chat/7076cc821e2c/src/app.ts +72 -0
- package/legacy/chat/7076cc821e2c/src/routes.ts +13 -0
- package/legacy/chat/7dbe6d5170df/src/app.ts +107 -0
- package/legacy/chat/7dbe6d5170df/src/routes.ts +19 -0
- package/legacy/chat/a9a9ab44c58e/src/app.ts +107 -0
- package/legacy/chat/a9a9ab44c58e/src/routes.ts +15 -0
- package/legacy/chat/f20ad9a51b06/src/app.ts +106 -0
- package/legacy/chat/f20ad9a51b06/src/routes.ts +15 -0
- package/legacy/layouts.json +524 -0
- package/legacy/nodejs/1d477f37aaf4/src/app.ts +92 -0
- package/legacy/nodejs/1d477f37aaf4/src/routes.ts +40 -0
- package/legacy/nodejs/b1bd9462496c/src/app.ts +61 -0
- package/legacy/nodejs/b1bd9462496c/src/routes.ts +37 -0
- package/legacy/nodejs/d5bab75076ef/src/app.ts +95 -0
- package/legacy/nodejs/d5bab75076ef/src/routes.ts +40 -0
- package/legacy/notes/4edc36949c15/src/app.ts +107 -0
- package/legacy/notes/4edc36949c15/src/routes.ts +14 -0
- package/legacy/notes/6cab2d09747c/src/app.ts +72 -0
- package/legacy/notes/6cab2d09747c/src/routes.ts +12 -0
- package/legacy/notes/7ca2dfed623a/src/app.ts +106 -0
- package/legacy/notes/7ca2dfed623a/src/routes.ts +14 -0
- package/legacy/todo/02e613b3625c/src/app.ts +71 -0
- package/legacy/todo/02e613b3625c/src/todo.ts +123 -0
- package/legacy/todo/45694a8d9e15/src/app.ts +71 -0
- package/legacy/todo/45694a8d9e15/src/todo.ts +96 -0
- package/legacy/todo/5923d3a6099f/src/app.ts +71 -0
- package/legacy/todo/5923d3a6099f/src/todo.ts +125 -0
- package/legacy/todo/849a18d66dc1/src/app.ts +91 -0
- package/legacy/todo/849a18d66dc1/src/todo.ts +125 -0
- package/legacy/todo/8e64211312f3/src/app.ts +71 -0
- package/legacy/todo/8e64211312f3/src/todo.ts +125 -0
- package/legacy/todo/b79078a87565/src/app.ts +71 -0
- package/legacy/todo/b79078a87565/src/todo.ts +125 -0
- package/lib/{audit-BFpULBCj.d.ts → audit-Bok_UNCn.d.ts} +26 -3
- package/lib/{client-modules-drj4mjhj.js → client-modules-Bkdr83jO.js} +1 -1
- package/lib/cordis/door.d.ts +87 -9
- package/lib/cordis/door.js +324 -60
- package/lib/cordis/inspect.js +1 -1
- package/lib/cordis/node-server.d.ts +101 -3
- package/lib/cordis/node-server.js +3 -3
- package/lib/cordis/router-http.d.ts +7 -1
- package/lib/cordis/router-http.js +44 -3
- package/lib/cordis/router.d.ts +1 -1
- package/lib/cordis/router.js +1 -1
- package/lib/cordis/state.js +1 -1
- package/lib/door/host.d.ts +2 -2
- package/lib/door/host.js +1 -1
- package/lib/door/page.d.ts +10 -1
- package/lib/door/page.js +46 -7
- package/lib/door/protocol.d.ts +1 -1
- package/lib/drivers.d.ts +10 -1
- package/lib/{index-DMOtA-NJ.d.ts → index-DGq7H0lb.d.ts} +11 -1
- package/lib/node-server.d.ts +7 -1
- package/lib/node-server.js +2 -2
- package/lib/{protocol-a2aqrp2X.d.ts → protocol-BeIYCgTo.d.ts} +4 -0
- package/lib/{snapshot-text-BwM6T2nG.js → snapshot-text-CXTnjxGx.js} +87 -7
- package/lib/src-CtkIX_Gg.js +427 -0
- package/lib/{src-BTBm4OPD.js → src-iBJ2ysV9.js} +77 -14
- package/lib/{test-websocket-BLeEvybj.js → test-websocket-CQOSvBth.js} +17 -7
- package/lib/{test-websocket-DyeS50Tr.d.ts → test-websocket-GUTAkFQT.d.ts} +3 -1
- package/package.json +2 -1
- package/plugins/acryl-door/plugin.json +3 -0
- package/plugins/acryl-door/src/cli/acryl.ts +63 -6
- package/plugins/acryl-door/src/host/channel.ts +86 -9
- package/plugins/acryl-door/src/host/chat-tools.ts +8 -6
- package/plugins/acryl-door/src/host/door-file.ts +7 -2
- package/plugins/acryl-door/src/host/door.ts +128 -24
- package/plugins/acryl-door/src/host/operator-routes.ts +21 -1
- package/plugins/acryl-door/src/host/page-routes.ts +3 -1
- package/plugins/acryl-door/src/host/page-socket.ts +18 -8
- package/plugins/acryl-door/src/host/verbs.ts +14 -1
- package/plugins/acryl-door/src/index.ts +168 -30
- package/plugins/acryl-door/src/page/base.ts +32 -0
- package/plugins/acryl-door/src/page/channel.ts +3 -1
- package/plugins/acryl-door/src/page/driver/accessibility.ts +11 -0
- package/plugins/acryl-door/src/page/driver/actions.ts +4 -0
- package/plugins/acryl-door/src/page/driver/driver.ts +32 -4
- package/plugins/acryl-door/src/page/driver/snapshot.ts +5 -2
- package/plugins/acryl-door/src/page/index.ts +41 -2
- package/plugins/acryl-door/src/page/outline.ts +56 -0
- package/plugins/acryl-door/src/page/protocol.ts +4 -0
- package/plugins/acryl-door/src/page/snapshot-text.ts +2 -1
- package/plugins/acryl-node-server/src/adapter/listener.ts +4 -0
- package/plugins/acryl-node-server/src/adapter/raw.ts +18 -0
- package/plugins/acryl-node-server/src/adapter/websocket.ts +15 -9
- package/plugins/acryl-node-server/src/client-modules.ts +7 -1
- package/plugins/acryl-node-server/src/index.ts +304 -16
- package/plugins/acryl-node-server/src/upgrade-hub.ts +2 -2
- package/plugins/acryl-page/plugin.json +12 -0
- package/plugins/acryl-page/src/index.ts +163 -0
- package/plugins/acryl-router/src/service.ts +77 -14
- package/plugins/acryl-router-http/src/index.ts +15 -1
- package/plugins/acryl-router-http/src/serve.ts +31 -0
- package/plugins/acryl-web-server/plugin.json +14 -0
- package/plugins/acryl-web-server/src/index.ts +164 -0
- package/plugins/agent/agent.ts +38 -7
- package/plugins/agent/index.ts +1 -1
- package/plugins/agent/model.ts +10 -2
- package/plugins/agent/tools.ts +9 -3
- package/plugins/agent-panel/client/describe.ts +57 -0
- package/plugins/agent-panel/client/driver-pick.ts +22 -0
- package/plugins/agent-panel/client/frame.ts +51 -0
- package/plugins/agent-panel/client/main.ts +238 -26
- package/plugins/agent-panel/drivers.ts +7 -2
- package/plugins/agent-panel/headless.ts +5 -2
- package/plugins/agent-panel/index.ts +146 -57
- package/plugins/agent-panel/mount.ts +27 -0
- package/plugins/agent-panel/visitors.ts +231 -0
- package/plugins/builder/index.ts +13 -35
- package/plugins/builder/package.ts +186 -0
- package/plugins/builder/plugin.json +3 -1
- package/plugins/desktop/frame.ts +231 -0
- package/plugins/desktop/launch.ts +44 -9
- package/plugins/desktop/main.ts +100 -32
- package/plugins/desktop/window.ts +21 -4
- package/plugins/driver-pty/client/terminal.ts +4 -1
- package/plugins/driver-pty/index.ts +38 -11
- package/plugins/driver-pty/spawn.ts +38 -0
- package/plugins/driver-pty/terminal.ts +2 -0
- package/plugins/extensions/index.ts +47 -18
- package/plugins/extensions/plugin-store.ts +27 -0
- package/plugins/extensions/plugin.json +1 -1
- package/plugins/extensions/resolve.ts +13 -0
- package/plugins/extensions/stage.ts +15 -5
- package/plugins/feedback/client.d.ts +22 -0
- package/plugins/feedback/client.js +471 -0
- package/plugins/feedback/index.ts +143 -0
- package/plugins/feedback/plugin.json +11 -0
- package/plugins/feedback/store.ts +307 -0
- package/plugins/home/index.ts +122 -0
- package/plugins/home/plugin.json +11 -0
- package/plugins/instance/index.ts +6 -0
- package/plugins/manifest/app-plugins.ts +86 -0
- package/plugins/manifest/index.ts +12 -2
- package/plugins/manifest/plugin.json +1 -1
- package/plugins/manifest/snapshot.ts +275 -0
- package/plugins/openai/index.ts +64 -5
- package/plugins/openai/prompt.ts +23 -0
- package/plugins/plugin-share/README.md +51 -0
- package/plugins/plugin-share/index.ts +467 -0
- package/plugins/plugin-share/plugin.json +15 -0
- package/plugins/plugin-share/publish.ts +65 -0
- package/plugins/plugin-share/pull-check.ts +129 -0
- package/plugins/plugin-share/pulled-records.ts +70 -0
- package/shared/AGENTS.core.md +36 -16
- package/shared/skills/acryl-add-ui/SKILL.md +19 -0
- package/shared/skills/acryl-app/SKILL.md +13 -0
- package/shared/skills/acryl-build-plugin/SKILL.md +22 -0
- package/shared/skills/acryl-change-plugin/SKILL.md +14 -0
- package/shared/skills/acryl-diagnose-plugin/SKILL.md +13 -0
- package/shared/skills/acryl-fix-plugin/SKILL.md +13 -0
- package/shared/skills/acryl-remove-plugin/SKILL.md +12 -0
- package/shared/skills/acryl-share-plugin/SKILL.md +16 -0
- package/shared/skills/cordis-plugin/SKILL.md +26 -0
- package/templates/agent/.gitattributes +2 -0
- package/templates/agent/AGENTS.md +1 -1
- package/templates/agent/blend.yaml +6 -0
- package/templates/agent/gitignore +1 -0
- package/templates/agent/package.json +1 -0
- package/templates/agent/src/app.ts +154 -33
- package/templates/agent/src/frame.ts +17 -0
- package/templates/agent/src/main.ts +5 -3
- package/templates/agent/src/routes.ts +38 -19
- package/templates/agent/template.json +3 -0
- package/templates/agent/test/app.test.ts +45 -3
- package/templates/blank/.gitattributes +2 -0
- package/templates/blank/AGENTS.md +3 -2
- package/templates/blank/blend.yaml +11 -0
- package/templates/blank/gitignore +1 -0
- package/templates/blank/package.json +1 -0
- package/templates/blank/src/app.ts +100 -29
- package/templates/blank/src/door.ts +7 -0
- package/templates/blank/src/first-page.ts +5 -0
- package/templates/blank/src/frame.ts +17 -0
- package/templates/blank/src/routes.ts +65 -8
- package/templates/blank/template.json +14 -1
- package/templates/blank/test/app.test.ts +103 -16
- package/templates/chat/.gitattributes +2 -0
- package/templates/chat/blend.yaml +2 -1
- package/templates/chat/gitignore +1 -0
- package/templates/chat/package.json +1 -0
- package/templates/chat/src/app.ts +72 -22
- package/templates/chat/src/chat-app.ts +11 -2
- package/templates/chat/src/client/chat.tsx +4 -2
- package/templates/chat/src/frame.ts +17 -0
- package/templates/chat/src/page.tsx +6 -4
- package/templates/chat/src/routes.ts +14 -4
- package/templates/chat/src/runtime.ts +9 -3
- package/templates/chat/template.json +3 -1
- package/templates/chat/test/chat.test.ts +46 -1
- package/templates/chat/test/server.test.ts +17 -3
- package/templates/nodejs/.gitattributes +2 -0
- package/templates/nodejs/blend.yaml +2 -1
- package/templates/nodejs/gitignore +1 -0
- package/templates/nodejs/package.json +1 -0
- package/templates/nodejs/src/app.ts +76 -21
- package/templates/nodejs/src/frame.ts +17 -0
- package/templates/nodejs/src/page.tsx +3 -3
- package/templates/nodejs/src/routes.ts +32 -13
- package/templates/nodejs/template.json +3 -1
- package/templates/nodejs/test/app.test.ts +38 -3
- package/templates/nodejs/test/server.test.ts +17 -3
- package/templates/notes/.gitattributes +2 -0
- package/templates/notes/blend.yaml +2 -1
- package/templates/notes/gitignore +1 -0
- package/templates/notes/package.json +1 -0
- package/templates/notes/src/app.ts +72 -22
- package/templates/notes/src/frame.ts +17 -0
- package/templates/notes/src/notes-app.ts +24 -17
- package/templates/notes/src/routes.ts +11 -4
- package/templates/notes/src/runtime.ts +9 -3
- package/templates/notes/src/views.tsx +26 -17
- package/templates/notes/template.json +3 -1
- package/templates/notes/test/notes.test.ts +39 -1
- package/templates/notes/test/server.test.ts +17 -3
- package/templates/todo/.gitattributes +2 -0
- package/templates/todo/blend.yaml +3 -0
- package/templates/todo/gitignore +1 -0
- package/templates/todo/package.json +1 -0
- package/templates/todo/src/app.ts +81 -27
- package/templates/todo/src/door.ts +7 -0
- package/templates/todo/src/frame.ts +17 -0
- package/templates/todo/src/page.ts +13 -6
- package/templates/todo/src/todo.ts +18 -6
- package/templates/todo/template.json +11 -1
- package/templates/todo/test/todo.test.ts +67 -9
- package/lib/src-LX0E4ec4.js +0 -117
- package/shared/SKILL.md +0 -14
|
@@ -7,7 +7,7 @@ A coding agent (Claude Code, Codex, OpenCode, Copilot and others) builds on Acry
|
|
|
7
7
|
- `AGENTS.md`: where the API is, how a feature is built (an `Acryl` app mounted with `ctx.router.route`, a plugin registered in `src/app.ts` and `blend.yaml`, a state cell),
|
|
8
8
|
the defaults and how each is swapped, the things that surprise people, and what must pass before a task is done (`npm test` and `npm run check`).
|
|
9
9
|
- `CLAUDE.md`: the same text as `AGENTS.md`, so tools that read either file read the same guide.
|
|
10
|
-
-
|
|
10
|
+
- Two skills, `acryl-app` and `cordis-plugin`, in `.claude/skills/<name>/SKILL.md` and `.agents/skills/<name>/SKILL.md` (the same text in both places): how the app is put together and how to change and check it through the door, and how to add a feature as a Cordis plugin.
|
|
11
11
|
- `.gitignore` lists `.acryl/`, the folder the door keeps its secret and state in, so `git add -A` stages none of it.
|
|
12
12
|
|
|
13
13
|
## One plugin folder
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Desktop
|
|
2
2
|
|
|
3
|
-
An Acryl app also runs as a desktop app: an Electron window opens on the app's own server. It is the same app and the same code as `npm run dev`; nothing in the app changes.
|
|
3
|
+
An Acryl app also runs as a desktop app: an Electron window opens on the app's own server. It is the same app and the same code as `npm run dev`; nothing in the app changes. A Blend app that runs inside the ACRYL frame
|
|
4
|
+
(it has `scripts/ide-host.mjs`) gets the whole frame in the window, the same one `npm run dev` serves to the browser: see [The frame in the window](#the-frame-in-the-window). This page covers a plain Acryl app (the `nodejs`
|
|
4
5
|
template) and a Blend app (the `agent` template or any other `acrylblends init` template). It runs from source today: packaging a distributable app (dmg, exe, deb) is not part of it yet.
|
|
5
6
|
|
|
6
7
|
## Add it
|
|
@@ -26,10 +27,28 @@ In a Blend app, the same two commands (`npx acrylblends add desktop`, `npm insta
|
|
|
26
27
|
|
|
27
28
|
## What `npm run desktop` does
|
|
28
29
|
|
|
29
|
-
1.
|
|
30
|
+
1. For a frame app, attaches to the running frame or starts its host (see [The frame in the window](#the-frame-in-the-window)). Otherwise it serves the app on `127.0.0.1` with a free port: for a plain app, `app.fetch` from `src/app.ts` (`export default app`) through `acrylblends/node-server`; for a Blend app, its own `createApp`.
|
|
30
31
|
2. Takes a single-instance lock: a second launch of the same app focuses the first window and exits.
|
|
31
|
-
3. Opens one window on the server's address, with a locked-down renderer (context isolation, no Node in the page, the sandbox, web security). Navigation stays on the app's own origin; any other
|
|
32
|
-
4. When the window closes (or on SIGINT or SIGTERM), stops the server and exits.
|
|
32
|
+
3. Opens one window on the server's address, with a locked-down renderer (context isolation, no Node in the page, the sandbox, web security). Navigation stays on the app's own origin; a link to any other `http(s)` or `mailto` address opens in the system browser.
|
|
33
|
+
4. When the window closes (or on SIGINT or SIGTERM), stops the server or frame host it started (never one it attached to) and exits.
|
|
34
|
+
|
|
35
|
+
## The frame in the window
|
|
36
|
+
|
|
37
|
+
A Blend app made with the frame (`npm run dev` runs `scripts/ide-host.mjs`) opens the ACRYL frame in its desktop window, not only its page: the left panel with the
|
|
38
|
+
projects and sessions, the right panel with Files, Changes and Review, Settings, terminal tabs, the DSH chat, and the app's own page in a browser tile. It is the
|
|
39
|
+
same frame the browser shows; the desktop builds nothing of its own.
|
|
40
|
+
|
|
41
|
+
1. When the frame already runs for this folder (`npm run dev` in another terminal), the window attaches to it: it reads the address the host keeps in
|
|
42
|
+
`.acrylblends/frame-url.json` (owner-only, with the launch token) and opens it. Closing the window leaves that host running.
|
|
43
|
+
2. Otherwise the window starts the host itself, exactly as `npm run dev` does (the same npm and Node that ran `npm run desktop`; the host never runs inside
|
|
44
|
+
Electron), and opens the address it prints. Closing the window stops that host and everything it started, including its terminals, so its port is free
|
|
45
|
+
again. Ctrl-C in the terminal does the same: Electron runs in a process group of its own, and `npm run desktop` passes it exactly one signal (a second
|
|
46
|
+
one would end Electron before it could stop the host).
|
|
47
|
+
3. Navigation follows ACRYL Desktop's rule: the frame's own address stays in the window, and its tiles (the app's page in an iframe) load freely. A link to any
|
|
48
|
+
other `http(s)` or `mailto` address opens in the system browser, and nothing else opens at all.
|
|
49
|
+
4. The door's `window list` shows each window's address without the launch token.
|
|
50
|
+
|
|
51
|
+
The application menu's `Settings...` (`Cmd+,` on macOS, in the app menu; `Ctrl+,` and the File menu on Windows and Linux) opens the frame's own Settings, the dialog the left panel's Settings button opens. `acrylblends.desktopPath` does not apply to a frame app, because the frame opens the app's page in its tile on first run.
|
|
33
52
|
|
|
34
53
|
## The first launch downloads Electron
|
|
35
54
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
Every template is a Cordis app: `blend.yaml` lists the plugins that are mounted, every plugin is a folder in `plugins/`, and the app is started by `src/main.ts`. A bare template name after the directory is the same as `--template`: `npm create acrylblends@latest my-app notes`. `bun` is no longer a template; the framework still runs on Bun (see [Bun](../getting-started/bun.md)), but a new app is a Cordis app on Node.
|
|
18
18
|
|
|
19
|
-
Every template includes `AGENTS.md` and `CLAUDE.md` (the same text),
|
|
19
|
+
Every template includes `AGENTS.md` and `CLAUDE.md` (the same text), two skills (`acryl-app`, `cordis-plugin`) in `.claude/skills/` and `.agents/skills/`, and a copy of these docs in `docs/framework/`, so a coding agent working in the folder reads the
|
|
20
20
|
API from the folder.
|
|
21
21
|
|
|
22
22
|
## Passing arguments
|
|
@@ -55,7 +55,7 @@ bun create acrylblends@latest my-app --template nodejs
|
|
|
55
55
|
| `[source]` | A template from outside the package: `github:owner/repo[#ref]`, `@scope/name[@version]` or a packed `.tgz` file. See [Templates from a repository or a package](#templates-from-a-repository-or-a-package). | `github:acme/starter` |
|
|
56
56
|
| `--template <template>` | One of `blank`, `nodejs`, `notes`, `chat`, `todo`, `agent` (the same list as `acrylblends init --template`; `acryl-app` is accepted as `agent`). Skips the template question; a bare name after the directory means the same. | `--template notes` |
|
|
57
57
|
| `--from <id \| source>` | A starter from the registry by its id (`acrylblends.notes-desktop`), or any source above. Only starters that declare `runtime: acrylblends` are made; an ACRYL app starter is refused. See [Starters from the registry](#starters-from-the-registry). | `-- --from acrylblends.notes-desktop` |
|
|
58
|
-
| `--registry <source>` | Read the ids from this registry instead of the public one: `github:owner/repo` or a folder, with an `index.json` (at its root or in `registry/`). | `-- --from login.thing --registry github:acryldev/workshop-2026-11-20` |
|
|
58
|
+
| `--registry <source>` | Read the ids from this registry instead of the public one: `github:owner/repo`, an `https://` address, or a folder, with an `index.json` (at its root or in `registry/`). | `-- --from login.thing --registry github:acryldev/workshop-2026-11-20` |
|
|
59
59
|
| `--install` | Install the dependencies with the package manager after creating the project. For a template from a source, the install scripts it will run are listed first. | `--install` |
|
|
60
60
|
| `--pm <packageManager>` | The package manager for `--install`: `npm`, `pnpm`, `yarn` or `bun`. Defaults to the one that started the initializer. | `--pm pnpm` |
|
|
61
61
|
| `--yes`, `-y` | Ask nothing: use `nodejs` unless `--template` is given, and the directory `acryl-app`. | `-y` |
|
|
@@ -78,7 +78,9 @@ npm run dev
|
|
|
78
78
|
- A starter with `runtime: acrylblends` is an `acrylblends` app: this command downloads its folder, gives the manifest to the new app (`metadata.id: acrylblends.my-notes`, `visibility: private`; the starter's id and licence stay the starter's), checks it for anything that looks like a secret, and writes it. Nothing in it is installed or run: `npm install` is yours to run, and the dependencies of the starter (a desktop starter brings `electron`) are in its `package.json`.
|
|
79
79
|
- A starter for the ACRYL app (`runtime: acryl`, the older `acryl.*` entries) is refused with one line that says so, because its plugins run only inside the ACRYL app. Nothing is written.
|
|
80
80
|
- An unknown id lists the starters this command can make.
|
|
81
|
-
- The ids come from `https://acrylblends.github.io/registry/index.json
|
|
81
|
+
- The ids come from `https://acrylblends.github.io/registry/index.json`, and only the starter you asked for is downloaded, as one archive checked against the integrity in the index; an archive that does not match is refused. When the site cannot give the starter, the registry's repository is read instead. `--registry github:owner/repo` reads another registry with the same layout (`index.json` and `blends/<id>/`), a team's own or a workshop's; `--registry ./folder` reads one on disk.
|
|
82
|
+
|
|
83
|
+
A registry on any static host works with `--registry https://...`, if its `index.json` names an `archive` and an `integrity` for each entry: `workshop-registry/scripts/registry-archives.mjs` in this repository writes both when you deploy, on the copy you publish.
|
|
82
84
|
|
|
83
85
|
To publish a starter of your own, see [the registry README](https://github.com/acrylblends/acrylblends.github.io/tree/main/registry): the folder of your app under `blends/<id>/` with an `acryl.template.json`, in a pull request.
|
|
84
86
|
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Build your app inside the ACRYL frame: the ACRYL Blends workshop
|
|
2
2
|
|
|
3
|
-
Ninety minutes, from an empty folder to an app
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
around it: a folder of Cordis plugins with a `blend.yaml`, running on your machine,
|
|
3
|
+
Ninety minutes, from an empty folder to an app that opens in ACRYL's own IDE: projects on the left, your app's page in the middle, files,
|
|
4
|
+
changes, checks and terminals on the right, a chat model that works on your app beside it, and Claude, Codex or Pi running in terminal tabs in
|
|
5
|
+
the same folder. **Acryl** is the small web framework underneath (a handler takes a `Request` and returns a `Response`); **ACRYL Blends** is the
|
|
6
|
+
app around it: a folder of Cordis plugins with a `blend.yaml`, running on your machine, opened by the frame.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
The frame is the workshop's point. You do not edit a folder and alt-tab to a browser: your app is a page inside the workspace, the agents work in
|
|
9
|
+
the same folder the frame shows, and every change you or an agent makes is one restart away from the page.
|
|
10
10
|
|
|
11
|
-
This guide is for **acrylblends 1.0
|
|
11
|
+
This guide is for **acrylblends 1.3.0 or newer**; `npm create acrylblends@latest` gives you that. An app you made with an older release gets the
|
|
12
|
+
frame with the upgrade in block 6.
|
|
12
13
|
|
|
13
14
|
## 0. Before you start (10 minutes)
|
|
14
15
|
|
|
@@ -19,7 +20,7 @@ npx acrylblends@latest preflight
|
|
|
19
20
|
```
|
|
20
21
|
|
|
21
22
|
It ends with `Ready for the workshop.`, or with how many lines say `FIX`: run each `FIX` line, then the preflight again. `NOTE` lines are things the
|
|
22
|
-
first blocks do without
|
|
23
|
+
first blocks do without.
|
|
23
24
|
|
|
24
25
|
| | macOS | Windows | Linux |
|
|
25
26
|
| --- | --- | --- | --- |
|
|
@@ -31,15 +32,18 @@ first blocks do without (`gh` is only needed in block 5).
|
|
|
31
32
|
Install what is missing: Node from <https://nodejs.org> (the LTS), git from <https://git-scm.com>, the GitHub CLI from <https://cli.github.com> (`gh auth
|
|
32
33
|
login` once), and one agent:
|
|
33
34
|
|
|
35
|
+
- **Claude Code**: <https://claude.com/claude-code>, then run `claude` once to log in.
|
|
34
36
|
- **Codex**: `npm i -g @openai/codex`, then `codex login`. If a run answers `model_not_found`, your account does not have the default model: pick one
|
|
35
37
|
your account supports (`/model` inside codex, or `model = "..."` in `~/.codex/config.toml`).
|
|
36
|
-
- **
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
- **pi with DeepSeek**: `npm i -g @earendil-works/pi-coding-agent`, and set your DeepSeek key in the terminal you start the app from (the terminal
|
|
39
|
+
tabs inherit that environment). The preflight checks the key: `PASS agent pi (DeepSeek key found)`.
|
|
40
|
+
|
|
41
|
+
| macOS and Linux | Windows PowerShell | Windows cmd.exe |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| `export DEEPSEEK_API_KEY=sk-...` | `$env:DEEPSEEK_API_KEY="sk-..."` | `set DEEPSEEK_API_KEY=sk-...` |
|
|
39
44
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
| `export DEEPSEEK_API_KEY=sk-...` | `$env:DEEPSEEK_API_KEY="sk-..."` | `set DEEPSEEK_API_KEY=sk-...` |
|
|
45
|
+
**One model key for the chat.** The frame's chat needs a model: a DeepSeek API key from <https://platform.deepseek.com> is the shortest path (you add
|
|
46
|
+
it in block 3). A Claude or ChatGPT subscription works too, through **Sign in with an account** on the same Settings page.
|
|
43
47
|
|
|
44
48
|
No prior knowledge of ACRYL, Cordis or Blends is needed; every new word is explained where it appears.
|
|
45
49
|
|
|
@@ -52,178 +56,169 @@ Make the workshop folder:
|
|
|
52
56
|
**On Windows.** Windows PowerShell 5.1 (the one Windows ships) has no `&&`: where this guide joins two commands with `&&`, type them as two lines, or join
|
|
53
57
|
them with `;`. PowerShell 7 (`pwsh`) accepts `&&`. In cmd.exe, `Ctrl-C` asks `Terminate batch job (Y/N)?`: answer `Y`.
|
|
54
58
|
|
|
55
|
-
**The agent setting that matters all day.** The
|
|
56
|
-
files
|
|
57
|
-
|
|
59
|
+
**The agent setting that matters all day.** The agents are configured to act rather than to describe: when you ask for something, they write the
|
|
60
|
+
files and check the result. If your agent stops to ask "shall I proceed?", answer "do it now" and it continues; that one sentence is the difference
|
|
61
|
+
between watching and building.
|
|
58
62
|
|
|
59
63
|
## The path
|
|
60
64
|
|
|
61
65
|
| Minutes | Block | What you get |
|
|
62
66
|
| --- | --- | --- |
|
|
63
|
-
| 0-10 | 0. Before you start
|
|
64
|
-
| 10-
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
> **Checkpoint
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
| 0-10 | 0. Before you start | a checked machine, one model key, a folder |
|
|
68
|
+
| 10-20 | 1. Create the app, open the frame | the app running and shown inside the ACRYL frame |
|
|
69
|
+
| 20-25 | 2. Your first change | the app's page in the frame showing your edit |
|
|
70
|
+
| 25-30 | 3. Connect your model in Settings > Models | a chat that answers |
|
|
71
|
+
| 30-50 | 4. Chat: your model builds a page | a board page the model wrote and you saw at /app/board |
|
|
72
|
+
| 50-65 | 5. A coding agent in a terminal tab | Claude, Codex or Pi working in the app's folder |
|
|
73
|
+
| 65-80 | 6. Upgrade an older app onto the frame | an app from before today, opened by the frame |
|
|
74
|
+
| 80-90 | 7. Publish it as a starter | the app listed in the workshop registry |
|
|
75
|
+
|
|
76
|
+
> **Checkpoint 20 minutes:** the app's page is in the frame.
|
|
77
|
+
> **Checkpoint 30 minutes:** the chat answers.
|
|
78
|
+
> **Checkpoint 50 minutes:** the model's board is at /app/board.
|
|
79
|
+
> **Checkpoint 65 minutes:** an agent in a terminal has changed the app.
|
|
80
|
+
|
|
81
|
+
## 1. Create the app; the frame opens on it (10 minutes)
|
|
75
82
|
|
|
76
83
|
```sh
|
|
77
|
-
npm create acrylblends@latest my-app agent
|
|
84
|
+
npm create acrylblends@latest my-app agent -- --desktop
|
|
78
85
|
cd my-app
|
|
79
86
|
npm install
|
|
80
87
|
npm run dev
|
|
81
88
|
```
|
|
82
89
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-

|
|
87
|
-
|
|
88
|
-
The page follows your system's light or dark setting, so on a dark-mode machine it is dark as above. For the next two minutes forget the panel: an
|
|
89
|
-
Acryl app is a function from a request to a response.
|
|
90
|
+
`npm install` is bigger than a framework-only app: it brings the frame and the chat engine (about 500 MB together, much less on a warm package
|
|
91
|
+
cache). `npm run dev` starts the app inside the frame and prints one line:
|
|
90
92
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
```ts
|
|
94
|
-
.get('/hello', (c) => c.json({ hello: 'workshop' }))
|
|
93
|
+
```text
|
|
94
|
+
acrylblends host: http://127.0.0.1:3489/?token=...
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
`
|
|
99
|
-
both pass (`npm test` reports 14 passing tests). That is the whole core: a route, a test, a typecheck.
|
|
97
|
+
Open that address (it is a free port on your machine; never a fixed one). It stays the same every time you start the app, and it is the way back in
|
|
98
|
+
later: `npx acrylblends open` prints it again while the frame is running. The first time, DeepSeek Harness shows a **Preview Notice**: press **Continue**. Then the frame opens **on your app**: the page in the middle is `my-app`'s own page, in a tab named after the app.
|
|
100
99
|
|
|
101
|
-
|
|
100
|
+

|
|
102
101
|
|
|
103
|
-
|
|
102
|
+
The three columns are ACRYL's IDE:
|
|
104
103
|
|
|
105
|
-
|
|
104
|
+
- **Left:** your workspaces and projects. `my-app` is selected; the account row above and **Settings** below.
|
|
105
|
+
- **Middle:** tabs. `my-app` is your app's page; the `+` at the left of the tab strip opens more (terminal, browser, files, chat, agents).
|
|
106
|
+
- **Right:** open it with the panel button at the top right (or `Cmd/Ctrl+B`): **Files**, **Changes**, **Review**, **Checks**, **Comments** and a
|
|
107
|
+
terminal. The bottom bar is the terminal dock.
|
|
106
108
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
```
|
|
109
|
+
The app's page also has an agent of its own: **Ask the agent** at the bottom right opens the app's panel (the offline agent unless the app is given
|
|
110
|
+
a model). The frame's chat in the next blocks is the tool you will use; the panel is there for the app to ship with.
|
|
110
111
|
|
|
111
|
-
|
|
112
|
+
**Stuck?** A busy port means the terminal printed a different address; use that. `npm install` failing on the native terminal package needs a C++
|
|
113
|
+
toolchain: on macOS `xcode-select --install`, on Windows the "Desktop development with C++" workload of Visual Studio Build Tools, on Ubuntu
|
|
114
|
+
`sudo apt install build-essential python3`.
|
|
112
115
|
|
|
113
|
-
|
|
114
|
-
> them done, a sidebar with filters (all, mine, done) and a count on each filter, a button that opens and closes the sidebar, and a header button
|
|
115
|
-
> "New card" that adds one. Use the app's own state so the counts update live. Build it as a plugin in plugins/, install it into the running app, then
|
|
116
|
-
> go to /board yourself and check it looks right, and tell me what you saw.
|
|
116
|
+
## 2. Your first change, seen at /app (5 minutes)
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
built. The panel shows `Working... m:ss` while it runs; with pi the build took about six minutes. The panel is on every page of the app, so when the
|
|
121
|
-
agent moves the page to `/board`, the panel comes along and keeps following the run.
|
|
118
|
+
Open the right panel (**Files**), expand `src`, click `routes.ts`. Find the sentence the page shows ("This app runs an agent unless it is switched
|
|
119
|
+
off...") and change it to something that is yours. Press **Save** in the editor's bar (or `Cmd/Ctrl+S`).
|
|
122
120
|
|
|
123
|
-
|
|
121
|
+
The running app does not pick a source change up by itself. Stop the host with `Ctrl-C` in the terminal where `npm run dev` runs (in cmd.exe answer
|
|
122
|
+
`Y`), then start it again:
|
|
124
123
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
the agent wrote it, you own it. Every agent builds a slightly different board: yours may need a title typed before "New card" adds one, or keep the
|
|
129
|
-
sidebar always open.
|
|
130
|
-
|
|
131
|
-
**Stuck?** If the agent describes the plan and stops, tell it "do it now, without asking for approval". An app made with an older release gets the
|
|
132
|
-
current panel and fixes with `npx acrylblends@latest upgrade`.
|
|
133
|
-
|
|
134
|
-
## 3. The agent drives the app (20 minutes)
|
|
124
|
+
```sh
|
|
125
|
+
npm run dev
|
|
126
|
+
```
|
|
135
127
|
|
|
136
|
-
The
|
|
137
|
-
`
|
|
128
|
+
The frame reconnects on its own, on the same address (the port is stable per app), in a few seconds. If a chat tab opened in front, press the
|
|
129
|
+
`my-app` tab: the page shows your sentence. That is the whole development loop for the rest of the day: edit, restart, look.
|
|
138
130
|
|
|
139
|
-
|
|
131
|
+
```sh
|
|
132
|
+
npm test
|
|
133
|
+
npm run check
|
|
134
|
+
```
|
|
140
135
|
|
|
141
|
-
|
|
142
|
-
|
|
136
|
+
Both pass: the app is TypeScript, with tests and a type check, and the scaffold made the folder a git repository, so **Changes** shows what you
|
|
137
|
+
edited.
|
|
143
138
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
under two minutes, most of it the model thinking.
|
|
139
|
+
**Stuck?** If the page looks unchanged, the host did not restart (the terminal says `Restarting` or it is waiting on `Ctrl-C`). If the frame still
|
|
140
|
+
says `Reconnecting...` after ten seconds, reload the tab: the address is the same one it was opened with. If the tab was closed, `npx acrylblends open`
|
|
141
|
+
in the app's folder prints the address again.
|
|
148
142
|
|
|
149
|
-
|
|
143
|
+
## 3. Connect your model: Settings > Models (5 minutes)
|
|
150
144
|
|
|
151
|
-
|
|
145
|
+
Press **Settings** at the bottom of the left column, then **Models** in its sidebar. The page lists DeepSeek as a provider: paste your API key into
|
|
146
|
+
**API key** and press **Apply**. It answers `Saved DeepSeek (deepseek-official).`; the key goes to the frame's own credentials store, never into the
|
|
147
|
+
app folder.
|
|
152
148
|
|
|
153
|
-
|
|
154
|
-
first if you want to see them move.
|
|
149
|
+

|
|
155
150
|
|
|
156
|
-
|
|
151
|
+
Then reload the frame (`Cmd/Ctrl+R`): the page you already had open picks the key up on its next load. A Claude or ChatGPT subscription instead of a
|
|
152
|
+
key: **Sign in with an account** on the same page.
|
|
157
153
|
|
|
158
|
-
|
|
154
|
+
If the frame greets you with DeepSeek Harness's **Add an API key to get started** card first, you can paste the key there and press **Save and
|
|
155
|
+
continue**, or press **Configure later** and use Settings > Models; both write the same store.
|
|
159
156
|
|
|
160
|
-
**
|
|
161
|
-
|
|
157
|
+
**Stuck?** "Loading the provider directory failed" means the host is not answering; start `npm run dev` again. A key that stays red is usually an
|
|
158
|
+
extra space: paste it again.
|
|
162
159
|
|
|
163
|
-
|
|
164
|
-
npx acrylblends add desktop
|
|
165
|
-
npm install
|
|
166
|
-
npm run desktop
|
|
167
|
-
```
|
|
160
|
+
## 4. Chat: your model works on the app (20 minutes)
|
|
168
161
|
|
|
169
|
-
|
|
162
|
+
Press `+` at the left of the tab strip and choose **AcrylDSH Chat**; on the `my-app` row in the left pane, **New chat on my-app** does the same and
|
|
163
|
+
binds the chat to the app's folder (the chat's workspace selector says `my-app`). Then ask, in one message:
|
|
170
164
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
165
|
+
> Do it now, without asking for approval. Build a board page at /board in this app: three columns (backlog, doing, done) with cards that have a
|
|
166
|
+
> checkbox to mark them done, a sidebar with filters (all, mine, done) and a count on each filter, a button that opens and closes the sidebar, and
|
|
167
|
+
> a header button "New card" that adds one. Use the app's own state so the counts update live. Read AGENTS.md and the app's docs first. When you are
|
|
168
|
+
> done, tell me what you changed.
|
|
175
169
|
|
|
176
|
-
|
|
177
|
-
|
|
170
|
+
The chat writes into `my-app` (watch the **Changes** panel fill), and the app's page at `/app` shows it after the loop from block 2: `Ctrl-C`, `npm
|
|
171
|
+
run dev`, the frame reconnects. The board is at `/app/board`: type the address in the app tab's bar (the same address with `/board` at the end) and
|
|
172
|
+
press **Go**.
|
|
178
173
|
|
|
179
|
-

|
|
180
175
|
|
|
181
|
-
|
|
176
|
+
Every model builds a slightly different board: yours may need a title typed before "New card" adds one, or keep the sidebar always open.
|
|
182
177
|
|
|
183
|
-
|
|
178
|
+
**Stuck?** If the chat asks for a model, block 3 did not finish (or the page was not reloaded after Apply). If the model describes the plan and
|
|
179
|
+
stops, reply "do it now, without asking for approval".
|
|
184
180
|
|
|
185
|
-
|
|
186
|
-
screen as it happens. The Settings item is in the application menu on macOS (`my-app > Settings...`, `Cmd+,`) and the first item of the File menu on
|
|
187
|
-
Windows and Linux (`Ctrl+,`); it opens `/settings` in a window of its own.
|
|
181
|
+
## 5. A coding agent in a terminal tab (15 minutes)
|
|
188
182
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
it change. A page the agent built (the board) follows the system theme unless you ask the agent to follow the app's appearance too.
|
|
183
|
+
Press `+` and choose **Claude**, **Codex** or **Pi** (or **New Terminal** and type the command yourself). The tab starts the agent in the app's
|
|
184
|
+
folder: the terminal's prompt is `my-app`, and `pwd` prints the folder. Ask it, in the terminal:
|
|
192
185
|
|
|
193
|
-
|
|
186
|
+
> Do it now, without asking for approval. Add a GET /time route that returns the current time as JSON, and a line on the app's page that shows it.
|
|
187
|
+
> Then check it at http://127.0.0.1:3489/app/time.
|
|
194
188
|
|
|
195
|
-
|
|
189
|
+
The port in that address is the one the frame printed. The agent edits the files, and the same loop shows them: `Ctrl-C`, `npm run dev`, the frame
|
|
190
|
+
reconnects, the `my-app` tab.
|
|
196
191
|
|
|
197
|
-
|
|
198
|
-
|
|
192
|
+
An agent that works in this folder can also use the app's **door**, the page channel the app carries in development: `.acryl/bin/acryl look` prints
|
|
193
|
+
what is on the page with refs, and `act` clicks, types, selects, presses, scrolls, waits, navigates and reloads. Ask the terminal agent to look at
|
|
194
|
+
the page before it tells you it is done; the app's own docs (`AGENTS.md`, `plugins/acryl-door`) say how.
|
|
199
195
|
|
|
200
|
-
**Stuck?**
|
|
201
|
-
`
|
|
202
|
-
it and ask again.
|
|
196
|
+
**Stuck?** An agent that says the terminal is not a TTY needs the tab, not a script. If the agent cannot log in, sign in in a terminal first
|
|
197
|
+
(`claude`, `codex login`, pi with `DEEPSEEK_API_KEY`), then open the tab again.
|
|
203
198
|
|
|
204
|
-
##
|
|
199
|
+
## 6. Upgrade an older app onto the frame (10 minutes)
|
|
205
200
|
|
|
206
|
-
|
|
207
|
-
|
|
201
|
+
An app made with an older acrylblends runs the framework only. The current release moves it onto the frame-hosted layout: the generated launcher,
|
|
202
|
+
the frame's row and the app's plugins beside it, the mount config. **Your source stays yours**: the upgrade only touches the files acrylblends
|
|
203
|
+
generated, plus the library plugins the app carries.
|
|
208
204
|
|
|
209
205
|
```sh
|
|
210
|
-
|
|
206
|
+
cd old-app
|
|
207
|
+
npx acrylblends@latest upgrade
|
|
208
|
+
npm install
|
|
209
|
+
npm run dev
|
|
211
210
|
```
|
|
212
211
|
|
|
213
|
-
|
|
214
|
-
|
|
212
|
+
The report names every file it changed and ends with a `frame` line (for an app that already has the frame: `everything is up to date`). An app made
|
|
213
|
+
today answers "everything is up to date" too. An app from a release **before 0.7.8** cannot start at all (its `src/main.ts` imports a `plugins/`
|
|
214
|
+
folder that release did not write); the upgrade says so instead of touching it.
|
|
215
215
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
`ACRYLBLENDS_HOST` and `ACRYLBLENDS_PORT` (not `PORT`):
|
|
219
|
-
|
|
220
|
-
| macOS and Linux | Windows PowerShell | Windows cmd.exe |
|
|
221
|
-
| --- | --- | --- |
|
|
222
|
-
| `ACRYLBLENDS_HOST=0.0.0.0 ACRYLBLENDS_PORT=8080 NODE_ENV=production npm start` | `$env:ACRYLBLENDS_HOST="0.0.0.0"; $env:ACRYLBLENDS_PORT="8080"; $env:NODE_ENV="production"; npm start` | `set ACRYLBLENDS_HOST=0.0.0.0&& set ACRYLBLENDS_PORT=8080&& set NODE_ENV=production&& npm start` |
|
|
216
|
+
**Stuck?** "is not the previous release's scaffold" means you edited a generated file: run with `--diff` to see it, save your version aside, and
|
|
217
|
+
run again (or `--force`; the app's versions are backed up under `.acrylblends/upgrade-backup/`).
|
|
223
218
|
|
|
224
|
-
|
|
219
|
+
## 7. Publish it as a starter (10 minutes, take-home)
|
|
225
220
|
|
|
226
|
-
|
|
221
|
+
Your app already is a starter: `blend.yaml` names it, `plugins/` holds its code.
|
|
227
222
|
|
|
228
223
|
```sh
|
|
229
224
|
cd ~/acryl-workshop
|
|
@@ -241,29 +236,18 @@ commit` as two lines, or join them with `;`.)
|
|
|
241
236
|
A check runs on the pull request and merges it: your starter is listed in about two minutes, and anyone can start from it with
|
|
242
237
|
`npm create acrylblends@latest another-app -- --from <your-github-login>.my-app --registry github:acryldev/workshop-2026-11-20`.
|
|
243
238
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
As an aside, for an app made before this release: `npx acrylblends@latest upgrade` moves the framework plugins it carries to the installed version,
|
|
247
|
-
leaving your own code alone (an app you made today answers "everything is up to date").
|
|
248
|
-
|
|
249
|
-
**Stuck?** The registry's check comments what to change; fix, commit, push again. `gh auth status` not logged in means `gh auth login`. A production app
|
|
250
|
-
with no agent is correct: that is the design, not a missing piece.
|
|
239
|
+
**Stuck?** The registry's check comments what to change; fix, commit, push again. `gh auth status` not logged in means `gh auth login`.
|
|
251
240
|
|
|
252
241
|
## Browser only (WebBoxes.ai) TODO(M9)
|
|
253
242
|
|
|
254
|
-
No local install? The same app, and the same
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
The hosted workspace is milestone M9; until it is live this section is a stub. When it is, it says the address, the sign-in it needs, and the two or three
|
|
258
|
-
clicks that replace block 1 here - and the one-click WebBoxes.ai deploy of an app from block 5, which is the same app on their infrastructure instead of
|
|
259
|
-
yours.
|
|
243
|
+
No local install? The same app, and the same agents working on it, will run as a hosted workspace: open it in a browser, pick a starter, and work in
|
|
244
|
+
the same folders. Nothing to install, nothing to keep on your machine. Until it is live this section is a stub.
|
|
260
245
|
|
|
261
246
|
## Where next
|
|
262
247
|
|
|
263
|
-
- **Read the docs you already have**: every app carries `docs/framework`, the same pages as <https://acrylblends.github.io/docs>.
|
|
264
|
-
|
|
265
|
-
- **
|
|
266
|
-
- **Swap a provider by editing one row**: SQLite to Postgres, the browser to a window, one agent to another in the panel's driver list.
|
|
248
|
+
- **Read the docs you already have**: every app carries `docs/framework`, the same pages as <https://acrylblends.github.io/docs>.
|
|
249
|
+
- **Teach the agents your app**: `AGENTS.md` is what they read first; add your team's conventions there and they follow them in the next run.
|
|
250
|
+
- **Swap a provider by editing one row**: SQLite to Postgres, the browser to a window, one agent to another in the frame's agent list.
|
|
267
251
|
- **Bring your own tool**: <https://acrylblends.github.io/docs/guides/bring-your-own-tool> wraps an outside library as a provider of a port.
|
|
268
252
|
|
|
269
253
|
---
|
|
@@ -274,11 +258,13 @@ yours.
|
|
|
274
258
|
| --- | --- |
|
|
275
259
|
| The preflight prints `FIX` lines | run each one, then `npx acrylblends@latest preflight` again |
|
|
276
260
|
| `npm create` fails or hangs | check the network; the facilitator has prepared apps |
|
|
261
|
+
| `npm install` fails building node-pty | install the C++ toolchain (block 1's **Stuck?**) and run it again |
|
|
277
262
|
| A port is taken | use the address the app printed |
|
|
278
|
-
| The
|
|
279
|
-
|
|
|
280
|
-
|
|
|
281
|
-
| The
|
|
263
|
+
| The frame says `Reconnecting...` | wait ten seconds; then `npx acrylblends open` and open the address it prints |
|
|
264
|
+
| Settings > Models shows no provider | the host is not running: `Ctrl-C`, `npm run dev` |
|
|
265
|
+
| The chat asks for a model | finish block 3, then reload the page |
|
|
266
|
+
| The model plans and stops | reply "do it now, without asking for approval" |
|
|
267
|
+
| An agent cannot log in | `codex login` / `claude` / pi with `DEEPSEEK_API_KEY`, then open the tab again |
|
|
268
|
+
| The app's page is unchanged after an edit | the host did not restart: `Ctrl-C`, `npm run dev` |
|
|
282
269
|
| `&&` is an error in PowerShell | Windows PowerShell 5.1: type the two commands as two lines, or join them with `;` |
|
|
283
|
-
| The agent says it acted, but the desktop window did not change | close the app's browser tab, then ask again |
|
|
284
270
|
| Anything else | the **Stuck?** line of the step, then your facilitator |
|