@webship.co/workspace 1.0.0-alpha1 → 1.0.0-beta2

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 (634) 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} +1 -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/{plugin-loader.js → core/workspace-app/plugin-loader.js} +19 -1
  169. package/{plugins-page.js → core/workspace-app/plugins-page.js} +28 -2
  170. package/{row-layout.js → core/workspace-app/row-layout.js} +0 -1
  171. package/{server.js → core/workspace-app/server.js} +26 -225
  172. package/core/workspace-app/tests/features/actions-rail.feature +44 -0
  173. package/core/workspace-app/tests/features/ai-items.feature +23 -0
  174. package/core/workspace-app/tests/features/assistant-speech.feature +63 -0
  175. package/core/workspace-app/tests/features/checks.feature +39 -0
  176. package/core/workspace-app/tests/features/clone-project.feature +30 -0
  177. package/core/workspace-app/tests/features/command-authoring.feature +58 -0
  178. package/core/workspace-app/tests/features/dashboard.feature +57 -0
  179. package/core/workspace-app/tests/features/menus.feature +29 -0
  180. package/core/workspace-app/tests/features/plugins/jira/jira.feature +47 -0
  181. package/core/workspace-app/tests/features/plugins.feature +20 -0
  182. package/core/workspace-app/tests/features/project-actions.feature +40 -0
  183. package/core/workspace-app/tests/features/screens.feature +29 -0
  184. package/core/workspace-app/tests/features/settings.feature +46 -0
  185. package/core/workspace-app/tests/features/test-reports.feature +32 -0
  186. package/core/workspace-app/tests/features/theme.feature +40 -0
  187. package/core/workspace-app/tests/step-definitions/actions-post.steps.js +25 -0
  188. package/core/workspace-app/tests/step-definitions/assistant-speech.steps.js +152 -0
  189. package/core/workspace-app/tests/step-definitions/preconditions.steps.js +100 -0
  190. package/core/workspace-app/tests/unit/_isolated-config.js +31 -0
  191. package/core/workspace-app/tests/unit/accessibility.test.js +124 -0
  192. package/core/workspace-app/tests/unit/actions-rail-ux.test.js +56 -0
  193. package/core/workspace-app/tests/unit/actions-rail.test.js +51 -0
  194. package/core/workspace-app/tests/unit/ai-inventory.test.js +64 -0
  195. package/core/workspace-app/tests/unit/app-docs.test.js +64 -0
  196. package/core/workspace-app/tests/unit/assistant-avatar.test.js +110 -0
  197. package/core/workspace-app/tests/unit/assistant-cast.test.js +105 -0
  198. package/core/workspace-app/tests/unit/assistant-send-animation.test.js +15 -0
  199. package/core/workspace-app/tests/unit/assistant-suggestions.test.js +112 -0
  200. package/core/workspace-app/tests/unit/assistant-switches.test.js +53 -0
  201. package/core/workspace-app/tests/unit/assistant-views.test.js +146 -0
  202. package/core/workspace-app/tests/unit/assistant-working-indicator.test.js +49 -0
  203. package/core/workspace-app/tests/unit/assistant.test.js +61 -0
  204. package/core/workspace-app/tests/unit/audio-player.test.js +147 -0
  205. package/core/workspace-app/tests/unit/audio-voice.test.js +634 -0
  206. package/core/workspace-app/tests/unit/auth-google.test.js +180 -0
  207. package/core/workspace-app/tests/unit/autostart-watch.test.js +76 -0
  208. package/core/workspace-app/tests/unit/browsers.test.js +76 -0
  209. package/core/workspace-app/tests/unit/build-distribution.test.js +125 -0
  210. package/core/workspace-app/tests/unit/build-order.test.js +153 -0
  211. package/core/workspace-app/tests/unit/builder-args.test.js +113 -0
  212. package/core/workspace-app/tests/unit/builders.test.js +158 -0
  213. package/core/workspace-app/tests/unit/card-state-toggle.test.js +29 -0
  214. package/core/workspace-app/tests/unit/changelog.test.js +177 -0
  215. package/core/workspace-app/tests/unit/chat-thread.test.js +92 -0
  216. package/core/workspace-app/tests/unit/checks-plan.test.js +205 -0
  217. package/core/workspace-app/tests/unit/claude-args.test.js +182 -0
  218. package/core/workspace-app/tests/unit/claude-code-here.test.js +15 -0
  219. package/core/workspace-app/tests/unit/claude-resume.test.js +147 -0
  220. package/core/workspace-app/tests/unit/claude-screen-options.test.js +84 -0
  221. package/core/workspace-app/tests/unit/claude-session.test.js +41 -0
  222. package/core/workspace-app/tests/unit/command-flags.test.js +45 -0
  223. package/core/workspace-app/tests/unit/command-palette.test.js +105 -0
  224. package/core/workspace-app/tests/unit/commands-center.test.js +338 -0
  225. package/core/workspace-app/tests/unit/composer-menu.test.js +187 -0
  226. package/core/workspace-app/tests/unit/config-yaml.test.js +116 -0
  227. package/core/workspace-app/tests/unit/confirm-dialog.test.js +69 -0
  228. package/core/workspace-app/tests/unit/create-card.test.js +85 -0
  229. package/core/workspace-app/tests/unit/ddev-addons.test.js +144 -0
  230. package/core/workspace-app/tests/unit/ddev-auth-ssh.test.js +40 -0
  231. package/core/workspace-app/tests/unit/ddev-custom-commands.test.js +56 -0
  232. package/core/workspace-app/tests/unit/ddev-diagnose.test.js +57 -0
  233. package/core/workspace-app/tests/unit/ddev-domains.test.js +153 -0
  234. package/core/workspace-app/tests/unit/ddev-hostnames.test.js +143 -0
  235. package/core/workspace-app/tests/unit/ddev-import.test.js +82 -0
  236. package/core/workspace-app/tests/unit/ddev-mail.test.js +135 -0
  237. package/core/workspace-app/tests/unit/ddev-menu-and-create.test.js +28 -0
  238. package/core/workspace-app/tests/unit/ddev-mutagen.test.js +37 -0
  239. package/core/workspace-app/tests/unit/ddev-options.test.js +51 -0
  240. package/core/workspace-app/tests/unit/ddev-share.test.js +40 -0
  241. package/core/workspace-app/tests/unit/ddev-shim.test.js +57 -0
  242. package/core/workspace-app/tests/unit/ddev-snapshots.test.js +142 -0
  243. package/core/workspace-app/tests/unit/ddev-start-daemons.test.js +62 -0
  244. package/core/workspace-app/tests/unit/ddev-xdebug.test.js +41 -0
  245. package/core/workspace-app/tests/unit/deep-chat-origin.test.js +38 -0
  246. package/core/workspace-app/tests/unit/density.test.js +52 -0
  247. package/core/workspace-app/tests/unit/elevenlabs.test.js +453 -0
  248. package/core/workspace-app/tests/unit/event-log.test.js +102 -0
  249. package/core/workspace-app/tests/unit/favicon.test.js +68 -0
  250. package/core/workspace-app/tests/unit/files-browser.test.js +224 -0
  251. package/core/workspace-app/tests/unit/git-info.test.js +26 -0
  252. package/core/workspace-app/tests/unit/grid-and-list.test.js +103 -0
  253. package/core/workspace-app/tests/unit/host-tool-wrapper.test.js +18 -0
  254. package/core/workspace-app/tests/unit/html-patterns.test.js +51 -0
  255. package/core/workspace-app/tests/unit/ide-infra.test.js +28 -0
  256. package/core/workspace-app/tests/unit/images-ai.test.js +201 -0
  257. package/core/workspace-app/tests/unit/images-create.test.js +59 -0
  258. package/core/workspace-app/tests/unit/images-providers.test.js +248 -0
  259. package/core/workspace-app/tests/unit/images-svg.test.js +213 -0
  260. package/core/workspace-app/tests/unit/images-workspace.test.js +144 -0
  261. package/core/workspace-app/tests/unit/jobs-fragment.test.js +66 -0
  262. package/core/workspace-app/tests/unit/media-ux.test.js +164 -0
  263. package/core/workspace-app/tests/unit/modal-fit.test.js +87 -0
  264. package/core/workspace-app/tests/unit/modules-load.test.js +23 -0
  265. package/core/workspace-app/tests/unit/narration.test.js +186 -0
  266. package/core/workspace-app/tests/unit/navigation-editor.test.js +260 -0
  267. package/core/workspace-app/tests/unit/navigation.test.js +254 -0
  268. package/core/workspace-app/tests/unit/new-folder.test.js +121 -0
  269. package/core/workspace-app/tests/unit/new-screen-form.test.js +149 -0
  270. package/core/workspace-app/tests/unit/node-menu.test.js +161 -0
  271. package/core/workspace-app/tests/unit/notes.test.js +128 -0
  272. package/core/workspace-app/tests/unit/page-structure.test.js +40 -0
  273. package/core/workspace-app/tests/unit/page-width.test.js +59 -0
  274. package/core/workspace-app/tests/unit/php-version.test.js +90 -0
  275. package/core/workspace-app/tests/unit/plan-card.test.js +44 -0
  276. package/core/workspace-app/tests/unit/plugin-catalog.test.js +31 -0
  277. package/core/workspace-app/tests/unit/plugin-system.test.js +251 -0
  278. package/core/workspace-app/tests/unit/plugins-page.test.js +28 -0
  279. package/core/workspace-app/tests/unit/plugins.test.js +58 -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 +74 -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 +198 -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 +417 -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/{workspace-types.js → core/workspace-app/workspace-types.js} +2 -2
  336. package/{workspaces.js → core/workspace-app/workspaces.js} +1 -5
  337. package/package.json +38 -36
  338. package/actions/graphs.js +0 -107
  339. package/actions/obsidian.js +0 -59
  340. package/graphs.js +0 -104
  341. package/obsidian.js +0 -405
  342. /package/{WORKSPACES.md → core/workspace-app/WORKSPACES.md} +0 -0
  343. /package/{actions → core/workspace-app/actions}/ai-items.js +0 -0
  344. /package/{actions → core/workspace-app/actions}/audio.js +0 -0
  345. /package/{actions → core/workspace-app/actions}/build-order.js +0 -0
  346. /package/{actions → core/workspace-app/actions}/checks.js +0 -0
  347. /package/{actions → core/workspace-app/actions}/claude-session.js +0 -0
  348. /package/{actions → core/workspace-app/actions}/commands-center.js +0 -0
  349. /package/{actions → core/workspace-app/actions}/composer.js +0 -0
  350. /package/{actions → core/workspace-app/actions}/ddev-addons.js +0 -0
  351. /package/{actions → core/workspace-app/actions}/ddev-mail.js +0 -0
  352. /package/{actions → core/workspace-app/actions}/folders.js +0 -0
  353. /package/{actions → core/workspace-app/actions}/images-svg.js +0 -0
  354. /package/{actions → core/workspace-app/actions}/images.js +0 -0
  355. /package/{actions → core/workspace-app/actions}/navigation.js +0 -0
  356. /package/{actions → core/workspace-app/actions}/node.js +0 -0
  357. /package/{actions → core/workspace-app/actions}/notes.js +0 -0
  358. /package/{actions → core/workspace-app/actions}/plugins.js +0 -0
  359. /package/{actions → core/workspace-app/actions}/project-make.js +0 -0
  360. /package/{actions → core/workspace-app/actions}/row-actions.js +0 -0
  361. /package/{actions → core/workspace-app/actions}/screens.js +0 -0
  362. /package/{actions → core/workspace-app/actions}/video-edit.js +0 -0
  363. /package/{ai-inventory.js → core/workspace-app/ai-inventory.js} +0 -0
  364. /package/{ai-items.js → core/workspace-app/ai-items.js} +0 -0
  365. /package/{assistant-cast.js → core/workspace-app/assistant-cast.js} +0 -0
  366. /package/{assistant-suggestions.js → core/workspace-app/assistant-suggestions.js} +0 -0
  367. /package/{audio-voice.js → core/workspace-app/audio-voice.js} +0 -0
  368. /package/{auth-google.js → core/workspace-app/auth-google.js} +0 -0
  369. /package/{build-ai.js → core/workspace-app/build-ai.js} +0 -0
  370. /package/{build-order-page.js → core/workspace-app/build-order-page.js} +0 -0
  371. /package/{build-order.js → core/workspace-app/build-order.js} +0 -0
  372. /package/{builder-args.js → core/workspace-app/builder-args.js} +0 -0
  373. /package/{changelog.js → core/workspace-app/changelog.js} +0 -0
  374. /package/{chat-threads.js → core/workspace-app/chat-threads.js} +0 -0
  375. /package/{checks.js → core/workspace-app/checks.js} +0 -0
  376. /package/{claude-args.js → core/workspace-app/claude-args.js} +0 -0
  377. /package/{claude-sessions.js → core/workspace-app/claude-sessions.js} +0 -0
  378. /package/{command-author.js → core/workspace-app/command-author.js} +0 -0
  379. /package/{command-block.js → core/workspace-app/command-block.js} +0 -0
  380. /package/{commands → core/workspace-app/commands}/defaults.yml +0 -0
  381. /package/{commands-page.js → core/workspace-app/commands-page.js} +0 -0
  382. /package/{commands.js → core/workspace-app/commands.js} +0 -0
  383. /package/{cucumber.js → core/workspace-app/cucumber.js} +0 -0
  384. /package/{ddev-addons-page.js → core/workspace-app/ddev-addons-page.js} +0 -0
  385. /package/{ddev-addons.js → core/workspace-app/ddev-addons.js} +0 -0
  386. /package/{ddev-custom-commands.js → core/workspace-app/ddev-custom-commands.js} +0 -0
  387. /package/{ddev-domains.js → core/workspace-app/ddev-domains.js} +0 -0
  388. /package/{ddev-import.js → core/workspace-app/ddev-import.js} +0 -0
  389. /package/{ddev-mail-page.js → core/workspace-app/ddev-mail-page.js} +0 -0
  390. /package/{ddev-mail.js → core/workspace-app/ddev-mail.js} +0 -0
  391. /package/{ddev-options.js → core/workspace-app/ddev-options.js} +0 -0
  392. /package/{ddev-snapshots.js → core/workspace-app/ddev-snapshots.js} +0 -0
  393. /package/{ddev.js → core/workspace-app/ddev.js} +0 -0
  394. /package/{docs → core/workspace-app/docs}/DEVELOPER-GUIDE.md +0 -0
  395. /package/{docs → core/workspace-app/docs}/README.md +0 -0
  396. /package/{docs → core/workspace-app/docs}/REFERENCE.md +0 -0
  397. /package/{docs → core/workspace-app/docs}/USER-GUIDE.md +0 -0
  398. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-board.png +0 -0
  399. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-coffee.png +0 -0
  400. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-colours.png +0 -0
  401. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-icons.png +0 -0
  402. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-moves.png +0 -0
  403. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-pick-cookieman.png +0 -0
  404. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-settings-voices.png +0 -0
  405. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-status.png +0 -0
  406. /package/{docs → core/workspace-app/docs}/screenshots/create-card/create-card.png +0 -0
  407. /package/{docs → core/workspace-app/docs}/screenshots/create-card/start-ai.png +0 -0
  408. /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-address.png +0 -0
  409. /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-worktree-off.png +0 -0
  410. /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-worktree-on.png +0 -0
  411. /package/{docs → core/workspace-app/docs}/screenshots/guide-ddev-menu.png +0 -0
  412. /package/{docs → core/workspace-app/docs}/screenshots/guide-domains.png +0 -0
  413. /package/{docs → core/workspace-app/docs}/screenshots/guide-home.png +0 -0
  414. /package/{docs → core/workspace-app/docs}/screenshots/guide-ide-menu.png +0 -0
  415. /package/{docs → core/workspace-app/docs}/screenshots/guide-remove-refusal.png +0 -0
  416. /package/{docs → core/workspace-app/docs}/screenshots/guide-rows-worktree.png +0 -0
  417. /package/{docs → core/workspace-app/docs}/screenshots/guide-screens.png +0 -0
  418. /package/{docs → core/workspace-app/docs}/screenshots/guide-settings.png +0 -0
  419. /package/{docs → core/workspace-app/docs}/screenshots/guide-workspace-page.png +0 -0
  420. /package/{docs → core/workspace-app/docs}/screenshots/home/card-settings.png +0 -0
  421. /package/{docs → core/workspace-app/docs}/screenshots/home/drag-reorder.png +0 -0
  422. /package/{docs → core/workspace-app/docs}/screenshots/home/edit-card.png +0 -0
  423. /package/{docs → core/workspace-app/docs}/screenshots/images/claude-code-image.png +0 -0
  424. /package/{docs → core/workspace-app/docs}/screenshots/images/edit-with-ai.png +0 -0
  425. /package/{docs → core/workspace-app/docs}/screenshots/images/gallery.png +0 -0
  426. /package/{docs → core/workspace-app/docs}/screenshots/images/generate-description.png +0 -0
  427. /package/{docs → core/workspace-app/docs}/screenshots/images/generate-plan.png +0 -0
  428. /package/{docs → core/workspace-app/docs}/screenshots/images/providers.png +0 -0
  429. /package/{docs → core/workspace-app/docs}/screenshots/images/svg-form.png +0 -0
  430. /package/{docs → core/workspace-app/docs}/screenshots/images/svg-result.png +0 -0
  431. /package/{docs → core/workspace-app/docs}/screenshots/images/upload.png +0 -0
  432. /package/{docs → core/workspace-app/docs}/screenshots/new-folder/2-form.png +0 -0
  433. /package/{docs → core/workspace-app/docs}/screenshots/new-folder/8-ddev-options.png +0 -0
  434. /package/{docs → core/workspace-app/docs}/screenshots/new-folder/files-folder.png +0 -0
  435. /package/{docs → core/workspace-app/docs}/screenshots/projects/ddev-custom-commands.png +0 -0
  436. /package/{docs → core/workspace-app/docs}/screenshots/projects/state-chip-stop.png +0 -0
  437. /package/{docs → core/workspace-app/docs}/screenshots/readme/dashboard-dark.png +0 -0
  438. /package/{docs → core/workspace-app/docs}/screenshots/readme/dashboard-light.png +0 -0
  439. /package/{docs → core/workspace-app/docs}/screenshots/readme/dev-dark.png +0 -0
  440. /package/{docs → core/workspace-app/docs}/screenshots/readme/dev-light.png +0 -0
  441. /package/{docs → core/workspace-app/docs}/screenshots/readme/docs-dark.png +0 -0
  442. /package/{docs → core/workspace-app/docs}/screenshots/readme/docs-light.png +0 -0
  443. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/ai.svg +0 -0
  444. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/code.svg +0 -0
  445. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/docs.svg +0 -0
  446. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/services.svg +0 -0
  447. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/sites.svg +0 -0
  448. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-report-dark.png +0 -0
  449. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-report-light.png +0 -0
  450. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-scenarios.png +0 -0
  451. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-steps.png +0 -0
  452. /package/{docs → core/workspace-app/docs}/screenshots/readme/videos-dark.png +0 -0
  453. /package/{docs → core/workspace-app/docs}/screenshots/readme/videos-light.png +0 -0
  454. /package/{docs → core/workspace-app/docs}/screenshots/screens-menu.png +0 -0
  455. /package/{docs → core/workspace-app/docs}/screenshots/screens-new.png +0 -0
  456. /package/{docs → core/workspace-app/docs}/screenshots/settings/auth-google-lists.png +0 -0
  457. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-1-row.png +0 -0
  458. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-2-confirm.png +0 -0
  459. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-3-type-name.png +0 -0
  460. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-4-type-yes.png +0 -0
  461. /package/{event-log.js → core/workspace-app/event-log.js} +0 -0
  462. /package/{files-browser.js → core/workspace-app/files-browser.js} +0 -0
  463. /package/{folders.js → core/workspace-app/folders.js} +0 -0
  464. /package/{format.js → core/workspace-app/format.js} +0 -0
  465. /package/{github-auth.js → core/workspace-app/github-auth.js} +0 -0
  466. /package/{html.js → core/workspace-app/html.js} +0 -0
  467. /package/{icons.js → core/workspace-app/icons.js} +0 -0
  468. /package/{images-ai.js → core/workspace-app/images-ai.js} +0 -0
  469. /package/{images-create.js → core/workspace-app/images-create.js} +0 -0
  470. /package/{images-page.js → core/workspace-app/images-page.js} +0 -0
  471. /package/{images-records.js → core/workspace-app/images-records.js} +0 -0
  472. /package/{images-render.js → core/workspace-app/images-render.js} +0 -0
  473. /package/{images-svg-core.js → core/workspace-app/images-svg-core.js} +0 -0
  474. /package/{images-svg-sanitize.js → core/workspace-app/images-svg-sanitize.js} +0 -0
  475. /package/{images-svg.js → core/workspace-app/images-svg.js} +0 -0
  476. /package/{images.js → core/workspace-app/images.js} +0 -0
  477. /package/{jobs.js → core/workspace-app/jobs.js} +0 -0
  478. /package/{linger.js → core/workspace-app/linger.js} +0 -0
  479. /package/{lists.js → core/workspace-app/lists.js} +0 -0
  480. /package/{media-info.js → core/workspace-app/media-info.js} +0 -0
  481. /package/{navigation-page.js → core/workspace-app/navigation-page.js} +0 -0
  482. /package/{navigation.js → core/workspace-app/navigation.js} +0 -0
  483. /package/{notes.js → core/workspace-app/notes.js} +0 -0
  484. /package/{palette-index.js → core/workspace-app/palette-index.js} +0 -0
  485. /package/{playwright.config.js → core/workspace-app/playwright.config.js} +0 -0
  486. /package/{plugin-install.js → core/workspace-app/plugin-install.js} +0 -0
  487. /package/{plugin-manifest.js → core/workspace-app/plugin-manifest.js} +0 -0
  488. /package/{plugin-settings.js → core/workspace-app/plugin-settings.js} +0 -0
  489. /package/{plugins → core/workspace-app/plugins}/workspace-notes/index.js +0 -0
  490. /package/{project-make.js → core/workspace-app/project-make.js} +0 -0
  491. /package/{project-name.js → core/workspace-app/project-name.js} +0 -0
  492. /package/{public → core/workspace-app/public}/assistant-avatar-moves.js +0 -0
  493. /package/{public → core/workspace-app/public}/assistant-avatar-ui.js +0 -0
  494. /package/{public → core/workspace-app/public}/assistant-avatar.js +0 -0
  495. /package/{public → core/workspace-app/public}/avatar/druplicon.vrm +0 -0
  496. /package/{public → core/workspace-app/public}/css/base.css +0 -0
  497. /package/{public → core/workspace-app/public}/css/components/ai-assistant.css +0 -0
  498. /package/{public → core/workspace-app/public}/css/components/assistant-avatar.css +0 -0
  499. /package/{public → core/workspace-app/public}/css/components/assistant-views.css +0 -0
  500. /package/{public → core/workspace-app/public}/css/components/build-order.css +0 -0
  501. /package/{public → core/workspace-app/public}/css/components/clone-as-a-git-worktree.css +0 -0
  502. /package/{public → core/workspace-app/public}/css/components/command-palette.css +0 -0
  503. /package/{public → core/workspace-app/public}/css/components/commands-center.css +0 -0
  504. /package/{public → core/workspace-app/public}/css/components/confirm-dialog.css +0 -0
  505. /package/{public → core/workspace-app/public}/css/components/create-card.css +0 -0
  506. /package/{public → core/workspace-app/public}/css/components/ddev-menu.css +0 -0
  507. /package/{public → core/workspace-app/public}/css/components/deep-chat.css +0 -0
  508. /package/{public → core/workspace-app/public}/css/components/density.css +0 -0
  509. /package/{public → core/workspace-app/public}/css/components/floating-assistant-workspace-pages.css +0 -0
  510. /package/{public → core/workspace-app/public}/css/components/folders.css +0 -0
  511. /package/{public → core/workspace-app/public}/css/components/full-height-left-assistant-sidebar-all-pages.css +0 -0
  512. /package/{public → core/workspace-app/public}/css/components/full-height-right-actions-rail-pages-that-have-actions.css +0 -0
  513. /package/{public → core/workspace-app/public}/css/components/grid-and-list.css +0 -0
  514. /package/{public → core/workspace-app/public}/css/components/help-page.css +0 -0
  515. /package/{public → core/workspace-app/public}/css/components/hero.css +0 -0
  516. /package/{public → core/workspace-app/public}/css/components/images.css +0 -0
  517. /package/{public → core/workspace-app/public}/css/components/layout-rhythm-and-spacing-polish.css +0 -0
  518. /package/{public → core/workspace-app/public}/css/components/mic-on-any-field-that-wants-typing.css +0 -0
  519. /package/{public → core/workspace-app/public}/css/components/modal-fit.css +0 -0
  520. /package/{public → core/workspace-app/public}/css/components/page-width.css +0 -0
  521. /package/{public → core/workspace-app/public}/css/components/plugins-page.css +0 -0
  522. /package/{public → core/workspace-app/public}/css/components/project-cards.css +0 -0
  523. /package/{public → core/workspace-app/public}/css/components/project-rows.css +0 -0
  524. /package/{public → core/workspace-app/public}/css/components/reordering-the-workspace-cards.css +0 -0
  525. /package/{public → core/workspace-app/public}/css/components/responsive-home-and-the-workspace-pages.css +0 -0
  526. /package/{public → core/workspace-app/public}/css/components/running-commands-as-toasts.css +0 -0
  527. /package/{public → core/workspace-app/public}/css/components/settings-editor-core-config-yml.css +0 -0
  528. /package/{public → core/workspace-app/public}/css/components/short-results-as-a-toast-at-the-top.css +0 -0
  529. /package/{public → core/workspace-app/public}/css/components/sound-player.css +0 -0
  530. /package/{public → core/workspace-app/public}/css/components/suggest-agents-skills-commands.css +0 -0
  531. /package/{public → core/workspace-app/public}/css/components/tab-modal.css +0 -0
  532. /package/{public → core/workspace-app/public}/css/components/terminals.css +0 -0
  533. /package/{public → core/workspace-app/public}/css/components/test-report-media-one-file-per-row-paged.css +0 -0
  534. /package/{public → core/workspace-app/public}/css/components/top-toolbar-logo-breadcrumb.css +0 -0
  535. /package/{public → core/workspace-app/public}/css/components/video-edit.css +0 -0
  536. /package/{public → core/workspace-app/public}/css/components/web-ide-open-with.css +0 -0
  537. /package/{public → core/workspace-app/public}/css/components/working-indicators.css +0 -0
  538. /package/{public → core/workspace-app/public}/css/components/workspace-cards.css +0 -0
  539. /package/{public → core/workspace-app/public}/favicon.ico +0 -0
  540. /package/{public → core/workspace-app/public}/favicon.png +0 -0
  541. /package/{public → core/workspace-app/public}/htmx.min.js +0 -0
  542. /package/{public → core/workspace-app/public}/logo.png +0 -0
  543. /package/{public → core/workspace-app/public}/media-player.js +0 -0
  544. /package/{public → core/workspace-app/public}/mic.js +0 -0
  545. /package/{public → core/workspace-app/public}/narration.js +0 -0
  546. /package/{public → core/workspace-app/public}/palette.js +0 -0
  547. /package/{public → core/workspace-app/public}/sortable.js +0 -0
  548. /package/{public → core/workspace-app/public}/suggest.js +0 -0
  549. /package/{public → core/workspace-app/public}/terminal.js +0 -0
  550. /package/{public → core/workspace-app/public}/themes/default/theme.css +0 -0
  551. /package/{public → core/workspace-app/public}/themes/ember/theme.css +0 -0
  552. /package/{public → core/workspace-app/public}/themes/press/theme.css +0 -0
  553. /package/{public → core/workspace-app/public}/themes/slate/theme.css +0 -0
  554. /package/{public → core/workspace-app/public}/touch-icon.png +0 -0
  555. /package/{public → core/workspace-app/public}/ui.js +0 -0
  556. /package/{public → core/workspace-app/public}/vendor/ace/LICENSE.txt +0 -0
  557. /package/{public → core/workspace-app/public}/vendor/ace/ace.js +0 -0
  558. /package/{public → core/workspace-app/public}/vendor/ace/ext-language_tools.js +0 -0
  559. /package/{public → core/workspace-app/public}/vendor/ace/ext-searchbox.js +0 -0
  560. /package/{public → core/workspace-app/public}/vendor/ace/mode-css.js +0 -0
  561. /package/{public → core/workspace-app/public}/vendor/ace/mode-html.js +0 -0
  562. /package/{public → core/workspace-app/public}/vendor/ace/mode-javascript.js +0 -0
  563. /package/{public → core/workspace-app/public}/vendor/ace/mode-markdown.js +0 -0
  564. /package/{public → core/workspace-app/public}/vendor/ace/mode-sh.js +0 -0
  565. /package/{public → core/workspace-app/public}/vendor/ace/mode-yaml.js +0 -0
  566. /package/{public → core/workspace-app/public}/vendor/ace/theme-textmate.js +0 -0
  567. /package/{public → core/workspace-app/public}/vendor/ace/theme-tomorrow_night.js +0 -0
  568. /package/{public → core/workspace-app/public}/vendor/ace/worker-yaml.js +0 -0
  569. /package/{public → core/workspace-app/public}/vendor/deep-chat.LICENSE +0 -0
  570. /package/{public → core/workspace-app/public}/vendor/deep-chat.bundle.js +0 -0
  571. /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-LICENSE.txt +0 -0
  572. /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-latin-400-italic.woff2 +0 -0
  573. /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-latin-400-normal.woff2 +0 -0
  574. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-LICENSE.txt +0 -0
  575. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-400-italic.woff2 +0 -0
  576. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-400-normal.woff2 +0 -0
  577. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-600-italic.woff2 +0 -0
  578. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-600-normal.woff2 +0 -0
  579. /package/{public → core/workspace-app/public}/vendor/fonts/jetbrains-mono-LICENSE.txt +0 -0
  580. /package/{public → core/workspace-app/public}/vendor/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  581. /package/{public → core/workspace-app/public}/vendor/fonts/ubuntu-mono-LICENSE.txt +0 -0
  582. /package/{public → core/workspace-app/public}/vendor/fonts/ubuntu-mono-latin-wght-normal.woff2 +0 -0
  583. /package/{public → core/workspace-app/public}/vendor/tabler-LICENSE.txt +0 -0
  584. /package/{public → core/workspace-app/public}/vendor/tabler-sprite.svg +0 -0
  585. /package/{public → core/workspace-app/public}/vendor/three/LICENSE +0 -0
  586. /package/{public → core/workspace-app/public}/vendor/three/addons/loaders/GLTFLoader.js +0 -0
  587. /package/{public → core/workspace-app/public}/vendor/three/addons/utils/BufferGeometryUtils.js +0 -0
  588. /package/{public → core/workspace-app/public}/vendor/three/addons/utils/SkeletonUtils.js +0 -0
  589. /package/{public → core/workspace-app/public}/vendor/three/three.core.min.js +0 -0
  590. /package/{public → core/workspace-app/public}/vendor/three/three.module.min.js +0 -0
  591. /package/{public → core/workspace-app/public}/vendor/three-vrm/LICENSE +0 -0
  592. /package/{public → core/workspace-app/public}/vendor/three-vrm/three-vrm.module.min.js +0 -0
  593. /package/{public → core/workspace-app/public}/vendor/uikit-icons.min.js +0 -0
  594. /package/{public → core/workspace-app/public}/vendor/uikit.min.css +0 -0
  595. /package/{public → core/workspace-app/public}/vendor/uikit.min.js +0 -0
  596. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/bookmark-outlined.svg +0 -0
  597. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/headset.svg +0 -0
  598. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/menu.svg +0 -0
  599. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/pause.svg +0 -0
  600. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/play.svg +0 -0
  601. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/share.svg +0 -0
  602. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/sound-off.svg +0 -0
  603. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/sound-on.svg +0 -0
  604. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/stop.svg +0 -0
  605. /package/{public → core/workspace-app/public}/vendor/xterm/addon-fit.js +0 -0
  606. /package/{public → core/workspace-app/public}/vendor/xterm/addon-unicode11.js +0 -0
  607. /package/{public → core/workspace-app/public}/vendor/xterm/addon-web-links.js +0 -0
  608. /package/{public → core/workspace-app/public}/vendor/xterm/xterm.css +0 -0
  609. /package/{public → core/workspace-app/public}/vendor/xterm/xterm.js +0 -0
  610. /package/{rag.js → core/workspace-app/rag.js} +0 -0
  611. /package/{reader.js → core/workspace-app/reader.js} +0 -0
  612. /package/{repo-blobs.js → core/workspace-app/repo-blobs.js} +0 -0
  613. /package/{report-pdf.js → core/workspace-app/report-pdf.js} +0 -0
  614. /package/{screenrc → core/workspace-app/screenrc} +0 -0
  615. /package/{screens.js → core/workspace-app/screens.js} +0 -0
  616. /package/{scripts → core/workspace-app/scripts}/code-server-start.sh +0 -0
  617. /package/{scripts → core/workspace-app/scripts}/images-claude-finish.js +0 -0
  618. /package/{scripts → core/workspace-app/scripts}/screen-host.sh +0 -0
  619. /package/{scripts → core/workspace-app/scripts}/screen-runner.js +0 -0
  620. /package/{scripts → core/workspace-app/scripts}/screen-then.js +0 -0
  621. /package/{scripts → core/workspace-app/scripts}/update.sh +0 -0
  622. /package/{settings-file.js → core/workspace-app/settings-file.js} +0 -0
  623. /package/{speech.js → core/workspace-app/speech.js} +0 -0
  624. /package/{tab-modal.js → core/workspace-app/tab-modal.js} +0 -0
  625. /package/{test-reports.js → core/workspace-app/test-reports.js} +0 -0
  626. /package/{themes.js → core/workspace-app/themes.js} +0 -0
  627. /package/{transcripts.js → core/workspace-app/transcripts.js} +0 -0
  628. /package/{urls.js → core/workspace-app/urls.js} +0 -0
  629. /package/{validate.js → core/workspace-app/validate.js} +0 -0
  630. /package/{version-check.js → core/workspace-app/version-check.js} +0 -0
  631. /package/{video-edit.js → core/workspace-app/video-edit.js} +0 -0
  632. /package/{waiting.js → core/workspace-app/waiting.js} +0 -0
  633. /package/{workspace-card-tools.js → core/workspace-app/workspace-card-tools.js} +0 -0
  634. /package/{workspace-delete.js → core/workspace-app/workspace-delete.js} +0 -0
