@webship.co/workspace 0.0.0-stage → 1.0.0-alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/PLUGINS.md +249 -0
  2. package/README.md +379 -2
  3. package/WORKSPACES.md +69 -0
  4. package/actions/ai-items.js +293 -0
  5. package/actions/audio.js +48 -0
  6. package/actions/build-order.js +79 -0
  7. package/actions/checks.js +95 -0
  8. package/actions/claude-session.js +104 -0
  9. package/actions/commands-center.js +258 -0
  10. package/actions/composer.js +267 -0
  11. package/actions/ddev-addons.js +90 -0
  12. package/actions/ddev-mail.js +80 -0
  13. package/actions/ddev.js +237 -0
  14. package/actions/folders.js +165 -0
  15. package/actions/graphs.js +107 -0
  16. package/actions/images-svg.js +33 -0
  17. package/actions/images.js +145 -0
  18. package/actions/navigation.js +190 -0
  19. package/actions/node.js +222 -0
  20. package/actions/notes.js +55 -0
  21. package/actions/obsidian.js +59 -0
  22. package/actions/plugins.js +36 -0
  23. package/actions/project-make.js +28 -0
  24. package/actions/rag.js +202 -0
  25. package/actions/row-actions.js +262 -0
  26. package/actions/screens.js +270 -0
  27. package/actions/testing.js +121 -0
  28. package/actions/video-edit.js +54 -0
  29. package/ai-inventory.js +182 -0
  30. package/ai-items.js +202 -0
  31. package/assistant-cast.js +176 -0
  32. package/assistant-suggestions.js +91 -0
  33. package/assistant.js +484 -0
  34. package/audio-voice.js +528 -0
  35. package/auth-google.js +260 -0
  36. package/build-ai.js +52 -0
  37. package/build-order-page.js +191 -0
  38. package/build-order.js +313 -0
  39. package/builder-args.js +117 -0
  40. package/changelog.js +302 -0
  41. package/chat-threads.js +134 -0
  42. package/checks.js +105 -0
  43. package/claude-args.js +282 -0
  44. package/claude-sessions.js +129 -0
  45. package/command-author.js +117 -0
  46. package/command-block.js +20 -0
  47. package/commands/defaults.yml +159 -0
  48. package/commands-page.js +460 -0
  49. package/commands.js +568 -0
  50. package/cucumber.js +43 -0
  51. package/ddev-addons-page.js +124 -0
  52. package/ddev-addons.js +154 -0
  53. package/ddev-custom-commands.js +96 -0
  54. package/ddev-domains.js +84 -0
  55. package/ddev-import.js +93 -0
  56. package/ddev-mail-page.js +167 -0
  57. package/ddev-mail.js +110 -0
  58. package/ddev-options.js +145 -0
  59. package/ddev-snapshots.js +126 -0
  60. package/ddev.js +145 -0
  61. package/docs/DEVELOPER-GUIDE.md +224 -0
  62. package/docs/README.md +252 -0
  63. package/docs/REFERENCE.md +684 -0
  64. package/docs/USER-GUIDE.md +697 -0
  65. package/docs/screenshots/assistant/avatar-board.png +0 -0
  66. package/docs/screenshots/assistant/avatar-coffee.png +0 -0
  67. package/docs/screenshots/assistant/avatar-colours.png +0 -0
  68. package/docs/screenshots/assistant/avatar-icons.png +0 -0
  69. package/docs/screenshots/assistant/avatar-moves.png +0 -0
  70. package/docs/screenshots/assistant/avatar-pick-cookieman.png +0 -0
  71. package/docs/screenshots/assistant/avatar-settings-voices.png +0 -0
  72. package/docs/screenshots/assistant/avatar-status.png +0 -0
  73. package/docs/screenshots/create-card/create-card.png +0 -0
  74. package/docs/screenshots/create-card/start-ai.png +0 -0
  75. package/docs/screenshots/guide-clone-address.png +0 -0
  76. package/docs/screenshots/guide-clone-worktree-off.png +0 -0
  77. package/docs/screenshots/guide-clone-worktree-on.png +0 -0
  78. package/docs/screenshots/guide-ddev-menu.png +0 -0
  79. package/docs/screenshots/guide-domains.png +0 -0
  80. package/docs/screenshots/guide-home.png +0 -0
  81. package/docs/screenshots/guide-ide-menu.png +0 -0
  82. package/docs/screenshots/guide-remove-refusal.png +0 -0
  83. package/docs/screenshots/guide-rows-worktree.png +0 -0
  84. package/docs/screenshots/guide-screens.png +0 -0
  85. package/docs/screenshots/guide-settings.png +0 -0
  86. package/docs/screenshots/guide-workspace-page.png +0 -0
  87. package/docs/screenshots/home/card-settings.png +0 -0
  88. package/docs/screenshots/home/drag-reorder.png +0 -0
  89. package/docs/screenshots/home/edit-card.png +0 -0
  90. package/docs/screenshots/images/claude-code-image.png +0 -0
  91. package/docs/screenshots/images/edit-with-ai.png +0 -0
  92. package/docs/screenshots/images/gallery.png +0 -0
  93. package/docs/screenshots/images/generate-description.png +0 -0
  94. package/docs/screenshots/images/generate-plan.png +0 -0
  95. package/docs/screenshots/images/providers.png +0 -0
  96. package/docs/screenshots/images/svg-form.png +0 -0
  97. package/docs/screenshots/images/svg-result.png +0 -0
  98. package/docs/screenshots/images/upload.png +0 -0
  99. package/docs/screenshots/new-folder/2-form.png +0 -0
  100. package/docs/screenshots/new-folder/8-ddev-options.png +0 -0
  101. package/docs/screenshots/new-folder/files-folder.png +0 -0
  102. package/docs/screenshots/projects/ddev-custom-commands.png +0 -0
  103. package/docs/screenshots/projects/state-chip-stop.png +0 -0
  104. package/docs/screenshots/readme/dashboard-dark.png +0 -0
  105. package/docs/screenshots/readme/dashboard-light.png +0 -0
  106. package/docs/screenshots/readme/dev-dark.png +0 -0
  107. package/docs/screenshots/readme/dev-light.png +0 -0
  108. package/docs/screenshots/readme/docs-dark.png +0 -0
  109. package/docs/screenshots/readme/docs-light.png +0 -0
  110. package/docs/screenshots/readme/icons/ai.svg +4 -0
  111. package/docs/screenshots/readme/icons/code.svg +4 -0
  112. package/docs/screenshots/readme/icons/docs.svg +4 -0
  113. package/docs/screenshots/readme/icons/services.svg +4 -0
  114. package/docs/screenshots/readme/icons/sites.svg +4 -0
  115. package/docs/screenshots/readme/test-report-dark.png +0 -0
  116. package/docs/screenshots/readme/test-report-light.png +0 -0
  117. package/docs/screenshots/readme/test-scenarios.png +0 -0
  118. package/docs/screenshots/readme/test-steps.png +0 -0
  119. package/docs/screenshots/readme/videos-dark.png +0 -0
  120. package/docs/screenshots/readme/videos-light.png +0 -0
  121. package/docs/screenshots/screens-menu.png +0 -0
  122. package/docs/screenshots/screens-new.png +0 -0
  123. package/docs/screenshots/settings/auth-google-lists.png +0 -0
  124. package/docs/screenshots/settings/delete-1-row.png +0 -0
  125. package/docs/screenshots/settings/delete-2-confirm.png +0 -0
  126. package/docs/screenshots/settings/delete-3-type-name.png +0 -0
  127. package/docs/screenshots/settings/delete-4-type-yes.png +0 -0
  128. package/event-log.js +59 -0
  129. package/files-browser.js +247 -0
  130. package/folders.js +121 -0
  131. package/format.js +73 -0
  132. package/git-info.js +81 -0
  133. package/github-auth.js +62 -0
  134. package/graphs.js +104 -0
  135. package/html.js +10 -0
  136. package/icons.js +83 -0
  137. package/images-ai.js +447 -0
  138. package/images-create.js +226 -0
  139. package/images-page.js +417 -0
  140. package/images-records.js +39 -0
  141. package/images-render.js +36 -0
  142. package/images-svg-core.js +214 -0
  143. package/images-svg-sanitize.js +188 -0
  144. package/images-svg.js +241 -0
  145. package/images.js +270 -0
  146. package/jobs.js +430 -0
  147. package/linger.js +21 -0
  148. package/lists.js +292 -0
  149. package/media-info.js +136 -0
  150. package/navigation-page.js +264 -0
  151. package/navigation.js +394 -0
  152. package/notes.js +0 -0
  153. package/obsidian.js +405 -0
  154. package/package.json +47 -4
  155. package/palette-index.js +46 -0
  156. package/playwright.config.js +23 -0
  157. package/plugin-install.js +239 -0
  158. package/plugin-loader.js +448 -0
  159. package/plugin-manifest.js +83 -0
  160. package/plugin-settings.js +44 -0
  161. package/plugins/workspace-notes/index.js +59 -0
  162. package/plugins-page.js +103 -0
  163. package/project-make.js +241 -0
  164. package/project-name.js +210 -0
  165. package/public/assistant-avatar-moves.js +646 -0
  166. package/public/assistant-avatar-ui.js +1223 -0
  167. package/public/assistant-avatar.js +530 -0
  168. package/public/avatar/druplicon.vrm +0 -0
  169. package/public/css/base.css +260 -0
  170. package/public/css/components/ai-assistant.css +263 -0
  171. package/public/css/components/assistant-avatar.css +279 -0
  172. package/public/css/components/assistant-views.css +198 -0
  173. package/public/css/components/build-order.css +74 -0
  174. package/public/css/components/clone-as-a-git-worktree.css +30 -0
  175. package/public/css/components/command-palette.css +61 -0
  176. package/public/css/components/commands-center.css +139 -0
  177. package/public/css/components/confirm-dialog.css +40 -0
  178. package/public/css/components/create-card.css +8 -0
  179. package/public/css/components/ddev-menu.css +23 -0
  180. package/public/css/components/deep-chat.css +17 -0
  181. package/public/css/components/density.css +11 -0
  182. package/public/css/components/floating-assistant-workspace-pages.css +55 -0
  183. package/public/css/components/folders.css +5 -0
  184. package/public/css/components/full-height-left-assistant-sidebar-all-pages.css +39 -0
  185. package/public/css/components/full-height-right-actions-rail-pages-that-have-actions.css +267 -0
  186. package/public/css/components/grid-and-list.css +203 -0
  187. package/public/css/components/help-page.css +36 -0
  188. package/public/css/components/hero.css +16 -0
  189. package/public/css/components/images.css +70 -0
  190. package/public/css/components/layout-rhythm-and-spacing-polish.css +139 -0
  191. package/public/css/components/mic-on-any-field-that-wants-typing.css +416 -0
  192. package/public/css/components/modal-fit.css +113 -0
  193. package/public/css/components/page-width.css +23 -0
  194. package/public/css/components/plugins-page.css +9 -0
  195. package/public/css/components/project-cards.css +256 -0
  196. package/public/css/components/project-rows.css +390 -0
  197. package/public/css/components/reordering-the-workspace-cards.css +85 -0
  198. package/public/css/components/responsive-home-and-the-workspace-pages.css +457 -0
  199. package/public/css/components/running-commands-as-toasts.css +327 -0
  200. package/public/css/components/settings-editor-core-config-yml.css +828 -0
  201. package/public/css/components/short-results-as-a-toast-at-the-top.css +203 -0
  202. package/public/css/components/sound-player.css +84 -0
  203. package/public/css/components/suggest-agents-skills-commands.css +112 -0
  204. package/public/css/components/tab-modal.css +142 -0
  205. package/public/css/components/terminals.css +244 -0
  206. package/public/css/components/test-report-media-one-file-per-row-paged.css +144 -0
  207. package/public/css/components/top-toolbar-logo-breadcrumb.css +107 -0
  208. package/public/css/components/video-edit.css +6 -0
  209. package/public/css/components/web-ide-open-with.css +23 -0
  210. package/public/css/components/working-indicators.css +158 -0
  211. package/public/css/components/workspace-cards.css +79 -0
  212. package/public/favicon.ico +0 -0
  213. package/public/favicon.png +0 -0
  214. package/public/htmx.min.js +1 -0
  215. package/public/logo.png +0 -0
  216. package/public/media-player.js +215 -0
  217. package/public/mic.js +255 -0
  218. package/public/narration.js +110 -0
  219. package/public/palette.js +278 -0
  220. package/public/sortable.js +251 -0
  221. package/public/suggest.js +337 -0
  222. package/public/terminal.js +903 -0
  223. package/public/themes/default/theme.css +267 -0
  224. package/public/themes/ember/theme.css +180 -0
  225. package/public/themes/press/theme.css +290 -0
  226. package/public/themes/slate/theme.css +182 -0
  227. package/public/touch-icon.png +0 -0
  228. package/public/ui.js +2721 -0
  229. package/public/vendor/ace/LICENSE.txt +24 -0
  230. package/public/vendor/ace/ace.js +23 -0
  231. package/public/vendor/ace/ext-language_tools.js +8 -0
  232. package/public/vendor/ace/ext-searchbox.js +8 -0
  233. package/public/vendor/ace/mode-css.js +8 -0
  234. package/public/vendor/ace/mode-html.js +8 -0
  235. package/public/vendor/ace/mode-javascript.js +8 -0
  236. package/public/vendor/ace/mode-markdown.js +8 -0
  237. package/public/vendor/ace/mode-sh.js +8 -0
  238. package/public/vendor/ace/mode-yaml.js +8 -0
  239. package/public/vendor/ace/theme-textmate.js +8 -0
  240. package/public/vendor/ace/theme-tomorrow_night.js +8 -0
  241. package/public/vendor/ace/worker-yaml.js +1 -0
  242. package/public/vendor/deep-chat.LICENSE +21 -0
  243. package/public/vendor/deep-chat.bundle.js +1 -0
  244. package/public/vendor/fonts/dm-serif-text-LICENSE.txt +93 -0
  245. package/public/vendor/fonts/dm-serif-text-latin-400-italic.woff2 +0 -0
  246. package/public/vendor/fonts/dm-serif-text-latin-400-normal.woff2 +0 -0
  247. package/public/vendor/fonts/figtree-LICENSE.txt +93 -0
  248. package/public/vendor/fonts/figtree-latin-400-italic.woff2 +0 -0
  249. package/public/vendor/fonts/figtree-latin-400-normal.woff2 +0 -0
  250. package/public/vendor/fonts/figtree-latin-600-italic.woff2 +0 -0
  251. package/public/vendor/fonts/figtree-latin-600-normal.woff2 +0 -0
  252. package/public/vendor/fonts/jetbrains-mono-LICENSE.txt +93 -0
  253. package/public/vendor/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  254. package/public/vendor/fonts/ubuntu-mono-LICENSE.txt +98 -0
  255. package/public/vendor/fonts/ubuntu-mono-latin-wght-normal.woff2 +0 -0
  256. package/public/vendor/tabler-LICENSE.txt +21 -0
  257. package/public/vendor/tabler-sprite.svg +1 -0
  258. package/public/vendor/three/LICENSE +21 -0
  259. package/public/vendor/three/addons/loaders/GLTFLoader.js +4860 -0
  260. package/public/vendor/three/addons/utils/BufferGeometryUtils.js +1501 -0
  261. package/public/vendor/three/addons/utils/SkeletonUtils.js +496 -0
  262. package/public/vendor/three/three.core.min.js +6 -0
  263. package/public/vendor/three/three.module.min.js +6 -0
  264. package/public/vendor/three-vrm/LICENSE +22 -0
  265. package/public/vendor/three-vrm/three-vrm.module.min.js +983 -0
  266. package/public/vendor/uikit-icons.min.js +1 -0
  267. package/public/vendor/uikit.min.css +1 -0
  268. package/public/vendor/uikit.min.js +1 -0
  269. package/public/vendor/webship-icons/ui/bookmark-outlined.svg +1 -0
  270. package/public/vendor/webship-icons/ui/headset.svg +1 -0
  271. package/public/vendor/webship-icons/ui/menu.svg +1 -0
  272. package/public/vendor/webship-icons/ui/pause.svg +1 -0
  273. package/public/vendor/webship-icons/ui/play.svg +1 -0
  274. package/public/vendor/webship-icons/ui/share.svg +1 -0
  275. package/public/vendor/webship-icons/ui/sound-off.svg +1 -0
  276. package/public/vendor/webship-icons/ui/sound-on.svg +1 -0
  277. package/public/vendor/webship-icons/ui/stop.svg +1 -0
  278. package/public/vendor/xterm/addon-fit.js +2 -0
  279. package/public/vendor/xterm/addon-unicode11.js +2 -0
  280. package/public/vendor/xterm/addon-web-links.js +2 -0
  281. package/public/vendor/xterm/xterm.css +218 -0
  282. package/public/vendor/xterm/xterm.js +2 -0
  283. package/rag.js +169 -0
  284. package/reader.js +132 -0
  285. package/repo-blobs.js +66 -0
  286. package/report-pdf.js +337 -0
  287. package/row-layout.js +1440 -0
  288. package/screenrc +37 -0
  289. package/screens.js +1063 -0
  290. package/scripts/code-server-start.sh +190 -0
  291. package/scripts/images-claude-finish.js +107 -0
  292. package/scripts/screen-host.sh +114 -0
  293. package/scripts/screen-runner.js +362 -0
  294. package/scripts/screen-then.js +47 -0
  295. package/scripts/update.sh +350 -0
  296. package/server.js +8140 -0
  297. package/settings-file.js +423 -0
  298. package/speech.js +297 -0
  299. package/tab-modal.js +75 -0
  300. package/test-reports.js +260 -0
  301. package/themes.js +381 -0
  302. package/transcripts.js +168 -0
  303. package/urls.js +13 -0
  304. package/validate.js +18 -0
  305. package/version-check.js +94 -0
  306. package/video-edit.js +588 -0
  307. package/waiting.js +85 -0
  308. package/workspace-card-tools.js +41 -0
  309. package/workspace-delete.js +139 -0
  310. package/workspace-types.js +85 -0
  311. package/workspaces.js +557 -0
