acrylblends 1.0.10 → 1.2.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 +60 -2
- package/dist/index.js +1992 -33
- package/dist/index.js.map +1 -1
- package/docs/framework/agents/index.md +1 -1
- package/docs/framework/api/summary.md +1 -1
- package/docs/framework/getting-started/desktop.md +23 -4
- package/docs/framework/guides/create-acrylblends.md +1 -1
- package/docs/framework/guides/production.md +20 -0
- package/docs/framework/workshop/README.md +174 -285
- package/docs/framework/workshop/facilitator.md +81 -90
- 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-Dw-siYTp.d.ts → audit-Bok_UNCn.d.ts} +41 -6
- package/lib/{client-modules-drj4mjhj.js → client-modules-Bkdr83jO.js} +1 -1
- package/lib/cordis/door.d.ts +44 -7
- package/lib/cordis/door.js +214 -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.d.ts +3 -2
- package/lib/cordis/state.js +371 -7
- package/lib/door/host.d.ts +2 -2
- package/lib/door/host.js +1 -1
- package/lib/door/page.d.ts +20 -1
- package/lib/door/page.js +75 -14
- 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-BfEbEOjA.js → snapshot-text-CXTnjxGx.js} +121 -9
- 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/src/host/channel.ts +124 -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 +58 -23
- 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 +3 -0
- package/plugins/acryl-door/src/index.ts +166 -29
- package/plugins/acryl-door/src/page/base.ts +32 -0
- package/plugins/acryl-door/src/page/channel.ts +11 -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 +49 -7
- package/plugins/acryl-door/src/page/driver/snapshot.ts +5 -2
- package/plugins/acryl-door/src/page/index.ts +46 -2
- package/plugins/acryl-door/src/page/indicator.ts +14 -6
- 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-state/plugin.json +4 -3
- package/plugins/acryl-state/src/client-source.ts +244 -0
- package/plugins/acryl-state/src/service.ts +33 -6
- package/plugins/acryl-state/src/socket.ts +96 -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 +343 -81
- package/plugins/agent-panel/drivers.ts +7 -2
- package/plugins/agent-panel/headless.ts +5 -2
- package/plugins/agent-panel/index.ts +187 -61
- package/plugins/agent-panel/mount.ts +27 -0
- package/plugins/agent-panel/visitors.ts +231 -0
- 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 +26 -1
- package/plugins/extensions/resolve.ts +13 -0
- 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 +12 -3
- package/plugins/manifest/app-plugins.ts +86 -0
- package/plugins/manifest/index.ts +12 -2
- package/plugins/manifest/snapshot.ts +275 -0
- package/plugins/openai/index.ts +64 -5
- package/plugins/openai/prompt.ts +23 -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/AGENTS.md +4 -2
- package/templates/agent/blend.yaml +4 -0
- package/templates/agent/gitignore +1 -0
- package/templates/agent/package.json +1 -0
- package/templates/agent/src/app.ts +150 -33
- package/templates/agent/src/frame.ts +17 -0
- package/templates/agent/src/main.ts +5 -3
- package/templates/agent/src/routes.ts +73 -21
- package/templates/agent/template.json +2 -0
- package/templates/agent/test/app.test.ts +83 -5
- 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/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/main.ts +1 -6
- 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/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/main.ts +1 -6
- 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/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/main.ts +1 -6
- 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/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
|
@@ -1,381 +1,270 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Build your app inside the ACRYL frame: the ACRYL Blends workshop
|
|
2
2
|
|
|
3
|
-
Ninety minutes,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
starter other people can pull from the registry.
|
|
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.
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
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.
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
This guide is for **acrylblends 1.2.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.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
| --- | --- | --- | --- |
|
|
16
|
-
| Node.js 22.19 or newer (24 LTS or 26 tested) | `node -v` | `node -v` | `node -v` |
|
|
17
|
-
| npm, which comes with Node | `npm -v` | `npm -v` | `npm -v` |
|
|
18
|
-
| git | `git --version` | `git --version` | `git --version` |
|
|
19
|
-
| a coding agent, logged in | `codex login status` or `claude --version` | same | same |
|
|
20
|
-
| a GitHub account and the `gh` CLI, logged in | `gh auth status` | same | same |
|
|
14
|
+
## 0. Before you start (10 minutes)
|
|
21
15
|
|
|
22
|
-
|
|
23
|
-
install GitHub.cli`, or <https://cli.github.com>), and one agent with `npm i -g @openai/codex` (then `codex login` once) or Claude Code. Run
|
|
24
|
-
`gh auth login` once, in any repository: step 10 publishes your app with a pull request. No prior knowledge of ACRYL, Cordis or Blends is needed;
|
|
25
|
-
every new word is explained where it appears.
|
|
26
|
-
|
|
27
|
-
Make a folder and open a terminal in it:
|
|
28
|
-
|
|
29
|
-
```sh
|
|
30
|
-
mkdir ~/acryl-workshop && cd ~/acryl-workshop
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## The path
|
|
34
|
-
|
|
35
|
-
| Minutes | Step | What you get |
|
|
36
|
-
| --- | --- | --- |
|
|
37
|
-
| 0-10 | Before you start | tools installed and checked |
|
|
38
|
-
| 10-15 | 1. Create and run | a blank app answering in a browser |
|
|
39
|
-
| 15-22 | 2. Change one thing | a route of your own, live, without a restart |
|
|
40
|
-
| 22-30 | 3. Tests and the typecheck | the app proves itself |
|
|
41
|
-
| 30-38 | 4. Data: JSON, then SQLite *(optional)* | a counter kept in a file, then in SQL |
|
|
42
|
-
| 38-45 | 5. A desktop window | the same app as a window |
|
|
43
|
-
| 45-53 | 6. Pull a starter from the registry | someone else's app in your folder |
|
|
44
|
-
| 53-60 | 7. Create from a template | the six starters, one table, one run |
|
|
45
|
-
| 60-75 | 8. An agent builds a feature | your app changed by the agent, still running |
|
|
46
|
-
| 75-82 | 9. Upgrade | the app moved to the current framework |
|
|
47
|
-
| 82-90 | 10. Publish it | your app as a registry starter |
|
|
48
|
-
|
|
49
|
-
> **Checkpoint 15 minutes:** your app answers in a browser. Without that, read the "Stuck?" line of step 1.
|
|
50
|
-
> **Checkpoint 45 minutes:** your app is open in a desktop window. Behind? Step 4 is the optional one; skip it and carry on.
|
|
51
|
-
> **Checkpoint 75 minutes:** the agent's page is live. Still waiting? Give it five more minutes, then skip step 9.
|
|
52
|
-
|
|
53
|
-
## 1. Create and run (5 minutes)
|
|
16
|
+
Run this first. It checks everything below and prints one line per check, with the exact command for anything missing:
|
|
54
17
|
|
|
55
18
|
```sh
|
|
56
|
-
|
|
57
|
-
cd my-hero
|
|
58
|
-
npm install
|
|
59
|
-
npm run dev
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
You should see:
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
created my-hero (blank) in /Users/you/acryl-workshop/my-hero: … files, plugins instance, acryl-router, acryl-node-server, manifest, save
|
|
66
|
-
|
|
67
|
-
Next:
|
|
68
|
-
cd my-hero
|
|
69
|
-
npm install
|
|
70
|
-
npm run dev
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
then, from `npm run dev`:
|
|
74
|
-
|
|
19
|
+
npx acrylblends@latest preflight
|
|
75
20
|
```
|
|
76
|
-
my-hero listening on http://127.0.0.1:3080 (data in /Users/you/acryl-workshop/my-hero/.acrylblends)
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
Open that address: `{"app":"my-hero","ok":true}`. `/health` answers `{"ok":true}` too. Leave the terminal running.
|
|
80
21
|
|
|
81
|
-
|
|
82
|
-
|
|
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
|
|
23
|
+
first blocks do without.
|
|
83
24
|
|
|
84
|
-
|
|
25
|
+
| | macOS | Windows | Linux |
|
|
26
|
+
| --- | --- | --- | --- |
|
|
27
|
+
| Node.js 22.19 or newer (24 and 26 work) | `node -v` | `node -v` | `node -v` |
|
|
28
|
+
| git | `git --version` | `git --version` | `git --version` |
|
|
29
|
+
| one coding agent, logged in | `codex login status` or `claude --version` or `pi --version` | same | same |
|
|
30
|
+
| GitHub account and `gh`, for the last block | `gh auth status` | same | same |
|
|
85
31
|
|
|
86
|
-
|
|
87
|
-
|
|
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
|
|
33
|
+
login` once), and one agent:
|
|
88
34
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
35
|
+
- **Claude Code**: <https://claude.com/claude-code>, then run `claude` once to log in.
|
|
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
|
|
37
|
+
your account supports (`/model` inside codex, or `model = "..."` in `~/.codex/config.toml`).
|
|
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)`.
|
|
92
40
|
|
|
93
|
-
|
|
94
|
-
|
|
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-...` |
|
|
95
44
|
|
|
96
|
-
**
|
|
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.
|
|
97
47
|
|
|
98
|
-
|
|
48
|
+
No prior knowledge of ACRYL, Cordis or Blends is needed; every new word is explained where it appears.
|
|
99
49
|
|
|
100
|
-
|
|
50
|
+
Make the workshop folder:
|
|
101
51
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
`npm test` ends with `ℹ pass 5`, `ℹ fail 0`. `npm run check` prints nothing when the types are clean.
|
|
52
|
+
| macOS and Linux | Windows PowerShell | Windows cmd.exe |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| `mkdir ~/acryl-workshop && cd ~/acryl-workshop` | `mkdir ~/acryl-workshop` then `cd ~/acryl-workshop` | `mkdir %USERPROFILE%\acryl-workshop` then `cd %USERPROFILE%\acryl-workshop` |
|
|
108
55
|
|
|
109
|
-
|
|
110
|
-
|
|
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
|
|
57
|
+
them with `;`. PowerShell 7 (`pwsh`) accepts `&&`. In cmd.exe, `Ctrl-C` asks `Terminate batch job (Y/N)?`: answer `Y`.
|
|
111
58
|
|
|
112
|
-
**
|
|
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.
|
|
113
62
|
|
|
114
|
-
##
|
|
63
|
+
## The path
|
|
115
64
|
|
|
116
|
-
|
|
65
|
+
| Minutes | Block | What you get |
|
|
66
|
+
| --- | --- | --- |
|
|
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)
|
|
117
82
|
|
|
118
83
|
```sh
|
|
119
|
-
|
|
84
|
+
npm create acrylblends@latest my-app agent
|
|
85
|
+
cd my-app
|
|
120
86
|
npm install
|
|
87
|
+
npm run dev
|
|
121
88
|
```
|
|
122
89
|
|
|
123
|
-
`
|
|
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:
|
|
124
92
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
- id: kv
|
|
129
|
-
name: acryl-kv-json
|
|
130
|
-
```
|
|
93
|
+
```text
|
|
94
|
+
acrylblends host: http://127.0.0.1:3489/?token=...
|
|
95
|
+
```
|
|
131
96
|
|
|
132
|
-
|
|
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.
|
|
133
99
|
|
|
134
|
-
|
|
135
|
-
import * as kvJson from '../plugins/acryl-kv-json/src/index.ts'
|
|
136
|
-
```
|
|
100
|
+

