@webship.co/workspace 1.0.0-beta1 → 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 (630) 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/core/workspace-app/README.md +380 -0
  160. package/{actions → core/workspace-app/actions}/ddev.js +0 -1
  161. package/{actions → core/workspace-app/actions}/rag.js +0 -1
  162. package/{actions → core/workspace-app/actions}/testing.js +0 -1
  163. package/{assistant.js → core/workspace-app/assistant.js} +1 -10
  164. package/{git-info.js → core/workspace-app/git-info.js} +17 -1
  165. package/core/workspace-app/package.json +29 -0
  166. package/core/workspace-app/plugin-catalog.js +50 -0
  167. package/{plugins-page.js → core/workspace-app/plugins-page.js} +28 -2
  168. package/{server.js → core/workspace-app/server.js} +18 -0
  169. package/core/workspace-app/tests/features/actions-rail.feature +44 -0
  170. package/core/workspace-app/tests/features/ai-items.feature +23 -0
  171. package/core/workspace-app/tests/features/assistant-speech.feature +63 -0
  172. package/core/workspace-app/tests/features/checks.feature +39 -0
  173. package/core/workspace-app/tests/features/clone-project.feature +30 -0
  174. package/core/workspace-app/tests/features/command-authoring.feature +58 -0
  175. package/core/workspace-app/tests/features/dashboard.feature +57 -0
  176. package/core/workspace-app/tests/features/menus.feature +29 -0
  177. package/core/workspace-app/tests/features/plugins/jira/jira.feature +47 -0
  178. package/core/workspace-app/tests/features/plugins.feature +20 -0
  179. package/core/workspace-app/tests/features/project-actions.feature +40 -0
  180. package/core/workspace-app/tests/features/screens.feature +29 -0
  181. package/core/workspace-app/tests/features/settings.feature +46 -0
  182. package/core/workspace-app/tests/features/test-reports.feature +32 -0
  183. package/core/workspace-app/tests/features/theme.feature +40 -0
  184. package/core/workspace-app/tests/step-definitions/actions-post.steps.js +25 -0
  185. package/core/workspace-app/tests/step-definitions/assistant-speech.steps.js +152 -0
  186. package/core/workspace-app/tests/step-definitions/preconditions.steps.js +100 -0
  187. package/core/workspace-app/tests/unit/_isolated-config.js +31 -0
  188. package/core/workspace-app/tests/unit/accessibility.test.js +124 -0
  189. package/core/workspace-app/tests/unit/actions-rail-ux.test.js +56 -0
  190. package/core/workspace-app/tests/unit/actions-rail.test.js +51 -0
  191. package/core/workspace-app/tests/unit/ai-inventory.test.js +64 -0
  192. package/core/workspace-app/tests/unit/app-docs.test.js +64 -0
  193. package/core/workspace-app/tests/unit/assistant-avatar.test.js +110 -0
  194. package/core/workspace-app/tests/unit/assistant-cast.test.js +105 -0
  195. package/core/workspace-app/tests/unit/assistant-send-animation.test.js +15 -0
  196. package/core/workspace-app/tests/unit/assistant-suggestions.test.js +112 -0
  197. package/core/workspace-app/tests/unit/assistant-switches.test.js +53 -0
  198. package/core/workspace-app/tests/unit/assistant-views.test.js +146 -0
  199. package/core/workspace-app/tests/unit/assistant-working-indicator.test.js +49 -0
  200. package/core/workspace-app/tests/unit/assistant.test.js +61 -0
  201. package/core/workspace-app/tests/unit/audio-player.test.js +147 -0
  202. package/core/workspace-app/tests/unit/audio-voice.test.js +634 -0
  203. package/core/workspace-app/tests/unit/auth-google.test.js +180 -0
  204. package/core/workspace-app/tests/unit/autostart-watch.test.js +76 -0
  205. package/core/workspace-app/tests/unit/browsers.test.js +76 -0
  206. package/core/workspace-app/tests/unit/build-distribution.test.js +125 -0
  207. package/core/workspace-app/tests/unit/build-order.test.js +153 -0
  208. package/core/workspace-app/tests/unit/builder-args.test.js +113 -0
  209. package/core/workspace-app/tests/unit/builders.test.js +158 -0
  210. package/core/workspace-app/tests/unit/card-state-toggle.test.js +29 -0
  211. package/core/workspace-app/tests/unit/changelog.test.js +177 -0
  212. package/core/workspace-app/tests/unit/chat-thread.test.js +92 -0
  213. package/core/workspace-app/tests/unit/checks-plan.test.js +205 -0
  214. package/core/workspace-app/tests/unit/claude-args.test.js +182 -0
  215. package/core/workspace-app/tests/unit/claude-code-here.test.js +15 -0
  216. package/core/workspace-app/tests/unit/claude-resume.test.js +147 -0
  217. package/core/workspace-app/tests/unit/claude-screen-options.test.js +84 -0
  218. package/core/workspace-app/tests/unit/claude-session.test.js +41 -0
  219. package/core/workspace-app/tests/unit/command-flags.test.js +45 -0
  220. package/core/workspace-app/tests/unit/command-palette.test.js +105 -0
  221. package/core/workspace-app/tests/unit/commands-center.test.js +338 -0
  222. package/core/workspace-app/tests/unit/composer-menu.test.js +187 -0
  223. package/core/workspace-app/tests/unit/config-yaml.test.js +116 -0
  224. package/core/workspace-app/tests/unit/confirm-dialog.test.js +69 -0
  225. package/core/workspace-app/tests/unit/create-card.test.js +85 -0
  226. package/core/workspace-app/tests/unit/ddev-addons.test.js +144 -0
  227. package/core/workspace-app/tests/unit/ddev-auth-ssh.test.js +40 -0
  228. package/core/workspace-app/tests/unit/ddev-custom-commands.test.js +56 -0
  229. package/core/workspace-app/tests/unit/ddev-diagnose.test.js +57 -0
  230. package/core/workspace-app/tests/unit/ddev-domains.test.js +153 -0
  231. package/core/workspace-app/tests/unit/ddev-hostnames.test.js +143 -0
  232. package/core/workspace-app/tests/unit/ddev-import.test.js +82 -0
  233. package/core/workspace-app/tests/unit/ddev-mail.test.js +135 -0
  234. package/core/workspace-app/tests/unit/ddev-menu-and-create.test.js +28 -0
  235. package/core/workspace-app/tests/unit/ddev-mutagen.test.js +37 -0
  236. package/core/workspace-app/tests/unit/ddev-options.test.js +51 -0
  237. package/core/workspace-app/tests/unit/ddev-share.test.js +40 -0
  238. package/core/workspace-app/tests/unit/ddev-shim.test.js +57 -0
  239. package/core/workspace-app/tests/unit/ddev-snapshots.test.js +142 -0
  240. package/core/workspace-app/tests/unit/ddev-start-daemons.test.js +62 -0
  241. package/core/workspace-app/tests/unit/ddev-xdebug.test.js +41 -0
  242. package/core/workspace-app/tests/unit/deep-chat-origin.test.js +38 -0
  243. package/core/workspace-app/tests/unit/density.test.js +52 -0
  244. package/core/workspace-app/tests/unit/elevenlabs.test.js +453 -0
  245. package/core/workspace-app/tests/unit/event-log.test.js +102 -0
  246. package/core/workspace-app/tests/unit/favicon.test.js +68 -0
  247. package/core/workspace-app/tests/unit/files-browser.test.js +224 -0
  248. package/core/workspace-app/tests/unit/git-info.test.js +26 -0
  249. package/core/workspace-app/tests/unit/grid-and-list.test.js +103 -0
  250. package/core/workspace-app/tests/unit/host-tool-wrapper.test.js +18 -0
  251. package/core/workspace-app/tests/unit/html-patterns.test.js +51 -0
  252. package/core/workspace-app/tests/unit/ide-infra.test.js +28 -0
  253. package/core/workspace-app/tests/unit/images-ai.test.js +201 -0
  254. package/core/workspace-app/tests/unit/images-create.test.js +59 -0
  255. package/core/workspace-app/tests/unit/images-providers.test.js +248 -0
  256. package/core/workspace-app/tests/unit/images-svg.test.js +213 -0
  257. package/core/workspace-app/tests/unit/images-workspace.test.js +144 -0
  258. package/core/workspace-app/tests/unit/jobs-fragment.test.js +66 -0
  259. package/core/workspace-app/tests/unit/media-ux.test.js +164 -0
  260. package/core/workspace-app/tests/unit/modal-fit.test.js +87 -0
  261. package/core/workspace-app/tests/unit/modules-load.test.js +23 -0
  262. package/core/workspace-app/tests/unit/narration.test.js +186 -0
  263. package/core/workspace-app/tests/unit/navigation-editor.test.js +260 -0
  264. package/core/workspace-app/tests/unit/navigation.test.js +254 -0
  265. package/core/workspace-app/tests/unit/new-folder.test.js +121 -0
  266. package/core/workspace-app/tests/unit/new-screen-form.test.js +149 -0
  267. package/core/workspace-app/tests/unit/node-menu.test.js +161 -0
  268. package/core/workspace-app/tests/unit/notes.test.js +128 -0
  269. package/core/workspace-app/tests/unit/page-structure.test.js +40 -0
  270. package/core/workspace-app/tests/unit/page-width.test.js +59 -0
  271. package/core/workspace-app/tests/unit/php-version.test.js +90 -0
  272. package/core/workspace-app/tests/unit/plan-card.test.js +44 -0
  273. package/core/workspace-app/tests/unit/plugin-catalog.test.js +31 -0
  274. package/core/workspace-app/tests/unit/plugin-system.test.js +251 -0
  275. package/core/workspace-app/tests/unit/plugins-page.test.js +28 -0
  276. package/core/workspace-app/tests/unit/plugins.test.js +58 -0
  277. package/core/workspace-app/tests/unit/project-activity-filter.test.js +180 -0
  278. package/core/workspace-app/tests/unit/project-make.test.js +143 -0
  279. package/core/workspace-app/tests/unit/project-name.test.js +202 -0
  280. package/core/workspace-app/tests/unit/reader.test.js +62 -0
  281. package/core/workspace-app/tests/unit/release.test.js +92 -0
  282. package/core/workspace-app/tests/unit/remove-confirm.test.js +37 -0
  283. package/core/workspace-app/tests/unit/report-pdf.test.js +171 -0
  284. package/core/workspace-app/tests/unit/round-11.test.js +31 -0
  285. package/core/workspace-app/tests/unit/round-12.test.js +37 -0
  286. package/core/workspace-app/tests/unit/row-layout.test.js +585 -0
  287. package/core/workspace-app/tests/unit/row-menus-fold.test.js +29 -0
  288. package/core/workspace-app/tests/unit/rows-add-modal.test.js +68 -0
  289. package/core/workspace-app/tests/unit/screen-runner-queue.test.js +41 -0
  290. package/core/workspace-app/tests/unit/screen-window.test.js +116 -0
  291. package/core/workspace-app/tests/unit/screens-beside-running.test.js +19 -0
  292. package/core/workspace-app/tests/unit/screens-columns.test.js +79 -0
  293. package/core/workspace-app/tests/unit/screens-menu.test.js +84 -0
  294. package/core/workspace-app/tests/unit/screens-modal-overlay.test.js +14 -0
  295. package/core/workspace-app/tests/unit/screens-waiting.test.js +129 -0
  296. package/core/workspace-app/tests/unit/screens.test.js +74 -0
  297. package/core/workspace-app/tests/unit/second-storage.test.js +218 -0
  298. package/core/workspace-app/tests/unit/session-name.test.js +64 -0
  299. package/core/workspace-app/tests/unit/settings-file.test.js +173 -0
  300. package/core/workspace-app/tests/unit/settings-nested-list.test.js +54 -0
  301. package/core/workspace-app/tests/unit/settings-raw.test.js +177 -0
  302. package/core/workspace-app/tests/unit/shared-prefs.test.js +49 -0
  303. package/core/workspace-app/tests/unit/speech.test.js +290 -0
  304. package/core/workspace-app/tests/unit/static-caching.test.js +39 -0
  305. package/core/workspace-app/tests/unit/status-language.test.js +47 -0
  306. package/core/workspace-app/tests/unit/tab-modal.test.js +69 -0
  307. package/core/workspace-app/tests/unit/tab-title.test.js +37 -0
  308. package/core/workspace-app/tests/unit/template-literals.test.js +52 -0
  309. package/core/workspace-app/tests/unit/terminal-scrollback.test.js +61 -0
  310. package/core/workspace-app/tests/unit/terminal-size.test.js +103 -0
  311. package/core/workspace-app/tests/unit/terminal-style.test.js +84 -0
  312. package/core/workspace-app/tests/unit/terminal-windows.test.js +154 -0
  313. package/core/workspace-app/tests/unit/themes.test.js +453 -0
  314. package/core/workspace-app/tests/unit/tool-labels.test.js +34 -0
  315. package/core/workspace-app/tests/unit/topbar-icons.test.js +47 -0
  316. package/core/workspace-app/tests/unit/update-docker-gid.test.js +51 -0
  317. package/core/workspace-app/tests/unit/user-guide.test.js +60 -0
  318. package/core/workspace-app/tests/unit/version-check.test.js +98 -0
  319. package/core/workspace-app/tests/unit/version-link.test.js +50 -0
  320. package/core/workspace-app/tests/unit/video-borrow.test.js +198 -0
  321. package/core/workspace-app/tests/unit/video-edit-ask.test.js +93 -0
  322. package/core/workspace-app/tests/unit/video-edit-short.test.js +42 -0
  323. package/core/workspace-app/tests/unit/video-edit.test.js +417 -0
  324. package/core/workspace-app/tests/unit/video-transcript.test.js +237 -0
  325. package/core/workspace-app/tests/unit/waiting.test.js +48 -0
  326. package/core/workspace-app/tests/unit/wordpress-odoo-builders.test.js +38 -0
  327. package/core/workspace-app/tests/unit/workspace-bin.test.js +48 -0
  328. package/core/workspace-app/tests/unit/workspace-card-tools.test.js +30 -0
  329. package/core/workspace-app/tests/unit/workspace-delete.test.js +77 -0
  330. package/core/workspace-app/tests/unit/workspace-types.test.js +68 -0
  331. package/core/workspace-app/tests/unit/worktree-clone.test.js +250 -0
  332. package/package.json +38 -36
  333. /package/{PLUGINS.md → core/workspace-app/PLUGINS.md} +0 -0
  334. /package/{WORKSPACES.md → core/workspace-app/WORKSPACES.md} +0 -0
  335. /package/{actions → core/workspace-app/actions}/ai-items.js +0 -0
  336. /package/{actions → core/workspace-app/actions}/audio.js +0 -0
  337. /package/{actions → core/workspace-app/actions}/build-order.js +0 -0
  338. /package/{actions → core/workspace-app/actions}/checks.js +0 -0
  339. /package/{actions → core/workspace-app/actions}/claude-session.js +0 -0
  340. /package/{actions → core/workspace-app/actions}/commands-center.js +0 -0
  341. /package/{actions → core/workspace-app/actions}/composer.js +0 -0
  342. /package/{actions → core/workspace-app/actions}/ddev-addons.js +0 -0
  343. /package/{actions → core/workspace-app/actions}/ddev-mail.js +0 -0
  344. /package/{actions → core/workspace-app/actions}/folders.js +0 -0
  345. /package/{actions → core/workspace-app/actions}/images-svg.js +0 -0
  346. /package/{actions → core/workspace-app/actions}/images.js +0 -0
  347. /package/{actions → core/workspace-app/actions}/navigation.js +0 -0
  348. /package/{actions → core/workspace-app/actions}/node.js +0 -0
  349. /package/{actions → core/workspace-app/actions}/notes.js +0 -0
  350. /package/{actions → core/workspace-app/actions}/plugins.js +0 -0
  351. /package/{actions → core/workspace-app/actions}/project-make.js +0 -0
  352. /package/{actions → core/workspace-app/actions}/row-actions.js +0 -0
  353. /package/{actions → core/workspace-app/actions}/screens.js +0 -0
  354. /package/{actions → core/workspace-app/actions}/video-edit.js +0 -0
  355. /package/{ai-inventory.js → core/workspace-app/ai-inventory.js} +0 -0
  356. /package/{ai-items.js → core/workspace-app/ai-items.js} +0 -0
  357. /package/{assistant-cast.js → core/workspace-app/assistant-cast.js} +0 -0
  358. /package/{assistant-suggestions.js → core/workspace-app/assistant-suggestions.js} +0 -0
  359. /package/{audio-voice.js → core/workspace-app/audio-voice.js} +0 -0
  360. /package/{auth-google.js → core/workspace-app/auth-google.js} +0 -0
  361. /package/{build-ai.js → core/workspace-app/build-ai.js} +0 -0
  362. /package/{build-order-page.js → core/workspace-app/build-order-page.js} +0 -0
  363. /package/{build-order.js → core/workspace-app/build-order.js} +0 -0
  364. /package/{builder-args.js → core/workspace-app/builder-args.js} +0 -0
  365. /package/{changelog.js → core/workspace-app/changelog.js} +0 -0
  366. /package/{chat-threads.js → core/workspace-app/chat-threads.js} +0 -0
  367. /package/{checks.js → core/workspace-app/checks.js} +0 -0
  368. /package/{claude-args.js → core/workspace-app/claude-args.js} +0 -0
  369. /package/{claude-sessions.js → core/workspace-app/claude-sessions.js} +0 -0
  370. /package/{command-author.js → core/workspace-app/command-author.js} +0 -0
  371. /package/{command-block.js → core/workspace-app/command-block.js} +0 -0
  372. /package/{commands → core/workspace-app/commands}/defaults.yml +0 -0
  373. /package/{commands-page.js → core/workspace-app/commands-page.js} +0 -0
  374. /package/{commands.js → core/workspace-app/commands.js} +0 -0
  375. /package/{cucumber.js → core/workspace-app/cucumber.js} +0 -0
  376. /package/{ddev-addons-page.js → core/workspace-app/ddev-addons-page.js} +0 -0
  377. /package/{ddev-addons.js → core/workspace-app/ddev-addons.js} +0 -0
  378. /package/{ddev-custom-commands.js → core/workspace-app/ddev-custom-commands.js} +0 -0
  379. /package/{ddev-domains.js → core/workspace-app/ddev-domains.js} +0 -0
  380. /package/{ddev-import.js → core/workspace-app/ddev-import.js} +0 -0
  381. /package/{ddev-mail-page.js → core/workspace-app/ddev-mail-page.js} +0 -0
  382. /package/{ddev-mail.js → core/workspace-app/ddev-mail.js} +0 -0
  383. /package/{ddev-options.js → core/workspace-app/ddev-options.js} +0 -0
  384. /package/{ddev-snapshots.js → core/workspace-app/ddev-snapshots.js} +0 -0
  385. /package/{ddev.js → core/workspace-app/ddev.js} +0 -0
  386. /package/{docs → core/workspace-app/docs}/DEVELOPER-GUIDE.md +0 -0
  387. /package/{docs → core/workspace-app/docs}/README.md +0 -0
  388. /package/{docs → core/workspace-app/docs}/REFERENCE.md +0 -0
  389. /package/{docs → core/workspace-app/docs}/USER-GUIDE.md +0 -0
  390. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-board.png +0 -0
  391. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-coffee.png +0 -0
  392. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-colours.png +0 -0
  393. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-icons.png +0 -0
  394. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-moves.png +0 -0
  395. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-pick-cookieman.png +0 -0
  396. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-settings-voices.png +0 -0
  397. /package/{docs → core/workspace-app/docs}/screenshots/assistant/avatar-status.png +0 -0
  398. /package/{docs → core/workspace-app/docs}/screenshots/create-card/create-card.png +0 -0
  399. /package/{docs → core/workspace-app/docs}/screenshots/create-card/start-ai.png +0 -0
  400. /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-address.png +0 -0
  401. /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-worktree-off.png +0 -0
  402. /package/{docs → core/workspace-app/docs}/screenshots/guide-clone-worktree-on.png +0 -0
  403. /package/{docs → core/workspace-app/docs}/screenshots/guide-ddev-menu.png +0 -0
  404. /package/{docs → core/workspace-app/docs}/screenshots/guide-domains.png +0 -0
  405. /package/{docs → core/workspace-app/docs}/screenshots/guide-home.png +0 -0
  406. /package/{docs → core/workspace-app/docs}/screenshots/guide-ide-menu.png +0 -0
  407. /package/{docs → core/workspace-app/docs}/screenshots/guide-remove-refusal.png +0 -0
  408. /package/{docs → core/workspace-app/docs}/screenshots/guide-rows-worktree.png +0 -0
  409. /package/{docs → core/workspace-app/docs}/screenshots/guide-screens.png +0 -0
  410. /package/{docs → core/workspace-app/docs}/screenshots/guide-settings.png +0 -0
  411. /package/{docs → core/workspace-app/docs}/screenshots/guide-workspace-page.png +0 -0
  412. /package/{docs → core/workspace-app/docs}/screenshots/home/card-settings.png +0 -0
  413. /package/{docs → core/workspace-app/docs}/screenshots/home/drag-reorder.png +0 -0
  414. /package/{docs → core/workspace-app/docs}/screenshots/home/edit-card.png +0 -0
  415. /package/{docs → core/workspace-app/docs}/screenshots/images/claude-code-image.png +0 -0
  416. /package/{docs → core/workspace-app/docs}/screenshots/images/edit-with-ai.png +0 -0
  417. /package/{docs → core/workspace-app/docs}/screenshots/images/gallery.png +0 -0
  418. /package/{docs → core/workspace-app/docs}/screenshots/images/generate-description.png +0 -0
  419. /package/{docs → core/workspace-app/docs}/screenshots/images/generate-plan.png +0 -0
  420. /package/{docs → core/workspace-app/docs}/screenshots/images/providers.png +0 -0
  421. /package/{docs → core/workspace-app/docs}/screenshots/images/svg-form.png +0 -0
  422. /package/{docs → core/workspace-app/docs}/screenshots/images/svg-result.png +0 -0
  423. /package/{docs → core/workspace-app/docs}/screenshots/images/upload.png +0 -0
  424. /package/{docs → core/workspace-app/docs}/screenshots/new-folder/2-form.png +0 -0
  425. /package/{docs → core/workspace-app/docs}/screenshots/new-folder/8-ddev-options.png +0 -0
  426. /package/{docs → core/workspace-app/docs}/screenshots/new-folder/files-folder.png +0 -0
  427. /package/{docs → core/workspace-app/docs}/screenshots/projects/ddev-custom-commands.png +0 -0
  428. /package/{docs → core/workspace-app/docs}/screenshots/projects/state-chip-stop.png +0 -0
  429. /package/{docs → core/workspace-app/docs}/screenshots/readme/dashboard-dark.png +0 -0
  430. /package/{docs → core/workspace-app/docs}/screenshots/readme/dashboard-light.png +0 -0
  431. /package/{docs → core/workspace-app/docs}/screenshots/readme/dev-dark.png +0 -0
  432. /package/{docs → core/workspace-app/docs}/screenshots/readme/dev-light.png +0 -0
  433. /package/{docs → core/workspace-app/docs}/screenshots/readme/docs-dark.png +0 -0
  434. /package/{docs → core/workspace-app/docs}/screenshots/readme/docs-light.png +0 -0
  435. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/ai.svg +0 -0
  436. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/code.svg +0 -0
  437. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/docs.svg +0 -0
  438. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/services.svg +0 -0
  439. /package/{docs → core/workspace-app/docs}/screenshots/readme/icons/sites.svg +0 -0
  440. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-report-dark.png +0 -0
  441. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-report-light.png +0 -0
  442. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-scenarios.png +0 -0
  443. /package/{docs → core/workspace-app/docs}/screenshots/readme/test-steps.png +0 -0
  444. /package/{docs → core/workspace-app/docs}/screenshots/readme/videos-dark.png +0 -0
  445. /package/{docs → core/workspace-app/docs}/screenshots/readme/videos-light.png +0 -0
  446. /package/{docs → core/workspace-app/docs}/screenshots/screens-menu.png +0 -0
  447. /package/{docs → core/workspace-app/docs}/screenshots/screens-new.png +0 -0
  448. /package/{docs → core/workspace-app/docs}/screenshots/settings/auth-google-lists.png +0 -0
  449. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-1-row.png +0 -0
  450. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-2-confirm.png +0 -0
  451. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-3-type-name.png +0 -0
  452. /package/{docs → core/workspace-app/docs}/screenshots/settings/delete-4-type-yes.png +0 -0
  453. /package/{event-log.js → core/workspace-app/event-log.js} +0 -0
  454. /package/{files-browser.js → core/workspace-app/files-browser.js} +0 -0
  455. /package/{folders.js → core/workspace-app/folders.js} +0 -0
  456. /package/{format.js → core/workspace-app/format.js} +0 -0
  457. /package/{github-auth.js → core/workspace-app/github-auth.js} +0 -0
  458. /package/{html.js → core/workspace-app/html.js} +0 -0
  459. /package/{icons.js → core/workspace-app/icons.js} +0 -0
  460. /package/{images-ai.js → core/workspace-app/images-ai.js} +0 -0
  461. /package/{images-create.js → core/workspace-app/images-create.js} +0 -0
  462. /package/{images-page.js → core/workspace-app/images-page.js} +0 -0
  463. /package/{images-records.js → core/workspace-app/images-records.js} +0 -0
  464. /package/{images-render.js → core/workspace-app/images-render.js} +0 -0
  465. /package/{images-svg-core.js → core/workspace-app/images-svg-core.js} +0 -0
  466. /package/{images-svg-sanitize.js → core/workspace-app/images-svg-sanitize.js} +0 -0
  467. /package/{images-svg.js → core/workspace-app/images-svg.js} +0 -0
  468. /package/{images.js → core/workspace-app/images.js} +0 -0
  469. /package/{jobs.js → core/workspace-app/jobs.js} +0 -0
  470. /package/{linger.js → core/workspace-app/linger.js} +0 -0
  471. /package/{lists.js → core/workspace-app/lists.js} +0 -0
  472. /package/{media-info.js → core/workspace-app/media-info.js} +0 -0
  473. /package/{navigation-page.js → core/workspace-app/navigation-page.js} +0 -0
  474. /package/{navigation.js → core/workspace-app/navigation.js} +0 -0
  475. /package/{notes.js → core/workspace-app/notes.js} +0 -0
  476. /package/{palette-index.js → core/workspace-app/palette-index.js} +0 -0
  477. /package/{playwright.config.js → core/workspace-app/playwright.config.js} +0 -0
  478. /package/{plugin-install.js → core/workspace-app/plugin-install.js} +0 -0
  479. /package/{plugin-loader.js → core/workspace-app/plugin-loader.js} +0 -0
  480. /package/{plugin-manifest.js → core/workspace-app/plugin-manifest.js} +0 -0
  481. /package/{plugin-settings.js → core/workspace-app/plugin-settings.js} +0 -0
  482. /package/{plugins → core/workspace-app/plugins}/workspace-notes/index.js +0 -0
  483. /package/{project-make.js → core/workspace-app/project-make.js} +0 -0
  484. /package/{project-name.js → core/workspace-app/project-name.js} +0 -0
  485. /package/{public → core/workspace-app/public}/assistant-avatar-moves.js +0 -0
  486. /package/{public → core/workspace-app/public}/assistant-avatar-ui.js +0 -0
  487. /package/{public → core/workspace-app/public}/assistant-avatar.js +0 -0
  488. /package/{public → core/workspace-app/public}/avatar/druplicon.vrm +0 -0
  489. /package/{public → core/workspace-app/public}/css/base.css +0 -0
  490. /package/{public → core/workspace-app/public}/css/components/ai-assistant.css +0 -0
  491. /package/{public → core/workspace-app/public}/css/components/assistant-avatar.css +0 -0
  492. /package/{public → core/workspace-app/public}/css/components/assistant-views.css +0 -0
  493. /package/{public → core/workspace-app/public}/css/components/build-order.css +0 -0
  494. /package/{public → core/workspace-app/public}/css/components/clone-as-a-git-worktree.css +0 -0
  495. /package/{public → core/workspace-app/public}/css/components/command-palette.css +0 -0
  496. /package/{public → core/workspace-app/public}/css/components/commands-center.css +0 -0
  497. /package/{public → core/workspace-app/public}/css/components/confirm-dialog.css +0 -0
  498. /package/{public → core/workspace-app/public}/css/components/create-card.css +0 -0
  499. /package/{public → core/workspace-app/public}/css/components/ddev-menu.css +0 -0
  500. /package/{public → core/workspace-app/public}/css/components/deep-chat.css +0 -0
  501. /package/{public → core/workspace-app/public}/css/components/density.css +0 -0
  502. /package/{public → core/workspace-app/public}/css/components/floating-assistant-workspace-pages.css +0 -0
  503. /package/{public → core/workspace-app/public}/css/components/folders.css +0 -0
  504. /package/{public → core/workspace-app/public}/css/components/full-height-left-assistant-sidebar-all-pages.css +0 -0
  505. /package/{public → core/workspace-app/public}/css/components/full-height-right-actions-rail-pages-that-have-actions.css +0 -0
  506. /package/{public → core/workspace-app/public}/css/components/grid-and-list.css +0 -0
  507. /package/{public → core/workspace-app/public}/css/components/help-page.css +0 -0
  508. /package/{public → core/workspace-app/public}/css/components/hero.css +0 -0
  509. /package/{public → core/workspace-app/public}/css/components/images.css +0 -0
  510. /package/{public → core/workspace-app/public}/css/components/layout-rhythm-and-spacing-polish.css +0 -0
  511. /package/{public → core/workspace-app/public}/css/components/mic-on-any-field-that-wants-typing.css +0 -0
  512. /package/{public → core/workspace-app/public}/css/components/modal-fit.css +0 -0
  513. /package/{public → core/workspace-app/public}/css/components/page-width.css +0 -0
  514. /package/{public → core/workspace-app/public}/css/components/plugins-page.css +0 -0
  515. /package/{public → core/workspace-app/public}/css/components/project-cards.css +0 -0
  516. /package/{public → core/workspace-app/public}/css/components/project-rows.css +0 -0
  517. /package/{public → core/workspace-app/public}/css/components/reordering-the-workspace-cards.css +0 -0
  518. /package/{public → core/workspace-app/public}/css/components/responsive-home-and-the-workspace-pages.css +0 -0
  519. /package/{public → core/workspace-app/public}/css/components/running-commands-as-toasts.css +0 -0
  520. /package/{public → core/workspace-app/public}/css/components/settings-editor-core-config-yml.css +0 -0
  521. /package/{public → core/workspace-app/public}/css/components/short-results-as-a-toast-at-the-top.css +0 -0
  522. /package/{public → core/workspace-app/public}/css/components/sound-player.css +0 -0
  523. /package/{public → core/workspace-app/public}/css/components/suggest-agents-skills-commands.css +0 -0
  524. /package/{public → core/workspace-app/public}/css/components/tab-modal.css +0 -0
  525. /package/{public → core/workspace-app/public}/css/components/terminals.css +0 -0
  526. /package/{public → core/workspace-app/public}/css/components/test-report-media-one-file-per-row-paged.css +0 -0
  527. /package/{public → core/workspace-app/public}/css/components/top-toolbar-logo-breadcrumb.css +0 -0
  528. /package/{public → core/workspace-app/public}/css/components/video-edit.css +0 -0
  529. /package/{public → core/workspace-app/public}/css/components/web-ide-open-with.css +0 -0
  530. /package/{public → core/workspace-app/public}/css/components/working-indicators.css +0 -0
  531. /package/{public → core/workspace-app/public}/css/components/workspace-cards.css +0 -0
  532. /package/{public → core/workspace-app/public}/favicon.ico +0 -0
  533. /package/{public → core/workspace-app/public}/favicon.png +0 -0
  534. /package/{public → core/workspace-app/public}/htmx.min.js +0 -0
  535. /package/{public → core/workspace-app/public}/logo.png +0 -0
  536. /package/{public → core/workspace-app/public}/media-player.js +0 -0
  537. /package/{public → core/workspace-app/public}/mic.js +0 -0
  538. /package/{public → core/workspace-app/public}/narration.js +0 -0
  539. /package/{public → core/workspace-app/public}/palette.js +0 -0
  540. /package/{public → core/workspace-app/public}/sortable.js +0 -0
  541. /package/{public → core/workspace-app/public}/suggest.js +0 -0
  542. /package/{public → core/workspace-app/public}/terminal.js +0 -0
  543. /package/{public → core/workspace-app/public}/themes/default/theme.css +0 -0
  544. /package/{public → core/workspace-app/public}/themes/ember/theme.css +0 -0
  545. /package/{public → core/workspace-app/public}/themes/press/theme.css +0 -0
  546. /package/{public → core/workspace-app/public}/themes/slate/theme.css +0 -0
  547. /package/{public → core/workspace-app/public}/touch-icon.png +0 -0
  548. /package/{public → core/workspace-app/public}/ui.js +0 -0
  549. /package/{public → core/workspace-app/public}/vendor/ace/LICENSE.txt +0 -0
  550. /package/{public → core/workspace-app/public}/vendor/ace/ace.js +0 -0
  551. /package/{public → core/workspace-app/public}/vendor/ace/ext-language_tools.js +0 -0
  552. /package/{public → core/workspace-app/public}/vendor/ace/ext-searchbox.js +0 -0
  553. /package/{public → core/workspace-app/public}/vendor/ace/mode-css.js +0 -0
  554. /package/{public → core/workspace-app/public}/vendor/ace/mode-html.js +0 -0
  555. /package/{public → core/workspace-app/public}/vendor/ace/mode-javascript.js +0 -0
  556. /package/{public → core/workspace-app/public}/vendor/ace/mode-markdown.js +0 -0
  557. /package/{public → core/workspace-app/public}/vendor/ace/mode-sh.js +0 -0
  558. /package/{public → core/workspace-app/public}/vendor/ace/mode-yaml.js +0 -0
  559. /package/{public → core/workspace-app/public}/vendor/ace/theme-textmate.js +0 -0
  560. /package/{public → core/workspace-app/public}/vendor/ace/theme-tomorrow_night.js +0 -0
  561. /package/{public → core/workspace-app/public}/vendor/ace/worker-yaml.js +0 -0
  562. /package/{public → core/workspace-app/public}/vendor/deep-chat.LICENSE +0 -0
  563. /package/{public → core/workspace-app/public}/vendor/deep-chat.bundle.js +0 -0
  564. /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-LICENSE.txt +0 -0
  565. /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-latin-400-italic.woff2 +0 -0
  566. /package/{public → core/workspace-app/public}/vendor/fonts/dm-serif-text-latin-400-normal.woff2 +0 -0
  567. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-LICENSE.txt +0 -0
  568. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-400-italic.woff2 +0 -0
  569. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-400-normal.woff2 +0 -0
  570. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-600-italic.woff2 +0 -0
  571. /package/{public → core/workspace-app/public}/vendor/fonts/figtree-latin-600-normal.woff2 +0 -0
  572. /package/{public → core/workspace-app/public}/vendor/fonts/jetbrains-mono-LICENSE.txt +0 -0
  573. /package/{public → core/workspace-app/public}/vendor/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  574. /package/{public → core/workspace-app/public}/vendor/fonts/ubuntu-mono-LICENSE.txt +0 -0
  575. /package/{public → core/workspace-app/public}/vendor/fonts/ubuntu-mono-latin-wght-normal.woff2 +0 -0
  576. /package/{public → core/workspace-app/public}/vendor/tabler-LICENSE.txt +0 -0
  577. /package/{public → core/workspace-app/public}/vendor/tabler-sprite.svg +0 -0
  578. /package/{public → core/workspace-app/public}/vendor/three/LICENSE +0 -0
  579. /package/{public → core/workspace-app/public}/vendor/three/addons/loaders/GLTFLoader.js +0 -0
  580. /package/{public → core/workspace-app/public}/vendor/three/addons/utils/BufferGeometryUtils.js +0 -0
  581. /package/{public → core/workspace-app/public}/vendor/three/addons/utils/SkeletonUtils.js +0 -0
  582. /package/{public → core/workspace-app/public}/vendor/three/three.core.min.js +0 -0
  583. /package/{public → core/workspace-app/public}/vendor/three/three.module.min.js +0 -0
  584. /package/{public → core/workspace-app/public}/vendor/three-vrm/LICENSE +0 -0
  585. /package/{public → core/workspace-app/public}/vendor/three-vrm/three-vrm.module.min.js +0 -0
  586. /package/{public → core/workspace-app/public}/vendor/uikit-icons.min.js +0 -0
  587. /package/{public → core/workspace-app/public}/vendor/uikit.min.css +0 -0
  588. /package/{public → core/workspace-app/public}/vendor/uikit.min.js +0 -0
  589. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/bookmark-outlined.svg +0 -0
  590. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/headset.svg +0 -0
  591. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/menu.svg +0 -0
  592. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/pause.svg +0 -0
  593. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/play.svg +0 -0
  594. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/share.svg +0 -0
  595. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/sound-off.svg +0 -0
  596. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/sound-on.svg +0 -0
  597. /package/{public → core/workspace-app/public}/vendor/webship-icons/ui/stop.svg +0 -0
  598. /package/{public → core/workspace-app/public}/vendor/xterm/addon-fit.js +0 -0
  599. /package/{public → core/workspace-app/public}/vendor/xterm/addon-unicode11.js +0 -0
  600. /package/{public → core/workspace-app/public}/vendor/xterm/addon-web-links.js +0 -0
  601. /package/{public → core/workspace-app/public}/vendor/xterm/xterm.css +0 -0
  602. /package/{public → core/workspace-app/public}/vendor/xterm/xterm.js +0 -0
  603. /package/{rag.js → core/workspace-app/rag.js} +0 -0
  604. /package/{reader.js → core/workspace-app/reader.js} +0 -0
  605. /package/{repo-blobs.js → core/workspace-app/repo-blobs.js} +0 -0
  606. /package/{report-pdf.js → core/workspace-app/report-pdf.js} +0 -0
  607. /package/{row-layout.js → core/workspace-app/row-layout.js} +0 -0
  608. /package/{screenrc → core/workspace-app/screenrc} +0 -0
  609. /package/{screens.js → core/workspace-app/screens.js} +0 -0
  610. /package/{scripts → core/workspace-app/scripts}/code-server-start.sh +0 -0
  611. /package/{scripts → core/workspace-app/scripts}/images-claude-finish.js +0 -0
  612. /package/{scripts → core/workspace-app/scripts}/screen-host.sh +0 -0
  613. /package/{scripts → core/workspace-app/scripts}/screen-runner.js +0 -0
  614. /package/{scripts → core/workspace-app/scripts}/screen-then.js +0 -0
  615. /package/{scripts → core/workspace-app/scripts}/update.sh +0 -0
  616. /package/{settings-file.js → core/workspace-app/settings-file.js} +0 -0
  617. /package/{speech.js → core/workspace-app/speech.js} +0 -0
  618. /package/{tab-modal.js → core/workspace-app/tab-modal.js} +0 -0
  619. /package/{test-reports.js → core/workspace-app/test-reports.js} +0 -0
  620. /package/{themes.js → core/workspace-app/themes.js} +0 -0
  621. /package/{transcripts.js → core/workspace-app/transcripts.js} +0 -0
  622. /package/{urls.js → core/workspace-app/urls.js} +0 -0
  623. /package/{validate.js → core/workspace-app/validate.js} +0 -0
  624. /package/{version-check.js → core/workspace-app/version-check.js} +0 -0
  625. /package/{video-edit.js → core/workspace-app/video-edit.js} +0 -0
  626. /package/{waiting.js → core/workspace-app/waiting.js} +0 -0
  627. /package/{workspace-card-tools.js → core/workspace-app/workspace-card-tools.js} +0 -0
  628. /package/{workspace-delete.js → core/workspace-app/workspace-delete.js} +0 -0
  629. /package/{workspace-types.js → core/workspace-app/workspace-types.js} +0 -0
  630. /package/{workspaces.js → core/workspace-app/workspaces.js} +0 -0
