@webship.co/workspace 1.0.0-beta1 → 1.0.0-rc1

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 (632) hide show
  1. package/LICENSE +339 -0
  2. package/README.md +28 -364
  3. package/core/bin/workspace.js +135 -0
  4. package/core/config/settings.labels.yml +514 -0
  5. package/core/config/settings.template.yml +292 -0
  6. package/core/config/style.yml +53 -0
  7. package/core/config/theme.default.yml +161 -0
  8. package/core/config/theme.dispatch.yml +166 -0
  9. package/core/config/theme.drupal.yml +175 -0
  10. package/core/config/theme.ember.yml +160 -0
  11. package/core/config/theme.github.yml +172 -0
  12. package/core/config/theme.gitlab.yml +168 -0
  13. package/core/config/theme.press.yml +161 -0
  14. package/core/config/theme.slate.yml +160 -0
  15. package/core/config/theme.upsun.yml +174 -0
  16. package/core/docs/architecture.svg +65 -0
  17. package/core/docs/getting-started.md +51 -0
  18. package/core/docs/plugins.md +27 -0
  19. package/core/docs/releases.md +23 -0
  20. package/core/docs/testing.md +15 -0
  21. package/core/docs/workspaces.md +25 -0
  22. package/core/scripts/args/arg-ai-items.sh +65 -0
  23. package/core/scripts/args/arg-autostart.sh +31 -0
  24. package/core/scripts/args/arg-avatar-agent.sh +28 -0
  25. package/core/scripts/args/arg-avatar-catalog.sh +12 -0
  26. package/core/scripts/args/arg-avatar-character.sh +68 -0
  27. package/core/scripts/args/arg-avatar-voice.sh +24 -0
  28. package/core/scripts/args/arg-avatar.sh +22 -0
  29. package/core/scripts/args/arg-checks.sh +36 -0
  30. package/core/scripts/args/arg-clone.sh +42 -0
  31. package/core/scripts/args/arg-commands.sh +51 -0
  32. package/core/scripts/args/arg-cucumber.sh +34 -0
  33. package/core/scripts/args/arg-distribution.sh +30 -0
  34. package/core/scripts/args/arg-drupal.sh +39 -0
  35. package/core/scripts/args/arg-drupal_cms.sh +18 -0
  36. package/core/scripts/args/arg-gitlab-ci-local.sh +25 -0
  37. package/core/scripts/args/arg-graphify.sh +36 -0
  38. package/core/scripts/args/arg-graphs.sh +12 -0
  39. package/core/scripts/args/arg-hostnames.sh +23 -0
  40. package/core/scripts/args/arg-milvus-backup.sh +8 -0
  41. package/core/scripts/args/arg-milvus-mcp.sh +12 -0
  42. package/core/scripts/args/arg-milvus.sh +32 -0
  43. package/core/scripts/args/arg-obsidian.sh +17 -0
  44. package/core/scripts/args/arg-odoo.sh +18 -0
  45. package/core/scripts/args/arg-penpot-backup.sh +8 -0
  46. package/core/scripts/args/arg-penpot-mcp.sh +15 -0
  47. package/core/scripts/args/arg-penpot-token.sh +17 -0
  48. package/core/scripts/args/arg-penpot.sh +44 -0
  49. package/core/scripts/args/arg-rag.sh +21 -0
  50. package/core/scripts/args/arg-ragify.sh +35 -0
  51. package/core/scripts/args/arg-reclaim.sh +18 -0
  52. package/core/scripts/args/arg-release.sh +21 -0
  53. package/core/scripts/args/arg-screen.sh +28 -0
  54. package/core/scripts/args/arg-site-template.sh +13 -0
  55. package/core/scripts/args/arg-spdd.sh +16 -0
  56. package/core/scripts/args/arg-specs.sh +22 -0
  57. package/core/scripts/args/arg-storage.sh +36 -0
  58. package/core/scripts/args/arg-testing.sh +36 -0
  59. package/core/scripts/args/arg-webship.sh +34 -0
  60. package/core/scripts/args/arg-webships-project.sh +22 -0
  61. package/core/scripts/args/arg-webships-site-template.sh +17 -0
  62. package/core/scripts/args/arg-webships.sh +34 -0
  63. package/core/scripts/args/arg-website-site-template.sh +17 -0
  64. package/core/scripts/args/arg-website.sh +25 -0
  65. package/core/scripts/args/arg-wordpress.sh +18 -0
  66. package/core/scripts/autostart-run.sh +162 -0
  67. package/core/scripts/autostart-stop.sh +30 -0
  68. package/core/scripts/autostart-watch.sh +43 -0
  69. package/core/scripts/autostart.sh +26 -0
  70. package/core/scripts/bootstrap-functions.sh +117 -0
  71. package/core/scripts/bootstrap-libraries.sh +10 -0
  72. package/core/scripts/bootstrap.sh +71 -0
  73. package/core/scripts/ddev-shim/ddev +122 -0
  74. package/core/scripts/docker-gid.sh +119 -0
  75. package/core/scripts/functions/arg-site-template.sh +28 -0
  76. package/core/scripts/functions/fun-ai-items-lock.sh +175 -0
  77. package/core/scripts/functions/fun-ai-items-sources.sh +298 -0
  78. package/core/scripts/functions/fun-ai-items.sh +621 -0
  79. package/core/scripts/functions/fun-ai-providers.sh +72 -0
  80. package/core/scripts/functions/fun-autostart.sh +429 -0
  81. package/core/scripts/functions/fun-avatar.sh +441 -0
  82. package/core/scripts/functions/fun-backup-item.sh +50 -0
  83. package/core/scripts/functions/fun-build-distribution.sh +226 -0
  84. package/core/scripts/functions/fun-build-site-template.sh +104 -0
  85. package/core/scripts/functions/fun-build-webships.sh +161 -0
  86. package/core/scripts/functions/fun-build-website.sh +199 -0
  87. package/core/scripts/functions/fun-checks.sh +243 -0
  88. package/core/scripts/functions/fun-clone-project.sh +289 -0
  89. package/core/scripts/functions/fun-commands.sh +521 -0
  90. package/core/scripts/functions/fun-database.sh +63 -0
  91. package/core/scripts/functions/fun-ddev-hostnames.sh +213 -0
  92. package/core/scripts/functions/fun-ddev-nodejs.sh +15 -0
  93. package/core/scripts/functions/fun-ddev-telemetry.sh +15 -0
  94. package/core/scripts/functions/fun-default-settings.sh +28 -0
  95. package/core/scripts/functions/fun-distribution-cucumber.sh +45 -0
  96. package/core/scripts/functions/fun-distribution-drupal.sh +25 -0
  97. package/core/scripts/functions/fun-distribution-drupal_cms.sh +35 -0
  98. package/core/scripts/functions/fun-distribution-webship.sh +28 -0
  99. package/core/scripts/functions/fun-distribution-webships.sh +33 -0
  100. package/core/scripts/functions/fun-distribution-website.sh +19 -0
  101. package/core/scripts/functions/fun-drush.sh +48 -0
  102. package/core/scripts/functions/fun-elevenlabs.sh +179 -0
  103. package/core/scripts/functions/fun-files.sh +19 -0
  104. package/core/scripts/functions/fun-git-worktrees.sh +142 -0
  105. package/core/scripts/functions/fun-gitlab-ci.sh +156 -0
  106. package/core/scripts/functions/fun-hostnames-cli.sh +88 -0
  107. package/core/scripts/functions/fun-milvus.sh +584 -0
  108. package/core/scripts/functions/fun-odoo.sh +121 -0
  109. package/core/scripts/functions/fun-penpot.sh +724 -0
  110. package/core/scripts/functions/fun-project-name.sh +20 -0
  111. package/core/scripts/functions/fun-rag.sh +253 -0
  112. package/core/scripts/functions/fun-ragify.sh +165 -0
  113. package/core/scripts/functions/fun-reclaim.sh +297 -0
  114. package/core/scripts/functions/fun-release.sh +159 -0
  115. package/core/scripts/functions/fun-remove-project.sh +319 -0
  116. package/core/scripts/functions/fun-screen.sh +96 -0
  117. package/core/scripts/functions/fun-spdd.sh +676 -0
  118. package/core/scripts/functions/fun-specs-share.sh +237 -0
  119. package/core/scripts/functions/fun-storage.sh +347 -0
  120. package/core/scripts/functions/fun-testing.sh +329 -0
  121. package/core/scripts/functions/fun-users.sh +87 -0
  122. package/core/scripts/functions/fun-version.sh +72 -0
  123. package/core/scripts/functions/fun-video-edit.sh +48 -0
  124. package/core/scripts/functions/fun-voice.sh +45 -0
  125. package/core/scripts/functions/fun-wordpress.sh +59 -0
  126. package/core/scripts/host-mounts.sh +161 -0
  127. package/core/scripts/install.sh +602 -0
  128. package/core/scripts/libs/__pycache__/video_edit.cpython-312.pyc +0 -0
  129. package/core/scripts/libs/argparse.sh +93 -0
  130. package/core/scripts/libs/bash-yaml.sh +52 -0
  131. package/core/scripts/libs/checks_plan.js +312 -0
  132. package/core/scripts/libs/elevenlabs.py +627 -0
  133. package/core/scripts/libs/progress-bar.sh +19 -0
  134. package/core/scripts/libs/rag_index.py +446 -0
  135. package/core/scripts/libs/video_edit.py +636 -0
  136. package/core/scripts/libs/voice.py +430 -0
  137. package/core/scripts/plugins/jira/host-install.sh +119 -0
  138. package/core/scripts/plugins/jira/host-mounts.txt +2 -0
  139. package/core/scripts/plugins/upsun/args/arg-upsun.sh +51 -0
  140. package/core/scripts/plugins/upsun/functions/fun-upsun.sh +304 -0
  141. package/core/scripts/plugins/upsun/host-install.sh +99 -0
  142. package/core/scripts/plugins/upsun/host-mounts.txt +1 -0
  143. package/core/scripts/plugins/upsun/upsun-ai.sh +133 -0
  144. package/core/scripts/plugins.sh +152 -0
  145. package/core/scripts/release.sh +69 -0
  146. package/core/scripts/storage.sh +39 -0
  147. package/core/scripts/sync-tooling.sh +246 -0
  148. package/core/scripts/tests/cmd-smoke-test.sh +109 -0
  149. package/core/scripts/trust-https.sh +257 -0
  150. package/core/workspace-app/.ddev/commands/web/test-dashboard +49 -0
  151. package/core/workspace-app/.ddev/config.yaml +400 -0
  152. package/core/workspace-app/.ddev/docker-compose.dood.yaml +45 -0
  153. package/core/workspace-app/.ddev/docker-compose.plugin-jira-twg.yaml +26 -0
  154. package/core/workspace-app/.ddev/docker-compose.plugin-upsun-upsun-cli.yaml +8 -0
  155. package/core/workspace-app/.ddev/docker-compose.screens.yaml +15 -0
  156. package/core/workspace-app/.ddev/nginx_full/nginx-site.conf +114 -0
  157. package/core/workspace-app/.ddev/web-build/Dockerfile.workspace-app +203 -0
  158. package/core/workspace-app/.ddev/web-build/ddev-shim-ddev +122 -0
  159. package/{PLUGINS.md → core/workspace-app/PLUGINS.md} +9 -1
  160. package/core/workspace-app/README.md +380 -0
  161. package/{actions → core/workspace-app/actions}/ddev.js +0 -1
  162. package/{actions → core/workspace-app/actions}/rag.js +0 -1
  163. package/{actions → core/workspace-app/actions}/testing.js +0 -1
  164. package/{assistant.js → core/workspace-app/assistant.js} +1 -10
  165. package/{git-info.js → core/workspace-app/git-info.js} +17 -1
  166. package/core/workspace-app/package.json +29 -0
  167. package/core/workspace-app/plugin-catalog.js +50 -0
  168. package/{plugins-page.js → core/workspace-app/plugins-page.js} +28 -2
  169. package/{server.js → core/workspace-app/server.js} +18 -0
  170. package/core/workspace-app/tests/features/actions-rail.feature +44 -0
  171. package/core/workspace-app/tests/features/ai-items.feature +23 -0
  172. package/core/workspace-app/tests/features/assistant-speech.feature +63 -0
  173. package/core/workspace-app/tests/features/checks.feature +40 -0
  174. package/core/workspace-app/tests/features/clone-project.feature +30 -0
  175. package/core/workspace-app/tests/features/command-authoring.feature +58 -0
  176. package/core/workspace-app/tests/features/dashboard.feature +57 -0
  177. package/core/workspace-app/tests/features/menus.feature +29 -0
  178. package/core/workspace-app/tests/features/plugins/jira/jira.feature +47 -0
  179. package/core/workspace-app/tests/features/plugins.feature +20 -0
  180. package/core/workspace-app/tests/features/project-actions.feature +41 -0
  181. package/core/workspace-app/tests/features/screens.feature +29 -0
  182. package/core/workspace-app/tests/features/settings.feature +46 -0
  183. package/core/workspace-app/tests/features/test-reports.feature +32 -0
  184. package/core/workspace-app/tests/features/theme.feature +40 -0
  185. package/core/workspace-app/tests/step-definitions/actions-post.steps.js +25 -0
  186. package/core/workspace-app/tests/step-definitions/assistant-speech.steps.js +157 -0
  187. package/core/workspace-app/tests/step-definitions/clone-project.steps.js +47 -0
  188. package/core/workspace-app/tests/step-definitions/preconditions.steps.js +168 -0
  189. package/core/workspace-app/tests/unit/_isolated-config.js +31 -0
  190. package/core/workspace-app/tests/unit/accessibility.test.js +124 -0
  191. package/core/workspace-app/tests/unit/actions-rail-ux.test.js +56 -0
  192. package/core/workspace-app/tests/unit/actions-rail.test.js +51 -0
  193. package/core/workspace-app/tests/unit/ai-inventory.test.js +64 -0
  194. package/core/workspace-app/tests/unit/app-docs.test.js +64 -0
  195. package/core/workspace-app/tests/unit/assistant-avatar.test.js +110 -0
  196. package/core/workspace-app/tests/unit/assistant-cast.test.js +105 -0
  197. package/core/workspace-app/tests/unit/assistant-send-animation.test.js +15 -0
  198. package/core/workspace-app/tests/unit/assistant-suggestions.test.js +112 -0
  199. package/core/workspace-app/tests/unit/assistant-switches.test.js +53 -0
  200. package/core/workspace-app/tests/unit/assistant-views.test.js +146 -0
  201. package/core/workspace-app/tests/unit/assistant-working-indicator.test.js +49 -0
  202. package/core/workspace-app/tests/unit/assistant.test.js +61 -0
  203. package/core/workspace-app/tests/unit/audio-player.test.js +147 -0
  204. package/core/workspace-app/tests/unit/audio-voice.test.js +634 -0
  205. package/core/workspace-app/tests/unit/auth-google.test.js +180 -0
  206. package/core/workspace-app/tests/unit/autostart-watch.test.js +76 -0
  207. package/core/workspace-app/tests/unit/browsers.test.js +76 -0
  208. package/core/workspace-app/tests/unit/build-distribution.test.js +125 -0
  209. package/core/workspace-app/tests/unit/build-order.test.js +153 -0
  210. package/core/workspace-app/tests/unit/builder-args.test.js +113 -0
  211. package/core/workspace-app/tests/unit/builders.test.js +158 -0
  212. package/core/workspace-app/tests/unit/card-state-toggle.test.js +29 -0
  213. package/core/workspace-app/tests/unit/changelog.test.js +223 -0
  214. package/core/workspace-app/tests/unit/chat-thread.test.js +92 -0
  215. package/core/workspace-app/tests/unit/checks-plan.test.js +205 -0
  216. package/core/workspace-app/tests/unit/claude-args.test.js +182 -0
  217. package/core/workspace-app/tests/unit/claude-code-here.test.js +15 -0
  218. package/core/workspace-app/tests/unit/claude-resume.test.js +147 -0
  219. package/core/workspace-app/tests/unit/claude-screen-options.test.js +84 -0
  220. package/core/workspace-app/tests/unit/claude-session.test.js +41 -0
  221. package/core/workspace-app/tests/unit/command-flags.test.js +45 -0
  222. package/core/workspace-app/tests/unit/command-palette.test.js +105 -0
  223. package/core/workspace-app/tests/unit/commands-center.test.js +338 -0
  224. package/core/workspace-app/tests/unit/composer-menu.test.js +187 -0
  225. package/core/workspace-app/tests/unit/config-yaml.test.js +116 -0
  226. package/core/workspace-app/tests/unit/confirm-dialog.test.js +69 -0
  227. package/core/workspace-app/tests/unit/create-card.test.js +85 -0
  228. package/core/workspace-app/tests/unit/ddev-addons.test.js +144 -0
  229. package/core/workspace-app/tests/unit/ddev-auth-ssh.test.js +40 -0
  230. package/core/workspace-app/tests/unit/ddev-custom-commands.test.js +56 -0
  231. package/core/workspace-app/tests/unit/ddev-diagnose.test.js +57 -0
  232. package/core/workspace-app/tests/unit/ddev-domains.test.js +179 -0
  233. package/core/workspace-app/tests/unit/ddev-hostnames.test.js +143 -0
  234. package/core/workspace-app/tests/unit/ddev-import.test.js +82 -0
  235. package/core/workspace-app/tests/unit/ddev-mail.test.js +135 -0
  236. package/core/workspace-app/tests/unit/ddev-menu-and-create.test.js +28 -0
  237. package/core/workspace-app/tests/unit/ddev-mutagen.test.js +37 -0
  238. package/core/workspace-app/tests/unit/ddev-options.test.js +51 -0
  239. package/core/workspace-app/tests/unit/ddev-share.test.js +40 -0
  240. package/core/workspace-app/tests/unit/ddev-shim.test.js +57 -0
  241. package/core/workspace-app/tests/unit/ddev-snapshots.test.js +142 -0
  242. package/core/workspace-app/tests/unit/ddev-start-daemons.test.js +62 -0
  243. package/core/workspace-app/tests/unit/ddev-xdebug.test.js +41 -0
  244. package/core/workspace-app/tests/unit/deep-chat-origin.test.js +38 -0
  245. package/core/workspace-app/tests/unit/density.test.js +52 -0
  246. package/core/workspace-app/tests/unit/elevenlabs.test.js +453 -0
  247. package/core/workspace-app/tests/unit/event-log.test.js +102 -0
  248. package/core/workspace-app/tests/unit/favicon.test.js +68 -0
  249. package/core/workspace-app/tests/unit/files-browser.test.js +224 -0
  250. package/core/workspace-app/tests/unit/git-info.test.js +26 -0
  251. package/core/workspace-app/tests/unit/grid-and-list.test.js +103 -0
  252. package/core/workspace-app/tests/unit/host-tool-wrapper.test.js +18 -0
  253. package/core/workspace-app/tests/unit/html-patterns.test.js +51 -0
  254. package/core/workspace-app/tests/unit/ide-infra.test.js +28 -0
  255. package/core/workspace-app/tests/unit/images-ai.test.js +201 -0
  256. package/core/workspace-app/tests/unit/images-create.test.js +59 -0
  257. package/core/workspace-app/tests/unit/images-providers.test.js +248 -0
  258. package/core/workspace-app/tests/unit/images-svg.test.js +213 -0
  259. package/core/workspace-app/tests/unit/images-workspace.test.js +144 -0
  260. package/core/workspace-app/tests/unit/jobs-fragment.test.js +66 -0
  261. package/core/workspace-app/tests/unit/media-ux.test.js +164 -0
  262. package/core/workspace-app/tests/unit/modal-fit.test.js +87 -0
  263. package/core/workspace-app/tests/unit/modules-load.test.js +23 -0
  264. package/core/workspace-app/tests/unit/narration.test.js +186 -0
  265. package/core/workspace-app/tests/unit/navigation-editor.test.js +260 -0
  266. package/core/workspace-app/tests/unit/navigation.test.js +254 -0
  267. package/core/workspace-app/tests/unit/new-folder.test.js +121 -0
  268. package/core/workspace-app/tests/unit/new-screen-form.test.js +149 -0
  269. package/core/workspace-app/tests/unit/node-menu.test.js +161 -0
  270. package/core/workspace-app/tests/unit/notes.test.js +128 -0
  271. package/core/workspace-app/tests/unit/page-structure.test.js +40 -0
  272. package/core/workspace-app/tests/unit/page-width.test.js +59 -0
  273. package/core/workspace-app/tests/unit/php-version.test.js +90 -0
  274. package/core/workspace-app/tests/unit/plan-card.test.js +44 -0
  275. package/core/workspace-app/tests/unit/plugin-catalog.test.js +31 -0
  276. package/core/workspace-app/tests/unit/plugin-system.test.js +251 -0
  277. package/core/workspace-app/tests/unit/plugins-page.test.js +28 -0
  278. package/core/workspace-app/tests/unit/plugins.test.js +58 -0
  279. package/core/workspace-app/tests/unit/preconditions.test.js +21 -0
  280. package/core/workspace-app/tests/unit/project-activity-filter.test.js +180 -0
  281. package/core/workspace-app/tests/unit/project-make.test.js +143 -0
  282. package/core/workspace-app/tests/unit/project-name.test.js +202 -0
  283. package/core/workspace-app/tests/unit/reader.test.js +62 -0
  284. package/core/workspace-app/tests/unit/release.test.js +92 -0
  285. package/core/workspace-app/tests/unit/remove-confirm.test.js +37 -0
  286. package/core/workspace-app/tests/unit/report-pdf.test.js +171 -0
  287. package/core/workspace-app/tests/unit/round-11.test.js +31 -0
  288. package/core/workspace-app/tests/unit/round-12.test.js +37 -0
  289. package/core/workspace-app/tests/unit/row-layout.test.js +585 -0
  290. package/core/workspace-app/tests/unit/row-menus-fold.test.js +29 -0
  291. package/core/workspace-app/tests/unit/rows-add-modal.test.js +68 -0
  292. package/core/workspace-app/tests/unit/screen-runner-queue.test.js +41 -0
  293. package/core/workspace-app/tests/unit/screen-window.test.js +116 -0
  294. package/core/workspace-app/tests/unit/screens-beside-running.test.js +19 -0
  295. package/core/workspace-app/tests/unit/screens-columns.test.js +79 -0
  296. package/core/workspace-app/tests/unit/screens-menu.test.js +84 -0
  297. package/core/workspace-app/tests/unit/screens-modal-overlay.test.js +14 -0
  298. package/core/workspace-app/tests/unit/screens-waiting.test.js +129 -0
  299. package/core/workspace-app/tests/unit/screens.test.js +93 -0
  300. package/core/workspace-app/tests/unit/second-storage.test.js +218 -0
  301. package/core/workspace-app/tests/unit/session-name.test.js +64 -0
  302. package/core/workspace-app/tests/unit/settings-file.test.js +173 -0
  303. package/core/workspace-app/tests/unit/settings-nested-list.test.js +54 -0
  304. package/core/workspace-app/tests/unit/settings-raw.test.js +177 -0
  305. package/core/workspace-app/tests/unit/shared-prefs.test.js +49 -0
  306. package/core/workspace-app/tests/unit/speech.test.js +290 -0
  307. package/core/workspace-app/tests/unit/static-caching.test.js +39 -0
  308. package/core/workspace-app/tests/unit/status-language.test.js +47 -0
  309. package/core/workspace-app/tests/unit/tab-modal.test.js +69 -0
  310. package/core/workspace-app/tests/unit/tab-title.test.js +37 -0
  311. package/core/workspace-app/tests/unit/template-literals.test.js +52 -0
  312. package/core/workspace-app/tests/unit/terminal-scrollback.test.js +61 -0
  313. package/core/workspace-app/tests/unit/terminal-size.test.js +103 -0
  314. package/core/workspace-app/tests/unit/terminal-style.test.js +84 -0
  315. package/core/workspace-app/tests/unit/terminal-windows.test.js +154 -0
  316. package/core/workspace-app/tests/unit/themes.test.js +453 -0
  317. package/core/workspace-app/tests/unit/tool-labels.test.js +34 -0
  318. package/core/workspace-app/tests/unit/topbar-icons.test.js +47 -0
  319. package/core/workspace-app/tests/unit/update-docker-gid.test.js +51 -0
  320. package/core/workspace-app/tests/unit/user-guide.test.js +60 -0
  321. package/core/workspace-app/tests/unit/version-check.test.js +98 -0
  322. package/core/workspace-app/tests/unit/version-link.test.js +50 -0
  323. package/core/workspace-app/tests/unit/video-borrow.test.js +220 -0
  324. package/core/workspace-app/tests/unit/video-edit-ask.test.js +93 -0
  325. package/core/workspace-app/tests/unit/video-edit-short.test.js +42 -0
  326. package/core/workspace-app/tests/unit/video-edit.test.js +436 -0
  327. package/core/workspace-app/tests/unit/video-transcript.test.js +237 -0
  328. package/core/workspace-app/tests/unit/waiting.test.js +48 -0
  329. package/core/workspace-app/tests/unit/wordpress-odoo-builders.test.js +38 -0
  330. package/core/workspace-app/tests/unit/workspace-bin.test.js +48 -0
  331. package/core/workspace-app/tests/unit/workspace-card-tools.test.js +30 -0
  332. package/core/workspace-app/tests/unit/workspace-delete.test.js +77 -0
  333. package/core/workspace-app/tests/unit/workspace-types.test.js +68 -0
  334. package/core/workspace-app/tests/unit/worktree-clone.test.js +250 -0
  335. package/package.json +38 -36
  336. /package/{WORKSPACES.md → core/workspace-app/WORKSPACES.md} +0 -0
  337. /package/{actions → core/workspace-app/actions}/ai-items.js +0 -0
  338. /package/{actions → core/workspace-app/actions}/audio.js +0 -0
  339. /package/{actions → core/workspace-app/actions}/build-order.js +0 -0
  340. /package/{actions → core/workspace-app/actions}/checks.js +0 -0
  341. /package/{actions → core/workspace-app/actions}/claude-session.js +0 -0
  342. /package/{actions → core/workspace-app/actions}/commands-center.js +0 -0
  343. /package/{actions → core/workspace-app/actions}/composer.js +0 -0
  344. /package/{actions → core/workspace-app/actions}/ddev-addons.js +0 -0
  345. /package/{actions → core/workspace-app/actions}/ddev-mail.js +0 -0
  346. /package/{actions → core/workspace-app/actions}/folders.js +0 -0
  347. /package/{actions → core/workspace-app/actions}/images-svg.js +0 -0
  348. /package/{actions → core/workspace-app/actions}/images.js +0 -0
  349. /package/{actions → core/workspace-app/actions}/navigation.js +0 -0
  350. /package/{actions → core/workspace-app/actions}/node.js +0 -0
  351. /package/{actions → core/workspace-app/actions}/notes.js +0 -0
  352. /package/{actions → core/workspace-app/actions}/plugins.js +0 -0
  353. /package/{actions → core/workspace-app/actions}/project-make.js +0 -0
  354. /package/{actions → core/workspace-app/actions}/row-actions.js +0 -0
  355. /package/{actions → core/workspace-app/actions}/screens.js +0 -0
  356. /package/{actions → core/workspace-app/actions}/video-edit.js +0 -0
  357. /package/{ai-inventory.js → core/workspace-app/ai-inventory.js} +0 -0
  358. /package/{ai-items.js → core/workspace-app/ai-items.js} +0 -0
  359. /package/{assistant-cast.js → core/workspace-app/assistant-cast.js} +0 -0
  360. /package/{assistant-suggestions.js → core/workspace-app/assistant-suggestions.js} +0 -0
  361. /package/{audio-voice.js → core/workspace-app/audio-voice.js} +0 -0
  362. /package/{auth-google.js → core/workspace-app/auth-google.js} +0 -0
  363. /package/{build-ai.js → core/workspace-app/build-ai.js} +0 -0
  364. /package/{build-order-page.js → core/workspace-app/build-order-page.js} +0 -0
  365. /package/{build-order.js → core/workspace-app/build-order.js} +0 -0
  366. /package/{builder-args.js → core/workspace-app/builder-args.js} +0 -0
  367. /package/{changelog.js → core/workspace-app/changelog.js} +0 -0
  368. /package/{chat-threads.js → core/workspace-app/chat-threads.js} +0 -0
  369. /package/{checks.js → core/workspace-app/checks.js} +0 -0
  370. /package/{claude-args.js → core/workspace-app/claude-args.js} +0 -0
  371. /package/{claude-sessions.js → core/workspace-app/claude-sessions.js} +0 -0
  372. /package/{command-author.js → core/workspace-app/command-author.js} +0 -0
  373. /package/{command-block.js → core/workspace-app/command-block.js} +0 -0
  374. /package/{commands → core/workspace-app/commands}/defaults.yml +0 -0
  375. /package/{commands-page.js → core/workspace-app/commands-page.js} +0 -0
  376. /package/{commands.js → core/workspace-app/commands.js} +0 -0
  377. /package/{cucumber.js → core/workspace-app/cucumber.js} +0 -0
  378. /package/{ddev-addons-page.js → core/workspace-app/ddev-addons-page.js} +0 -0
  379. /package/{ddev-addons.js → core/workspace-app/ddev-addons.js} +0 -0
  380. /package/{ddev-custom-commands.js → core/workspace-app/ddev-custom-commands.js} +0 -0
  381. /package/{ddev-domains.js → core/workspace-app/ddev-domains.js} +0 -0
  382. /package/{ddev-import.js → core/workspace-app/ddev-import.js} +0 -0
  383. /package/{ddev-mail-page.js → core/workspace-app/ddev-mail-page.js} +0 -0
  384. /package/{ddev-mail.js → core/workspace-app/ddev-mail.js} +0 -0
  385. /package/{ddev-options.js → core/workspace-app/ddev-options.js} +0 -0
  386. /package/{ddev-snapshots.js → core/workspace-app/ddev-snapshots.js} +0 -0
  387. /package/{ddev.js → core/workspace-app/ddev.js} +0 -0
  388. /package/{docs → core/workspace-app/docs}/DEVELOPER-GUIDE.md +0 -0
  389. /package/{docs → core/workspace-app/docs}/README.md +0 -0
  390. /package/{docs → core/workspace-app/docs}/REFERENCE.md +0 -0
  391. /package/{docs → core/workspace-app/docs}/USER-GUIDE.md +0 -0
  392. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-board.png +0 -0
  393. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-coffee.png +0 -0
  394. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-colours.png +0 -0
  395. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-icons.png +0 -0
  396. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-moves.png +0 -0
  397. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-pick-cookieman.png +0 -0
  398. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-settings-voices.png +0 -0
  399. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-status.png +0 -0
  400. /package/{docs → core/workspace-app/docs}/screenshots/create-card/create-card.png +0 -0
  401. /package/{docs → core/workspace-app/docs}/screenshots/create-card/start-ai.png +0 -0
  402. /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-address.png +0 -0
  403. /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-worktree-off.png +0 -0
  404. /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-worktree-on.png +0 -0
  405. /package/{docs → core/workspace-app/docs}/screenshots/guide-ddev-menu.png +0 -0
  406. /package/{docs → core/workspace-app/docs}/screenshots/guide-domains.png +0 -0
  407. /package/{docs → core/workspace-app/docs}/screenshots/guide-home.png +0 -0
  408. /package/{docs → core/workspace-app/docs}/screenshots/guide-ide-menu.png +0 -0
  409. /package/{docs → core/workspace-app/docs}/screenshots/guide-remove-refusal.png +0 -0
  410. /package/{docs → core/workspace-app/docs}/screenshots/guide-rows-worktree.png +0 -0
  411. /package/{docs → core/workspace-app/docs}/screenshots/guide-screens.png +0 -0
  412. /package/{docs → core/workspace-app/docs}/screenshots/guide-settings.png +0 -0
  413. /package/{docs → core/workspace-app/docs}/screenshots/guide-workspace-page.png +0 -0
  414. /package/{docs → core/workspace-app/docs}/screenshots/home/card-settings.png +0 -0
  415. /package/{docs → core/workspace-app/docs}/screenshots/home/drag-reorder.png +0 -0
  416. /package/{docs → core/workspace-app/docs}/screenshots/home/edit-card.png +0 -0
  417. /package/{docs → core/workspace-app/docs}/screenshots/images/claude-code-image.png +0 -0
  418. /package/{docs → core/workspace-app/docs}/screenshots/images/edit-with-ai.png +0 -0
  419. /package/{docs → core/workspace-app/docs}/screenshots/images/gallery.png +0 -0
  420. /package/{docs → core/workspace-app/docs}/screenshots/images/generate-description.png +0 -0
  421. /package/{docs → core/workspace-app/docs}/screenshots/images/generate-plan.png +0 -0
  422. /package/{docs → core/workspace-app/docs}/screenshots/images/providers.png +0 -0
  423. /package/{docs → core/workspace-app/docs}/screenshots/images/svg-form.png +0 -0
  424. /package/{docs → core/workspace-app/docs}/screenshots/images/svg-result.png +0 -0
  425. /package/{docs → core/workspace-app/docs}/screenshots/images/upload.png +0 -0
  426. /package/{docs → core/workspace-app/docs}/screenshots/new-folder/2-form.png +0 -0
  427. /package/{docs → core/workspace-app/docs}/screenshots/new-folder/8-ddev-options.png +0 -0
  428. /package/{docs → core/workspace-app/docs}/screenshots/new-folder/files-folder.png +0 -0
  429. /package/{docs → core/workspace-app/docs}/screenshots/projects/ddev-custom-commands.png +0 -0
  430. /package/{docs → core/workspace-app/docs}/screenshots/projects/state-chip-stop.png +0 -0
  431. /package/{docs → core/workspace-app/docs}/screenshots/readme/dashboard-dark.png +0 -0
  432. /package/{docs → core/workspace-app/docs}/screenshots/readme/dashboard-light.png +0 -0
  433. /package/{docs → core/workspace-app/docs}/screenshots/readme/dev-dark.png +0 -0
  434. /package/{docs → core/workspace-app/docs}/screenshots/readme/dev-light.png +0 -0
  435. /package/{docs → core/workspace-app/docs}/screenshots/readme/docs-dark.png +0 -0
  436. /package/{docs → core/workspace-app/docs}/screenshots/readme/docs-light.png +0 -0
  437. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/ai.svg +0 -0
  438. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/code.svg +0 -0
  439. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/docs.svg +0 -0
  440. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/services.svg +0 -0
  441. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/sites.svg +0 -0
  442. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-report-dark.png +0 -0
  443. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-report-light.png +0 -0
  444. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-scenarios.png +0 -0
  445. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-steps.png +0 -0
  446. /package/{docs → core/workspace-app/docs}/screenshots/readme/videos-dark.png +0 -0
  447. /package/{docs → core/workspace-app/docs}/screenshots/readme/videos-light.png +0 -0
  448. /package/{docs → core/workspace-app/docs}/screenshots/screens-menu.png +0 -0
  449. /package/{docs → core/workspace-app/docs}/screenshots/screens-new.png +0 -0
  450. /package/{docs → core/workspace-app/docs}/screenshots/settings/auth-google-lists.png +0 -0
  451. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-1-row.png +0 -0
  452. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-2-confirm.png +0 -0
  453. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-3-type-name.png +0 -0
  454. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-4-type-yes.png +0 -0
  455. /package/{event-log.js → core/workspace-app/event-log.js} +0 -0
  456. /package/{files-browser.js → core/workspace-app/files-browser.js} +0 -0
  457. /package/{folders.js → core/workspace-app/folders.js} +0 -0
  458. /package/{format.js → core/workspace-app/format.js} +0 -0
  459. /package/{github-auth.js → core/workspace-app/github-auth.js} +0 -0
  460. /package/{html.js → core/workspace-app/html.js} +0 -0
  461. /package/{icons.js → core/workspace-app/icons.js} +0 -0
  462. /package/{images-ai.js → core/workspace-app/images-ai.js} +0 -0
  463. /package/{images-create.js → core/workspace-app/images-create.js} +0 -0
  464. /package/{images-page.js → core/workspace-app/images-page.js} +0 -0
  465. /package/{images-records.js → core/workspace-app/images-records.js} +0 -0
  466. /package/{images-render.js → core/workspace-app/images-render.js} +0 -0
  467. /package/{images-svg-core.js → core/workspace-app/images-svg-core.js} +0 -0
  468. /package/{images-svg-sanitize.js → core/workspace-app/images-svg-sanitize.js} +0 -0
  469. /package/{images-svg.js → core/workspace-app/images-svg.js} +0 -0
  470. /package/{images.js → core/workspace-app/images.js} +0 -0
  471. /package/{jobs.js → core/workspace-app/jobs.js} +0 -0
  472. /package/{linger.js → core/workspace-app/linger.js} +0 -0
  473. /package/{lists.js → core/workspace-app/lists.js} +0 -0
  474. /package/{media-info.js → core/workspace-app/media-info.js} +0 -0
  475. /package/{navigation-page.js → core/workspace-app/navigation-page.js} +0 -0
  476. /package/{navigation.js → core/workspace-app/navigation.js} +0 -0
  477. /package/{notes.js → core/workspace-app/notes.js} +0 -0
  478. /package/{palette-index.js → core/workspace-app/palette-index.js} +0 -0
  479. /package/{playwright.config.js → core/workspace-app/playwright.config.js} +0 -0
  480. /package/{plugin-install.js → core/workspace-app/plugin-install.js} +0 -0
  481. /package/{plugin-loader.js → core/workspace-app/plugin-loader.js} +0 -0
  482. /package/{plugin-manifest.js → core/workspace-app/plugin-manifest.js} +0 -0
  483. /package/{plugin-settings.js → core/workspace-app/plugin-settings.js} +0 -0
  484. /package/{plugins → core/workspace-app/plugins}/workspace-notes/index.js +0 -0
  485. /package/{project-make.js → core/workspace-app/project-make.js} +0 -0
  486. /package/{project-name.js → core/workspace-app/project-name.js} +0 -0
  487. /package/{public → core/workspace-app/public}/assistant-avatar-moves.js +0 -0
  488. /package/{public → core/workspace-app/public}/assistant-avatar-ui.js +0 -0
  489. /package/{public → core/workspace-app/public}/assistant-avatar.js +0 -0
  490. /package/{public → core/workspace-app/public}/avatar/druplicon.vrm +0 -0
  491. /package/{public → core/workspace-app/public}/css/base.css +0 -0
  492. /package/{public → core/workspace-app/public}/css/components/ai-assistant.css +0 -0
  493. /package/{public → core/workspace-app/public}/css/components/assistant-avatar.css +0 -0
  494. /package/{public → core/workspace-app/public}/css/components/assistant-views.css +0 -0
  495. /package/{public → core/workspace-app/public}/css/components/build-order.css +0 -0
  496. /package/{public → core/workspace-app/public}/css/components/clone-as-a-git-worktree.css +0 -0
  497. /package/{public → core/workspace-app/public}/css/components/command-palette.css +0 -0
  498. /package/{public → core/workspace-app/public}/css/components/commands-center.css +0 -0
  499. /package/{public → core/workspace-app/public}/css/components/confirm-dialog.css +0 -0
  500. /package/{public → core/workspace-app/public}/css/components/create-card.css +0 -0
  501. /package/{public → core/workspace-app/public}/css/components/ddev-menu.css +0 -0
  502. /package/{public → core/workspace-app/public}/css/components/deep-chat.css +0 -0
  503. /package/{public → core/workspace-app/public}/css/components/density.css +0 -0
  504. /package/{public → core/workspace-app/public}/css/components/floating-assistant-workspace-pages.css +0 -0
  505. /package/{public → core/workspace-app/public}/css/components/folders.css +0 -0
  506. /package/{public → core/workspace-app/public}/css/components/full-height-left-assistant-sidebar-all-pages.css +0 -0
  507. /package/{public → core/workspace-app/public}/css/components/full-height-right-actions-rail-pages-that-have-actions.css +0 -0
  508. /package/{public → core/workspace-app/public}/css/components/grid-and-list.css +0 -0
  509. /package/{public → core/workspace-app/public}/css/components/help-page.css +0 -0
  510. /package/{public → core/workspace-app/public}/css/components/hero.css +0 -0
  511. /package/{public → core/workspace-app/public}/css/components/images.css +0 -0
  512. /package/{public → core/workspace-app/public}/css/components/layout-rhythm-and-spacing-polish.css +0 -0
  513. /package/{public → core/workspace-app/public}/css/components/mic-on-any-field-that-wants-typing.css +0 -0
  514. /package/{public → core/workspace-app/public}/css/components/modal-fit.css +0 -0
  515. /package/{public → core/workspace-app/public}/css/components/page-width.css +0 -0
  516. /package/{public → core/workspace-app/public}/css/components/plugins-page.css +0 -0
  517. /package/{public → core/workspace-app/public}/css/components/project-cards.css +0 -0
  518. /package/{public → core/workspace-app/public}/css/components/project-rows.css +0 -0
  519. /package/{public → core/workspace-app/public}/css/components/reordering-the-workspace-cards.css +0 -0
  520. /package/{public → core/workspace-app/public}/css/components/responsive-home-and-the-workspace-pages.css +0 -0
  521. /package/{public → core/workspace-app/public}/css/components/running-commands-as-toasts.css +0 -0
  522. /package/{public → core/workspace-app/public}/css/components/settings-editor-core-config-yml.css +0 -0
  523. /package/{public → core/workspace-app/public}/css/components/short-results-as-a-toast-at-the-top.css +0 -0
  524. /package/{public → core/workspace-app/public}/css/components/sound-player.css +0 -0
  525. /package/{public → core/workspace-app/public}/css/components/suggest-agents-skills-commands.css +0 -0
  526. /package/{public → core/workspace-app/public}/css/components/tab-modal.css +0 -0
  527. /package/{public → core/workspace-app/public}/css/components/terminals.css +0 -0
  528. /package/{public → core/workspace-app/public}/css/components/test-report-media-one-file-per-row-paged.css +0 -0
  529. /package/{public → core/workspace-app/public}/css/components/top-toolbar-logo-breadcrumb.css +0 -0
  530. /package/{public → core/workspace-app/public}/css/components/video-edit.css +0 -0
  531. /package/{public → core/workspace-app/public}/css/components/web-ide-open-with.css +0 -0
  532. /package/{public → core/workspace-app/public}/css/components/working-indicators.css +0 -0
  533. /package/{public → core/workspace-app/public}/css/components/workspace-cards.css +0 -0
  534. /package/{public → core/workspace-app/public}/favicon.ico +0 -0
  535. /package/{public → core/workspace-app/public}/favicon.png +0 -0
  536. /package/{public → core/workspace-app/public}/htmx.min.js +0 -0
  537. /package/{public → core/workspace-app/public}/logo.png +0 -0
  538. /package/{public → core/workspace-app/public}/media-player.js +0 -0
  539. /package/{public → core/workspace-app/public}/mic.js +0 -0
  540. /package/{public → core/workspace-app/public}/narration.js +0 -0
  541. /package/{public → core/workspace-app/public}/palette.js +0 -0
  542. /package/{public → core/workspace-app/public}/sortable.js +0 -0
  543. /package/{public → core/workspace-app/public}/suggest.js +0 -0
  544. /package/{public → core/workspace-app/public}/terminal.js +0 -0
  545. /package/{public → core/workspace-app/public}/themes/default/theme.css +0 -0
  546. /package/{public → core/workspace-app/public}/themes/ember/theme.css +0 -0
  547. /package/{public → core/workspace-app/public}/themes/press/theme.css +0 -0
  548. /package/{public → core/workspace-app/public}/themes/slate/theme.css +0 -0
  549. /package/{public → core/workspace-app/public}/touch-icon.png +0 -0
  550. /package/{public → core/workspace-app/public}/ui.js +0 -0
  551. /package/{public → core/workspace-app/public}/vendor/ace/LICENSE.txt +0 -0
  552. /package/{public → core/workspace-app/public}/vendor/ace/ace.js +0 -0
  553. /package/{public → core/workspace-app/public}/vendor/ace/ext-language_tools.js +0 -0
  554. /package/{public → core/workspace-app/public}/vendor/ace/ext-searchbox.js +0 -0
  555. /package/{public → core/workspace-app/public}/vendor/ace/mode-css.js +0 -0
  556. /package/{public → core/workspace-app/public}/vendor/ace/mode-html.js +0 -0
  557. /package/{public → core/workspace-app/public}/vendor/ace/mode-javascript.js +0 -0
  558. /package/{public → core/workspace-app/public}/vendor/ace/mode-markdown.js +0 -0
  559. /package/{public → core/workspace-app/public}/vendor/ace/mode-sh.js +0 -0
  560. /package/{public → core/workspace-app/public}/vendor/ace/mode-yaml.js +0 -0
  561. /package/{public → core/workspace-app/public}/vendor/ace/theme-textmate.js +0 -0
  562. /package/{public → core/workspace-app/public}/vendor/ace/theme-tomorrow_night.js +0 -0
  563. /package/{public → core/workspace-app/public}/vendor/ace/worker-yaml.js +0 -0
  564. /package/{public → core/workspace-app/public}/vendor/deep-chat.LICENSE +0 -0
  565. /package/{public → core/workspace-app/public}/vendor/deep-chat.bundle.js +0 -0
  566. /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-LICENSE.txt +0 -0
  567. /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-latin-400-italic.woff2 +0 -0
  568. /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-latin-400-normal.woff2 +0 -0
  569. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-LICENSE.txt +0 -0
  570. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-400-italic.woff2 +0 -0
  571. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-400-normal.woff2 +0 -0
  572. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-600-italic.woff2 +0 -0
  573. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-600-normal.woff2 +0 -0
  574. /package/{public → core/workspace-app/public}/vendor/fonts/jetbrains-mono-LICENSE.txt +0 -0
  575. /package/{public → core/workspace-app/public}/vendor/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  576. /package/{public → core/workspace-app/public}/vendor/fonts/ubuntu-mono-LICENSE.txt +0 -0
  577. /package/{public → core/workspace-app/public}/vendor/fonts/ubuntu-mono-latin-wght-normal.woff2 +0 -0
  578. /package/{public → core/workspace-app/public}/vendor/tabler-LICENSE.txt +0 -0
  579. /package/{public → core/workspace-app/public}/vendor/tabler-sprite.svg +0 -0
  580. /package/{public → core/workspace-app/public}/vendor/three/LICENSE +0 -0
  581. /package/{public → core/workspace-app/public}/vendor/three/addons/loaders/GLTFLoader.js +0 -0
  582. /package/{public → core/workspace-app/public}/vendor/three/addons/utils/BufferGeometryUtils.js +0 -0
  583. /package/{public → core/workspace-app/public}/vendor/three/addons/utils/SkeletonUtils.js +0 -0
  584. /package/{public → core/workspace-app/public}/vendor/three/three.core.min.js +0 -0
  585. /package/{public → core/workspace-app/public}/vendor/three/three.module.min.js +0 -0
  586. /package/{public → core/workspace-app/public}/vendor/three-vrm/LICENSE +0 -0
  587. /package/{public → core/workspace-app/public}/vendor/three-vrm/three-vrm.module.min.js +0 -0
  588. /package/{public → core/workspace-app/public}/vendor/uikit-icons.min.js +0 -0
  589. /package/{public → core/workspace-app/public}/vendor/uikit.min.css +0 -0
  590. /package/{public → core/workspace-app/public}/vendor/uikit.min.js +0 -0
  591. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/bookmark-outlined.svg +0 -0
  592. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/headset.svg +0 -0
  593. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/menu.svg +0 -0
  594. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/pause.svg +0 -0
  595. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/play.svg +0 -0
  596. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/share.svg +0 -0
  597. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/sound-off.svg +0 -0
  598. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/sound-on.svg +0 -0
  599. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/stop.svg +0 -0
  600. /package/{public → core/workspace-app/public}/vendor/xterm/addon-fit.js +0 -0
  601. /package/{public → core/workspace-app/public}/vendor/xterm/addon-unicode11.js +0 -0
  602. /package/{public → core/workspace-app/public}/vendor/xterm/addon-web-links.js +0 -0
  603. /package/{public → core/workspace-app/public}/vendor/xterm/xterm.css +0 -0
  604. /package/{public → core/workspace-app/public}/vendor/xterm/xterm.js +0 -0
  605. /package/{rag.js → core/workspace-app/rag.js} +0 -0
  606. /package/{reader.js → core/workspace-app/reader.js} +0 -0
  607. /package/{repo-blobs.js → core/workspace-app/repo-blobs.js} +0 -0
  608. /package/{report-pdf.js → core/workspace-app/report-pdf.js} +0 -0
  609. /package/{row-layout.js → core/workspace-app/row-layout.js} +0 -0
  610. /package/{screenrc → core/workspace-app/screenrc} +0 -0
  611. /package/{screens.js → core/workspace-app/screens.js} +0 -0
  612. /package/{scripts → core/workspace-app/scripts}/code-server-start.sh +0 -0
  613. /package/{scripts → core/workspace-app/scripts}/images-claude-finish.js +0 -0
  614. /package/{scripts → core/workspace-app/scripts}/screen-host.sh +0 -0
  615. /package/{scripts → core/workspace-app/scripts}/screen-runner.js +0 -0
  616. /package/{scripts → core/workspace-app/scripts}/screen-then.js +0 -0
  617. /package/{scripts → core/workspace-app/scripts}/update.sh +0 -0
  618. /package/{settings-file.js → core/workspace-app/settings-file.js} +0 -0
  619. /package/{speech.js → core/workspace-app/speech.js} +0 -0
  620. /package/{tab-modal.js → core/workspace-app/tab-modal.js} +0 -0
  621. /package/{test-reports.js → core/workspace-app/test-reports.js} +0 -0
  622. /package/{themes.js → core/workspace-app/themes.js} +0 -0
  623. /package/{transcripts.js → core/workspace-app/transcripts.js} +0 -0
  624. /package/{urls.js → core/workspace-app/urls.js} +0 -0
  625. /package/{validate.js → core/workspace-app/validate.js} +0 -0
  626. /package/{version-check.js → core/workspace-app/version-check.js} +0 -0
  627. /package/{video-edit.js → core/workspace-app/video-edit.js} +0 -0
  628. /package/{waiting.js → core/workspace-app/waiting.js} +0 -0
  629. /package/{workspace-card-tools.js → core/workspace-app/workspace-card-tools.js} +0 -0
  630. /package/{workspace-delete.js → core/workspace-app/workspace-delete.js} +0 -0
  631. /package/{workspace-types.js → core/workspace-app/workspace-types.js} +0 -0
  632. /package/{workspaces.js → core/workspace-app/workspaces.js} +0 -0
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # The Website project template (drupal/website) is installed by the Webship
4
+ # installer, which offers the three Webship site templates. Pick one.
5
+
6
+ argparse "$@" <<EOF || exit 1
7
+ parser.add_argument('PROJECT_NAME',
8
+ help='The name of the project. It becomes https://<PROJECT_NAME>.ddev.site')
9
+ parser.add_argument('-t', '--template',
10
+ default="website_starter",
11
+ choices=['website_starter', 'webship_starter', 'webship_portal'],
12
+ help='The site template the Webship installer installs [default %(default)s].')
13
+ parser.add_argument('-a', '--add-users',
14
+ action='store_true',
15
+ default=False,
16
+ help='Add the default set of users after the install.')
17
+ parser.add_argument('-f', '--with-pending-fixes',
18
+ action='store_true',
19
+ default=False,
20
+ help='Pin the web* issue-fork branches that are not merged yet (webblog MR !4, webreleases MR !5).')
21
+ parser.add_argument('-p', '--php-version',
22
+ default="",
23
+ choices=['8.5', '8.4', '8.3', '8.2', '8.1', '8.0', '7.4'],
24
+ help='PHP version for the project container. The seven most recent PHP releases DDEV supports; empty means the builder default. Example: --php-version 8.3')
25
+ EOF
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env bash
2
+
3
+ argparse "$@" <<ARGEOF || exit 1
4
+ parser.add_argument('PROJECT_NAME',
5
+ help='The name of the project.')
6
+ parser.add_argument('-i', '--install',
7
+ action='store_true',
8
+ default=False,
9
+ help='Install WordPress, with the workspace account as the administrator.')
10
+ parser.add_argument('-l', '--launch',
11
+ action='store_true',
12
+ default=False,
13
+ help='Open the site in a browser when it is ready.')
14
+ parser.add_argument('--php-version',
15
+ default="",
16
+ choices=['8.5', '8.4', '8.3', '8.2', '8.1'],
17
+ help='PHP version for the project container; empty means DDEV\'s default. Example: --php-version 8.3')
18
+ ARGEOF
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # What the boot service runs. Kept as its own file, not inlined into the unit, so that what runs at
4
+ # boot is the same thing you can run by hand and read the output of — `core/scripts/autostart.sh --now`
5
+ # calls exactly this.
6
+ #
7
+ # The whole job is: wait until Docker will actually answer, then `ddev start` the configured projects.
8
+ # The waiting is the part that matters. At boot this races dockerd, and `ddev start` against a socket
9
+ # that is not listening yet fails in a way that leaves the project half-configured — so it polls
10
+ # rather than assuming, and gives up loudly instead of silently doing nothing.
11
+
12
+ # No `set -u`: bootstrap.sh and libs/bash-yaml.sh both read variables that are legitimately unset
13
+ # (WORKSPACE_REPO, parse_yaml's optional prefix), so it aborts the chain before Docker is even
14
+ # checked. Nothing else in this tree sets it either.
15
+
16
+ WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}";
17
+ source "${WORKSPACE_SCRIPTS}/bootstrap.sh" || exit 1 ;
18
+
19
+ eval $(parse_yaml "${WORKSPACE_CONFIG}/settings.yml" 2>/dev/null);
20
+
21
+ log() { printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" ; }
22
+
23
+ # WHICH PROJECTS, and why this is not just a list of names.
24
+ #
25
+ # A hand-maintained list is wrong within a week: you build a project, you never think about this file
26
+ # again, and after the next reboot it is not there. So the setting takes a small vocabulary as well as
27
+ # literal names:
28
+ #
29
+ # workspace just the dashboard. The default, and usually the right answer — it boots in seconds
30
+ # and you can start anything else from it with one click.
31
+ # running whatever was running when the machine last shut down cleanly. This is what people
32
+ # actually mean by "bring my work back", and it needs no maintenance.
33
+ # all every project DDEV has registered. Honest about the cost: 11 projects here is 11×
34
+ # (web + db) containers competing for RAM and disk at boot.
35
+ # a,b,c exactly these, in this order.
36
+ #
37
+ # The dashboard is ALWAYS first and always included, whatever the setting says. It is the way in to
38
+ # everything else, so a boot that brings back four sites and no dashboard is a worse outcome than one
39
+ # that brings back only the dashboard.
40
+ readonly STATE_FILE="${WORKSPACE_PATH}/state/autostart-was-running";
41
+
42
+ function resolve_projects() {
43
+ local setting="${dashboard_autostart:-workspace}" resolved="";
44
+
45
+ case "${setting}" in
46
+ all)
47
+ resolved="$(ddev list --json-output 2>/dev/null | jq -r '.raw[]?.name // empty' 2>/dev/null | paste -sd, -)";
48
+ ;;
49
+ running)
50
+ # Recorded by the service's ExecStop on a clean shutdown. A hard poweroff never runs ExecStop,
51
+ # so the file may be stale or missing — the dashboard-only fallback below covers that rather
52
+ # than the boot failing over a missing file.
53
+ [ -f "${STATE_FILE}" ] && resolved="$(cat "${STATE_FILE}" 2>/dev/null)";
54
+ [ -z "${resolved}" ] && log "no record of what was running (hard poweroff?) — starting the dashboard only" ;
55
+ ;;
56
+ *)
57
+ resolved="${setting}";
58
+ ;;
59
+ esac
60
+
61
+ # Dashboard first, then the rest, no duplicates and order preserved.
62
+ printf 'workspace\n%s\n' "$(printf '%s' "${resolved}" | tr ',' '\n')" \
63
+ | sed 's/^[[:space:]]*//; s/[[:space:]]*$//' | sed '/^$/d' | awk '!seen[$0]++';
64
+ }
65
+
66
+ # `--list` prints what WOULD start and exits. The status display calls this rather than re-deriving
67
+ # the list, so the two can never disagree about what a reboot will bring back — the same reason the
68
+ # checks command asks checks_plan.js instead of keeping its own copy of the map.
69
+ if [ "${1:-}" == '--list' ] ; then
70
+ resolve_projects ;
71
+ exit 0 ;
72
+ fi
73
+
74
+ # Docker, before anything else. 24 × 5s = two minutes, which covers a cold boot on a slow disk
75
+ # without hanging the unit for the full 900s timeout when Docker is genuinely broken.
76
+ attempt=0 ;
77
+ until docker info > /dev/null 2>&1 ; do
78
+ attempt=$(( attempt + 1 )) ;
79
+ if [ "${attempt}" -ge 24 ] ; then
80
+ log "Docker did not become available after 2 minutes. Nothing was started." ;
81
+ exit 1 ;
82
+ fi
83
+ log "waiting for Docker… (${attempt}/24)" ;
84
+ sleep 5 ;
85
+ done
86
+ log "Docker is up." ;
87
+
88
+ # DDEV's own shared infrastructure, before any project. `ddev-router` and `ddev-ssh-agent` are not
89
+ # projects — every project depends on them, but nothing owns starting them back up.
90
+ #
91
+ # This is the actual bug behind "ddev start did not work" and the boot service silently not
92
+ # starting the dashboard: a laptop suspend/reboot leaves these containers `exited` (Docker gives
93
+ # them no restart policy, same as every project container), and an EXITED container has no live
94
+ # network attachment, so Docker's own DNS has nothing to resolve `ddev-router` to. The web
95
+ # container's nginx fails at startup with "host not found in upstream ddev-router", supervisord
96
+ # gives up after three quick retries, and the WHOLE container exits — cleanly, exit code 0, which
97
+ # is why this reads as nothing having failed while nothing comes up either.
98
+ #
99
+ # `ddev start` does not reliably fix this on its own: it recreates the PROJECT's containers and
100
+ # leaves the router exactly as it found it. Confirmed by hand — starting the router first, then
101
+ # `ddev start`, works in one try; `ddev start` alone against a dead router does not, however many
102
+ # times it is retried.
103
+ for infra in ddev-router ddev-ssh-agent ; do
104
+ # Absent entirely is fine — a machine that has never run a project has neither yet, and `ddev
105
+ # start` creates what it needs. Only an EXISTING, stopped container is the failure to repair.
106
+ state="$(docker inspect "${infra}" --format '{{.State.Status}}' 2>/dev/null)" ;
107
+ if [ -n "${state}" ] && [ "${state}" != 'running' ] ; then
108
+ log "${infra} is ${state}, not running — starting it before any project." ;
109
+ docker start "${infra}" > /dev/null 2>&1 ;
110
+ # Give it a moment to attach to the network and pass its own health check before the project
111
+ # that depends on it starts racing it. Not a hard wait: if it is still not running after this,
112
+ # the project start below will fail loudly and say why, rather than hanging silently on it.
113
+ for _ in 1 2 3 4 5 6 ; do
114
+ [ "$(docker inspect "${infra}" --format '{{.State.Status}}' 2>/dev/null)" == 'running' ] && break ;
115
+ sleep 2 ;
116
+ done
117
+ fi
118
+ done
119
+
120
+ projects="$(resolve_projects | paste -sd' ' -)";
121
+ log "starting: ${projects}" ;
122
+
123
+ status=0 ;
124
+ for project in ${projects} ; do
125
+ case "${project}" in
126
+ workspace) project_path="${WORKSPACE_PATH}/workspace-app" ;;
127
+ *) project_path="$(ddev list --json-output 2>/dev/null \
128
+ | jq -r --arg n "${project}" '.raw[]? | select(.name==$n) | .approot' 2>/dev/null | head -1)" ;;
129
+ esac
130
+
131
+ if [ -z "${project_path}" ] || [ ! -d "${project_path}/.ddev" ] ; then
132
+ log "skipping ${project}: no DDEV project found for it." ;
133
+ continue ;
134
+ fi
135
+
136
+ log "starting ${project} (${project_path})…" ;
137
+ if ( cd "${project_path}" && ddev start -y ) ; then
138
+ log "started ${project}." ;
139
+ else
140
+ log "FAILED to start ${project}." ;
141
+ status=1 ;
142
+ fi
143
+ done
144
+
145
+ # The screen runner belongs to the same "the machine came back" job. Sessions run on the
146
+ # HOST — that is the whole point of them, so `screen -r` works in your own terminal and a
147
+ # browser an agent drives opens on your desktop — and the dashboard runs in a container,
148
+ # which cannot start a host process. So without this, every Screens page action and every
149
+ # item-sync button answers "its runner is not up" until somebody runs one command, on a
150
+ # machine that otherwise looks fully set up.
151
+ screen_host="${WORKSPACE_PATH}/workspace-app/scripts/screen-host.sh";
152
+ if [ -f "${screen_host}" ] ; then
153
+ if bash "${screen_host}" --status 2>/dev/null | grep -q '^Running' ; then
154
+ log "screen runner already up." ;
155
+ elif bash "${screen_host}" --start > /dev/null 2>&1 ; then
156
+ log "started the screen runner." ;
157
+ else
158
+ log "could not start the screen runner — the Screens page will say so." ;
159
+ fi
160
+ fi
161
+
162
+ exit "${status}" ;
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Record which projects were running, so `autostart: running` has something to restore.
4
+ #
5
+ # Run as the service's ExecStop, which systemd calls on a clean shutdown or reboot. A hard poweroff
6
+ # never runs it, so the file can be stale or absent — the boot side treats that as "dashboard only"
7
+ # rather than failing, because a boot that starts nothing is worse than a boot that starts one thing.
8
+ #
9
+ # It records rather than acts: nothing here stops a project. `ddev poweroff` on shutdown would be
10
+ # tidier in theory and is wrong in practice — Docker is already going down around it, and a half-
11
+ # stopped project is how a database volume gets corrupted.
12
+
13
+ WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}";
14
+ source "${WORKSPACE_SCRIPTS}/bootstrap.sh" || exit 0 ;
15
+
16
+ STATE_DIR="${WORKSPACE_PATH}/state";
17
+ STATE_FILE="${STATE_DIR}/autostart-was-running";
18
+
19
+ mkdir -p "${STATE_DIR}" 2>/dev/null ;
20
+
21
+ running="$(ddev list --json-output 2>/dev/null \
22
+ | jq -r '.raw[]? | select(.status=="running") | .name' 2>/dev/null | paste -sd, -)";
23
+
24
+ # Only overwrite when the answer is believable. If Docker is already gone the query returns nothing,
25
+ # and writing that empty result would erase a perfectly good record from the previous shutdown.
26
+ if [ -n "${running}" ] ; then
27
+ printf '%s\n' "${running}" > "${STATE_FILE}" ;
28
+ fi
29
+
30
+ exit 0 ;
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Runs every couple of minutes from webship-workspace-watch.timer.
4
+ #
5
+ # The boot service starts the dashboard once. When Docker itself restarts afterwards (an update, a crash,
6
+ # somebody running `systemctl restart docker`), every DDEV container stops and nothing starts them again,
7
+ # so every workspace URL answers 404 until a person notices. This notices: it remembers when Docker last
8
+ # started, and when that moment has changed it runs the same script the boot service runs, once.
9
+ #
10
+ # It never starts anything just because the dashboard is not running. A dashboard stopped on purpose
11
+ # stays stopped; only "Docker came back since I last looked" restores it.
12
+ #
13
+ # Overrides, for tests: AUTOSTART_WATCH_STATE (the stamp file), AUTOSTART_WATCH_DOCKER_STAMP (the value
14
+ # systemd would report) and AUTOSTART_WATCH_RUN (what to run instead of autostart-run.sh).
15
+
16
+ WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}"
17
+ STATE="${AUTOSTART_WATCH_STATE:-${XDG_STATE_HOME:-${HOME}/.local/state}/webship-workspace/docker-started}"
18
+ RUN="${AUTOSTART_WATCH_RUN:-bash ${WORKSPACE_SCRIPTS}/autostart-run.sh}"
19
+
20
+ log() { printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" ; }
21
+
22
+ if [ -n "${AUTOSTART_WATCH_DOCKER_STAMP+x}" ] ; then
23
+ current="${AUTOSTART_WATCH_DOCKER_STAMP}"
24
+ else
25
+ [ "$(systemctl is-active docker 2>/dev/null)" = "active" ] || exit 0
26
+ current="$(systemctl show docker --property=ActiveEnterTimestamp --value 2>/dev/null)"
27
+ fi
28
+ [ -n "${current}" ] || exit 0
29
+
30
+ mkdir -p "$(dirname "${STATE}")"
31
+ previous="$(cat "${STATE}" 2>/dev/null)"
32
+
33
+ if [ -z "${previous}" ] ; then
34
+ printf '%s\n' "${current}" > "${STATE}"
35
+ log "first look: Docker started ${current}; nothing to do"
36
+ exit 0
37
+ fi
38
+ [ "${current}" = "${previous}" ] && exit 0
39
+
40
+ # Record it BEFORE running, so a start that fails is not retried every two minutes.
41
+ printf '%s\n' "${current}" > "${STATE}"
42
+ log "Docker restarted (${previous} -> ${current}); starting the dashboard again"
43
+ bash -c "${RUN}"
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # The dashboard's own hostnames, and getting it back after a reboot.
4
+ #
5
+ # A DDEV project's containers carry `restart: no`, so nothing brings the dashboard back when the
6
+ # machine boots — every workspace URL then answers 404 from a router with nothing behind it. This
7
+ # installs a systemd USER service that runs `ddev start` for the configured projects at boot, and
8
+ # manages `hub_domain` — the one field every dashboard URL and DDEV's own routing are built from.
9
+ #
10
+ # Machine setup rather than per-project work, which is why it lives in core/scripts beside
11
+ # sync-tooling.sh and install.sh: it is run once when a machine is set up, takes no project name, and
12
+ # configures the box rather than acting on a project.
13
+
14
+ # Bootstrap.
15
+ # Find the workspace tooling from this script, so a fresh clone needs no setup.
16
+ WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}";
17
+ source ${WORKSPACE_SCRIPTS}/bootstrap.sh || exit 1 ;
18
+
19
+ eval $(parse_yaml ${WORKSPACE_CONFIG}/settings.yml);
20
+
21
+ ARGPARSE_DESCRIPTION="Bring the dashboard back after a reboot, and set the domain everything is built from"
22
+ source ${WORKSPACE_SCRIPTS}/args/arg-autostart.sh || exit 1 ;
23
+
24
+ shift $#;
25
+
26
+ autostart_command ;
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Include users functions.
4
+ source ${WORKSPACE_SCRIPTS}/functions/fun-users.sh || exit 1 ;
5
+
6
+ # Include Default settings functions.
7
+ source ${WORKSPACE_SCRIPTS}/functions/fun-default-settings.sh || exit 1 ;
8
+
9
+ # Include Database functions.
10
+ source ${WORKSPACE_SCRIPTS}/functions/fun-database.sh || exit 1 ;
11
+ source ${WORKSPACE_SCRIPTS}/functions/fun-ddev-telemetry.sh || exit 1 ;
12
+ source ${WORKSPACE_SCRIPTS}/functions/fun-ddev-nodejs.sh || exit 1 ;
13
+
14
+ # Include Files functions.
15
+ source ${WORKSPACE_SCRIPTS}/functions/fun-files.sh || exit 1 ;
16
+
17
+ # Include backup functions.
18
+ source ${WORKSPACE_SCRIPTS}/functions/fun-backup-item.sh || exit 1 ;
19
+
20
+ # Include clone-project functions.
21
+ source ${WORKSPACE_SCRIPTS}/functions/fun-clone-project.sh || exit 1 ;
22
+ source ${WORKSPACE_SCRIPTS}/functions/fun-git-worktrees.sh || exit 1 ;
23
+ source ${WORKSPACE_SCRIPTS}/functions/fun-ddev-hostnames.sh || exit 1 ;
24
+ source ${WORKSPACE_SCRIPTS}/functions/fun-hostnames-cli.sh || exit 1 ;
25
+
26
+ # Include screen-session functions.
27
+ source ${WORKSPACE_SCRIPTS}/functions/fun-screen.sh || exit 1 ;
28
+
29
+ # Include project removal functions.
30
+ source ${WORKSPACE_SCRIPTS}/functions/fun-remove-project.sh || exit 1 ;
31
+
32
+ # Include drush functions.
33
+ source ${WORKSPACE_SCRIPTS}/functions/fun-drush.sh || exit 1 ;
34
+
35
+ # Include distribution functions.
36
+ source ${WORKSPACE_SCRIPTS}/functions/fun-build-distribution.sh || exit 1 ;
37
+
38
+ # Include site template functions.
39
+ source ${WORKSPACE_SCRIPTS}/functions/fun-build-site-template.sh || exit 1 ;
40
+
41
+ # Include the Website stack and the Webships API build families.
42
+ source ${WORKSPACE_SCRIPTS}/functions/fun-build-website.sh || exit 1 ;
43
+ source ${WORKSPACE_SCRIPTS}/functions/fun-build-webships.sh || exit 1 ;
44
+
45
+ # Include Obsidian (reading a project's graph as a vault) functions.
46
+
47
+
48
+ # Include AI provider key functions.
49
+ source ${WORKSPACE_SCRIPTS}/functions/fun-ai-providers.sh || exit 1 ;
50
+
51
+ # Include GitLab CI (gitlab-ci-local green-gate) functions.
52
+ source ${WORKSPACE_SCRIPTS}/functions/fun-gitlab-ci.sh || exit 1 ;
53
+
54
+ # Include AI item (agents/skills/prompts) functions.
55
+ source ${WORKSPACE_SCRIPTS}/functions/fun-ai-items.sh || exit 1 ;
56
+ source ${WORKSPACE_SCRIPTS}/functions/fun-ai-items-lock.sh || exit 1 ;
57
+ source ${WORKSPACE_SCRIPTS}/functions/fun-ai-items-sources.sh || exit 1 ;
58
+
59
+ # Include workspace command management functions.
60
+ source ${WORKSPACE_SCRIPTS}/functions/fun-commands.sh || exit 1 ;
61
+
62
+ # Include Penpot (self-hosted design platform in DDEV) functions.
63
+ source ${WORKSPACE_SCRIPTS}/functions/fun-penpot.sh || exit 1 ;
64
+ source ${WORKSPACE_SCRIPTS}/functions/fun-wordpress.sh || exit 1 ;
65
+ source ${WORKSPACE_SCRIPTS}/functions/fun-odoo.sh || exit 1 ;
66
+ source ${WORKSPACE_SCRIPTS}/functions/fun-avatar.sh || exit 1 ;
67
+
68
+
69
+ # Include Milvus (self-hosted vector database in DDEV) functions.
70
+ source ${WORKSPACE_SCRIPTS}/functions/fun-milvus.sh || exit 1 ;
71
+
72
+ # Include RAG index build (ragify) functions.
73
+ source ${WORKSPACE_SCRIPTS}/functions/fun-ragify.sh || exit 1 ;
74
+
75
+ # Include rag workspace (the index store and its MCP wiring) functions.
76
+ source ${WORKSPACE_SCRIPTS}/functions/fun-rag.sh || exit 1 ;
77
+
78
+ # Include Google Drive (push a workspace folder to a Drive folder, and its MCP server) functions.
79
+
80
+ # Include automated-testing (set up and run a project's suite) functions.
81
+ source ${WORKSPACE_SCRIPTS}/functions/fun-testing.sh || exit 1 ;
82
+
83
+ # The code-quality checks a package already declares (cmd-tools-checks.sh).
84
+ source ${WORKSPACE_SCRIPTS}/functions/fun-checks.sh || exit 1 ;
85
+
86
+ # Reclaiming the disk that removed projects left behind (cmd-tools-reclaim.sh).
87
+ source ${WORKSPACE_SCRIPTS}/functions/fun-reclaim.sh || exit 1 ;
88
+
89
+ # The dashboard's hostnames and its boot service (core/scripts/autostart.sh).
90
+ source ${WORKSPACE_SCRIPTS}/functions/fun-autostart.sh || exit 1 ;
91
+
92
+ # ElevenLabs, for the final voiceover of a narrated video (videos/cmd-tools-elevenlabs.sh).
93
+ source ${WORKSPACE_SCRIPTS}/functions/fun-elevenlabs.sh || exit 1 ;
94
+
95
+ # Voices for the audio workspace: Piper and ElevenLabs (audio/cmd-tools-voice.sh).
96
+ source ${WORKSPACE_SCRIPTS}/functions/fun-voice.sh || exit 1 ;
97
+ source ${WORKSPACE_SCRIPTS}/functions/fun-video-edit.sh || exit 1 ;
98
+
99
+ # Include SPDD (structured-prompt-driven design artifacts) functions.
100
+ source ${WORKSPACE_SCRIPTS}/functions/fun-spdd.sh || exit 1 ;
101
+ source ${WORKSPACE_SCRIPTS}/functions/fun-specs-share.sh || exit 1 ;
102
+
103
+ # trim_project_name — the one place PROJECT_NAME gets a trailing slash trimmed, called from every
104
+ # cmd-*.sh that takes one.
105
+ source ${WORKSPACE_SCRIPTS}/functions/fun-project-name.sh || exit 1 ;
106
+ source ${WORKSPACE_SCRIPTS}/functions/fun-version.sh || exit 1 ;
107
+ source ${WORKSPACE_SCRIPTS}/functions/fun-release.sh || exit 1 ;
108
+
109
+ # Workspace folders kept on a second disk (core/scripts/storage.sh).
110
+ source ${WORKSPACE_SCRIPTS}/functions/fun-storage.sh || exit 1 ;
111
+
112
+ # The functions installed plugins ship (core/scripts/plugins.sh --install <name> puts them in
113
+ # core/scripts/plugins/<name>/functions/). Sourced last, so a plugin can build on everything above.
114
+ for plugin_functions_file in "${WORKSPACE_SCRIPTS}"/plugins/*/functions/*.sh ; do
115
+ [ -f "${plugin_functions_file}" ] || continue ;
116
+ source "${plugin_functions_file}" || exit 1 ;
117
+ done
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Include Bash YAML library.
4
+ source ${WORKSPACE_SCRIPTS}/libs/bash-yaml.sh || exit 1 ;
5
+
6
+ # Include the arguments parser
7
+ source ${WORKSPACE_SCRIPTS}/libs/argparse.sh || exit 1 ;
8
+
9
+ # Include Bash Progress Bar library.
10
+ source ${WORKSPACE_SCRIPTS}/libs/progress-bar.sh || exit 1 ;
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env bash
2
+
3
+ current_path=$(pwd);
4
+ user_name="$USER";
5
+
6
+ # Where this tooling comes from, and where a proposed change is filed. Captured HERE, before
7
+ # settings.yml is parsed: parse_yaml would overwrite an exported override with the file's value,
8
+ # and an export is meant to win for a one-off run.
9
+ _env_workspace_repo="${WORKSPACE_REPO}";
10
+ _env_workspace_repo_ref="${WORKSPACE_REPO_REF}";
11
+ _env_ai_items_repo="${AI_ITEMS_REPO}";
12
+ _env_ai_items_ref="${AI_ITEMS_REF}";
13
+
14
+ # These were WEBSHIP_WORKSPACE_* until the rename. Anyone still exporting the old names meant them
15
+ # as an override, so honour them rather than silently ignoring the override and picking the
16
+ # checkout instead.
17
+ WORKSPACE_ROOT="${WORKSPACE_ROOT:-${WEBSHIP_WORKSPACE_ROOT}}";
18
+ WORKSPACE_PATH="${WORKSPACE_PATH:-${WEBSHIP_WORKSPACE_PATH}}";
19
+ WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-${WEBSHIP_WORKSPACE_SCRIPTS}}";
20
+ WORKSPACE_CONFIG="${WORKSPACE_CONFIG:-${WEBSHIP_WORKSPACE_CONFIG}}";
21
+
22
+ # Locate the workspace from this file, so a fresh clone works with no setup:
23
+ # core/scripts/bootstrap.sh -> core/scripts -> core -> the workspace root.
24
+ # Exported WORKSPACE_* variables still win, for a workspace kept
25
+ # somewhere other than the checkout that is running.
26
+ WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}";
27
+ WORKSPACE_PATH="${WORKSPACE_PATH:-$(dirname "${WORKSPACE_SCRIPTS}")}";
28
+ WORKSPACE_ROOT="${WORKSPACE_ROOT:-$(dirname "${WORKSPACE_PATH}")}";
29
+ WORKSPACE_CONFIG="${WORKSPACE_CONFIG:-${WORKSPACE_PATH}/config}";
30
+ export WORKSPACE_ROOT WORKSPACE_PATH WORKSPACE_SCRIPTS WORKSPACE_CONFIG ;
31
+
32
+ # Include Bootstrap libraries.
33
+ source ${WORKSPACE_SCRIPTS}/bootstrap-libraries.sh || exit 1 ;
34
+
35
+ # Include Bootstrap functions.
36
+ source ${WORKSPACE_SCRIPTS}/bootstrap-functions.sh || exit 1 ;
37
+
38
+ # Load settings.
39
+ eval $(parse_yaml ${WORKSPACE_CONFIG}/settings.yml);
40
+
41
+ # The settings files installed plugins own (core/config/plugin.<name>.settings.yml), as
42
+ # plugin_<name>_<key> variables, so a plugin's bash hooks read the same values the dashboard does.
43
+ for plugin_settings_file in "${WORKSPACE_CONFIG}"/plugin.*.settings.yml ; do
44
+ [ -f "${plugin_settings_file}" ] || continue ;
45
+ plugin_settings_name="$(basename "${plugin_settings_file}" .settings.yml)";
46
+ plugin_settings_name="${plugin_settings_name#plugin.}";
47
+ eval $(parse_yaml "${plugin_settings_file}" "plugin_${plugin_settings_name//-/_}_");
48
+ done
49
+ unset plugin_settings_file plugin_settings_name ;
50
+
51
+ # settings.yml carries no paths: they follow the checkout, for whoever is running
52
+ # it. Set root/path/scripts/config/backups there only to override that.
53
+ root="${root:-${WORKSPACE_ROOT}}";
54
+ path="${path:-${WORKSPACE_PATH}}";
55
+ scripts="${scripts:-${WORKSPACE_SCRIPTS}}";
56
+ config="${config:-${WORKSPACE_CONFIG}}";
57
+ backups="${backups:-${root}/backups}";
58
+
59
+ # The tooling repository, from sources.tooling in settings.yml. The commands tooling compares
60
+ # against it, pulls from it, and proposes back to it.
61
+ WORKSPACE_REPO="${_env_workspace_repo:-${sources_tooling_repo:-webship/workspace}}";
62
+ WORKSPACE_REPO_REF="${_env_workspace_repo_ref:-${sources_tooling_ref:-1.0.x}}";
63
+
64
+ # The shared AI agents, skills and prompts come from their own repository, and go back to it the
65
+ # same way commands go back to the tooling one.
66
+ AI_ITEMS_REPO="${_env_ai_items_repo:-${sources_ai_items_repo:-webship/ai-agents}}";
67
+ AI_ITEMS_REF="${_env_ai_items_ref:-${sources_ai_items_ref:-main}}";
68
+ export WORKSPACE_REPO WORKSPACE_REPO_REF AI_ITEMS_REPO AI_ITEMS_REF ;
69
+
70
+ # The backups folder is the one directory that is not in the checkout.
71
+ mkdir -p "${backups}" 2>/dev/null ;
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env bash
2
+
3
+ ################################################################################
4
+ ## `ddev`, serialised on the router. A shim, not a replacement.
5
+ ################################################################################
6
+ ## Every router-mutating verb — start, stop, restart, poweroff, delete — tears the
7
+ ## ONE shared ddev-router down and brings it back with the routes of whatever is
8
+ ## running. Two at a time race on a single container: one removes it while the
9
+ ## other has just created it, and the loser can leave it removed for good. What
10
+ ## that looks like is the whole workspace going dark — every *.ddev.site address,
11
+ ## the dashboard's hub included — with healthy web containers behind it, and DDEV
12
+ ## then refusing to start anything at all:
13
+ ##
14
+ ## Failed to start workspace: Error response from daemon:
15
+ ## No such container: ddev-router
16
+ ##
17
+ ## Recovering needs `ddev poweroff`. Five clicks in thirty-eight seconds did it.
18
+ ##
19
+ ## The dashboard's own buttons and its AI assistant already take this lock. This
20
+ ## shim is for every OTHER caller — a cmd-*.sh script, an agent, a person in a
21
+ ## terminal or in `ddev ssh` — because a rule that each caller must remember is a
22
+ ## rule that gets forgotten, including by callers nobody has written yet.
23
+ ##
24
+ ## Install: PATH must reach this file before the real ddev.
25
+ ## container: /usr/local/sbin/ddev (PATH has /usr/local/sbin before /usr/local/bin)
26
+ ## host: core/scripts/install.sh offers it, same path, needs sudo
27
+ ##
28
+ ## FOUR RULES THIS FILE LIVES BY, because a wrong shim breaks every ddev call on
29
+ ## the machine — including the dashboard's own status reads every twenty seconds:
30
+ ##
31
+ ## 1. The real ddev is resolved by ABSOLUTE PATH and checked not to be this
32
+ ## file. Resolving through PATH would find the shim again and fork forever.
33
+ ## 2. Anything that is not a router verb is exec'd immediately, with no lock,
34
+ ## no subshell and no added latency. `ddev list --json-output` must cost
35
+ ## exactly what it cost before.
36
+ ## 3. Nothing here is fatal. If flock is missing, or the lock file cannot be
37
+ ## created, it says so once on stderr and runs the command anyway. Refusing
38
+ ## to run ddev because a lock could not be taken would be a worse failure
39
+ ## than the one being prevented.
40
+ ## 4. It never re-locks a lock already held. The dashboard wraps its own calls
41
+ ## in flock, and taking the same lock again from inside would deadlock for
42
+ ## the full timeout — so DDEV_ROUTER_LOCK_HELD is the interlock, set by
43
+ ## whoever holds it and exported here for anything ddev itself shells out to.
44
+ ################################################################################
45
+
46
+ set -u
47
+
48
+ # --- 1. the real ddev, by absolute path, and never this file -------------------
49
+ SELF="$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || echo "${BASH_SOURCE[0]}")"
50
+ REAL_DDEV=''
51
+ for candidate in /usr/local/bin/ddev /usr/bin/ddev /opt/homebrew/bin/ddev /snap/bin/ddev ; do
52
+ [ -x "${candidate}" ] || continue
53
+ [ "$(readlink -f "${candidate}" 2>/dev/null || echo "${candidate}")" == "${SELF}" ] && continue
54
+ REAL_DDEV="${candidate}"
55
+ break
56
+ done
57
+ if [ -z "${REAL_DDEV}" ] ; then
58
+ echo "ddev: this is the workspace's router-lock shim, and the real ddev binary was not found" >&2
59
+ echo " (looked in /usr/local/bin, /usr/bin, /opt/homebrew/bin, /snap/bin)" >&2
60
+ exit 127
61
+ fi
62
+
63
+ # --- 2. which verb is this? ----------------------------------------------------
64
+ # `ddev [global flags] <verb> [args]`, so the verb is the first argument that is
65
+ # not a flag and not a flag's value. Only the verb matters here, and an unknown
66
+ # shape falls through to the pass-through path, which is the safe direction.
67
+ VERB=''
68
+ for arg in "$@" ; do
69
+ case "${arg}" in
70
+ -*) continue ;;
71
+ *) VERB="${arg}"; break ;;
72
+ esac
73
+ done
74
+
75
+ case "${VERB}" in
76
+ start|stop|restart|poweroff|delete) ;;
77
+ # Everything else — list, describe, drush, composer, exec, ssh, snapshot,
78
+ # export-db, add-on, config, and every verb added in future — is none of this
79
+ # shim's business. Straight through, same process, no measurable overhead.
80
+ *) exec "${REAL_DDEV}" "$@" ;;
81
+ esac
82
+
83
+ # --- 3. the lock ---------------------------------------------------------------
84
+ # Already held by a caller above us: run, do not re-lock (see rule 4).
85
+ if [ -n "${DDEV_ROUTER_LOCK_HELD:-}" ] ; then
86
+ exec "${REAL_DDEV}" "$@"
87
+ fi
88
+
89
+ WS_ROOT="${WORKSPACE_ROOT:-${HOME}/workspace}"
90
+ LOCK="${WS_ROOT}/.ddev-router.lock"
91
+
92
+ if ! command -v flock > /dev/null 2>&1 ; then
93
+ echo "ddev: flock is not installed, so '${VERB}' runs unserialised — concurrent" >&2
94
+ echo " start/stop can destroy the shared ddev-router. Install util-linux." >&2
95
+ exec "${REAL_DDEV}" "$@"
96
+ fi
97
+
98
+ # The lock file has to be creatable. It normally exists already; when it does not
99
+ # (a fresh checkout, a different WORKSPACE_ROOT) create it, and if that fails say
100
+ # so and carry on rather than blocking the command.
101
+ if [ ! -e "${LOCK}" ] ; then
102
+ if ! ( umask 022 && : > "${LOCK}" ) 2>/dev/null ; then
103
+ echo "ddev: cannot create ${LOCK}, so '${VERB}' runs unserialised." >&2
104
+ exec "${REAL_DDEV}" "$@"
105
+ fi
106
+ fi
107
+
108
+ # Say something only when there is really something to wait for: a free lock has
109
+ # to cost nothing and print nothing, or every start grows a line of noise.
110
+ if ! flock -n "${LOCK}" true 2>/dev/null ; then
111
+ echo "ddev: waiting — another ddev start/stop/restart holds the router lock." >&2
112
+ echo " They cannot run at once: each one recreates the shared ddev-router." >&2
113
+ fi
114
+
115
+ # Exported so anything the real ddev shells out to (including ddev calling itself)
116
+ # does not queue behind a lock this process already owns.
117
+ export DDEV_ROUTER_LOCK_HELD=1
118
+
119
+ # -w: bounded, so a wedged start cannot hold the queue for ever. The command's own
120
+ # exit status is what leaves this script, because callers check it.
121
+ flock -w 1800 "${LOCK}" "${REAL_DDEV}" "$@"
122
+ exit $?