@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,20 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # The one place a project name gets cleaned up, called from every cmd-*.sh that takes one.
4
+ #
5
+ # A directory name copy-pasted or tab-completed carries a trailing slash more often than not —
6
+ # `cd dev/v11x00b1<TAB>` appends one, and so does copying a name straight out of a directory
7
+ # listing. That slash is never part of the project name, only of how it arrived, so every command
8
+ # that takes PROJECT_NAME as its positional trims it before using it anywhere.
9
+ #
10
+ # One real implementation rather than the same trim (and the same explanation) pasted into 42
11
+ # files: each command still calls it explicitly, right after its own `shift $#;`, because
12
+ # PROJECT_NAME does not exist until that command's own argparse has run — bootstrap.sh loads this
13
+ # function before that, but cannot act on a variable nothing has set yet.
14
+ function trim_project_name() {
15
+ if [ "$#" -gt 0 ] ; then
16
+ printf '%s' "${1%/}" ;
17
+ else
18
+ PROJECT_NAME="${PROJECT_NAME%/}" ;
19
+ fi
20
+ }
@@ -0,0 +1,253 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # The rag workspace: the Milvus vector database that holds every project's RAG index, and the
4
+ # commands that read it.
5
+ #
6
+ # The split mirrors graphs/: cmd-tools-ragify.sh (in each project's own workspace folder) BUILDS
7
+ # an index, and this command is what you do with it afterwards — list, inspect, search, drop, and
8
+ # hand it to the Claude Code CLI over MCP.
9
+ #
10
+ # Unlike a graph, an index is not a file: it is rows inside Milvus. So there is nothing to move
11
+ # out of the project and nothing to keep in the folder — `rag/` holds the database instance
12
+ # itself, and the collections live in it.
13
+
14
+ # pymilvus 2.6.x is the client for a Milvus 2.6.x server. Pinned below 3: pymilvus 3.x tracks the
15
+ # Milvus 3.0 line released on 2026-07-29, and pairing a 3.x client with the 2.6 server this
16
+ # workspace installs by default is exactly the combination that fails at connect time rather than
17
+ # at install time.
18
+ RAG_PYMILVUS="pymilvus>=2.6,<3";
19
+ RAG_OPENAI="openai>=1.40";
20
+
21
+ # Run the Python worker (core/scripts/libs/rag_index.py).
22
+ #
23
+ # Through `uv run --with`, not an installed tool: the dependency set is resolved and cached by uv,
24
+ # so there is no venv of ours to create, no PATH entry to add and nothing to keep in sync with the
25
+ # rest of the workspace. The OpenAI client is only pulled in when a run actually asks for dense
26
+ # embeddings.
27
+ function rag_python() {
28
+ local extra="";
29
+ case " $* " in
30
+ *" --embedding openai "*|*" --openai-key "*) extra="--with ${RAG_OPENAI}" ;;
31
+ esac
32
+ # shellcheck disable=SC2086
33
+ uv run --quiet --with "${RAG_PYMILVUS}" ${extra} \
34
+ python3 "${WORKSPACE_SCRIPTS}/libs/rag_index.py" "$@" ;
35
+ }
36
+
37
+ # Which Milvus instance a project's index lives in.
38
+ #
39
+ # One shared instance is the default, and that is right for almost everything: a collection is
40
+ # already an isolation boundary, and a second Milvus is another etcd, another MinIO and another
41
+ # ~2 GB of containers. A project can still be BOUND to its own — a client engagement whose vectors
42
+ # must be backed up and handed over on their own, or one that needs a different Milvus version.
43
+ #
44
+ # The binding lives here, not in the project, for the same reason a graph does not: half the
45
+ # projects worth indexing are repositories we ship, and a repo must not gain a file because
46
+ # somebody indexed it. One line per bound project; anything unbound simply is not in the file.
47
+ RAG_BINDINGS_FILE="${WORKSPACE_ROOT}/rag/bindings.yml";
48
+
49
+ function rag_binding_get() {
50
+ local workspace="$1" project="$2";
51
+ [ -f "${RAG_BINDINGS_FILE}" ] || return 0 ;
52
+ sed -n "s|^${workspace}/${project}:[[:space:]]*\([A-Za-z0-9_-]\+\)[[:space:]]*$|\1|p" "${RAG_BINDINGS_FILE}" | head -1 ;
53
+ }
54
+
55
+ function rag_binding_set() {
56
+ local workspace="$1" project="$2" instance="$3" tmp;
57
+ mkdir -p "$(dirname "${RAG_BINDINGS_FILE}")" ;
58
+ if [ ! -f "${RAG_BINDINGS_FILE}" ] ; then
59
+ cat > "${RAG_BINDINGS_FILE}" <<'HEADEREOF'
60
+ # Which Milvus instance holds each project's RAG index.
61
+ #
62
+ # Written by cmd-tools-ragify.sh --milvus <instance> and by the dashboard's RAG menu. A project
63
+ # that is not listed here uses milvus.project from core/config/workspace.rag.settings.yml.
64
+ #
65
+ # Machine-local state, like the graphs store: it describes what is built on THIS machine.
66
+ HEADEREOF
67
+ fi
68
+ tmp="$(mktemp)";
69
+ grep -v "^${workspace}/${project}:" "${RAG_BINDINGS_FILE}" > "${tmp}" 2>/dev/null ;
70
+ if [ -n "${instance}" ] ; then
71
+ printf '%s/%s: %s\n' "${workspace}" "${project}" "${instance}" >> "${tmp}" ;
72
+ fi
73
+ mv "${tmp}" "${RAG_BINDINGS_FILE}" ;
74
+ }
75
+
76
+ # The instance a command should talk to: an explicit argument, then the binding, then the default.
77
+ function rag_resolve_instance() {
78
+ local workspace="$1" project="$2" given="$3" bound;
79
+ if [ -n "${given}" ] && [ "${given}" != '_settings_' ] ; then
80
+ printf '%s' "${given}" ; return 0 ;
81
+ fi
82
+ bound="$(rag_binding_get "${workspace}" "${project}")";
83
+ if [ -n "${bound}" ] ; then printf '%s' "${bound}" ; return 0 ; fi
84
+ printf '%s' "$(milvus_resolve_project '_settings_')";
85
+ }
86
+
87
+ # Every Milvus instance built in the rag workspace: a directory with the compose file this
88
+ # tooling writes. Used by `-a servers` and by the dashboard's server picker.
89
+ function rag_instances() {
90
+ local dir;
91
+ for dir in "${WORKSPACE_ROOT}"/rag/*/ ; do
92
+ [ -f "${dir}.ddev/docker-compose.milvus.yaml" ] || continue ;
93
+ basename "${dir}" ;
94
+ done
95
+ }
96
+
97
+ # The collection name for one project: <prefix>_<workspace>_<project>, with everything Milvus
98
+ # does not allow in an identifier folded to an underscore. Deterministic, so ragify writes and
99
+ # this command reads the same name without keeping state anywhere.
100
+ function rag_collection_name() {
101
+ local workspace="$1" project="$2" prefix;
102
+ prefix="$(milvus_setting "${rag_collection_prefix}")"; prefix="${prefix:-ws}";
103
+ printf '%s_%s_%s' "${prefix}" "${workspace}" "${project}" | tr -c 'A-Za-z0-9_\n' '_' ;
104
+ }
105
+
106
+ # Resolve what the user named to a collection that exists.
107
+ #
108
+ # Accepts <workspace>/<project>, a bare <project> (matched across workspaces), or the raw
109
+ # collection name. Ambiguity is reported rather than resolved by sort order: drop is one of the
110
+ # actions here and it does not ask twice.
111
+ function rag_resolve_collection() {
112
+ local wanted="$1" uri="$2" token="$3" all matches;
113
+ all="$(rag_python --uri "${uri}" --token "${token}" --json collections 2>/dev/null \
114
+ | python3 -c "import json,sys
115
+ try:
116
+ print('\n'.join(row['collection'] for row in json.load(sys.stdin)))
117
+ except Exception:
118
+ pass")";
119
+ [ -n "${all}" ] || return 0 ;
120
+
121
+ case "${wanted}" in
122
+ */*) matches="$(printf '%s\n' "${all}" | grep -x "$(rag_collection_name "${wanted%%/*}" "${wanted##*/}")")" ;;
123
+ *) matches="$(printf '%s\n' "${all}" | grep -x "${wanted}")";
124
+ [ -n "${matches}" ] || matches="$(printf '%s\n' "${all}" | grep -E "_${wanted}$")" ;;
125
+ esac
126
+ printf '%s' "${matches}";
127
+ }
128
+
129
+ # One resolved collection, or a sentence saying why not. Sets RAG_COLLECTION.
130
+ function rag_require_collection() {
131
+ local uri="$1" token="$2" count;
132
+ if [ "${RAG_NAME}" == '_all_' ] ; then
133
+ echo "Name the index: bash cmd-tools-rag.sh <workspace>/<project> -a ${RAG_ACTION}";
134
+ echo " (-a list shows them)";
135
+ return 1 ;
136
+ fi
137
+ RAG_COLLECTION="$(rag_resolve_collection "${RAG_NAME}" "${uri}" "${token}")";
138
+ count="$(printf '%s' "${RAG_COLLECTION}" | grep -c . )";
139
+ if [ "${count}" -eq 0 ] ; then
140
+ echo "No index matches '${RAG_NAME}'.";
141
+ echo " Build it: cd ${WORKSPACE_ROOT}/<workspace> && bash cmd-tools-ragify.sh ${RAG_NAME##*/}";
142
+ return 1 ;
143
+ fi
144
+ if [ "${count}" -gt 1 ] ; then
145
+ echo "'${RAG_NAME}' matches ${count} indexes — name the workspace too:";
146
+ printf ' %s\n' ${RAG_COLLECTION};
147
+ return 1 ;
148
+ fi
149
+ return 0 ;
150
+ }
151
+
152
+ function rag_command() {
153
+ local project uri token target_ws target_project;
154
+
155
+ # An index named as <workspace>/<project> resolves to the instance THAT project is bound to,
156
+ # which is the whole point of binding: `-a search demos/website_starter` must reach the server holding
157
+ # website_starter's vectors, not the default one.
158
+ case "${RAG_NAME}" in
159
+ */*) target_ws="${RAG_NAME%%/*}"; target_project="${RAG_NAME##*/}" ;;
160
+ *) target_ws=""; target_project="" ;;
161
+ esac
162
+ if [ -n "${target_ws}" ] ; then
163
+ project="$(rag_resolve_instance "${target_ws}" "${target_project}" "${MILVUS_PROJECT}")";
164
+ else
165
+ project="$(milvus_resolve_project "${MILVUS_PROJECT}")";
166
+ fi
167
+ uri="$(milvus_uri "${project}")";
168
+ token="$(milvus_token)";
169
+
170
+ case "${RAG_ACTION}" in
171
+ list|serve|mcp-register|mcp-unregister|status|servers|bind) : ;;
172
+ *) milvus_require_running "${project}" || return 1 ;;
173
+ esac
174
+
175
+ case "${RAG_ACTION}" in
176
+ servers)
177
+ local instance bound_count;
178
+ printf '%-28s %-10s %-28s %s\n' "SERVER" "STATE" "URI" "BOUND PROJECTS";
179
+ while read -r instance ; do
180
+ [ -n "${instance}" ] || continue ;
181
+ # `grep -c` already prints 0 when it matches nothing — and exits 1 while doing so, so a
182
+ # `|| echo 0` fallback appended a SECOND line and the count became "0\n0", which printf
183
+ # then spread across two rows. The missing-file case is what the default is for.
184
+ bound_count="$(grep -c ": ${instance}$" "${RAG_BINDINGS_FILE}" 2>/dev/null)";
185
+ bound_count="${bound_count:-0}";
186
+ printf '%-28s %-10s %-28s %s\n' "${instance}" \
187
+ "$(docker ps --format '{{.Names}}' | grep -qx "ddev-${instance}-milvus-standalone" && echo running || echo stopped)" \
188
+ "$(milvus_uri "${instance}")" \
189
+ "${bound_count}$([ "${instance}" == "$(milvus_resolve_project '_settings_')" ] && echo ' (default)')";
190
+ done <<< "$(rag_instances)"
191
+ echo "";
192
+ echo "Build another: bash cmd-milvus-project.sh <name>";
193
+ echo "Bind a project: bash cmd-tools-rag.sh <workspace>/<project> -a bind -m <name>";
194
+ ;;
195
+ bind)
196
+ if [ -z "${target_ws}" ] ; then
197
+ echo "Name the project as <workspace>/<project>: bash cmd-tools-rag.sh demos/website_starter -a bind -m <server>";
198
+ return 1 ;
199
+ fi
200
+ if [ "${MILVUS_PROJECT}" == '_settings_' ] ; then
201
+ echo "Name the server with -m: bash cmd-tools-rag.sh ${RAG_NAME} -a bind -m <server>";
202
+ echo " (-a servers lists them; -m default unbinds and falls back to the default server)";
203
+ return 1 ;
204
+ fi
205
+ if [ "${MILVUS_PROJECT}" == 'default' ] ; then
206
+ rag_binding_set "${target_ws}" "${target_project}" "" ;
207
+ echo "${RAG_NAME} now uses the default server ($(milvus_resolve_project '_settings_')).";
208
+ return 0 ;
209
+ fi
210
+ if ! printf '%s\n' "$(rag_instances)" | grep -qx "${MILVUS_PROJECT}" ; then
211
+ echo "No Milvus instance called '${MILVUS_PROJECT}' in ${WORKSPACE_ROOT}/rag.";
212
+ echo " Build it first: cd ${WORKSPACE_ROOT}/rag && bash cmd-milvus-project.sh ${MILVUS_PROJECT}";
213
+ return 1 ;
214
+ fi
215
+ rag_binding_set "${target_ws}" "${target_project}" "${MILVUS_PROJECT}" ;
216
+ echo "${RAG_NAME} is now indexed into ${MILVUS_PROJECT} ($(milvus_uri "${MILVUS_PROJECT}")).";
217
+ echo " Re-index it there: cd ${WORKSPACE_ROOT}/${target_ws} && bash cmd-tools-ragify.sh ${target_project}";
218
+ echo " The old collection stays where it was — drop it with -a remove before rebinding if it is stale.";
219
+ ;;
220
+ list)
221
+ milvus_require_running "${project}" || return 1 ;
222
+ echo "Milvus ${project} on ${uri}";
223
+ echo "";
224
+ rag_python --uri "${uri}" --token "${token}" collections ;
225
+ ;;
226
+ info)
227
+ rag_require_collection "${uri}" "${token}" || return 1 ;
228
+ rag_python --uri "${uri}" --token "${token}" info --collection "${RAG_COLLECTION}" ;
229
+ ;;
230
+ search)
231
+ if [ -z "${QUERY}" ] ; then
232
+ echo "Give a question: bash cmd-tools-rag.sh <workspace>/<project> -a search -q \"how is the hero styled\"";
233
+ return 1 ;
234
+ fi
235
+ rag_require_collection "${uri}" "${token}" || return 1 ;
236
+ rag_python --uri "${uri}" --token "${token}" search \
237
+ --collection "${RAG_COLLECTION}" --query "${QUERY}" --limit "${LIMIT}" ;
238
+ ;;
239
+ remove)
240
+ rag_require_collection "${uri}" "${token}" || return 1 ;
241
+ rag_python --uri "${uri}" --token "${token}" drop --collection "${RAG_COLLECTION}" ;
242
+ ;;
243
+ mcp-register|mcp-unregister|serve|status)
244
+ # The MCP server is per INSTANCE, not per collection: its tools list and search every
245
+ # collection in the database, so registering one index would be registering all of them.
246
+ PROJECT_NAME="${project}";
247
+ MCP_ACTION="${RAG_ACTION#mcp-}";
248
+ milvus_mcp ;
249
+ ;;
250
+ *)
251
+ echo "Unknown action '${RAG_ACTION}'." ; return 1 ;;
252
+ esac
253
+ }
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Index a project in this workspace into the Milvus vector database — the RAG counterpart of
4
+ # cmd-tools-graphify.sh.
5
+ #
6
+ # The two answer different questions, and the difference is the reason both exist:
7
+ #
8
+ # graphify parses code with tree-sitter into a graph. "What injects this service", "what
9
+ # extends this class". It reads no Markdown, no Twig, no *.module hooks and none of
10
+ # the Drupal wiring YAML — those are documents to it, and a code-only run drops them.
11
+ # ragify indexes the TEXT of the same tree — including exactly those files — and retrieves
12
+ # passages. "Where is this explained", "which template renders that", "what does the
13
+ # recipe set for this field".
14
+ #
15
+ # Nothing here calls an LLM. Retrieval is Milvus's built-in BM25 function: the database tokenises
16
+ # the text and builds the sparse vectors itself, so the default run sends nothing anywhere.
17
+ # `--embedding openai` is the one mode that does, and it says so.
18
+
19
+ # The chunks land in a collection named for the project, in whichever Milvus instance the rag
20
+ # workspace holds. Deterministic (see rag_collection_name), so a re-index overwrites its own
21
+ # collection and never anyone else's.
22
+
23
+ # Third-party and generated trees, reusing exactly what graphify already excludes — a built site
24
+ # build is 90% vendored code, and indexing it buries the project's own text under Symfony's.
25
+ # The scope flag means the same thing here as there:
26
+ # custom the project's own code only
27
+ # contrib custom + contrib modules, themes and profiles THE DEFAULT
28
+ # all everything, core and vendor included
29
+ function ragify_scope_excludes() {
30
+ graphify_scope_excludes "$1" ;
31
+ }
32
+
33
+ # Build (or rebuild) the index of a project in this workspace.
34
+ function ragify_project() {
35
+ local project_path milvus_project uri token collection excludes embedding key model started;
36
+
37
+ project_path="${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME}";
38
+ if [ ! -d "${project_path}" ] ; then
39
+ echo "No project ${PROJECT_NAME} in ${WORKSPACE_ROOT}/${doc_name}.";
40
+ return 1 ;
41
+ fi
42
+
43
+ # The database lives in the rag workspace, so its settings are read from there rather than from
44
+ # the calling workspace's own file — a module being indexed has no `milvus:` block of its own.
45
+ eval $(parse_yaml "${WORKSPACE_CONFIG}/workspace.rag.settings.yml" "rag_ws_");
46
+ milvus_project="$(milvus_setting "${rag_ws_milvus_project}")"; milvus_project="${milvus_project:-milvus}";
47
+ # rag_collection_name() reads the unprefixed name, so the naming rule is the same one
48
+ # cmd-tools-rag.sh applies when it reads the collection back.
49
+ rag_collection_prefix="${rag_ws_rag_collection_prefix}";
50
+
51
+ # Which RAG server. One shared instance is the default; --milvus binds this project to another
52
+ # one and remembers it, so every later index, search and MCP registration for it goes there.
53
+ if [ "${MILVUS_INSTANCE}" != '_settings_' ] ; then
54
+ if [ "${MILVUS_INSTANCE}" == 'default' ] ; then
55
+ rag_binding_set "${doc_name}" "${PROJECT_NAME}" "" ;
56
+ echo "Unbound ${doc_name}/${PROJECT_NAME} — it uses the default server again.";
57
+ elif printf '%s\n' "$(rag_instances)" | grep -qx "${MILVUS_INSTANCE}" ; then
58
+ rag_binding_set "${doc_name}" "${PROJECT_NAME}" "${MILVUS_INSTANCE}" ;
59
+ echo "Bound ${doc_name}/${PROJECT_NAME} to the ${MILVUS_INSTANCE} server.";
60
+ else
61
+ echo "No RAG server called '${MILVUS_INSTANCE}' in ${WORKSPACE_ROOT}/rag.";
62
+ echo " Build it first: cd ${WORKSPACE_ROOT}/rag && bash cmd-milvus-project.sh ${MILVUS_INSTANCE}";
63
+ return 1 ;
64
+ fi
65
+ fi
66
+ milvus_project="$(rag_resolve_instance "${doc_name}" "${PROJECT_NAME}" '_settings_')";
67
+
68
+ # milvus_uri()/milvus_host_port() resolve against the rag workspace folder, which is not the
69
+ # folder this command was run from.
70
+ local doc_name_saved="${doc_name}";
71
+ doc_name="rag";
72
+ uri="$(milvus_uri "${milvus_project}")";
73
+ token="$(milvus_token)";
74
+ if ! milvus_require_running "${milvus_project}" ; then
75
+ doc_name="${doc_name_saved}";
76
+ return 1 ;
77
+ fi
78
+ doc_name="${doc_name_saved}";
79
+
80
+ collection="$(rag_collection_name "${doc_name}" "${PROJECT_NAME}")";
81
+ excludes="$(ragify_scope_excludes "${SCOPE}")";
82
+ [ "${ALL}" == 'yes' ] && excludes="";
83
+ # argparse.sh emits an nargs='+' option as a bash ARRAY, so plain ${EXCLUDE} is its FIRST
84
+ # element and `--exclude a b` quietly indexed b. [0] reads the sentinel on a scalar default too.
85
+ if [ "${EXCLUDE[0]}" != '_none_' ] ; then
86
+ excludes="${excludes} ${EXCLUDE[*]}";
87
+ fi
88
+
89
+ embedding="${EMBEDDING}";
90
+ if [ "${embedding}" == '_settings_' ] ; then
91
+ embedding="$(milvus_setting "${rag_ws_rag_embedding}")"; embedding="${embedding:-bm25}";
92
+ fi
93
+ model="$(milvus_setting "${rag_ws_rag_openai_model}")"; model="${model:-text-embedding-3-small}";
94
+
95
+ key="";
96
+ if [ "${embedding}" == 'openai' ] ; then
97
+ # The key the workspace already holds. A placeholder is not a key — sk-change-this would fail
98
+ # deep in the run with an authentication error rather than here with a sentence.
99
+ key="${OPENAI_API_KEY:-${ai_providers_openai_api_key}}";
100
+ case "${key}" in ''|CHANGE_ME|sk-change-this)
101
+ echo "--embedding openai needs an OpenAI key: set ai_providers.openai.api_key in";
102
+ echo "core/config/settings.yml, or export OPENAI_API_KEY for a one-off run.";
103
+ return 1 ;;
104
+ esac
105
+ echo "";
106
+ echo "Dense embeddings are ON: every indexed chunk of ${PROJECT_NAME} is sent to the OpenAI API";
107
+ echo "(${model}). The default BM25 mode sends nothing anywhere.";
108
+ fi
109
+
110
+ echo "";
111
+ echo "Indexing ${doc_name}/${PROJECT_NAME} into ${collection}";
112
+ echo " Milvus ${uri}";
113
+ echo " Scope ${SCOPE}$([ "${ALL}" == 'yes' ] && echo ' (--all: nothing excluded)')";
114
+ echo " Retrieval ${embedding}";
115
+ echo "";
116
+
117
+ started="$(date +%s)";
118
+ # shellcheck disable=SC2086
119
+ rag_python --uri "${uri}" --token "${token}" index \
120
+ --collection "${collection}" \
121
+ --path "${project_path}" \
122
+ --chunk-lines "$(milvus_setting "${rag_ws_rag_chunk_lines}")" \
123
+ --chunk-overlap "$(milvus_setting "${rag_ws_rag_chunk_overlap}")" \
124
+ --max-file-kb "$(milvus_setting "${rag_ws_rag_max_file_kb}")" \
125
+ --embedding "${embedding}" \
126
+ --openai-model "${model}" \
127
+ ${key:+--openai-key "${key}"} \
128
+ ${APPEND:+--append} \
129
+ --progress \
130
+ ${excludes:+--exclude ${excludes}} || return 1 ;
131
+
132
+ echo "";
133
+ echo "*---------------------------------------------------------------------*";
134
+ echo " Indexed in $(( $(date +%s) - started ))s.";
135
+ echo "";
136
+ echo " Ask it something:";
137
+ echo " cd ${WORKSPACE_ROOT}/rag && bash cmd-tools-rag.sh ${doc_name}/${PROJECT_NAME} -a search -q \"...\"";
138
+ echo " Give the whole database to the Claude Code CLI (all collections, one registration):";
139
+ echo " cd ${WORKSPACE_ROOT}/rag && bash cmd-milvus-mcp.sh -a register";
140
+ echo "*---------------------------------------------------------------------*";
141
+ }
142
+
143
+ # Ask an existing index a question, from the project's own workspace folder — the same search
144
+ # cmd-tools-rag.sh runs, without changing directory.
145
+ function ragify_query_project() {
146
+ local milvus_project uri token collection doc_name_saved;
147
+
148
+ eval $(parse_yaml "${WORKSPACE_CONFIG}/workspace.rag.settings.yml" "rag_ws_");
149
+ rag_collection_prefix="${rag_ws_rag_collection_prefix}";
150
+ milvus_project="$(rag_resolve_instance "${doc_name}" "${PROJECT_NAME}" '_settings_')";
151
+
152
+ doc_name_saved="${doc_name}";
153
+ doc_name="rag";
154
+ uri="$(milvus_uri "${milvus_project}")";
155
+ token="$(milvus_token)";
156
+ if ! milvus_require_running "${milvus_project}" ; then
157
+ doc_name="${doc_name_saved}";
158
+ return 1 ;
159
+ fi
160
+ doc_name="${doc_name_saved}";
161
+
162
+ collection="$(rag_collection_name "${doc_name}" "${PROJECT_NAME}")";
163
+ rag_python --uri "${uri}" --token "${token}" search \
164
+ --collection "${collection}" --query "${QUERY}" --limit "${LIMIT}" ;
165
+ }