@@ -0,0 +1,697 @@
1
+ # Webship Workspace — the guide
2
+
3
+ This is the guide for **using** the workspace. The `README.md` beside it explains how the tooling is
4
+ built; you do not need that to do your job here.
5
+
6
+ Everything below has been done on a real machine. Where something needs a person — a password, a
7
+ browser login, a decision — it says so rather than pretending it is automatic.
8
+
9
+ ---
10
+
11
+ ## What this is, in two sentences
12
+
13
+ One machine that builds and runs Drupal sites — Webship, Drupal, Drupal CMS, and Webship's site
14
+ templates — each in its own DDEV container, with nothing installed on your host but Docker and DDEV.
15
+ A web dashboard drives all of it, so building a site, opening it, backing it up and throwing it away
16
+ are buttons rather than remembered commands.
17
+
18
+ ---
19
+
20
+ ## Day one
21
+
22
+ **1. Get the files.** Download the `1.0.x` branch of `webship/workspace` as a ZIP, unzip it, and rename
23
+ the folder so you have `~/workspace`.
24
+
25
+ **2. Install.**
26
+
27
+ ```bash
28
+ bash ~/workspace/core/scripts/install.sh
29
+ ```
30
+
31
+ That is the only installer. It is safe to run again at any time, and `--check` reports without
32
+ changing anything. Read what it prints at the end — every step it could not finish for you is listed
33
+ there with the command that finishes it.
34
+
35
+ **3. Log out and back in.** Not optional, and not the installer being lazy: it added you to the
36
+ `docker` group, and a group only applies at login. Until you do, everything fails with
37
+ `permission denied … docker.sock`.
38
+
39
+ **4. Start the dashboard.**
40
+
41
+ ```bash
42
+ cd ~/workspace/core/workspace-app && ddev start
43
+ ```
44
+
45
+ **5. Open <https://workspace.ddev.site>.**
46
+
47
+ ![The home page](screenshots/guide-home.png)
48
+
49
+ If the browser refuses the page (`ERR_CERT_AUTHORITY_INVALID`), run
50
+ `bash ~/workspace/core/scripts/trust-https.sh` and then **fully restart the browser** — a browser
51
+ reads its trust store once, at startup, so a reload will not do it.
52
+
53
+ ---
54
+
55
+ ## The home page
56
+
57
+ Every workspace has a card, and every card has two tools in its corner, as the project cards do:
58
+
59
+ - **Edit** (the pencil) changes the card's icon and description, in a window over the page. It writes
60
+ `presentation:` in that workspace's own settings file, so the rail shows the same.
61
+ - **Settings** (the gear) opens that workspace's settings file, with every other settings file as a tab
62
+ down the left.
63
+
64
+ At five or six cards across the tools show when you point at a card.
65
+
66
+ ![Edit the Dev card](screenshots/home/edit-card.png)
67
+
68
+ ![A workspace's settings, opened from its card](screenshots/home/card-settings.png)
69
+
70
+ **Drag a card to change the order.** The card lifts and follows the pointer, the others slide out of its
71
+ way, and the page scrolls when you reach its top or bottom edge. Let go and the new order is saved, with
72
+ nothing redrawn; **Escape** while dragging puts it back. With the keyboard, focus a card and press **Alt**
73
+ with an arrow key. On a touch screen, drag by the handle so the page still scrolls. The order is the
74
+ `workspaces:` list in `core/config/settings.yml`, and that list in Settings drags the same way.
75
+
76
+ ![Dragging the Test card to a new place](screenshots/home/drag-reorder.png)
77
+
78
+ ---
79
+
80
+ ## The five things you will actually do
81
+
82
+ ### Build a site
83
+
84
+ On any workspace page — **Dev**, **Test**, **Demos**, **Sandboxes** — the top of the page has a
85
+ build form: pick what to build, type a name, press the button. It runs in the background and you can
86
+ close the tab.
87
+
88
+ ![A workspace page](screenshots/guide-workspace-page.png)
89
+
90
+ Names are lowercase letters and digits. Keep them short; you will type them again. Picking a builder
91
+ proposes a name for you, such as `d11x00b1` for the first Drupal 11 build.
92
+
93
+ The list is mostly Webship, Drupal, Drupal CMS and the site templates. At its end, in dev, test and
94
+ sandboxes, are example builders for **WordPress (latest)**, **WordPress on Composer (Bedrock)** and
95
+ **Odoo 20 Community**.
96
+
97
+ ### What would you like to create?
98
+
99
+ On a workspace of projects, the card at the top is **What would you like to create?**: build a project
100
+ from a builder, or make a **New folder** with the button on its right.
101
+
102
+ ![What would you like to create?](screenshots/create-card/create-card.png)
103
+
104
+ ### Start AI when the build finishes
105
+
106
+ Under the build row, tick **Start AI** and say what it should do. The Claude Code options are the ones
107
+ **New screen** offers: model, permission mode, effort, an **agent** from the ones installed on this
108
+ machine, and every other option under *All Claude Code options*. Claude Code starts in the new project as
109
+ its own session, only if the build succeeds, and after the install when **Install** is ticked. Watch and
110
+ answer it on **Screens**.
111
+
112
+ ![Start AI](screenshots/create-card/start-ai.png)
113
+
114
+ ### Start from an empty folder
115
+
116
+ Not everything starts from a builder. **New folder**, in *What would you like to create?* on a
117
+ workspace page (and in the side rail), makes an empty folder that is listed with the projects. Give it
118
+ a name and, if you like, a line about what it is for; it becomes the folder's note.
119
+
120
+ You can also set it up and connect it in the same step:
121
+
122
+ - **Configure DDEV**, so the folder can start. Pick a **DDEV quickstart** (TYPO3, Laravel, Symfony,
123
+ Craft CMS, Shopware 6, Magento 2, Joomla, Backdrop, CakePHP, CodeIgniter, Statamic, Wagtail, Node.js,
124
+ WordPress and the rest of the DDEV docs) to fill the fields, then change any of them: project type
125
+ (every type DDEV supports), docroot, PHP 5.6 to 8.5, database (MariaDB, MySQL or Postgres, every
126
+ version DDEV supports), web server, Node.js version, Composer version, no database container, and
127
+ Python. DDEV has no Python version setting; the Python option adds pip and venv to the web image.
128
+ The row's **Configure DDEV** offers the same fields, starting from what the project uses.
129
+
130
+ ![DDEV options](screenshots/new-folder/8-ddev-options.png)
131
+ - **Set up `webship-js` testing** (Playwright and Cucumber). It configures DDEV first, then
132
+ installs the package and the browser, and the row's **Tests** menu can run the suite.
133
+ - **Create a Jira workitem for it with AI**, written from "What is it for?", in your default Jira project.
134
+ - **Upsun**: link it to an existing project by its id, or create a new project and deploy it with AI.
135
+ Creating one costs money, so Claude Code asks you for the organization, region and plan first.
136
+
137
+ The setup runs as one screen session, in that order. The AI tasks run in a Claude Code session in the
138
+ folder, with your own first message after them. Then choose what happens next: nothing, a terminal in
139
+ it, or Claude Code in it.
140
+
141
+ ![New folder](screenshots/new-folder/2-form.png)
142
+
143
+ The folder's row works like any project without DDEV: **Screens**, **Claude Code here**, **IDE**,
144
+ **GIT** (`git init` included), the note, and every command that runs on a project or a folder. If it
145
+ grows into a site, **Configure DDEV** on the row sets it up.
146
+
147
+ In a files workspace (Docs, Specs, Designs, Images, Videos, Audio), **New folder** is in *What would you
148
+ like to create?* and the side rail too. It makes the folder inside the one you are looking at, takes a
149
+ readable name (capitals, spaces and dots are fine), and the optional note; there is nothing to set up.
150
+
151
+ ![New folder in a docs folder](screenshots/new-folder/files-folder.png)
152
+
153
+ ### Open it
154
+
155
+ Each project row has **Launch**. A project has two addresses and both work:
156
+
157
+ - `https://<project>.ddev.site` — the canonical one DDEV gives it
158
+ - `https://<project>.<workspace>.workspace.ddev.site` — the hierarchical one the dashboard hands out
159
+
160
+ ### Start, stop, back up, remove
161
+
162
+ **The state on the card is the switch.** Click **Stopped** or **Paused** to start the project, and
163
+ **Running** to stop it (that one asks first). Pointing at it shows the word it will do: Start or Stop.
164
+
165
+ ![Pointing at Running shows Stop](screenshots/projects/state-chip-stop.png)
166
+
167
+ Everything else is in the **DDEV** menu on the row. Backups land in `~/workspace/backups/<workspace>/`
168
+ and appear on that workspace's **Backups** page.
169
+
170
+ ![The DDEV menu](screenshots/guide-ddev-menu.png)
171
+
172
+ The menu also lists what the project itself defines, each in its own group that folds open:
173
+ **Custom commands** (the `ddev` commands in its `.ddev/commands/`), **composer.json scripts** and
174
+ **package.json scripts**. Each runs in a screen session, like the rest of the menu.
175
+
176
+ ![The project's own DDEV commands](screenshots/projects/ddev-custom-commands.png)
177
+
178
+ **The assistant can be shown four ways.** The ✨ switch at the left of the toolbar shows and hides it —
179
+ closed, the page has the whole width. Its header menu (⋮) offers **Sidebar** (the column it starts as),
180
+ **Wide** (the same column doubled, for a long answer), **Floating** (a button in the corner, the panel
181
+ over the page) and **Full page** (`/assistant`, the whole width). The › button beside the menu is the
182
+ same as Wide, one click. Your choice is remembered in this browser; `style: assistant_view:` in
183
+ `settings.yml` sets what everyone starts with.
184
+
185
+ **The conversation follows you.** Ask the assistant something on `/dev`, move to `/test` or let it take
186
+ you there, and the chat is still there — and so is what it remembers, because it picks its own session
187
+ back up rather than starting over. **New chat** in the panel header ends one and starts another; it asks
188
+ first, and what the assistant remembered of that conversation goes with it.
189
+
190
+ **Every important action asks first.** Delete, Remove, Drop the database, resetting the buttons to
191
+ their defaults and any command marked as asking all open the same dialog — *Wait! Are you sure you
192
+ want to proceed with this action?* — with the action and what it belongs to named under it. **No**
193
+ does nothing, and so do Escape, the ✕ and clicking outside it; only **Yes** goes through.
194
+
195
+ **Remove spells it out and asks for the name.** **DDEV → Remove the project…** lists what goes (the
196
+ DDEV project with its database, and the folder), offers to back up the database first, says when the
197
+ project holds commits that are on no remote or uncommitted changes, and keeps its button off until you
198
+ type the project's name exactly. Deleting the folder by hand is not the same thing — it leaves the
199
+ database volume, the snapshots and the built images behind, invisible until your disk is full. Use the
200
+ button, or `cmd-tools-remove.sh`.
201
+
202
+ ![Remove names what goes, and warns about unpushed work](screenshots/guide-remove-refusal.png)
203
+
204
+ ### Copy one, or branch one
205
+
206
+ ![The clone form, with the worktree option](screenshots/guide-clone-worktree-on.png)
207
+
208
+ **Clone** on the row makes a second working project from an existing one. Two shapes, and the form
209
+ asks which:
210
+
211
+ - **A copy** (the default) — the files are copied and the database travels through a dump, so the two
212
+ projects share nothing and can diverge for ever. Use it when they are two different sites.
213
+ - **A git worktree** — offered only when the project is a git checkout. One shared `.git` and one
214
+ history, a branch per folder, and still its own DDEV project at its own URL with its own database.
215
+ Use it when they are two branches of the same work: reviewing somebody's merge request beside your
216
+ own build, both running at once, without a second clone of a repository whose history is often
217
+ larger than the checkout.
218
+
219
+ The clone name becomes the DDEV project name, so `ace_editor-copy` answers at
220
+ `https://ace_editor-copy.ddev.site`. On the worktree path the **folder** is what names the project —
221
+ that is why the branch you pick and the folder you get are separate fields.
222
+
223
+ The git-ignored build (`vendor/`, contrib, the files directory, `settings.local.php`) is copied into
224
+ the worktree, because git does not carry it and a worktree without it is a source tree rather than a
225
+ running site.
226
+
227
+ **Removing them is guarded**, because two of the three ways to do it destroy work silently:
228
+
229
+ - Removing the **main checkout** while worktrees still live off it is **refused**, and the reason lists
230
+ them. Its `.git` is the only copy of the repository those folders have; deleting it leaves each of
231
+ them files with no branch, no history and nothing to push.
232
+ - Removing anything holding **commits that are on no remote**, or uncommitted changes, is **refused**
233
+ and the count is shown. Push it, or say explicitly that you want it gone.
234
+ - Removing a worktree normally also **prunes its registration** in the main checkout, so a later
235
+ clone to the same folder is not refused by git.
236
+
237
+ Both refusals are overridden the same way: tick the extra box in the Remove dialog, or pass `--force`.
238
+ Nothing is deleted before the check runs.
239
+
240
+ `git worktree remove` by hand does none of this — it will delete a worktree that holds unpushed
241
+ commits. Use the row's **Remove** button, or `cmd-tools-remove.sh`.
242
+
243
+ Each row says what it is: **worktree · `<branch>`**, or **main checkout · N worktree(s)**.
244
+
245
+ From the command line, in the workspace folder:
246
+
247
+ ```bash
248
+ bash cmd-tools-clone.sh <project> --to <name> # a copy
249
+ bash cmd-tools-clone.sh <project> --to <name> --worktree # a worktree, branch <name>
250
+ bash cmd-tools-clone.sh <project> --to <name> --worktree --branch 3512345-the-fix
251
+ ```
252
+
253
+ ### Give it another address
254
+
255
+ A project's URL comes from its DDEV **name**, so `blog2` answers at `https://blog2.ddev.site`, and the
256
+ dashboard hands out `https://blog2.dev.workspace.ddev.site` as well. **DDEV → Domains this answers at…**
257
+ shows everywhere a project answers, and adds another: any flat hostname you like, or the one it
258
+ suggests, `<project>-<workspace>.ddev.site`.
259
+
260
+ ![The domains dialog](screenshots/guide-domains.png)
261
+
262
+ It **adds**, never renames: the canonical address keeps working, nothing is rebuilt, and every link
263
+ already written down stays valid. A new address reaches the router when the project next starts, so the
264
+ dialog offers to do that. Two projects cannot share a hostname (the router would give it to whichever
265
+ started last), so trying is refused with the name of the one that already has it. The clone form offers
266
+ the same for the copy it is about to make, and so does the command line:
267
+
268
+ ```bash
269
+ bash cmd-tools-hostnames.sh # every project here, and its addresses
270
+ bash cmd-tools-hostnames.sh blog2 --with-workspace --start # blog2-dev.ddev.site
271
+ bash cmd-tools-hostnames.sh blog2 --add staging --start
272
+ bash cmd-tools-hostnames.sh blog2 --remove staging
273
+ ```
274
+
275
+ ### Work on the code
276
+
277
+ The **IDE** menu on the row, right after JIRA and followed by **GIT**:
278
+
279
+ - **Web IDE** — VS Code in your browser, opened on that project. Works from any device, needs
280
+ nothing installed.
281
+ - **Visual Studio Code** / **IntelliJ IDEA** — opens the project in the editor on *your own machine*.
282
+ Needs that editor's URL handler; if nothing happens, use **Copy the path** and open it from a
283
+ terminal.
284
+
285
+ The Web IDE has a terminal (`Terminal → New Terminal`), and its terminal dropdown offers **Claude
286
+ Code** — the same agents and skills you have on the command line, already loaded.
287
+
288
+ The **COMPOSER** menu, right after SCREENS, is on every folder that has a `composer.json`. What it
289
+ offers depends on the workspace.
290
+
291
+ In **dev**, **test**, **demos**, **sandboxes** and **projects** (the sites) it is the full menu:
292
+
293
+ - **Daily** — first, because they are what you run every day: install, update, outdated and validate.
294
+ - **Inspect** — `update --dry-run` to see what an update would do, show (direct or as a tree),
295
+ audit, platform requirements and licenses.
296
+ - **Maintenance** — `update --lock` and `dump-autoload -o`.
297
+ - **A package** — type `vendor/name` (with `:^1.0` for require) and pick require, update -W,
298
+ remove, require --dev or why.
299
+ - **Scripts in composer.json** — the folder's own scripts, with their aliases. Event hooks
300
+ (`post-update-cmd` and the like) are not listed: they run by themselves.
301
+
302
+ Everywhere else (**products**, **modules**, **themes**, **recipes**, **profiles**: package clones, not
303
+ sites) the menu never installs. It only adds to `composer.json`: **require**, **require --dev** and
304
+ **remove** run with `--no-update`, which changes that one file and nothing else. It also offers
305
+ **validate** and links to edit the file. A workspace chooses with `composer: full` or
306
+ `composer: manifest` in its own settings file, and manifest is the default.
307
+
308
+ Every command runs in a screen session, and the toast at the top opens it. A DDEV project runs
309
+ `ddev composer`; any other folder runs composer in the dashboard's own DDEV container. Clicking a
310
+ command whose run is still going leaves that run alone and links to it.
311
+
312
+ The **NODE** menu, right after COMPOSER, is on every folder that has a `package.json`, in every
313
+ workspace. It opens on a **yarn | npm** switch, and each side says whether its lock file
314
+ (`yarn.lock`, `package-lock.json`) is there. It starts on the one the project uses: its
315
+ `packageManager` pin, else its lock file. If the project pins yarn, the npm side warns that running
316
+ npm there would write a second lock file.
317
+
318
+ - **Daily**: install, install from the lock (`npm ci`, `yarn install --frozen-lockfile`, or
319
+ `--immutable` on Yarn 2+), outdated (`yarn upgrade-interactive` on Yarn 2+) and audit.
320
+ - **Inspect**: the direct dependencies and the version.
321
+ - **Maintenance**: update, dedupe and the cache.
322
+ - **A package**: type `name`, `@scope/name` or `name@^1.0` and pick add, upgrade, remove,
323
+ add --dev or why.
324
+ - **Scripts in package.json**: run with `npm run` or `yarn run`. Lifecycle hooks are not listed.
325
+
326
+ It runs like COMPOSER: in a screen session, as `ddev npm` / `ddev yarn` in a DDEV project, and in the
327
+ dashboard's DDEV container anywhere else (`corepack yarn` when the project pins a Yarn version).
328
+
329
+ ### Run any command on anything
330
+
331
+ **Commands**, in the rail, lists every command the dashboard can run and what each one runs on: a
332
+ workspace folder, a project, a folder or a file. The built-in commands ship with the dashboard, yours are
333
+ kept in `core/config/commands.yml`, and every `cmd-*.sh` in the tree is listed as a script.
334
+
335
+ - **Run** asks where: a workspace, then a project, then a folder or a file. The path box suggests names
336
+ as you type. The command runs in a screen session, like everything else.
337
+ - **New** adds a command: a command line, or a script with its arguments. `{{project}}`, `{{file}}` and
338
+ the other values are filled in and quoted for you. A line cannot contain `$` or a backtick.
339
+ - **Edit** a built-in command, and your version takes its place; delete yours and the built-in one is
340
+ back. Built-in commands cannot be deleted, but they can be copied.
341
+ - **On buttons**, on a command's page, lists the buttons it is on; **Add to a button** puts it on
342
+ another, where it runs on the row's project. A command a button uses cannot be deleted until it is
343
+ taken off.
344
+ - **Definition** is your commands as YAML. **Check** says what loading it would change, and saves nothing.
345
+
346
+ ### Arrange the row
347
+
348
+ **Action buttons** in the rail, on any page — or **Commands → Buttons** — is rows management for every project
349
+ row. With
350
+ nothing changed, the row is exactly as it has always been.
351
+
352
+ **Rows** — the rows of buttons, top to bottom:
353
+
354
+ - **Add a row**, move one up or down, or remove it (its buttons move to the row above). The first row
355
+ sits beside the running and test badges.
356
+ - **Buttons**: drag one to another row, or pick its row, or put it in **Hidden**.
357
+ - **Open a button** to arrange what is inside it. Drag its groups, and the commands inside a group,
358
+ into the order you want, and tick a group or command to hide it. Each command also has ↑ ↓ arrows,
359
+ for a phone or a keyboard where dragging is awkward. The dashboard's own commands are marked
360
+ **built in**: they can be moved and hidden, never deleted.
361
+ - **Add an action** right inside the button: a label, its group, which folders it shows on, one
362
+ command per line, and whether it keeps going after a failed step, asks before running, and opens
363
+ **a toast** linking to its session or **its screen** straight away. Your actions can be edited and
364
+ deleted in place.
365
+ - **Use a command** from Commands instead of typing it: pick it in the box, or write a step as
366
+ `use: <command id>`. It runs on the row's project, asks for its options, and keeps its own filter of
367
+ which folders it is for. A command picked alone becomes the whole action, with its name and group.
368
+ - **Add a button** makes a menu of your own, starting with its first action.
369
+
370
+ Nothing is kept until **Save**, which stays at the bottom of the screen while you scroll. Once you
371
+ change something the bar says **Unsaved changes**, and the browser asks before you leave the page.
372
+ Saving keeps the buttons you had open and your place on the page.
373
+
374
+ **Activity** lists the last runs of your actions, newest first, with how each ended (succeeded,
375
+ failed, or which step failed), and a link to a run still going.
376
+
377
+ **Definition** is the whole file as YAML: copy it to keep or share it, or paste one in. **Check** says
378
+ what would change and saves nothing. Loading can replace the whole file, or take only its actions and
379
+ skip or update an id that already exists. An empty paste is refused (Reset to the defaults is the way
380
+ back), and so is a definition too large or too deeply nested to be a layout. It also has an example of
381
+ an action with every field, borrowed from Rundeck's job model:
382
+
383
+ - **Steps** can have an `on_error` step that runs when that step fails.
384
+ - **Options** are asked for in a form before it runs. A value goes into a step as `{{opt.name}}`,
385
+ checked against its allowed values or pattern, and quoted.
386
+ - **`when`** is a filter where every clause must match, for example
387
+ `[ddev, composer, "!workspace:products"]`.
388
+
389
+ An action runs in the project's folder, on this machine, so use `ddev …` for anything inside a site. A
390
+ command cannot contain `$` or a backtick; use an option for a value. Everything is kept in
391
+ `core/config/row-actions.yml`, and **Reset to the defaults** (in Definition) puts it all back. Hiding
392
+ only takes a command out of the menu; it does not switch the command off.
393
+
394
+ ### End Claude Code, and pick it up again
395
+
396
+ A screen running Claude Code offers **Exit Claude Code (/exit)**, in the card's **SCREENS** menu and on
397
+ **Screens**. It asks first, then closes any question Claude has open, types `/exit` and presses Enter, so
398
+ Claude ends the way it would if you typed it, and the conversation is kept. When no Claude Code runs in a
399
+ project or folder that has one, the same menu offers **Resume Claude Code**, which resumes the last conversation
400
+ with `claude --resume` in that folder.
401
+
402
+ ![The SCREENS menu on a card: its sessions, Resume Claude Code, New screen here and Claude Code here](screenshots/screens-menu.png)
403
+
404
+ ### Watch something long
405
+
406
+ ![The screens page](screenshots/guide-screens.png)
407
+
408
+ Builds, installs, test suites and AI agents run in **screen sessions** so they survive you closing
409
+ the tab. The **Screens** page lists them all, opens a real terminal on any of them, and — this is the
410
+ useful part — flags one that has **stopped to ask you something** with `✋ waiting on a choice`,
411
+ instead of leaving it looking busy for ever.
412
+
413
+ On a project card the screens sit beside the site's state: the screen icon, how many are running, and a
414
+ ✋ when one waits for you. Its menu starts **New screen here…** (a shell in that project) or **Claude
415
+ Code here…** (the same form with Claude Code already chosen). Picking **Open terminal** from the Screens
416
+ list closes the list, so you can type into the terminal straight away.
417
+
418
+ ![New screen: where it runs, and what it starts](screenshots/screens-new.png)
419
+
420
+ The form asks where it runs (the workspace folder or one of its projects), what it starts (a shell,
421
+ Claude Code, or a command you type), and an optional session name. `screen -r <name>` in your own
422
+ terminal attaches to the same session.
423
+
424
+ ---
425
+
426
+ ### Find an image
427
+
428
+ **Images** (`https://images.workspace.ddev.site`) is a gallery of every picture in `images/`: folders
429
+ first, then thumbnails with their size and date. Search by name, sort by date, name or size, and narrow
430
+ to one type. Click a picture for the viewer: the next and previous one (or the arrow keys), actual size,
431
+ and buttons to download it, copy its link or a Markdown line for a doc, rename it or delete it.
432
+
433
+ **All media images** shows, read-only, the pictures in docs, videos, audio, specs and designs, and the
434
+ dashboard's own screenshots, each labelled with where it lives.
435
+
436
+ ![The images gallery](screenshots/images/gallery.png)
437
+
438
+ ### Make an image
439
+
440
+ On the **Images** page, under *What would you like to create?*:
441
+
442
+ - **Upload images**: drop pictures on the box or choose them, and pick the folder they go in.
443
+ - **Screenshot a page**: an address, a window width (1600 is the Webship docs size), light or dark, and
444
+ the window or the whole page.
445
+
446
+ To change one, open it and use **Edit as a new file**: crop to 1:1, 16:9, 4:3, 3:2 or 9:16, resize to a
447
+ width, or convert to PNG, JPEG or WebP. The original stays as it was.
448
+
449
+ ![Upload images](screenshots/images/upload.png)
450
+
451
+ ### Generate an image with AI
452
+
453
+ **Generate with AI** on the Images page: say what the picture should show, pick the shape, the quality and
454
+ how many, and press **See the plan**. The plan says what will be asked for and about what it costs; nothing
455
+ is sent until you press **Generate** and then **Yes**. The pictures land in `images/generated/`, and the
456
+ viewer shows the prompt and settings each one was made with.
457
+
458
+ Pick the **Provider** first: OpenAI, Google Gemini, xAI, Stability AI or Claude Code. The model, size and
459
+ quality fields change with it. A provider with no key on this machine is listed but greyed out, with the key
460
+ to set (`ai_providers.<provider>.api_key` in `core/config/settings.yml`).
461
+
462
+ ![The provider select: the ones without a key say which key to set](screenshots/images/providers.png)
463
+
464
+ **Claude Code** needs no key: it uses your own Claude Code login, so there is no API charge. It cannot paint
465
+ a photo, so it draws a flat illustration as an SVG, and the dashboard turns it into a PNG as well; you keep
466
+ both, with the prompt, a summary and the alt text Claude wrote. It runs as a screen session, so it still asks
467
+ before it starts, and you can watch it on **Screens**. An SVG can be edited with AI only by Claude Code,
468
+ which changes its code into a new version.
469
+
470
+ ![A drawing made by Claude Code, with its record](screenshots/images/claude-code-image.png)
471
+
472
+ ![Generate with AI: the plan](screenshots/images/generate-plan.png)
473
+
474
+ Each generated picture keeps its prompt. Beside `leaf.png` you get `leaf.md`, a readable record with the
475
+ prompt, the model, size, quality and date, and a short **description** and **alt text** written by a small
476
+ vision model right after the picture is made (about $0.001 more, shown in the plan). The viewer shows both
477
+ under *How it was made*, and **Copy Markdown** uses the alt text. If the description could not be written,
478
+ the viewer offers **Describe it**, which asks first because it is paid.
479
+
480
+ ![A generated picture with its description](screenshots/images/generate-description.png)
481
+
482
+ ### Edit an image with AI
483
+
484
+ Open any image, from the Images workspace or from *All media images*, and use **Edit with AI** under it:
485
+ say what should change, pick the model, the size (*Same shape as the source* by default) and the quality,
486
+ and press **See the plan**. Nothing is sent until you press **Edit it** and then **Yes**. The result is a
487
+ new file, never the source: `<name>-ai-v1.png` beside an image in `images/`, or in `images/edited/` for an
488
+ image from another workspace. It gets the same `.md` record, description and alt text, and the viewer says
489
+ what it was edited from, with a link back. An SVG can be edited only with Claude Code, which changes its
490
+ code; an image model edits pictures.
491
+
492
+ ### Generate an SVG
493
+
494
+ **Generate SVG** on the Images page asks a text model for a drawing as SVG code, still or animated, in the
495
+ brand colours. Pick the provider (OpenAI, Gemini, Anthropic or Claude Code), start from one of the
496
+ **examples** or write your own prompt, and choose a style:
497
+
498
+ - **Still**: no animation.
499
+ - **Draw the strokes**: outlines only; each part rises into place in turn while its strokes are traced.
500
+ - **CSS keyframes** or **SMIL**: the model writes its own animation.
501
+
502
+ Every animated style shows the finished drawing to anyone who has asked their system for less motion. The
503
+ palette comes from the brand tokens and can be changed for one drawing. As always you see the plan and press
504
+ **Yes** first. The drawing is cleaned of anything unsafe (scripts, event handlers, links that leave the
505
+ file), checked that it has enough in it, and asked for again with the reason when it does not, up to three
506
+ times. It lands in `images/svg/` with its prompt, summary and alt text. In the viewer, **Replay** plays the
507
+ animation again and **Copy SVG markup** copies the code. The defaults (the brief, the palette, the attempts,
508
+ the timing and the examples) are the `svg:` block in `core/config/workspace.images.settings.yml`.
509
+
510
+ ![Generate SVG: provider, examples, style and palette](screenshots/images/svg-form.png)
511
+
512
+ ![A drawing tracing itself in, with its record](screenshots/images/svg-result.png)
513
+
514
+ ![Edit with AI: the result and where it came from](screenshots/images/edit-with-ai.png)
515
+
516
+ ## Where things live
517
+
518
+ Each folder at `~/workspace` is a **workspace**, and each has a page in the dashboard.
519
+
520
+ | | for |
521
+ | --- | --- |
522
+ | **dev**, **test** | sites you are working on |
523
+ | **demos**, **sandboxes** | copies of the hosted client demos and sandboxes |
524
+ | **products**, **modules**, **themes**, **recipes**, **profiles** | code we maintain, as git clones |
525
+ | **docs**, **worklogs**, **specs** | documents, session worklogs, specifications |
526
+ | **ai-agents**, **ai-skills**, **ai-commands**, **ai-prompts** | the AI items, as drafts to edit |
527
+ | **designs** | Penpot, beside the Figma exports |
528
+ | **rag**, **graphs** | the search index and the code graphs |
529
+
530
+ ---
531
+
532
+ ## Keys
533
+
534
+ Press **Ctrl + K** (**Cmd + K** on a Mac), or **/**, anywhere to open one list of every workspace, page and project:
535
+ type a few letters, move with the arrow keys, press Enter. A project opens its site; a folder with no site opens
536
+ its workspace. **?** shows the shortcuts. **g** then a letter jumps to a workspace: `g d` is Dev, `g v` Videos,
537
+ `g s` Screens, `g h` Home. None of these fire while you are typing in a field or a terminal.
538
+
539
+ In any list, the search keeps what you type while it searches: you do not need to wait for it. On this
540
+ page, **Search the guide** keeps only the sections that hold every word and marks them.
541
+
542
+ ## The AI assistant
543
+
544
+ Every page has one, on the right. It is the **AI Assistant** everywhere — one assistant, whose
545
+ conversation follows you between workspaces — and it is scoped to the page you are on: on `/dev` it
546
+ knows dev's projects, commands and rules.
547
+
548
+ It can actually do things: build, start, back up, open, and report. Ask in plain words.
549
+
550
+ **What it is called, and what its box says, are yours to set.** `assistant: name:` and
551
+ `assistant: placeholder:` in `core/config/settings.yml` are the defaults, for the home dashboard and
552
+ every page that belongs to no workspace; the same two keys in a workspace's own
553
+ `workspace.<name>.settings.yml` override them for that workspace's page alone. Both are on the
554
+ Settings screen, so neither needs a file edit. `default` in a workspace's file means "whatever
555
+ settings.yml says", which is what ships — so renaming it in one place still reaches every page.
556
+
557
+ The composer ships with **no placeholder at all**: an empty field with a cursor in it already says
558
+ *type here*, and a prompt that suggests what to ask narrows what gets asked. Set one if your team
559
+ wants the prompt.
560
+
561
+ **Type `@` or `/`** to call something by name:
562
+
563
+ - **`@`** — agents and skills, for example `@webship-js` or `@webship-multilingual-setup`
564
+ - **`/`** — commands and skills you invoke
565
+
566
+ The list shows what each one does, and whether it is installed or still only a draft in the
567
+ workspace. Some names are **both** an agent and a skill and they are not interchangeable — the agent
568
+ drives a whole job, the skill carries the steps — so the list shows which, and picking one writes
569
+ `@name (agent)`.
570
+
571
+ You do not need to name the workspace's own tooling (`webship-workspace…`); the assistant already
572
+ works by it.
573
+
574
+ ---
575
+
576
+ ## Keeping up to date
577
+
578
+ ```bash
579
+ bash ~/workspace/core/workspace-app/scripts/update.sh --check # what you have vs the latest
580
+ bash ~/workspace/core/workspace-app/scripts/update.sh # update
581
+ ```
582
+
583
+ The version you are running is in the **toolbar**, beside the product name. If it says
584
+ `version unknown`, the tree was installed in a way that did not record one — the tooltip lists the
585
+ commands that set it.
586
+
587
+ The updater touches **only** the dashboard app. Fresh tooling, config and settings come from
588
+ `bash ~/workspace/core/scripts/sync-tooling.sh --pull`, and the updater will refuse that job rather
589
+ than half-do it.
590
+
591
+ Some releases ship changes to the container image — the release notes say so, and then you also need
592
+ `cd ~/workspace/core/workspace-app && ddev restart`.
593
+
594
+ **If you are on 1.0.9 exactly**, run `bash ~/workspace/core/scripts/docker-gid.sh` once. That
595
+ release's updater did not put this machine's docker GID back, and the symptom is delayed: nothing is
596
+ wrong until your next `ddev restart`, when the dashboard shows **every project as Stopped** while they
597
+ all run perfectly well. Later releases re-apply it for you.
598
+
599
+ ---
600
+
601
+ ## When something is wrong
602
+
603
+ The single most useful command, and the first thing to run:
604
+
605
+ ```bash
606
+ bash ~/workspace/core/scripts/install.sh --check
607
+ ```
608
+
609
+ It changes nothing and reports every part of the setup: tools, https trust, Docker access, mounted
610
+ paths, the CLIs, the Web IDE, the exposure state, and the inotify limit.
611
+
612
+ | What you see | What it is |
613
+ | --- | --- |
614
+ | Every URL refused, `ERR_CERT_AUTHORITY_INVALID` | the local CA is missing or your browser has not read it. `trust-https.sh`, then **fully restart** the browser |
615
+ | `permission denied … docker.sock` | you have not logged out and back in since installing |
616
+ | Every project shows **Stopped** while they are clearly running | the dashboard container cannot see Docker or the DDEV registry. `bash core/scripts/docker-gid.sh --check` |
617
+ | Every `*.ddev.site` address dead, containers healthy | the shared `ddev-router` is gone. `cd ~/workspace/core/workspace-app && ddev start` brings it back |
618
+ | Nothing works after a reboot | DDEV projects do not come back by themselves. `bash core/scripts/autostart.sh --enable`, and `sudo loginctl enable-linger $USER` |
619
+ | **JIRA** is greyed out | `twg` is missing or not signed in. The tooltip says which; `~/.local/bin/twg login --force` |
620
+ | The Web IDE says *Unable to watch for file changes* | the kernel's inotify limit. `install.sh --check` prints the fix |
621
+ | A screen session looks stuck | check **Screens** — if it says `✋ waiting on a choice`, it is waiting for **you**. Open the terminal and answer it |
622
+
623
+ ### One thing to know before you change it
624
+
625
+ On a laptop the workspace has **no login**, and that is safe because nothing is reachable from the
626
+ network: it listens on your own machine only. If you ever turn on `router_bind_all_interfaces`, or
627
+ point `hub_domain` at a real domain, then anyone who can reach that port gets a terminal, an editor
628
+ with write access to everything in `~/workspace`, and the Docker socket. The dashboard will show a red
629
+ banner the moment that happens. Do not ignore it.
630
+
631
+ Before that, turn on **Sign in with Google**: `auth.google.enabled: true` in `settings.yml`, with the
632
+ Google Workspace domains that may sign in in `auth.google.allowed_domains` (this repository ships
633
+ `example.com`) and single addresses in `auth.google.allowed_emails`. Both lists are edited on the
634
+ Settings page. With nothing allowed, nobody gets in.
635
+
636
+ ---
637
+
638
+ ## Settings
639
+
640
+ ![The settings page](screenshots/guide-settings.png)
641
+
642
+ `core/config/settings.yml` and each workspace's own file, editable from the browser. A secret's value
643
+ never leaves the server: keys that look like passwords or tokens show as empty fields marked
644
+ *set — leave blank to keep it*, and the file is rewritten line by line so your comments survive.
645
+
646
+ **Settings** in the side rail opens them as a window over the page you are on, with the files as tabs
647
+ down the left; type in **Filter** to find a file. Inside a file:
648
+
649
+ - **Find a setting in this file** narrows the fields as you type.
650
+ - On/off values are switches that say **On** or **Off**.
651
+ - The comment written above a key in the file is shown under its name.
652
+ - **Unsaved changes** appears beside Save until you save, and leaving the page asks first.
653
+
654
+ A link such as `#settings/workspace.dev.settings.yml` opens that file from any page.
655
+
656
+ **Lists are rows, not text.** Every YAML list in a file is edited in place: type a new entry and press
657
+ **Add**, and each entry is checked as what it is (a machine name, a domain). Lists inside a block work
658
+ the same, such as `auth.google.allowed_domains` and `auth.google.allowed_emails`. A list whose order
659
+ matters, such as `workspaces:` (the order of the home page cards), has a handle to drag each row and
660
+ ↑ ↓ buttons. Lists are saved as you change them, not with the Save button.
661
+
662
+ ![The Google sign-in lists in settings.yml](screenshots/settings/auth-google-lists.png)
663
+
664
+ ### Delete a workspace
665
+
666
+ A workspace that is **not used** can be deleted from the `workspaces:` list in `settings.yml`: its row
667
+ has a bin. Not used means nothing in its folder but its own tooling (`cmd-*.sh`, `README.md`,
668
+ `AGENTS.md`, `CLAUDE.md`, the `.code-workspace` file), no backups, no screen session running there,
669
+ and not the only workspace left. Any other workspace says **in use**, and pointing at it says why.
670
+
671
+ ![The workspaces list: unused ones have a bin](screenshots/settings/delete-1-row.png)
672
+
673
+ It asks three times, because it cannot be undone:
674
+
675
+ 1. **Are you sure?**, in the same dialog as every other important action.
676
+ 2. **Type the workspace's name.** The step lists what will go: the folder, its settings file, its line
677
+ in `workspaces:` and its `*.<name>.workspace` hostname.
678
+ 3. **Type `YES`**, then **Delete workspace**.
679
+
680
+ ![Step 1: the confirm dialog](screenshots/settings/delete-2-confirm.png)
681
+
682
+ ![Step 2: type the name](screenshots/settings/delete-3-type-name.png)
683
+
684
+ ![Step 3: type YES](screenshots/settings/delete-4-type-yes.png)
685
+
686
+ **Cancel** at any step leaves everything as it was. Adding a workspace (the field under the list) does
687
+ the same four things the other way round.
688
+
689
+ ## Getting help
690
+
691
+ - `bash ~/workspace/core/scripts/install.sh --check` first — it answers most of it.
692
+ - Each workspace folder has a `README.md` (for you) and an `AGENTS.md` (the same folder explained to
693
+ an AI agent). Both are worth reading for the folder you work in most.
694
+ - [`REFERENCE.md`](REFERENCE.md) is the full reference: every command, every flag, how to add your own.
695
+ - Ask the assistant. It can read the machine and tell you what it finds.
696
+ - [`core/workspace-app/docs/`](README.md) is this guide's longer sibling — the dashboard screen by
697
+ screen — and [`DEVELOPER-GUIDE.md`](DEVELOPER-GUIDE.md) is for changing the tooling itself.