@@ -0,0 +1,329 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # The automated-testing stack of an EXISTING project: set it up, and run it.
4
+ #
5
+ # The cmd-automated-testing-*-project.sh builders in the test workspace do this as part of
6
+ # building a site from nothing — they delete the directory first, which is exactly what you do not
7
+ # want on a project you already have. These two verbs are the same stack applied to a project that
8
+ # is already there.
9
+ #
10
+ # Two stacks are supported:
11
+ #
12
+ # in-project Some project templates ship a DDEV testing command of their own —
13
+ # `ddev init-full-automated-testing` installs the site if needed, adds the testing
14
+ # users and prepares Playwright. If the command is in the project, it is the right
15
+ # one, because it knows that project.
16
+ # webship-js Everything else gets webship-js (Playwright + Cucumber-js) through its DDEV add-on,
17
+ # github.com/webship/ddev-webship-js, which scaffolds cucumber.js, the feature files,
18
+ # the step definitions and the report/screenshot/video directories, preserving
19
+ # anything already there.
20
+ #
21
+ # Both write their results to <project>/tests/reports/, which is what the dashboard's Tests menu
22
+ # reads.
23
+
24
+ # Which stack a project has, or would get.
25
+ # Where Playwright keeps its browsers.
26
+ #
27
+ # NOT the default `~/.cache/ms-playwright` inside the web container: that lives in the container's
28
+ # writable layer, so a `ddev restart` — which `ddev init-full-automated-testing` and the add-on both
29
+ # do as part of setting up — throws away the 113 MB that had just been downloaded, and the next run
30
+ # fails with "Executable doesn't exist at …/chrome-headless-shell". `/mnt/ddev-global-cache` is a
31
+ # docker volume DDEV mounts into every web container, so the download survives a restart AND is
32
+ # shared by every project instead of being fetched once per site. The directory names carry the
33
+ # Playwright build number, so two projects on two versions do not collide.
34
+ readonly TESTING_BROWSERS_PATH='/mnt/ddev-global-cache/ms-playwright';
35
+
36
+ # Install the browsers if they are not already in the shared cache. Idempotent and quick when they
37
+ # are, so it is safe to call before every run — which is what makes a wiped container self-heal
38
+ # rather than failing 275 scenarios in 1.6 seconds.
39
+ # PLAYWRIGHT_SKIP_BROWSER_GC=1 is not optional here.
40
+ #
41
+ # `playwright install` sweeps the browsers directory and DELETES every build its own version does
42
+ # not know about. In a per-container cache that is housekeeping; in a SHARED one it is one project
43
+ # destroying another's browser — and it did: installing for the dashboard (Playwright 1.62,
44
+ # chromium 1234) removed the 1223 build a project's suite was running against, which failed the
45
+ # remaining 213 of its 275 scenarios with "Executable doesn't exist" twenty minutes in. Skipping the
46
+ # collection leaves both builds in place; they are a few hundred MB and the disk is not the problem
47
+ # a shared cache was solving.
48
+ # The shared libraries chromium itself needs (libnspr4, libnss3, the X and font
49
+ # stack). They belong in the IMAGE, not in a running container: `ddev restart`
50
+ # recreates the container, so `playwright install-deps` run once at setup time is
51
+ # gone by the next suite and every scenario dies at browser launch with
52
+ # error while loading shared libraries: libnspr4.so
53
+ # A build file in .ddev/web-build/ is rebuilt into the image on every start, so
54
+ # the libraries survive restarts, rebuilds and a `ddev delete` + rebuild.
55
+ readonly TESTING_BROWSER_LIBS_BUILD='.ddev/web-build/Dockerfile.playwright';
56
+
57
+ function testing_write_browser_libs_build() {
58
+ local project_path="$1";
59
+ mkdir -p "${project_path}/.ddev/web-build" || return 1 ;
60
+ cat > "${project_path}/${TESTING_BROWSER_LIBS_BUILD}" <<'DOCKERFILE'
61
+ # The shared libraries Playwright's chromium needs, baked into the web image so
62
+ # they survive `ddev restart` — installed by the workspace testing tooling.
63
+ # Playwright resolves the package names for this Debian release itself; the apt
64
+ # list is the fallback for a build with no network access to npm.
65
+ RUN npx --yes playwright@1.56 install-deps chromium || \
66
+ (apt-get update && apt-get install -y --no-install-recommends \
67
+ libnspr4 libnss3 libdbus-1-3 libatk1.0-0t64 libatk-bridge2.0-0t64 libcups2t64 \
68
+ libdrm2 libatspi2.0-0t64 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
69
+ libgbm1 libxkbcommon0 libasound2t64 libpango-1.0-0 libcairo2 fonts-liberation \
70
+ && rm -rf /var/lib/apt/lists/*)
71
+ DOCKERFILE
72
+ }
73
+
74
+ # Is chromium actually able to start in this project's web container?
75
+ function testing_browser_libs_ok() {
76
+ ddev exec 'ldconfig -p | grep -q libnspr4' > /dev/null 2>&1 ;
77
+ }
78
+
79
+ # Make sure it is, rebuilding the image once if it is not. Called before every
80
+ # run, so a project that predates this — or one whose image was rebuilt from an
81
+ # older config — heals itself instead of failing the whole suite at step one.
82
+ function testing_ensure_browser_libs() {
83
+ local project_path="$1";
84
+ if testing_browser_libs_ok ; then
85
+ return 0 ;
86
+ fi
87
+ echo "";
88
+ echo "The chromium libraries are missing from this project's web container — adding them to the image.";
89
+ testing_write_browser_libs_build "${project_path}" || return 1 ;
90
+ ddev restart || return 1 ;
91
+ if testing_browser_libs_ok ; then
92
+ echo "The browser libraries are in place.";
93
+ return 0 ;
94
+ fi
95
+ echo "The browser libraries are still missing after the rebuild — check ${TESTING_BROWSER_LIBS_BUILD}.";
96
+ return 1 ;
97
+ }
98
+
99
+ function testing_install_browsers() {
100
+ echo "Making sure the Playwright browsers are in the shared DDEV cache.";
101
+ ddev exec "PLAYWRIGHT_BROWSERS_PATH=${TESTING_BROWSERS_PATH} PLAYWRIGHT_SKIP_BROWSER_GC=1 npx playwright install chromium" || return 1 ;
102
+ }
103
+
104
+ function testing_stack() {
105
+ local project_path="$1";
106
+ if [ -f "${project_path}/.ddev/commands/web/init-full-automated-testing" ] ; then
107
+ printf 'in-project' ; return 0 ;
108
+ fi
109
+ # webship-js (github.com/webship/webship-js) is cucumber-js + Playwright, and its footprint is
110
+ # the cucumber.js config at the project root plus the step definitions it points at.
111
+ if [ -f "${project_path}/cucumber.js" ] || [ -d "${project_path}/tests/step-definitions" ] ; then
112
+ printf 'webship-js' ; return 0 ;
113
+ fi
114
+ printf 'none';
115
+ }
116
+
117
+ # npm or yarn, decided by what the project actually carries rather than by preference: running
118
+ # `npm run` in a yarn workspace re-resolves the tree and can leave it unbuildable.
119
+ function testing_package_runner() {
120
+ local project_path="$1";
121
+ [ -f "${project_path}/yarn.lock" ] && { printf 'yarn' ; return 0 ; }
122
+ printf 'npm';
123
+ }
124
+
125
+ function testing_require_project() {
126
+ local project_path="$1";
127
+ if [ ! -d "${project_path}" ] ; then
128
+ echo "No project ${PROJECT_NAME} in ${WORKSPACE_ROOT}/${doc_name}.";
129
+ return 1 ;
130
+ fi
131
+ if [ ! -f "${project_path}/.ddev/config.yaml" ] ; then
132
+ echo "${doc_name}/${PROJECT_NAME} is not a DDEV project — the testing stack runs inside DDEV.";
133
+ return 1 ;
134
+ fi
135
+ return 0 ;
136
+ }
137
+
138
+ # Set the testing environment up on an existing project. Idempotent: the in-project command checks
139
+ # what is installed before it installs anything, and the webship add-on preserves every file it
140
+ # finds, so a second run adds what a first run missed rather than resetting the suite.
141
+ function testing_configure() {
142
+ local project_path="${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME}" stack runner;
143
+ testing_require_project "${project_path}" || return 1 ;
144
+ cd "${project_path}" || return 1 ;
145
+
146
+ stack="$(testing_stack "${project_path}")";
147
+ echo "";
148
+ echo "Setting up automated testing for ${doc_name}/${PROJECT_NAME}.";
149
+ echo "";
150
+
151
+ ddev start -y || return 1 ;
152
+
153
+ case "${stack}" in
154
+ in-project)
155
+ echo "This project ships its own DDEV testing command — using it.";
156
+ ddev init-full-automated-testing || return 1 ;
157
+ ;;
158
+ *)
159
+ # Also the path for `webship-js`: the add-on owns the scaffold, and re-getting it is how you
160
+ # pick up a newer version of it.
161
+ echo "Adding the webship-js DDEV add-on (Playwright + Cucumber-js).";
162
+ if ! ddev add-on get webship/ddev-webship-js ; then
163
+ # The add-on declares a minimum DDEV version, and the failure reads as an add-on error
164
+ # rather than as "your DDEV is too old", which is what it actually means.
165
+ echo "";
166
+ echo " The add-on could not be installed. It requires a newer DDEV than this machine has:";
167
+ echo " installed: $(ddev version 2>/dev/null | awk '$1 == "DDEV" && $2 == "version" {print $3}')";
168
+ echo " Update DDEV (https://ddev.readthedocs.io/en/stable/users/install/ddev-upgrade/),";
169
+ echo " then run this command again.";
170
+ return 1 ;
171
+ fi
172
+ # The add-on scaffolds on post-start, so the restart is part of the install, not a nicety.
173
+ ddev restart || return 1 ;
174
+ ;;
175
+ esac
176
+
177
+ runner="$(testing_package_runner "${project_path}")";
178
+ if [ -f "${project_path}/package.json" ] ; then
179
+ echo "";
180
+ echo "Installing the JS dependencies and the chromium browser.";
181
+ ddev ${runner} install || true ;
182
+ testing_write_browser_libs_build "${project_path}" ;
183
+ testing_ensure_browser_libs "${project_path}" || true ;
184
+ testing_install_browsers || true ;
185
+ fi
186
+
187
+ # A site under test should fail loudly and serve unaggregated assets: a CSS aggregate makes a
188
+ # failure screenshot unreadable, and a swallowed error is a scenario that fails for the wrong
189
+ # reason. Best-effort — a non-Drupal project simply has no drush.
190
+ if ddev drush status --field=bootstrap 2>/dev/null | grep -qi successful ; then
191
+ echo "";
192
+ echo "Tuning the site for testing (no aggregation, all errors visible).";
193
+ ddev drush config:set system.performance css.preprocess 0 --yes > /dev/null 2>&1 ;
194
+ ddev drush config:set system.performance js.preprocess 0 --yes > /dev/null 2>&1 ;
195
+ ddev drush config:set system.logging error_level all --yes > /dev/null 2>&1 ;
196
+ ddev drush cache:rebuild > /dev/null 2>&1 ;
197
+ fi
198
+
199
+ echo "";
200
+ echo "*---------------------------------------------------------------------*";
201
+ echo " Testing is set up on ${doc_name}/${PROJECT_NAME} ($(testing_stack "${project_path}")).";
202
+ echo "";
203
+ echo " Run it: bash cmd-tools-testing.sh ${PROJECT_NAME} --run";
204
+ echo " One feature: bash cmd-tools-testing.sh ${PROJECT_NAME} --run --path tests/features/<name>.feature";
205
+ echo " By tag: bash cmd-tools-testing.sh ${PROJECT_NAME} --run --tags @critical";
206
+ echo "";
207
+ echo " The report lands in tests/reports/, and the dashboard's Tests menu reads it.";
208
+ echo "*---------------------------------------------------------------------*";
209
+ }
210
+
211
+ # Run the suite. Everything happens inside DDEV — the browsers are in the web container, and the
212
+ # site under test is reachable there by its own name.
213
+ function testing_run() {
214
+ local project_path="${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME}" stack runner script started status;
215
+ testing_require_project "${project_path}" || return 1 ;
216
+ cd "${project_path}" || return 1 ;
217
+
218
+ stack="$(testing_stack "${project_path}")";
219
+ if [ "${stack}" == 'none' ] ; then
220
+ echo "${doc_name}/${PROJECT_NAME} has no testing stack yet.";
221
+ echo " Set it up first: bash cmd-tools-testing.sh ${PROJECT_NAME} --configure";
222
+ return 1 ;
223
+ fi
224
+
225
+ # Start it only if it is not already up. `ddev start` on a running project RECREATES its
226
+ # containers whenever the project rewrites its own config on boot (the site-template projects do,
227
+ # for Storybook) — which throws away the container, occasionally trips the health wait, and used
228
+ # to take the freshly downloaded browsers with it. A running project is left alone.
229
+ if ddev describe -j 2>/dev/null | grep -q '"status":"running"' ; then
230
+ echo "${doc_name}/${PROJECT_NAME} is already running.";
231
+ else
232
+ ddev start -y || return 1 ;
233
+ fi
234
+
235
+ # A restart between setting up and running empties the container's own cache, so check before
236
+ # opening a browser rather than after 275 scenarios have failed for the same missing file. The
237
+ # libraries chromium links against are checked the same way and for the same reason.
238
+ testing_ensure_browser_libs "${project_path}" || return 1 ;
239
+ testing_install_browsers || return 1 ;
240
+ runner="$(testing_package_runner "${project_path}")";
241
+ started="$(date +%s)";
242
+
243
+ echo "";
244
+ echo "Running the ${BROWSER} suite of ${doc_name}/${PROJECT_NAME}.";
245
+ echo "";
246
+
247
+ # webship-js is cucumber-js driving Playwright, configured by the project's own cucumber.js.
248
+ # The package scripts are the contract — `test:chromium` is
249
+ # BROWSER=chromium node ./node_modules/@cucumber/cucumber/bin/cucumber.js --config cucumber.js
250
+ # — so an unfiltered run calls the script rather than reimplementing it, and a filtered run
251
+ # reproduces exactly that command with the filter appended. The browser and headed-ness travel
252
+ # as the environment variables the config reads (BROWSER, HEADLESS), not as flags cucumber has
253
+ # no idea about.
254
+ local env_prefix="PLAYWRIGHT_BROWSERS_PATH=${TESTING_BROWSERS_PATH} BROWSER=${BROWSER}";
255
+ [ "${HEADED}" == 'yes' ] && env_prefix="${env_prefix} HEADLESS=false";
256
+ local cucumber="node ./node_modules/@cucumber/cucumber/bin/cucumber.js --config cucumber.js";
257
+ local filter="";
258
+ # Narrowing to one feature is an ENV var here, not a positional argument: these projects'
259
+ # cucumber.js sets `paths: [process.env.FEATURES || 'tests/features/**/*.feature']`, and a config
260
+ # `paths` wins over the path you type — passing it positionally silently ran all 275 scenarios.
261
+ # A directory is expanded to the glob cucumber expects, so `--path tests/features/02-user` works.
262
+ if [ ! "${TESTING_PATH}" == '_none_' ] ; then
263
+ local features="${TESTING_PATH}";
264
+ case "${features}" in
265
+ *.feature|*'*'*) : ;;
266
+ *) features="${features%/}/**/*.feature" ;;
267
+ esac
268
+ env_prefix="${env_prefix} FEATURES=\"${features}\"";
269
+ filter="${filter} ";
270
+ fi
271
+ [ ! "${TAGS}" == '_none_' ] && filter="${filter} --tags \"${TAGS}\"";
272
+ [ ! "${RETRY}" == '_none_' ] && filter="${filter} --retry ${RETRY}";
273
+ # --dry-run compiles the suite and matches every step against the definitions without opening a
274
+ # browser: seconds instead of the ~20 minutes a full suite takes, and it is what catches
275
+ # an undefined step or a broken tag expression before a real run does.
276
+ [ "${DRY_RUN}" == 'yes' ] && filter="${filter} --dry-run";
277
+
278
+ if [ -n "${filter}" ] ; then
279
+ echo " ddev exec ${env_prefix} ${cucumber} ${filter}";
280
+ ddev exec "${env_prefix} ${cucumber} ${filter}" ;
281
+ status=$? ;
282
+ else
283
+ script="test:${BROWSER}";
284
+ echo " ddev ${runner} run ${script}";
285
+ [ "${HEADED}" == 'yes' ] && script="test:headed";
286
+ ddev exec "${env_prefix} ${runner} run ${script}" ;
287
+ status=$? ;
288
+ fi
289
+
290
+ # The HTML report the dashboard reads is written by webship-js's own hook, unless the run
291
+ # disabled it (WEBSHIP_REPORT_DISABLE=1, which CI does). Regenerate it when the JSON is there
292
+ # and the HTML is not, so a run always leaves the artifact the Tests menu links to.
293
+ if [ -f tests/reports/cucumber_report.json ] && [ ! -f tests/reports/cucumber_report.html ] ; then
294
+ if grep -q '"generate-reports"' package.json 2>/dev/null ; then
295
+ echo "";
296
+ echo "Generating the HTML report.";
297
+ ddev ${runner} run generate-reports || true ;
298
+ fi
299
+ fi
300
+
301
+ echo "";
302
+ echo "*---------------------------------------------------------------------*";
303
+ if [ "${status}" -eq 0 ] ; then
304
+ echo " The suite passed in $(( $(date +%s) - started ))s.";
305
+ else
306
+ # A failing suite is a result, not a tooling error — say so plainly and point at the evidence
307
+ # rather than burying it in a non-zero exit.
308
+ echo " The suite FAILED (exit ${status}) after $(( $(date +%s) - started ))s.";
309
+ echo " Every failed step leaves a screenshot and a DOM dump; each scenario leaves a recording.";
310
+ fi
311
+ echo "";
312
+ echo " Report: ${doc_name}/${PROJECT_NAME}/tests/reports/cucumber_report.html";
313
+ echo " Screenshots: ${doc_name}/${PROJECT_NAME}/tests/screenshots/";
314
+ echo " Recordings: ${doc_name}/${PROJECT_NAME}/tests/videos/";
315
+ echo " The dashboard's Tests menu shows all three, newest first.";
316
+ echo "*---------------------------------------------------------------------*";
317
+ return ${status} ;
318
+ }
319
+
320
+ function testing_command() {
321
+ # --configure is the default, so it is only meaningful as a word — except together with --run,
322
+ # where "set it up and then run it" is a real thing to ask for and used to lose the setup half.
323
+ if [ "${CONFIGURE}" == 'yes' ] || [ ! "${RUN}" == 'yes' ] ; then
324
+ testing_configure || return 1 ;
325
+ fi
326
+ if [ "${RUN}" == 'yes' ] ; then
327
+ testing_run ;
328
+ fi
329
+ }
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Load the default user list of a distribution: `set_<distribution>_users` lives
4
+ # in functions/fun-distribution-<distribution>.sh, next to that distribution's
5
+ # install functions. Each cmd-*.sh sets distribution_name itself.
6
+ function load_distribution_users () {
7
+ distribution_functions="${WORKSPACE_SCRIPTS}/functions/fun-distribution-${distribution_name}.sh" ;
8
+ if [ -f "${distribution_functions}" ]; then
9
+ source "${distribution_functions}" ;
10
+ fi
11
+
12
+ if declare -f set_${distribution_name}_users > /dev/null ; then
13
+ set_${distribution_name}_users ;
14
+ else
15
+ echo "No default user list for '${distribution_name}' — add set_${distribution_name}_users() to fun-distribution-${distribution_name}.sh." ;
16
+ fi
17
+
18
+ # Callers that only know the project (cmd-tools-add-users.sh) get the docroot
19
+ # from the project's own DDEV config.
20
+ if [ -z "${distribution_webroot}" ] && [ -f "${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME}/.ddev/config.yaml" ]; then
21
+ distribution_webroot=$(grep '^docroot:' "${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME}/.ddev/config.yaml" | awk '{print $2}') ;
22
+ fi
23
+ }
24
+
25
+ # Add users to a project.
26
+ function add_users () {
27
+
28
+ # Add Drush if it was not in the system.
29
+ add_drush ;
30
+
31
+ load_distribution_users ;
32
+
33
+ cd ${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME}/${distribution_webroot}/;
34
+
35
+ for user in ${users[@]}
36
+ do
37
+ user_name="user_${user}_name";
38
+ user_mail="user_${user}_mail";
39
+ user_password="user_${user}_password";
40
+ user_role="user_${user}_role";
41
+
42
+ echo " ---------------------------------------------------------------- ";
43
+ echo " User name: ${!user_name}";
44
+ echo " User mail: ${!user_mail}";
45
+ echo " User password: ${!user_password}";
46
+ echo " User role: ${!user_role}";
47
+ echo " ================================================================= ";
48
+
49
+ ddev drush user:create "${!user_name}" --mail="${!user_mail}" --password="${!user_password}" ;
50
+ if [ "${!user_role}" == '_none_' ] ; then
51
+ echo " No user role for this user" ;
52
+ else
53
+ ddev drush user:role:add "${!user_role}" "${!user_name}" ;
54
+ fi
55
+ done
56
+
57
+ echo "Cache rebuilding ...";
58
+ ddev drush cache:rebuild ;
59
+
60
+ cd ${WORKSPACE_ROOT}/${doc_name};
61
+ }
62
+
63
+ # Cancle users from a project and delete their content.
64
+ function cancel_users () {
65
+
66
+ # Add Drush if it was not in the system.
67
+ add_drush ;
68
+
69
+ load_distribution_users ;
70
+
71
+ cd ${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME}/${distribution_webroot}/;
72
+
73
+ for user in ${users[@]}
74
+ do
75
+ user_name="user_${user}_name";
76
+
77
+ echo " ---------------------------------------------------------------- ";
78
+ echo " User name: ${!user_name}";
79
+ echo " ================================================================= ";
80
+ ddev drush user:cancel --delete-content "${!user_name}" -y ;
81
+ done
82
+
83
+ echo "Cache rebuilding ...";
84
+ ddev drush cache:rebuild ;
85
+
86
+ cd ${WORKSPACE_ROOT}/${doc_name};
87
+ }
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env bash
2
+
3
+ ################################################################################
4
+ ## What version of the Webship Workspace is this machine running?
5
+ ################################################################################
6
+ ## One answer, in one place, because three different things install this tree and
7
+ ## until now only ONE of them left a trace:
8
+ ##
9
+ ## install.sh a fresh machine -> stamped nothing
10
+ ## sync-tooling.sh --pull a machine with the clone -> stamped nothing
11
+ ## update.sh a machine on releases -> wrote .app-version
12
+ ##
13
+ ## So `update.sh --check` answered "Installed: (untracked)" and offered an update
14
+ ## on a tree that was already current, for ever, on every machine that had not been
15
+ ## updated by the updater. With one person that is a curiosity. Across a team it is
16
+ ## the support question — "what version are you on?" — that nobody can answer, and
17
+ ## an update prompt that everyone learns to ignore.
18
+ ##
19
+ ## The stamp is a plain file, core/workspace-app/.app-version, holding a tag and
20
+ ## nothing else. Not git: the live tree is not a checkout (`~/workspace` has no
21
+ ## .git), which is exactly why `git describe` cannot be the answer.
22
+ ################################################################################
23
+
24
+ # Where the stamp lives. WORKSPACE_PATH is core/, set by bootstrap.sh.
25
+ function workspace_version_file() {
26
+ echo "${WORKSPACE_PATH:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}/workspace-app/.app-version"
27
+ }
28
+
29
+ # The version this tree reports, or an empty string. Never invents one: a wrong
30
+ # version is worse than an absent one, because it stops the question being asked.
31
+ function workspace_version() {
32
+ local f
33
+ f="$(workspace_version_file)"
34
+ [ -f "${f}" ] || return 0
35
+ head -1 "${f}" | tr -d '[:space:]'
36
+ }
37
+
38
+ # Record the version this tree is now at. Callers pass what they actually
39
+ # installed; nobody guesses.
40
+ function workspace_version_stamp() {
41
+ local version="${1:-}"
42
+ local f
43
+ [ -n "${version}" ] || return 1
44
+ f="$(workspace_version_file)"
45
+ mkdir -p "$(dirname "${f}")" 2>/dev/null
46
+ printf '%s\n' "${version}" > "${f}" || return 1
47
+ return 0
48
+ }
49
+
50
+ # The newest release tag, from the repository. Used when a caller knows it is
51
+ # installing "whatever is current" rather than a named tag — a fresh install from
52
+ # a downloaded ZIP, say. Empty when the network or gh is unavailable, and the
53
+ # caller must treat that as "unknown", never as "up to date".
54
+ function workspace_latest_tag() {
55
+ local repo="${1:-webship/workspace}" tag=''
56
+ if command -v gh > /dev/null 2>&1 ; then
57
+ tag="$(gh api "repos/${repo}/releases/latest" --jq .tag_name 2>/dev/null)"
58
+ fi
59
+ if [ -z "${tag}" ] && command -v curl > /dev/null 2>&1 ; then
60
+ tag="$(curl -fsSL --max-time 15 "https://api.github.com/repos/${repo}/releases/latest" 2>/dev/null \
61
+ | sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p' | head -1)"
62
+ fi
63
+ echo "${tag}"
64
+ }
65
+
66
+ # The version of a git clone of this repository, for sync-tooling.sh --pull: there
67
+ # the source IS a checkout, so the tag it is on is the honest answer.
68
+ function workspace_clone_version() {
69
+ local clone="${1:-}"
70
+ [ -n "${clone}" ] && [ -d "${clone}/.git" ] || return 0
71
+ git -C "${clone}" describe --tags --abbrev=0 2>/dev/null
72
+ }
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Edit a video into a new version of itself. The work is in libs/video_edit.py; this hands it the ElevenLabs
4
+ # settings, which only a section added with that voice uses.
5
+
6
+ function video_edit_engine() {
7
+ ELEVENLABS_API_KEY="$(elevenlabs_key)" ELEVENLABS_API_BASE="$(elevenlabs_base)" \
8
+ ELEVENLABS_MODEL="$(elevenlabs_model)" ELEVENLABS_VOICE="$(elevenlabs_voice)" \
9
+ python3 "${WORKSPACE_SCRIPTS}/libs/video_edit.py" "$@" ;
10
+ }
11
+
12
+ function video_edit_usage() {
13
+ cat <<'USAGE'
14
+ usage: cmd-tools-video-edit.sh -a ACTION --video V.mp4 [options]
15
+
16
+ -a info size, frame rate and length
17
+ -a edit --out NEW.mp4 [changes] a new version with the changes; the original is never touched
18
+
19
+ changes (any number together):
20
+ --speed 0.25-4 play faster or slower --length 1:30 make it exactly that long
21
+ --trim 0:05-0:40 keep only that stretch --remove T03,T05 cut sections of the script out
22
+ --add-title T --add-text "..." --add-after T03|start|end [--engine piper|elevenlabs --voice ID]
23
+ a new section: a Webship logo card, spoken by the voice
24
+ --intro-card 3 [--intro-title T --intro-subtitle S] the Webship logo before the video (1-10 seconds)
25
+ --outro-card 3 [--outro-title T --outro-subtitle S] the Webship logo after it
26
+ --intro-music F --outro-music F [--intro-seconds 8 --outro-seconds 8 --music-volume 0.5]
27
+ --clone a plain copy to re-work (what a new version starts as)
28
+ --script S.md [--script-out O.md] the timed voiceover script; it is rewritten for the new version
29
+
30
+ An existing output is refused unless --force. Only a section spoken with ElevenLabs spends credits: it prints
31
+ a plan and stops unless --confirm is given. Exit codes: 0 ok, 1 error, 2 usage, 3 no key, 4 plan only.
32
+ USAGE
33
+ }
34
+
35
+ function video_edit_main() {
36
+ local action='edit';
37
+ while [ $# -gt 0 ] ; do
38
+ case "$1" in
39
+ -h|--help) video_edit_usage ; return 0 ;;
40
+ -a|--action) action="$2"; shift 2 || { video_edit_usage >&2 ; return 2 ; } ;;
41
+ *) break ;;
42
+ esac
43
+ done
44
+ case "${action}" in
45
+ info|edit) video_edit_engine "${action}" "$@" ;;
46
+ *) echo "Unknown action: ${action}" >&2 ; video_edit_usage >&2 ; return 2 ;;
47
+ esac
48
+ }
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Voices for the audio workspace: Piper (voice-narration) and ElevenLabs, one text spoken to one file.
4
+ # The engine and its arguments are in libs/voice.py; this only hands it the ElevenLabs settings.
5
+
6
+ function voice_engine() {
7
+ ELEVENLABS_API_KEY="$(elevenlabs_key)" ELEVENLABS_API_BASE="$(elevenlabs_base)" \
8
+ ELEVENLABS_MODEL="$(elevenlabs_model)" ELEVENLABS_VOICE="$(elevenlabs_voice)" \
9
+ python3 "${WORKSPACE_SCRIPTS}/libs/voice.py" "$@" ;
10
+ }
11
+
12
+ function voice_usage() {
13
+ cat <<'USAGE'
14
+ usage: cmd-tools-voice.sh -a ACTION [options]
15
+
16
+ -a engines [--json] which engines this machine can use, and why not
17
+ -a voices --engine piper|elevenlabs the voices of one engine [--search WORD] [--limit N]
18
+ -a speak --engine piper|elevenlabs --text-file F --out F.wav|F.mp3 [--voice ID] [--model ID]
19
+ -a voiceover --engine piper|elevenlabs --script S.md --video V.mp4 --out O.mp4 --voice ID [--model ID] [--drop-optional]
20
+ a timed voiceover script, or any transcript, spoken over a video
21
+ -a sound --text-file F --out F.mp3 [--duration 0.5-30] [--loop] [--influence 0-1] (ElevenLabs)
22
+ a sound effect from a description
23
+ -a music --text-file F --out F.mp3 [--length 3-600] [--instrumental] (ElevenLabs)
24
+ music from a description
25
+
26
+ Piper is free and local. ElevenLabs spends credits, so speak, voiceover, sound and music print a plan and stop
27
+ unless --confirm is given. An existing output is refused unless --force. Add --json for machine-readable output.
28
+ Exit codes: 0 ok, 1 error, 2 usage, 3 no key, 4 plan only.
29
+ USAGE
30
+ }
31
+
32
+ function voice_main() {
33
+ local action='engines';
34
+ while [ $# -gt 0 ] ; do
35
+ case "$1" in
36
+ -h|--help) voice_usage ; return 0 ;;
37
+ -a|--action) action="$2"; shift 2 || { voice_usage >&2 ; return 2 ; } ;;
38
+ *) break ;;
39
+ esac
40
+ done
41
+ case "${action}" in
42
+ engines|voices|speak|voiceover|sound|music) voice_engine "${action}" "$@" ;;
43
+ *) echo "Unknown action: ${action}" >&2 ; voice_usage >&2 ; return 2 ;;
44
+ esac
45
+ }
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # WordPress on DDEV: an example of a non-Drupal builder.
4
+ #
5
+ # Two shapes, picked by the builder:
6
+ # wordpress_shape="core" WordPress itself, downloaded with wp-cli, docroot at the project root.
7
+ # wordpress_shape="bedrock" roots/bedrock, WordPress managed by Composer, docroot web/.
8
+ #
9
+ # DDEV writes wp-config-ddev.php for the database, so nothing here writes database settings.
10
+
11
+ function build_wordpress() {
12
+ local base_url="https://${PROJECT_NAME}.ddev.site" ;
13
+ local docroot="" ;
14
+ [ "${wordpress_shape}" == 'bedrock' ] && docroot="web" ;
15
+
16
+ cd ${WORKSPACE_ROOT}/${doc_name} || exit 1 ;
17
+
18
+ drop_database ;
19
+ rm -rf "${PROJECT_NAME}" ;
20
+ mkdir -p "${PROJECT_NAME}" ;
21
+ cd ${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME} || exit 1 ;
22
+
23
+ local php_version="${PHP_VERSION:-${site_php_version:-}}" ;
24
+ ddev config --project-type=wordpress --docroot="${docroot}" --project-name=${PROJECT_NAME} \
25
+ ${php_version:+--php-version=${php_version}} --auto || exit 1 ;
26
+ ddev_up start -y || exit 1 ;
27
+
28
+ if [ "${wordpress_shape}" == 'bedrock' ] ; then
29
+ ddev composer create-project "roots/bedrock:${site_version}" --no-interaction || { echo "composer create-project failed." ; exit 1 ; } ;
30
+ # Bedrock reads its settings from .env; DDEV's database is always db/db/db.
31
+ {
32
+ echo "DB_NAME='db'" ; echo "DB_USER='db'" ; echo "DB_PASSWORD='db'" ; echo "DB_HOST='db'" ;
33
+ echo "WP_ENV='development'" ; echo "WP_HOME='${base_url}'" ; echo 'WP_SITEURL="${WP_HOME}/wp"' ;
34
+ local key ;
35
+ for key in AUTH_KEY SECURE_AUTH_KEY LOGGED_IN_KEY NONCE_KEY AUTH_SALT SECURE_AUTH_SALT LOGGED_IN_SALT NONCE_SALT ; do
36
+ echo "${key}='$(head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n')'" ;
37
+ done
38
+ } > .env ;
39
+ else
40
+ ddev wp core download --version="${site_version}" || { echo "wp core download failed." ; exit 1 ; } ;
41
+ fi
42
+
43
+ if [ "${INSTALL}" == 'yes' ] ; then
44
+ ddev wp core install --url="${base_url}" --title="${doc_name} ${PROJECT_NAME}" \
45
+ --admin_user="${account_name}" --admin_password="${account_pass}" --admin_email="${account_mail}" \
46
+ --skip-email || { echo "wp core install failed." ; exit 1 ; } ;
47
+ echo "${doc_name} ${PROJECT_NAME} has been installed!!!!";
48
+ echo "Go to ${base_url}/wp-admin and log in as ${account_name}";
49
+ else
50
+ echo "${doc_name} ${PROJECT_NAME} is ready to install!!!!";
51
+ echo "Go to ${base_url}";
52
+ fi
53
+
54
+ if [ "${LAUNCH}" == 'yes' ] ; then
55
+ ddev launch ;
56
+ fi
57
+
58
+ cd ${WORKSPACE_ROOT}/${doc_name};
59
+ }