@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.
- package/PLUGINS.md +249 -0
- package/README.md +379 -2
- package/WORKSPACES.md +69 -0
- package/actions/ai-items.js +293 -0
- package/actions/audio.js +48 -0
- package/actions/build-order.js +79 -0
- package/actions/checks.js +95 -0
- package/actions/claude-session.js +104 -0
- package/actions/commands-center.js +258 -0
- package/actions/composer.js +267 -0
- package/actions/ddev-addons.js +90 -0
- package/actions/ddev-mail.js +80 -0
- package/actions/ddev.js +237 -0
- package/actions/folders.js +165 -0
- package/actions/graphs.js +107 -0
- package/actions/images-svg.js +33 -0
- package/actions/images.js +145 -0
- package/actions/navigation.js +190 -0
- package/actions/node.js +222 -0
- package/actions/notes.js +55 -0
- package/actions/obsidian.js +59 -0
- package/actions/plugins.js +36 -0
- package/actions/project-make.js +28 -0
- package/actions/rag.js +202 -0
- package/actions/row-actions.js +262 -0
- package/actions/screens.js +270 -0
- package/actions/testing.js +121 -0
- package/actions/video-edit.js +54 -0
- package/ai-inventory.js +182 -0
- package/ai-items.js +202 -0
- package/assistant-cast.js +176 -0
- package/assistant-suggestions.js +91 -0
- package/assistant.js +484 -0
- package/audio-voice.js +528 -0
- package/auth-google.js +260 -0
- package/build-ai.js +52 -0
- package/build-order-page.js +191 -0
- package/build-order.js +313 -0
- package/builder-args.js +117 -0
- package/changelog.js +302 -0
- package/chat-threads.js +134 -0
- package/checks.js +105 -0
- package/claude-args.js +282 -0
- package/claude-sessions.js +129 -0
- package/command-author.js +117 -0
- package/command-block.js +20 -0
- package/commands/defaults.yml +159 -0
- package/commands-page.js +460 -0
- package/commands.js +568 -0
- package/cucumber.js +43 -0
- package/ddev-addons-page.js +124 -0
- package/ddev-addons.js +154 -0
- package/ddev-custom-commands.js +96 -0
- package/ddev-domains.js +84 -0
- package/ddev-import.js +93 -0
- package/ddev-mail-page.js +167 -0
- package/ddev-mail.js +110 -0
- package/ddev-options.js +145 -0
- package/ddev-snapshots.js +126 -0
- package/ddev.js +145 -0
- package/docs/DEVELOPER-GUIDE.md +224 -0
- package/docs/README.md +252 -0
- package/docs/REFERENCE.md +684 -0
- package/docs/USER-GUIDE.md +697 -0
- package/docs/screenshots/assistant/avatar-board.png +0 -0
- package/docs/screenshots/assistant/avatar-coffee.png +0 -0
- package/docs/screenshots/assistant/avatar-colours.png +0 -0
- package/docs/screenshots/assistant/avatar-icons.png +0 -0
- package/docs/screenshots/assistant/avatar-moves.png +0 -0
- package/docs/screenshots/assistant/avatar-pick-cookieman.png +0 -0
- package/docs/screenshots/assistant/avatar-settings-voices.png +0 -0
- package/docs/screenshots/assistant/avatar-status.png +0 -0
- package/docs/screenshots/create-card/create-card.png +0 -0
- package/docs/screenshots/create-card/start-ai.png +0 -0
- package/docs/screenshots/guide-clone-address.png +0 -0
- package/docs/screenshots/guide-clone-worktree-off.png +0 -0
- package/docs/screenshots/guide-clone-worktree-on.png +0 -0
- package/docs/screenshots/guide-ddev-menu.png +0 -0
- package/docs/screenshots/guide-domains.png +0 -0
- package/docs/screenshots/guide-home.png +0 -0
- package/docs/screenshots/guide-ide-menu.png +0 -0
- package/docs/screenshots/guide-remove-refusal.png +0 -0
- package/docs/screenshots/guide-rows-worktree.png +0 -0
- package/docs/screenshots/guide-screens.png +0 -0
- package/docs/screenshots/guide-settings.png +0 -0
- package/docs/screenshots/guide-workspace-page.png +0 -0
- package/docs/screenshots/home/card-settings.png +0 -0
- package/docs/screenshots/home/drag-reorder.png +0 -0
- package/docs/screenshots/home/edit-card.png +0 -0
- package/docs/screenshots/images/claude-code-image.png +0 -0
- package/docs/screenshots/images/edit-with-ai.png +0 -0
- package/docs/screenshots/images/gallery.png +0 -0
- package/docs/screenshots/images/generate-description.png +0 -0
- package/docs/screenshots/images/generate-plan.png +0 -0
- package/docs/screenshots/images/providers.png +0 -0
- package/docs/screenshots/images/svg-form.png +0 -0
- package/docs/screenshots/images/svg-result.png +0 -0
- package/docs/screenshots/images/upload.png +0 -0
- package/docs/screenshots/new-folder/2-form.png +0 -0
- package/docs/screenshots/new-folder/8-ddev-options.png +0 -0
- package/docs/screenshots/new-folder/files-folder.png +0 -0
- package/docs/screenshots/projects/ddev-custom-commands.png +0 -0
- package/docs/screenshots/projects/state-chip-stop.png +0 -0
- package/docs/screenshots/readme/dashboard-dark.png +0 -0
- package/docs/screenshots/readme/dashboard-light.png +0 -0
- package/docs/screenshots/readme/dev-dark.png +0 -0
- package/docs/screenshots/readme/dev-light.png +0 -0
- package/docs/screenshots/readme/docs-dark.png +0 -0
- package/docs/screenshots/readme/docs-light.png +0 -0
- package/docs/screenshots/readme/icons/ai.svg +4 -0
- package/docs/screenshots/readme/icons/code.svg +4 -0
- package/docs/screenshots/readme/icons/docs.svg +4 -0
- package/docs/screenshots/readme/icons/services.svg +4 -0
- package/docs/screenshots/readme/icons/sites.svg +4 -0
- package/docs/screenshots/readme/test-report-dark.png +0 -0
- package/docs/screenshots/readme/test-report-light.png +0 -0
- package/docs/screenshots/readme/test-scenarios.png +0 -0
- package/docs/screenshots/readme/test-steps.png +0 -0
- package/docs/screenshots/readme/videos-dark.png +0 -0
- package/docs/screenshots/readme/videos-light.png +0 -0
- package/docs/screenshots/screens-menu.png +0 -0
- package/docs/screenshots/screens-new.png +0 -0
- package/docs/screenshots/settings/auth-google-lists.png +0 -0
- package/docs/screenshots/settings/delete-1-row.png +0 -0
- package/docs/screenshots/settings/delete-2-confirm.png +0 -0
- package/docs/screenshots/settings/delete-3-type-name.png +0 -0
- package/docs/screenshots/settings/delete-4-type-yes.png +0 -0
- package/event-log.js +59 -0
- package/files-browser.js +247 -0
- package/folders.js +121 -0
- package/format.js +73 -0
- package/git-info.js +81 -0
- package/github-auth.js +62 -0
- package/graphs.js +104 -0
- package/html.js +10 -0
- package/icons.js +83 -0
- package/images-ai.js +447 -0
- package/images-create.js +226 -0
- package/images-page.js +417 -0
- package/images-records.js +39 -0
- package/images-render.js +36 -0
- package/images-svg-core.js +214 -0
- package/images-svg-sanitize.js +188 -0
- package/images-svg.js +241 -0
- package/images.js +270 -0
- package/jobs.js +430 -0
- package/linger.js +21 -0
- package/lists.js +292 -0
- package/media-info.js +136 -0
- package/navigation-page.js +264 -0
- package/navigation.js +394 -0
- package/notes.js +0 -0
- package/obsidian.js +405 -0
- package/package.json +47 -4
- package/palette-index.js +46 -0
- package/playwright.config.js +23 -0
- package/plugin-install.js +239 -0
- package/plugin-loader.js +448 -0
- package/plugin-manifest.js +83 -0
- package/plugin-settings.js +44 -0
- package/plugins/workspace-notes/index.js +59 -0
- package/plugins-page.js +103 -0
- package/project-make.js +241 -0
- package/project-name.js +210 -0
- package/public/assistant-avatar-moves.js +646 -0
- package/public/assistant-avatar-ui.js +1223 -0
- package/public/assistant-avatar.js +530 -0
- package/public/avatar/druplicon.vrm +0 -0
- package/public/css/base.css +260 -0
- package/public/css/components/ai-assistant.css +263 -0
- package/public/css/components/assistant-avatar.css +279 -0
- package/public/css/components/assistant-views.css +198 -0
- package/public/css/components/build-order.css +74 -0
- package/public/css/components/clone-as-a-git-worktree.css +30 -0
- package/public/css/components/command-palette.css +61 -0
- package/public/css/components/commands-center.css +139 -0
- package/public/css/components/confirm-dialog.css +40 -0
- package/public/css/components/create-card.css +8 -0
- package/public/css/components/ddev-menu.css +23 -0
- package/public/css/components/deep-chat.css +17 -0
- package/public/css/components/density.css +11 -0
- package/public/css/components/floating-assistant-workspace-pages.css +55 -0
- package/public/css/components/folders.css +5 -0
- package/public/css/components/full-height-left-assistant-sidebar-all-pages.css +39 -0
- package/public/css/components/full-height-right-actions-rail-pages-that-have-actions.css +267 -0
- package/public/css/components/grid-and-list.css +203 -0
- package/public/css/components/help-page.css +36 -0
- package/public/css/components/hero.css +16 -0
- package/public/css/components/images.css +70 -0
- package/public/css/components/layout-rhythm-and-spacing-polish.css +139 -0
- package/public/css/components/mic-on-any-field-that-wants-typing.css +416 -0
- package/public/css/components/modal-fit.css +113 -0
- package/public/css/components/page-width.css +23 -0
- package/public/css/components/plugins-page.css +9 -0
- package/public/css/components/project-cards.css +256 -0
- package/public/css/components/project-rows.css +390 -0
- package/public/css/components/reordering-the-workspace-cards.css +85 -0
- package/public/css/components/responsive-home-and-the-workspace-pages.css +457 -0
- package/public/css/components/running-commands-as-toasts.css +327 -0
- package/public/css/components/settings-editor-core-config-yml.css +828 -0
- package/public/css/components/short-results-as-a-toast-at-the-top.css +203 -0
- package/public/css/components/sound-player.css +84 -0
- package/public/css/components/suggest-agents-skills-commands.css +112 -0
- package/public/css/components/tab-modal.css +142 -0
- package/public/css/components/terminals.css +244 -0
- package/public/css/components/test-report-media-one-file-per-row-paged.css +144 -0
- package/public/css/components/top-toolbar-logo-breadcrumb.css +107 -0
- package/public/css/components/video-edit.css +6 -0
- package/public/css/components/web-ide-open-with.css +23 -0
- package/public/css/components/working-indicators.css +158 -0
- package/public/css/components/workspace-cards.css +79 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.png +0 -0
- package/public/htmx.min.js +1 -0
- package/public/logo.png +0 -0
- package/public/media-player.js +215 -0
- package/public/mic.js +255 -0
- package/public/narration.js +110 -0
- package/public/palette.js +278 -0
- package/public/sortable.js +251 -0
- package/public/suggest.js +337 -0
- package/public/terminal.js +903 -0
- package/public/themes/default/theme.css +267 -0
- package/public/themes/ember/theme.css +180 -0
- package/public/themes/press/theme.css +290 -0
- package/public/themes/slate/theme.css +182 -0
- package/public/touch-icon.png +0 -0
- package/public/ui.js +2721 -0
- package/public/vendor/ace/LICENSE.txt +24 -0
- package/public/vendor/ace/ace.js +23 -0
- package/public/vendor/ace/ext-language_tools.js +8 -0
- package/public/vendor/ace/ext-searchbox.js +8 -0
- package/public/vendor/ace/mode-css.js +8 -0
- package/public/vendor/ace/mode-html.js +8 -0
- package/public/vendor/ace/mode-javascript.js +8 -0
- package/public/vendor/ace/mode-markdown.js +8 -0
- package/public/vendor/ace/mode-sh.js +8 -0
- package/public/vendor/ace/mode-yaml.js +8 -0
- package/public/vendor/ace/theme-textmate.js +8 -0
- package/public/vendor/ace/theme-tomorrow_night.js +8 -0
- package/public/vendor/ace/worker-yaml.js +1 -0
- package/public/vendor/deep-chat.LICENSE +21 -0
- package/public/vendor/deep-chat.bundle.js +1 -0
- package/public/vendor/fonts/dm-serif-text-LICENSE.txt +93 -0
- package/public/vendor/fonts/dm-serif-text-latin-400-italic.woff2 +0 -0
- package/public/vendor/fonts/dm-serif-text-latin-400-normal.woff2 +0 -0
- package/public/vendor/fonts/figtree-LICENSE.txt +93 -0
- package/public/vendor/fonts/figtree-latin-400-italic.woff2 +0 -0
- package/public/vendor/fonts/figtree-latin-400-normal.woff2 +0 -0
- package/public/vendor/fonts/figtree-latin-600-italic.woff2 +0 -0
- package/public/vendor/fonts/figtree-latin-600-normal.woff2 +0 -0
- package/public/vendor/fonts/jetbrains-mono-LICENSE.txt +93 -0
- package/public/vendor/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
- package/public/vendor/fonts/ubuntu-mono-LICENSE.txt +98 -0
- package/public/vendor/fonts/ubuntu-mono-latin-wght-normal.woff2 +0 -0
- package/public/vendor/tabler-LICENSE.txt +21 -0
- package/public/vendor/tabler-sprite.svg +1 -0
- package/public/vendor/three/LICENSE +21 -0
- package/public/vendor/three/addons/loaders/GLTFLoader.js +4860 -0
- package/public/vendor/three/addons/utils/BufferGeometryUtils.js +1501 -0
- package/public/vendor/three/addons/utils/SkeletonUtils.js +496 -0
- package/public/vendor/three/three.core.min.js +6 -0
- package/public/vendor/three/three.module.min.js +6 -0
- package/public/vendor/three-vrm/LICENSE +22 -0
- package/public/vendor/three-vrm/three-vrm.module.min.js +983 -0
- package/public/vendor/uikit-icons.min.js +1 -0
- package/public/vendor/uikit.min.css +1 -0
- package/public/vendor/uikit.min.js +1 -0
- package/public/vendor/webship-icons/ui/bookmark-outlined.svg +1 -0
- package/public/vendor/webship-icons/ui/headset.svg +1 -0
- package/public/vendor/webship-icons/ui/menu.svg +1 -0
- package/public/vendor/webship-icons/ui/pause.svg +1 -0
- package/public/vendor/webship-icons/ui/play.svg +1 -0
- package/public/vendor/webship-icons/ui/share.svg +1 -0
- package/public/vendor/webship-icons/ui/sound-off.svg +1 -0
- package/public/vendor/webship-icons/ui/sound-on.svg +1 -0
- package/public/vendor/webship-icons/ui/stop.svg +1 -0
- package/public/vendor/xterm/addon-fit.js +2 -0
- package/public/vendor/xterm/addon-unicode11.js +2 -0
- package/public/vendor/xterm/addon-web-links.js +2 -0
- package/public/vendor/xterm/xterm.css +218 -0
- package/public/vendor/xterm/xterm.js +2 -0
- package/rag.js +169 -0
- package/reader.js +132 -0
- package/repo-blobs.js +66 -0
- package/report-pdf.js +337 -0
- package/row-layout.js +1440 -0
- package/screenrc +37 -0
- package/screens.js +1063 -0
- package/scripts/code-server-start.sh +190 -0
- package/scripts/images-claude-finish.js +107 -0
- package/scripts/screen-host.sh +114 -0
- package/scripts/screen-runner.js +362 -0
- package/scripts/screen-then.js +47 -0
- package/scripts/update.sh +350 -0
- package/server.js +8140 -0
- package/settings-file.js +423 -0
- package/speech.js +297 -0
- package/tab-modal.js +75 -0
- package/test-reports.js +260 -0
- package/themes.js +381 -0
- package/transcripts.js +168 -0
- package/urls.js +13 -0
- package/validate.js +18 -0
- package/version-check.js +94 -0
- package/video-edit.js +588 -0
- package/waiting.js +85 -0
- package/workspace-card-tools.js +41 -0
- package/workspace-delete.js +139 -0
- package/workspace-types.js +85 -0
- 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
|
+

|
|
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
|
+

|
|
67
|
+
|
|
68
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
203
|
+
|
|
204
|
+
### Copy one, or branch one
|
|
205
|
+
|
|
206
|
+

|
|
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
|
+

|
|
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
|
+

|
|
403
|
+
|
|
404
|
+
### Watch something long
|
|
405
|
+
|
|
406
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
471
|
+
|
|
472
|
+

|
|
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
|
+

|
|
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
|
+

|
|
511
|
+
|
|
512
|
+

|
|
513
|
+
|
|
514
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
681
|
+
|
|
682
|
+

|
|
683
|
+
|
|
684
|
+

|
|
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.
|