@@ -0,0 +1,584 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Milvus (https://github.com/milvus-io/milvus), self-hosted inside DDEV.
4
+ #
5
+ # Milvus standalone is three containers, not one: the database itself, etcd for its metadata, and
6
+ # MinIO for the segment/object store. Since 2.6 the write-ahead log is the built-in Woodpecker
7
+ # (MQ_TYPE=woodpecker), so there is no Pulsar or Kafka to run — that is the whole reason
8
+ # standalone is viable on a laptop. Attu is the web UI on top.
9
+ #
10
+ # Browser ──https──▶ ddev-router ──▶ ddev-<project>-web (nginx reverse proxy)
11
+ # ├─▶ milvus-attu:3000 the UI
12
+ # ├─▶ milvus-standalone:19530 /v2/… REST
13
+ # └─▶ milvus-standalone:9091 /webui/, /healthz
14
+ #
15
+ # pymilvus / MCP / notebook ──▶ 127.0.0.1:<grpc_port> ──▶ milvus-standalone:19530
16
+ #
17
+ # The gRPC port is PUBLISHED on the host, which the rest of this workspace's DDEV projects never
18
+ # need to do. It has to be: the DDEV router terminates HTTP(S) only, and every real Milvus client
19
+ # — pymilvus, the MCP server, LangChain — speaks gRPC. The HTTPS origin still gets the UI and the
20
+ # REST API, so nothing that can go through the router does anything else.
21
+ #
22
+ # The project is NOT a Drupal site: `--project-type=php` with settings management disabled and no
23
+ # docroot, because nothing in it is served from disk.
24
+
25
+ # parse_yaml keeps a value's own quotes, so `version: "v2.6.21"` reaches the shell as the
26
+ # nine-character string `"v2.6.21"` — which lands in an image tag as milvusdb/milvus:"v2.6.21"
27
+ # and makes every `${x:-fallback}` default silently stop working on an empty quoted string.
28
+ # Strip one layer of matching quotes from anything read from settings.
29
+ function milvus_setting() {
30
+ local value="$1";
31
+ case "${value}" in
32
+ \"*\") value="${value#\"}"; value="${value%\"}" ;;
33
+ \'*\') value="${value#\'}"; value="${value%\'}" ;;
34
+ esac
35
+ printf '%s' "${value}";
36
+ }
37
+
38
+ # The project a command acts on: the argument, else milvus.project from the settings.
39
+ function milvus_resolve_project() {
40
+ local given="$1" name;
41
+ if [ -n "${given}" ] && [ "${given}" != '_settings_' ] ; then
42
+ printf '%s' "${given}" ; return 0 ;
43
+ fi
44
+ name="$(milvus_setting "${milvus_project}")";
45
+ printf '%s' "${name:-milvus}";
46
+ }
47
+
48
+ # The one origin Attu is served on, resolved the same way build_milvus resolves it.
49
+ function milvus_resolve_url() {
50
+ local project="$1" setting;
51
+ setting="$(milvus_setting "${milvus_public_uri}")";
52
+ case "${setting:-hub}" in
53
+ hub) printf 'https://%s.%s.workspace.ddev.site' "${project}" "${doc_name}" ;;
54
+ canonical) printf 'https://%s.ddev.site' "${project}" ;;
55
+ *) printf '%s' "${setting}" ;;
56
+ esac
57
+ }
58
+
59
+ # The host port an existing instance publishes Milvus on.
60
+ #
61
+ # Read from the compose file the build wrote, not from the settings: the settings hold the port to
62
+ # START scanning from, and an instance built while 19530 was busy is on 19531. Falls back to
63
+ # asking docker, then to the setting, so this answers for an instance built by an older version of
64
+ # this command too.
65
+ function milvus_host_port() {
66
+ local project="$1" compose port;
67
+ compose="${WORKSPACE_ROOT}/${doc_name}/${project}/.ddev/docker-compose.milvus.yaml";
68
+
69
+ if [ -f "${compose}" ] ; then
70
+ port="$(sed -n 's/^ *- "\([0-9]\+\):19530"$/\1/p' "${compose}" | head -1)";
71
+ [ -n "${port}" ] && { printf '%s' "${port}" ; return 0 ; }
72
+ fi
73
+
74
+ port="$(docker port "ddev-${project}-milvus-standalone" 19530/tcp 2>/dev/null | head -1 | sed 's/.*://')";
75
+ [ -n "${port}" ] && { printf '%s' "${port}" ; return 0 ; }
76
+
77
+ port="$(milvus_setting "${milvus_grpc_port}")";
78
+ printf '%s' "${port:-19530}";
79
+ }
80
+
81
+ # What a client connects to. Everything in this workspace that is not a browser uses this:
82
+ # cmd-tools-ragify.sh, cmd-tools-rag.sh and the MCP server.
83
+ #
84
+ # Two answers, because these commands run in two places. On the HOST it is the published port. In a
85
+ # CONTAINER — the dashboard runs its jobs inside ddev-workspace-web — 127.0.0.1 is that container,
86
+ # and this machine's firewall drops container-to-host traffic anyway, so the published port is
87
+ # unreachable there. DDEV puts every project's containers on the shared `ddev_default` network, so
88
+ # the answer inside one is the Milvus container's own name: same port, same protocol, no proxy
89
+ # involved (Milvus multiplexes gRPC and REST on 19530).
90
+ function milvus_uri() {
91
+ local project="$1" port;
92
+ port="$(milvus_host_port "${project}")";
93
+
94
+ if [ -f /.dockerenv ] || [ -n "${DDEV_SITENAME}" ] ; then
95
+ printf 'http://ddev-%s-milvus-standalone:19530' "${project}";
96
+ return 0 ;
97
+ fi
98
+ printf 'http://127.0.0.1:%s' "${port}";
99
+ }
100
+
101
+ # The token clients authenticate with, empty when authorization is off (the default).
102
+ function milvus_token() {
103
+ local auth;
104
+ auth="$(milvus_setting "${milvus_authorization}")";
105
+ [ "${auth}" == 'true' ] || return 0 ;
106
+ printf '%s' "$(milvus_setting "${milvus_token}")";
107
+ }
108
+
109
+ # Refuse politely rather than erroring deep inside pymilvus.
110
+ function milvus_require_running() {
111
+ local project="$1";
112
+ if ! docker ps --format '{{.Names}}' | grep -qx "ddev-${project}-milvus-standalone" ; then
113
+ echo "Milvus ${project} is not running.";
114
+ echo " Start it: cd ${WORKSPACE_ROOT}/${doc_name}/${project} && ddev start";
115
+ echo " Build it: cd ${WORKSPACE_ROOT}/${doc_name} && bash cmd-milvus-project.sh ${project}";
116
+ return 1 ;
117
+ fi
118
+ return 0 ;
119
+ }
120
+
121
+ # The next free host port from $1 upwards, as seen by docker — one instance per index set is a
122
+ # normal thing to want, and each publishes its own gRPC port.
123
+ function milvus_free_port() {
124
+ local port="$1" taken;
125
+ taken="$(docker ps --format '{{.Ports}}' 2>/dev/null)";
126
+ while printf '%s' "${taken}" | grep -q ":${port}->" ; do
127
+ port=$((port + 1));
128
+ if [ "${port}" -gt "$(( $1 + 40 ))" ] ; then
129
+ printf '%s' "$1" ; return 0 ; # give up scanning and let ddev report the conflict
130
+ fi
131
+ done
132
+ printf '%s' "${port}";
133
+ }
134
+
135
+ # Wait for Milvus to answer its own health endpoint. The container is "running" long before the
136
+ # database will accept a connection — a first start loads the WAL and creates the MinIO bucket —
137
+ # so anything that connects immediately after `ddev start` fails with a confusing gRPC error.
138
+ function milvus_wait_healthy() {
139
+ local project="$1" waited=0 limit="${2:-180}";
140
+ printf 'Waiting for Milvus to become healthy';
141
+ until docker exec "ddev-${project}-milvus-standalone" curl -sf http://localhost:9091/healthz > /dev/null 2>&1 ; do
142
+ printf '.';
143
+ sleep 3 ; waited=$((waited + 3));
144
+ if [ "${waited}" -ge "${limit}" ] ; then
145
+ printf '\n';
146
+ echo "Milvus did not report healthy within ${limit}s. Look at:";
147
+ echo " docker logs ddev-${project}-milvus-standalone";
148
+ return 1 ;
149
+ fi
150
+ done
151
+ printf ' healthy after %ss.\n' "${waited}";
152
+ return 0 ;
153
+ }
154
+
155
+ # Write .ddev/docker-compose.milvus.yaml for one instance.
156
+ #
157
+ # $1 the project directory, $2 the Milvus image tag, $3 the Attu tag, $4 the published gRPC port,
158
+ # $5 "true" to turn Milvus authentication on
159
+ function milvus_write_compose() {
160
+ local project_dir="$1" version="$2" attu_version="$3" grpc_port="$4" authorization="$5";
161
+
162
+ mkdir -p "${project_dir}/.ddev" ;
163
+
164
+ cat > "${project_dir}/.ddev/docker-compose.milvus.yaml" <<COMPOSEEOF
165
+ ## Milvus standalone, orchestrated by DDEV.
166
+ ## Written by cmd-milvus-project.sh — re-run that command rather than editing by hand.
167
+ ## The DDEV web container (nginx) reverse-proxies the Attu UI, the REST API and the Milvus WebUI;
168
+ ## the gRPC port is published on the host because the router speaks HTTP(S) only.
169
+ ## Every service is on the DDEV project's 'default' network, so they resolve each other by name.
170
+
171
+ volumes:
172
+ milvus_etcd:
173
+ milvus_minio:
174
+ milvus_data:
175
+
176
+ services:
177
+ milvus-etcd:
178
+ container_name: ddev-\${DDEV_SITENAME}-milvus-etcd
179
+ image: "quay.io/coreos/etcd:v3.5.25"
180
+ restart: "no"
181
+ labels:
182
+ com.ddev.site-name: \${DDEV_SITENAME}
183
+ com.ddev.approot: \${DDEV_APPROOT}
184
+ environment:
185
+ ETCD_AUTO_COMPACTION_MODE: revision
186
+ ETCD_AUTO_COMPACTION_RETENTION: "1000"
187
+ ETCD_QUOTA_BACKEND_BYTES: "4294967296"
188
+ ETCD_SNAPSHOT_COUNT: "50000"
189
+ volumes:
190
+ - milvus_etcd:/etcd
191
+ command: etcd -advertise-client-urls=http://milvus-etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
192
+ healthcheck:
193
+ test: ["CMD", "etcdctl", "endpoint", "health"]
194
+ interval: 30s
195
+ timeout: 20s
196
+ retries: 3
197
+
198
+ milvus-minio:
199
+ container_name: ddev-\${DDEV_SITENAME}-milvus-minio
200
+ image: "minio/minio:RELEASE.2024-12-18T13-15-44Z"
201
+ restart: "no"
202
+ labels:
203
+ com.ddev.site-name: \${DDEV_SITENAME}
204
+ com.ddev.approot: \${DDEV_APPROOT}
205
+ environment:
206
+ MINIO_ACCESS_KEY: minioadmin
207
+ MINIO_SECRET_KEY: minioadmin
208
+ volumes:
209
+ - milvus_minio:/minio_data
210
+ ## No host ports: the console is reached through the project's own https origin at /minio/,
211
+ ## which is what keeps a second instance from colliding on 9000/9001.
212
+ command: minio server /minio_data --console-address ":9001"
213
+ healthcheck:
214
+ test: ["CMD", "mc", "ready", "local"]
215
+ interval: 30s
216
+ timeout: 20s
217
+ retries: 3
218
+
219
+ milvus-standalone:
220
+ container_name: ddev-\${DDEV_SITENAME}-milvus-standalone
221
+ image: "milvusdb/milvus:${version}"
222
+ restart: "no"
223
+ labels:
224
+ com.ddev.site-name: \${DDEV_SITENAME}
225
+ com.ddev.approot: \${DDEV_APPROOT}
226
+ command: ["milvus", "run", "standalone"]
227
+ security_opt:
228
+ - seccomp:unconfined
229
+ environment:
230
+ ETCD_ENDPOINTS: milvus-etcd:2379
231
+ MINIO_ADDRESS: milvus-minio:9000
232
+ ## Woodpecker is the built-in WAL introduced in 2.6 — it is what removes the Pulsar
233
+ ## dependency that used to make standalone Milvus a five-container stack.
234
+ MQ_TYPE: woodpecker
235
+ COMMON_SECURITY_AUTHORIZATIONENABLED: "${authorization}"
236
+ volumes:
237
+ - milvus_data:/var/lib/milvus
238
+ ## Published on the host: pymilvus, the MCP server and every other real client speak gRPC,
239
+ ## and the DDEV router cannot carry that. The HTTPS origin still serves the UI and REST.
240
+ ports:
241
+ - "${grpc_port}:19530"
242
+ healthcheck:
243
+ test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
244
+ interval: 30s
245
+ start_period: 90s
246
+ timeout: 20s
247
+ retries: 3
248
+ depends_on:
249
+ milvus-etcd:
250
+ condition: service_healthy
251
+ milvus-minio:
252
+ condition: service_healthy
253
+
254
+ milvus-attu:
255
+ container_name: ddev-\${DDEV_SITENAME}-milvus-attu
256
+ image: "zilliz/attu:${attu_version}"
257
+ restart: "no"
258
+ labels:
259
+ com.ddev.site-name: \${DDEV_SITENAME}
260
+ com.ddev.approot: \${DDEV_APPROOT}
261
+ depends_on:
262
+ - milvus-standalone
263
+ environment:
264
+ ## Attu's server-side half talks to Milvus inside the network, so the browser never needs
265
+ ## the gRPC port and the UI works over plain https.
266
+ MILVUS_URL: milvus-standalone:19530
267
+ COMPOSEEOF
268
+ }
269
+
270
+ # Write the nginx site config that turns the DDEV web container into the reverse proxy.
271
+ # A full replacement (nginx_full), because none of the default PHP site config applies to a
272
+ # project that serves no files of its own.
273
+ function milvus_write_nginx() {
274
+ local project_dir="$1";
275
+
276
+ mkdir -p "${project_dir}/.ddev/nginx_full" ;
277
+
278
+ cat > "${project_dir}/.ddev/nginx_full/nginx-site.conf" <<'NGINXEOF'
279
+ # DDEV web container nginx: reverse-proxy the Milvus stack.
280
+ # Full replacement of the default site config (nginx_full).
281
+ # Written by cmd-milvus-project.sh — re-run that command rather than editing by hand.
282
+
283
+ server {
284
+ listen 80 default_server;
285
+ listen 443 ssl default_server;
286
+
287
+ root /var/www/html;
288
+
289
+ ssl_certificate /etc/ssl/certs/master.crt;
290
+ ssl_certificate_key /etc/ssl/certs/master.key;
291
+
292
+ include /etc/nginx/monitoring.conf;
293
+
294
+ # Bulk inserts and collection imports go through the REST API.
295
+ client_max_body_size 512M;
296
+
297
+ include /etc/nginx/common.d/*.conf;
298
+
299
+ # Milvus's own REST API, on the same port as gRPC — Milvus multiplexes both on 19530, so
300
+ # this is the plain-HTTP half of the same listener. Anything that can speak HTTP (curl, a
301
+ # Drupal module, the dashboard) can use the database over the project's https origin with no
302
+ # published port and no gRPC client.
303
+ location /v2/ {
304
+ proxy_pass http://milvus-standalone:19530;
305
+ proxy_http_version 1.1;
306
+ proxy_set_header Host $host;
307
+ proxy_set_header X-Forwarded-Proto $scheme;
308
+ proxy_read_timeout 600s;
309
+ proxy_buffering off;
310
+ }
311
+
312
+ # Milvus's built-in web console and health endpoint (port 9091), which is a different server
313
+ # from the API above.
314
+ location /webui/ {
315
+ proxy_pass http://milvus-standalone:9091/webui/;
316
+ proxy_http_version 1.1;
317
+ proxy_set_header Host $host;
318
+ proxy_set_header X-Forwarded-Proto $scheme;
319
+ }
320
+
321
+ location = /healthz {
322
+ proxy_pass http://milvus-standalone:9091/healthz;
323
+ proxy_set_header Host $host;
324
+ }
325
+
326
+ # The MinIO console, so the segment store is inspectable without publishing 9001 on the host.
327
+ location /minio/ {
328
+ proxy_pass http://milvus-minio:9001/;
329
+ proxy_http_version 1.1;
330
+ proxy_set_header Host $host;
331
+ proxy_set_header X-Forwarded-Proto $scheme;
332
+ proxy_set_header Upgrade $http_upgrade;
333
+ proxy_set_header Connection "upgrade";
334
+ }
335
+
336
+ # Attu, the Milvus UI, on the root.
337
+ location / {
338
+ proxy_pass http://milvus-attu:3000;
339
+ proxy_http_version 1.1;
340
+
341
+ proxy_set_header Host $host;
342
+ proxy_set_header X-Real-IP $remote_addr;
343
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
344
+ proxy_set_header X-Forwarded-Proto $scheme;
345
+ proxy_set_header X-Forwarded-Host $host;
346
+
347
+ # Attu streams collection loads over a websocket.
348
+ proxy_set_header Upgrade $http_upgrade;
349
+ proxy_set_header Connection "upgrade";
350
+
351
+ proxy_connect_timeout 75s;
352
+ proxy_read_timeout 3600s;
353
+ proxy_send_timeout 3600s;
354
+ proxy_buffering off;
355
+ }
356
+
357
+ include /etc/nginx/server.d/*.conf;
358
+ }
359
+ NGINXEOF
360
+ }
361
+
362
+ # Build (or rebuild) a Milvus instance in the calling workspace folder.
363
+ #
364
+ # The calling cmd-*.sh sets nothing but the workspace: everything else comes from the arguments
365
+ # in args/arg-milvus.sh, defaulting to the `milvus:` block of the workspace settings.
366
+ function build_milvus() {
367
+
368
+ # The workspace settings hold the defaults; an argument that was actually given wins. The
369
+ # sentinel is what tells the two apart — argparse cannot report "not given" on its own.
370
+ if [ "${PROJECT_NAME}" == '_settings_' ] ; then PROJECT_NAME="$(milvus_setting "${milvus_project}")"; PROJECT_NAME="${PROJECT_NAME:-milvus}"; fi
371
+ if [ "${MILVUS_VERSION}" == '_settings_' ] ; then MILVUS_VERSION="$(milvus_setting "${milvus_version}")"; MILVUS_VERSION="${MILVUS_VERSION:-v2.6.21}"; fi
372
+ if [ "${ATTU_VERSION}" == '_settings_' ] ; then ATTU_VERSION="$(milvus_setting "${milvus_attu_version}")"; ATTU_VERSION="${ATTU_VERSION:-v2.6.5}"; fi
373
+
374
+ local project_dir="${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME}";
375
+ local base_url="https://${PROJECT_NAME}.ddev.site";
376
+ local hub_url="https://${PROJECT_NAME}.${doc_name}.workspace.ddev.site";
377
+ local public_uri other_url grpc_port authorization;
378
+
379
+ public_uri="${PUBLIC_URI}";
380
+ if [ "${public_uri}" == '_settings_' ] ; then
381
+ public_uri="$(milvus_setting "${milvus_public_uri}")";
382
+ public_uri="${public_uri:-hub}";
383
+ fi
384
+ case "${public_uri}" in
385
+ hub) public_uri="${hub_url}"; other_url="${base_url}" ;;
386
+ canonical) public_uri="${base_url}"; other_url="${hub_url}" ;;
387
+ *) other_url="" ;;
388
+ esac
389
+
390
+ grpc_port="${GRPC_PORT}";
391
+ if [ "${grpc_port}" == '_settings_' ] ; then
392
+ grpc_port="$(milvus_setting "${milvus_grpc_port}")";
393
+ grpc_port="${grpc_port:-19530}";
394
+ fi
395
+ grpc_port="$(milvus_free_port "${grpc_port}")";
396
+
397
+ authorization="$(milvus_setting "${milvus_authorization}")";
398
+ [ "${AUTHORIZATION}" == 'yes' ] && authorization="true";
399
+ authorization="${authorization:-false}";
400
+
401
+ cd "${WORKSPACE_ROOT}/${doc_name}" || exit 1 ;
402
+
403
+ if [ -d "${PROJECT_NAME}" ] ; then
404
+ if [ "${FORCE}" != 'yes' ] ; then
405
+ echo "";
406
+ echo "${PROJECT_NAME} already exists in ${WORKSPACE_ROOT}/${doc_name}.";
407
+ echo " Start it with: cd ${project_dir} && ddev start";
408
+ echo " Rebuild it with: bash cmd-milvus-project.sh ${PROJECT_NAME} --force";
409
+ echo " (--force deletes the Milvus volumes too, so every collection in it goes with them.)";
410
+ exit 1 ;
411
+ fi
412
+ echo "Removing the existing ${PROJECT_NAME} instance, its metadata and every collection in it.";
413
+ # -O removes the project's volumes: for this project that is etcd's metadata, MinIO's
414
+ # segments and the Milvus data directory — i.e. all of the indexed data.
415
+ (cd "${project_dir}" && ddev delete -y -O) ;
416
+ rm -rf "${project_dir}" ;
417
+ fi
418
+
419
+ mkdir -p "${project_dir}" ;
420
+ cd "${project_dir}" || exit 1 ;
421
+
422
+ # No docroot and no settings management: this project serves no files of its own, it proxies.
423
+ ddev config --project-name=${PROJECT_NAME} --project-type=php --docroot="" --disable-settings-management ;
424
+
425
+ milvus_write_compose "${project_dir}" "${MILVUS_VERSION}" "${ATTU_VERSION}" "${grpc_port}" "${authorization}" ;
426
+ milvus_write_nginx "${project_dir}" ;
427
+
428
+ echo "";
429
+ echo "Starting Milvus ${MILVUS_VERSION} — the first run pulls ~2 GB of images, which takes a few minutes.";
430
+ ddev start -y ;
431
+
432
+ milvus_wait_healthy "${PROJECT_NAME}" || true ;
433
+
434
+ echo "";
435
+ echo "*---------------------------------------------------------------------*";
436
+ echo " Milvus ${MILVUS_VERSION} is ready.";
437
+ echo "";
438
+ echo " Attu (the UI) ${public_uri}";
439
+ echo " Milvus WebUI ${public_uri}/webui/";
440
+ echo " REST API ${public_uri}/v2/vectordb/collections/list";
441
+ echo " MinIO console ${public_uri}/minio/ (minioadmin / minioadmin)";
442
+ echo "";
443
+ echo " Clients on this machine — pymilvus, the MCP server, LangChain — connect on gRPC:";
444
+ echo " http://127.0.0.1:${grpc_port}";
445
+ if [ "${authorization}" == 'true' ] ; then
446
+ echo " token: $(milvus_setting "${milvus_token}") (authentication is ON for this instance)";
447
+ else
448
+ echo " No authentication: a local development database on a DDEV network.";
449
+ fi
450
+ if [ -n "${other_url}" ] ; then
451
+ echo "";
452
+ echo " ${other_url} reaches the same instance.";
453
+ fi
454
+ echo "";
455
+ echo " Index a project into it:";
456
+ echo " cd ${WORKSPACE_ROOT}/<workspace> && bash cmd-tools-ragify.sh <project>";
457
+ echo " Give it to the Claude Code CLI:";
458
+ echo " cd ${WORKSPACE_ROOT}/${doc_name} && bash cmd-milvus-mcp.sh ${PROJECT_NAME} -a register";
459
+ echo "*---------------------------------------------------------------------*";
460
+
461
+ if [ "${LAUNCH}" == 'yes' ] ; then
462
+ ddev launch ;
463
+ fi
464
+ }
465
+
466
+ # Back up one instance. Milvus keeps its metadata in etcd and its segments in MinIO, and a dump of
467
+ # either alone restores nothing — so both volumes are archived together, plus a JSON manifest of
468
+ # the collections so a restore can be checked against what went in.
469
+ function milvus_backup() {
470
+ local project stamp out archive manifest;
471
+ project="$(milvus_resolve_project "${PROJECT_NAME}")";
472
+ milvus_require_running "${project}" || return 1 ;
473
+
474
+ stamp="$(date +%Y-%m-%d-%H%M%S)";
475
+ out="${backups}/${doc_name}/${project}";
476
+ mkdir -p "${out}" ;
477
+ archive="${out}/${project}-milvus-${stamp}.tar.gz";
478
+ manifest="${out}/${project}-milvus-${stamp}.collections.json";
479
+
480
+ echo "Writing the collection manifest.";
481
+ rag_python collections --uri "$(milvus_uri "${project}")" --token "$(milvus_token)" --json > "${manifest}" 2>/dev/null \
482
+ || echo " (could not reach Milvus for the manifest — archiving the volumes anyway)";
483
+
484
+ echo "Archiving the etcd metadata, the MinIO segments and the Milvus data directory.";
485
+ # The data lives in named volumes, not in the project directory, so it is read through a
486
+ # throwaway container. --user, or the archive lands owned by root: a backup the user cannot
487
+ # delete is a bad backup.
488
+ if ! docker run --rm --user "$(id -u):$(id -g)" \
489
+ -v "ddev-${project}_milvus_etcd:/v/etcd:ro" \
490
+ -v "ddev-${project}_milvus_minio:/v/minio:ro" \
491
+ -v "ddev-${project}_milvus_data:/v/milvus:ro" \
492
+ -v "${out}:/out" \
493
+ busybox tar czf "/out/$(basename "${archive}")" -C /v . ; then
494
+ echo "The archive failed — removing the partial file.";
495
+ rm -f "${archive}" ;
496
+ return 1 ;
497
+ fi
498
+
499
+ echo "";
500
+ echo "*---------------------------------------------------------------------*";
501
+ echo " Backed up ${project}:";
502
+ echo " ${archive}";
503
+ echo " ${manifest}";
504
+ echo "";
505
+ echo " Restore into a STOPPED instance of the same Milvus version:";
506
+ echo " docker run --rm -v ddev-${project}_milvus_etcd:/v/etcd \\";
507
+ echo " -v ddev-${project}_milvus_minio:/v/minio -v ddev-${project}_milvus_data:/v/milvus \\";
508
+ echo " -v ${out}:/in busybox tar xzf /in/$(basename "${archive}") -C /v";
509
+ echo " Re-indexing with cmd-tools-ragify.sh is usually simpler — an index is derived data.";
510
+ echo "*---------------------------------------------------------------------*";
511
+ }
512
+
513
+ # The Milvus MCP server, and its one-line Claude Code registration.
514
+ #
515
+ # zilliztech/mcp-server-milvus is a Python FastMCP server with 14 milvus_* tools (list/create/load
516
+ # collections, text, vector and hybrid search, query, insert, delete). Registered on **stdio**, so
517
+ # there is no port to keep open and no daemon to remember: the CLI starts it when a session needs
518
+ # it and stops it after. It connects to the database over the published gRPC port, which is why
519
+ # the instance has to be running for the tools to answer.
520
+ function milvus_mcp() {
521
+ local project uri package name token;
522
+ project="$(milvus_resolve_project "${PROJECT_NAME}")";
523
+ uri="$(milvus_uri "${project}")";
524
+ package="$(milvus_setting "${milvus_mcp_package}")"; package="${package:-mcp-server-milvus==0.1.1.dev9}";
525
+ name="rag-${project}";
526
+ token="$(milvus_token)";
527
+
528
+ # The published wheel declares `fastmcp` but imports `mcp.server.fastmcp`, so on its own
529
+ # dependency set it dies at import with ModuleNotFoundError — which the Claude Code CLI reports
530
+ # only as "Connection closed". The missing package is injected here rather than left to be
531
+ # discovered. Pinned below 2 for the same reason graphify pins it: mcp 2.x moved that module.
532
+ local with_mcp='--with mcp<2';
533
+
534
+ case "${MCP_ACTION}" in
535
+ status)
536
+ milvus_require_running "${project}" && echo "Milvus ${project} is running on ${uri}." ;
537
+ curl -s -o /dev/null -w " REST /v2/vectordb/collections/list → HTTP %{http_code}\n" \
538
+ -X POST "${uri}/v2/vectordb/collections/list" -H 'Content-Type: application/json' -d '{}' ;
539
+ claude mcp list 2>/dev/null | grep -i "${name}" || echo " Not registered in Claude Code yet — run with -a register.";
540
+ ;;
541
+ register)
542
+ milvus_require_running "${project}" || return 1 ;
543
+ # Prove the server can actually start before registering it: an import error here is a
544
+ # sentence, and the same error after registration is only "Connection closed" in a session
545
+ # three days later. It exits on EOF, so an empty stdin is the whole test.
546
+ if ! uvx --from "${package}" ${with_mcp} mcp-server-milvus --milvus-uri "${uri}" < /dev/null > /dev/null 2>&1 ; then
547
+ echo "The Milvus MCP server (${package}) will not start. Run it by hand to see why:";
548
+ echo " uvx --from ${package} ${with_mcp} mcp-server-milvus --milvus-uri ${uri}";
549
+ return 1 ;
550
+ fi
551
+ # uvx resolves and caches the package on first use; no install step of our own to keep in
552
+ # sync. The pin carries a .devN suffix because that is all PyPI has published — without it
553
+ # uvx refuses the package as pre-release only.
554
+ if [ -n "${token}" ] ; then
555
+ claude mcp add --scope user --env "MILVUS_TOKEN=${token}" "${name}" \
556
+ -- uvx --from "${package}" ${with_mcp} mcp-server-milvus --milvus-uri "${uri}" || return 1 ;
557
+ else
558
+ claude mcp add --scope user "${name}" \
559
+ -- uvx --from "${package}" ${with_mcp} mcp-server-milvus --milvus-uri "${uri}" || return 1 ;
560
+ fi
561
+ echo "";
562
+ echo "Registered ${name} with the Claude Code CLI (stdio, no port).";
563
+ echo " Open a NEW session to see its 13 tools: milvus_list_collections, milvus_text_search,";
564
+ echo " milvus_vector_search, milvus_hybrid_search, milvus_query, milvus_get_collection_info,";
565
+ echo " milvus_create_collection, milvus_insert_data, milvus_delete_entities,";
566
+ echo " milvus_load_collection, milvus_release_collection, milvus_list_databases,";
567
+ echo " milvus_use_database.";
568
+ echo " Re-indexing needs no re-registration — the URI does not change.";
569
+ ;;
570
+ unregister)
571
+ claude mcp remove --scope user "${name}" && echo "Removed ${name} from the Claude Code CLI." ;
572
+ ;;
573
+ serve)
574
+ milvus_require_running "${project}" || return 1 ;
575
+ echo "Serving Milvus ${project} over MCP on stdio — Ctrl+C to stop.";
576
+ [ -n "${token}" ] && export MILVUS_TOKEN="${token}" ;
577
+ exec uvx --from "${package}" ${with_mcp} mcp-server-milvus --milvus-uri "${uri}" ;
578
+ ;;
579
+ *)
580
+ echo "Pick one of -a status, -a register, -a unregister or -a serve.";
581
+ return 1 ;
582
+ ;;
583
+ esac
584
+ }