|
|
137
101
|
|
|
138
|
-
|
|
139
|
-
export const registry = { 'acryl-router': router, 'acryl-node-server': nodeServer, 'acryl-kv-json': kvJson, routes }
|
|
140
|
-
```
|
|
102
|
+
The three columns are ACRYL's IDE:
|
|
141
103
|
|
|
142
|
-
|
|
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.
|
|
143
108
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
```
|
|
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.
|
|
147
111
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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`.
|
|
151
115
|
|
|
152
|
-
|
|
153
|
-
.get('/hello', async (c) => {
|
|
154
|
-
const visits = await ctx.kv.update('visits', (n) => (n ?? 0) + 1)
|
|
155
|
-
return c.json({ hello: 'workshop', visits })
|
|
156
|
-
})
|
|
157
|
-
```
|
|
116
|
+
## 2. Your first change, seen at /app (5 minutes)
|
|
158
117
|
|
|
159
|
-
|
|
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`).
|
|
160
120
|
|
|
161
|
-
The
|
|
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:
|
|
162
123
|
|
|
163
124
|
```sh
|
|
164
|
-
|
|
165
|
-
mkdir migrations
|
|
166
|
-
printf 'CREATE TABLE visits (id INTEGER PRIMARY KEY, at TEXT NOT NULL);\n' > migrations/001-visits.sql
|
|
167
|
-
npm install
|
|
125
|
+
npm run dev
|
|
168
126
|
```
|
|
169
127
|
|
|
170
|
-
|
|
171
|
-
|
|
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.
|
|
172
130
|
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
const projectRoot = fileURLToPath(new URL('..', import.meta.url))
|
|
177
|
-
// in the compose options next to server:
|
|
178
|
-
db: { migrations: join(projectRoot, 'migrations') },
|
|
131
|
+
```sh
|
|
132
|
+
npm test
|
|
133
|
+
npm run check
|
|
179
134
|
```
|
|
180
135
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
and the migrations run at start, in order.
|
|
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.
|
|
184
138
|
|
|
185
|
-
**Stuck?**
|
|
186
|
-
|
|
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.
|
|
187
142
|
|
|
188
|
-
##
|
|
143
|
+
## 3. Connect your model: Settings > Models (5 minutes)
|
|
189
144
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
npm run desktop
|
|
194
|
-
```
|
|
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.
|
|
195
148
|
|
|
196
|
-
|
|
197
|
-
and the window's browser data stays inside `my-hero/.acrylblends/electron`. Close the window when you are done (`Cmd-Q`, `Alt-F4`).
|
|
149
|
+

|
|
198
150
|
|
|
199
|
-
|
|
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.
|
|
200
153
|
|
|
201
|
-
|
|
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.
|
|
202
156
|
|
|
203
|
-
|
|
204
|
-
|
|
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.
|
|
205
159
|
|
|
206
|
-
|
|
207
|
-
cd ~/acryl-workshop
|
|
208
|
-
npm create acrylblends@latest from-the-registry -- --from <starter-id>
|
|
209
|
-
cd from-the-registry
|
|
210
|
-
npm install
|
|
211
|
-
npm run dev
|
|
212
|
-
```
|
|
160
|
+
## 4. Chat: your model works on the app (20 minutes)
|
|
213
161
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
`Next:` block asks for the same `npm install` as step 1.
|
|
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:
|
|
217
164
|
|
|
218
|
-
|
|
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.
|
|
219
169
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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**.
|
|
223
173
|
|
|
224
|
-
|
|
174
|
+

|
|
225
175
|
|
|
226
|
-
|
|
227
|
-
ACRYL app starter: open it in the ACRYL app`) and then npm's own error block; read the first lines, not the last.
|
|
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.
|
|
228
177
|
|
|
229
|
-
|
|
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".
|
|
230
180
|
|
|
231
|
-
|
|
181
|
+
## 5. A coding agent in a terminal tab (15 minutes)
|
|
232
182
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
| `blank` | the router, the server and one route: what you just built |
|
|
236
|
-
| `nodejs` | a page rendered with JSX and a client component, without a bundler |
|
|
237
|
-
| `notes` | a multi-user notes app on the `db` port: sign-up, sessions, migrations, search, a typed client |
|
|
238
|
-
| `chat` | an answer streamed over server-sent events from an OpenAI-compatible API, history in SQLite |
|
|
239
|
-
| `todo` | a to-do list on the router and live state |
|
|
240
|
-
| `agent` | the blank app with an offline agent that writes and installs plugins into the running app |
|
|
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:
|
|
241
185
|
|
|
242
|
-
|
|
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.
|
|
243
188
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
npm create acrylblends@latest notes-app notes
|
|
247
|
-
cd notes-app && npm install
|
|
248
|
-
npx acrylblends add desktop && npm install && npm run desktop
|
|
249
|
-
```
|
|
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.
|
|
250
191
|
|
|
251
|
-
|
|
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.
|
|
252
195
|
|
|
253
|
-
**Stuck?**
|
|
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.
|
|
254
198
|
|
|
255
|
-
##
|
|
199
|
+
## 6. Upgrade an older app onto the frame (10 minutes)
|
|
256
200
|
|
|
257
|
-
|
|
258
|
-
|
|
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.
|
|
259
204
|
|
|
260
205
|
```sh
|
|
261
|
-
cd
|
|
262
|
-
|
|
263
|
-
cd agent-app
|
|
264
|
-
npm install
|
|
265
|
-
npx acrylblends add agent-panel driver-pty
|
|
266
|
-
npx acrylblends add desktop
|
|
206
|
+
cd old-app
|
|
207
|
+
npx acrylblends@latest upgrade
|
|
267
208
|
npm install
|
|
268
209
|
npm run dev
|
|
269
210
|
```
|
|
270
211
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
> Add a page at /board that lists the app's tasks, newest first, and a test for it.
|
|
276
|
-
|
|
277
|
-
The agent reads `AGENTS.md`, reads `docs/framework` (which is in your app), edits your files, runs your tests, and the app reloads itself. It takes a
|
|
278
|
-
few minutes; the panel shows each step, and has a stop button. Open `/board` when it is done.
|
|
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.
|
|
279
215
|
|
|
280
|
-
|
|
281
|
-
|
|
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/`).
|
|
282
218
|
|
|
283
|
-
|
|
284
|
-
`node-pty`'s install script, ignore it: prebuilt binaries ship. Only if the panel lists no `pty:` terminal, run `npm approve-scripts node-pty` and
|
|
285
|
-
`npm rebuild node-pty` (the `add` output says the same).
|
|
219
|
+
## 7. Publish it as a starter (10 minutes, take-home)
|
|
286
220
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
Your app carries its framework plugins as source, so a new release moves them in place and leaves your code alone. Run the tool by its full name:
|
|
290
|
-
**`npx acrylblends@latest`**, because an app's own copy of `acrylblends` shadows the bare command and an older copy has no `upgrade` at all.
|
|
221
|
+
Your app already is a starter: `blend.yaml` names it, `plugins/` holds its code.
|
|
291
222
|
|
|
292
223
|
```sh
|
|
293
|
-
cd ~/acryl-workshop
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
224
|
+
cd ~/acryl-workshop
|
|
225
|
+
gh repo fork acryldev/workshop-2026-11-20 --clone
|
|
226
|
+
cd workshop-2026-11-20
|
|
227
|
+
node scripts/make-entry.mjs ../my-app <your-github-login>.my-app --description "the board my agent built"
|
|
228
|
+
git add blends && git commit -m "add <your-github-login>.my-app"
|
|
229
|
+
git push
|
|
230
|
+
gh pr create --fill --repo acryldev/workshop-2026-11-20
|
|
297
231
|
```
|
|
298
232
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
`everything is up to date`: that is the mechanism working, and an app made by an earlier release lists what it would move. Your tests still pass
|
|
302
|
-
afterwards.
|
|
303
|
-
|
|
304
|
-
## 10. Publish it, and the hero moment (8 minutes)
|
|
305
|
-
|
|
306
|
-
The app you publish is `agent-app`, the one the agent changed in step 8 (keep `my-hero` too: it is yours, saved the same way). It is already a
|
|
307
|
-
**starter**: `blend.yaml` names it, lists its rows, and `plugins/` holds its code. Two parts make it public: your own copy, then the registry.
|
|
308
|
-
|
|
309
|
-
**Your own copy first.** `npm run save` commits the app and pushes it to its remote (it refuses a file that looks like a secret, and refuses to push a
|
|
310
|
-
private app to a public remote). Create an empty repository on your git host, set it as `origin`, run `npm run save`.
|
|
311
|
-
|
|
312
|
-
**The registry.** Publishing is a pull request to the workshop registry, `github.com/acryldev/workshop-2026-11-20`, and it is four commands.
|
|
313
|
-
|
|
314
|
-
1. Fork and clone it, then let its script build the entry from your app:
|
|
315
|
-
|
|
316
|
-
```sh
|
|
317
|
-
cd ~/acryl-workshop
|
|
318
|
-
gh repo fork acryldev/workshop-2026-11-20 --clone
|
|
319
|
-
cd workshop-2026-11-20
|
|
320
|
-
node scripts/make-entry.mjs ../agent-app <your-github-login>.agent-app --description "the app I built in the workshop"
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
`make-entry` copies the app into `blends/<your-github-login>.agent-app/` without `node_modules`, `.git` or the app's data, marks its `blend.yaml`
|
|
324
|
-
public and licensed under that id, and writes the `acryl.template.json` that makes it pullable. The entry is the whole app: its dependencies come with
|
|
325
|
-
it, so whoever pulls it gets the desktop shell without adding it again. The id is lowercase, `<login>.<name>` with letters, digits and dashes.
|
|
326
|
-
|
|
327
|
-
2. Commit, push and open the pull request:
|
|
233
|
+
(On Windows PowerShell 5.1, `cd ~/acryl-workshop` works as written; in cmd.exe use `cd %USERPROFILE%\acryl-workshop`. Type the `git add` and `git
|
|
234
|
+
commit` as two lines, or join them with `;`.)
|
|
328
235
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
git push
|
|
332
|
-
gh pr create --fill --repo acryldev/workshop-2026-11-20
|
|
333
|
-
```
|
|
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
|
|
237
|
+
`npm create acrylblends@latest another-app -- --from <your-github-login>.my-app --registry github:acryldev/workshop-2026-11-20`.
|
|
334
238
|
|
|
335
|
-
|
|
336
|
-
refuses, it comments what to change; fix, commit, push again and it re-checks. To take an app down, open a pull request that removes the folder:
|
|
337
|
-
`git rm -r blends/<your-github-login>.agent-app`.
|
|
239
|
+
**Stuck?** The registry's check comments what to change; fix, commit, push again. `gh auth status` not logged in means `gh auth login`.
|
|
338
240
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
```sh
|
|
342
|
-
npm create acrylblends@latest my-app -- --from <your-github-login>.agent-app --registry github:acryldev/workshop-2026-11-20
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
**Stuck?** The check's comment is the answer: read it, fix, push again. An id with a capital or a dot inside a part is refused by `make-entry`; use
|
|
346
|
-
lowercase `<login>.<name>`. `gh: not found` means the GitHub CLI is not installed, and `gh auth status` saying not logged in means `gh auth login`.
|
|
241
|
+
## Browser only (WebBoxes.ai) TODO(M9)
|
|
347
242
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
> store and a SQLite database. Note what you did not write: the router, the server, the JSON file, the SQLite migrations, the window, the page.
|
|
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.
|
|
351
245
|
|
|
352
246
|
## Where next
|
|
353
247
|
|
|
354
|
-
- **Read the docs you already have**: every app carries `docs/framework`, the same pages as <https://acrylblends.github.io/docs>.
|
|
355
|
-
|
|
356
|
-
- **Swap a provider by editing one row**: SQLite to Postgres
|
|
357
|
-
to another (the panel's driver list).
|
|
358
|
-
- **Teach your agent**: `AGENTS.md` in your app is what it reads first; add your team's conventions there and the next run follows them.
|
|
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.
|
|
359
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.
|
|
360
252
|
|
|
361
|
-
## Browser only (WebBoxes.ai) TODO(M9)
|
|
362
|
-
|
|
363
|
-
No local install? The same app, and the same agent, will run as a hosted workspace: open it in a browser, pick a starter, and work in the same three
|
|
364
|
-
folders. Nothing to install, nothing to keep on your machine.
|
|
365
|
-
|
|
366
|
-
The hosted workspace is milestone M9 and is due before the workshop, so this section is a stub until it is live: write the address, the sign-in it
|
|
367
|
-
needs, and the two or three clicks that replace steps 1-2 here, then let the local steps stand for anyone who wants the app on their own disk.
|
|
368
|
-
|
|
369
253
|
---
|
|
370
254
|
|
|
371
255
|
## If something goes wrong
|
|
372
256
|
|
|
373
257
|
| Symptom | Do |
|
|
374
258
|
| --- | --- |
|
|
259
|
+
| The preflight prints `FIX` lines | run each one, then `npx acrylblends@latest preflight` again |
|
|
375
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 |
|
|
376
262
|
| A port is taken | use the address the app printed |
|
|
377
|
-
| The
|
|
378
|
-
|
|
|
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` |
|
|
269
|
+
| `&&` is an error in PowerShell | Windows PowerShell 5.1: type the two commands as two lines, or join them with `;` |
|
|
379
270
|
| Anything else | the **Stuck?** line of the step, then your facilitator |
|
|
380
|
-
|
|
381
|
-
Behind at a checkpoint? Skip step 4 (data) first, then the second app in step 7. Steps 1-3, 5, 8-10 are the spine.
|