@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,199 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Build the Website stack (Drupal 11.4, PHP 8.4):
4
+ #
5
+ # build_website_project drupal/website, installed by the Webship installer
6
+ # (`drush site:install webship`) with the chosen site template.
7
+ # build_website_site_template one site-template recipe on drupal/recommended-project 11.4.x,
8
+ # installed with `drush site:install <recipe directory>`.
9
+ #
10
+ # The calling cmd-*.sh sets distribution_* and site_version, and for a recipe build
11
+ # site_template_name, site_template_title and site_template_package.
12
+
13
+ website_php_version="8.4";
14
+ website_core_version="11.4.x-dev";
15
+
16
+ # A clean DDEV project for PROJECT_NAME in this workspace, with the codebase of
17
+ # `$1` (a composer project template with its version) in it.
18
+ function website_create_project() {
19
+ base_url="https://${PROJECT_NAME}.ddev.site";
20
+
21
+ cd ${WORKSPACE_ROOT}/${doc_name};
22
+ drop_database;
23
+ if [ -d "${PROJECT_NAME}" ]; then
24
+ rm -rf ${PROJECT_NAME}
25
+ fi
26
+ mkdir -p ${PROJECT_NAME} ;
27
+ cd ${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME} ;
28
+
29
+ ddev config --project-type=drupal --docroot=${distribution_webroot} --php-version=${PHP_VERSION:-${website_php_version}} --nodejs-version=$(ddev_nodejs_version) --project-name=${PROJECT_NAME} --auto ;
30
+ ddev start -y ;
31
+
32
+ if ! ddev composer create-project "$1" . --no-interaction ; then
33
+ echo "composer create-project failed for $1 — aborting, nothing was installed." ;
34
+ cd ${WORKSPACE_ROOT}/${doc_name};
35
+ return 1 ;
36
+ fi
37
+
38
+ # The web* packages and the site templates only have dev releases for now.
39
+ ddev composer config minimum-stability dev ;
40
+ ddev composer config prefer-stable true ;
41
+
42
+ # Keep the site templates as recipes, like drupal/website does: unpacking them
43
+ # into the root composer.json fails on aliased dev branches (the pending fixes).
44
+ ddev composer config --json --merge extra.drupal-recipe-unpack.ignore '["drupal/website_starter", "drupal/webship_starter", "drupal/webship_portal"]' ;
45
+ }
46
+
47
+ # -----------------------------------------------------------------------------
48
+ # @todo Remove this block (and --with-pending-fixes) once these are merged into
49
+ # 12.0.x — the builds work without the flag from then on:
50
+ # - webblog MR !4: https://git.drupalcode.org/project/webblog/-/merge_requests/4
51
+ # - webreleases MR !5: https://git.drupalcode.org/project/webreleases/-/merge_requests/5
52
+ #
53
+ # Pins the issue-fork branches with --with-pending-fixes. `composer config
54
+ # repositories.<name>` adds a repository ahead of packages.drupal.org, so the
55
+ # fork wins. Arguments: the pins to add — webblog, webreleases.
56
+ function website_add_pending_fixes() {
57
+ if [ ! "${WITH_PENDING_FIXES}" == 'yes' ] ; then
58
+ return 0 ;
59
+ fi
60
+
61
+ local pins=() ;
62
+ for fix in "$@" ; do
63
+ case "${fix}" in
64
+ webship)
65
+ # drupal/webship has no 12.0.x-dev on packages.drupal.org yet
66
+ # ("Package drupal/webship not found"): take the installer from its 12.0.x branch.
67
+ # The repository's default branch (11.0.x) names the package webship/webship,
68
+ # and a vcs repository takes its package name from the default branch.
69
+ echo "Pending fix: webship/webship (the Webship installer) from its 12.0.x branch." ;
70
+ ddev composer config repositories.webship-12 vcs https://git.drupalcode.org/project/webship.git ;
71
+ pins+=("webship/webship:12.0.x-dev") ;
72
+ ;;
73
+ webblog)
74
+ echo "Pending fix: webblog from issue/webblog-3591554 (3591554-display-builder)." ;
75
+ ddev composer config repositories.webblog-3591554 vcs https://git.drupalcode.org/issue/webblog-3591554.git ;
76
+ pins+=("drupal/webblog:dev-3591554-display-builder as 12.0.x-dev") ;
77
+ ;;
78
+ webreleases)
79
+ echo "Pending fix: webreleases from issue/webreleases-3591672 (3591672-display-builder)." ;
80
+ ddev composer config repositories.webreleases-3591672 vcs https://git.drupalcode.org/issue/webreleases-3591672.git ;
81
+ pins+=("drupal/webreleases:dev-3591672-display-builder as 12.0.x-dev") ;
82
+ ;;
83
+ esac
84
+ done
85
+
86
+ if [ ${#pins[@]} -gt 0 ] ; then
87
+ ddev composer require --no-update "${pins[@]}" ;
88
+ fi
89
+ }
90
+ # -----------------------------------------------------------------------------
91
+
92
+ # The pending fixes a site template needs: webship_starter and webship_portal
93
+ # bring webreleases on top of the Website Starter's webblog.
94
+ function website_pending_fixes_for() {
95
+ case "$1" in
96
+ webship_starter|webship_portal) echo "webblog webreleases" ;;
97
+ *) echo "webblog" ;;
98
+ esac
99
+ }
100
+
101
+ # Install the site, then the shared after-install steps.
102
+ function website_after_install() {
103
+ drush_set_debug_on;
104
+ drush_cr;
105
+
106
+ if [ "${ADD_USERS}" == 'yes' ] ; then
107
+ add_users ;
108
+ fi
109
+
110
+ echo "";
111
+ echo "*---------------------------------------------------------------------*";
112
+ echo " ${PROJECT_NAME} is ready: ${base_url}";
113
+ echo "*---------------------------------------------------------------------*";
114
+
115
+ cd ${WORKSPACE_ROOT}/${doc_name};
116
+ }
117
+
118
+ # drupal/website installed by the Webship installer with --template.
119
+ function build_website_project() {
120
+ local template="${TEMPLATE:-website_starter}" ;
121
+
122
+ website_create_project "${distribution_project_template}:${site_version}" || return 1 ;
123
+
124
+ # The Website project requires the Webship installer and the three site
125
+ # templates. Add whatever the published template does not require yet.
126
+ local require_block missing=() ;
127
+ require_block=$(sed -n '/"require": {/,/}/p' composer.json) ;
128
+ for package in "drupal/webship:12.0.x-dev" "drupal/website_starter:1.0.x-dev" "drupal/webship_starter:1.0.x-dev" "drupal/webship_portal:1.0.x-dev" ; do
129
+ # The installer is drupal/webship or webship/webship; the pending fixes pin the latter.
130
+ if [ "${package%%:*}" == "drupal/webship" ] && { [ "${WITH_PENDING_FIXES}" == 'yes' ] || echo "${require_block}" | grep -q '"webship/webship"' ; } ; then
131
+ continue ;
132
+ fi
133
+ if ! echo "${require_block}" | grep -q "\"${package%%:*}\"" ; then
134
+ echo "${distribution_project_template} does not require ${package%%:*} yet — adding it." ;
135
+ missing+=("${package}") ;
136
+ fi
137
+ done
138
+
139
+ # The codebase carries all three site templates, so it needs every pending fix.
140
+ website_add_pending_fixes webship $(website_pending_fixes_for webship_portal) ;
141
+
142
+ # Stage everything, then one full update, so no pin is held back by the lock file.
143
+ local composer_ok=1 ;
144
+ if [ ${#missing[@]} -gt 0 ] ; then
145
+ ddev composer require --no-update --no-interaction "${missing[@]}" || composer_ok=0 ;
146
+ fi
147
+ if [ ${composer_ok} -eq 1 ] && { [ ${#missing[@]} -gt 0 ] || [ "${WITH_PENDING_FIXES}" == 'yes' ] ; } ; then
148
+ ddev composer update -W --no-interaction || composer_ok=0 ;
149
+ fi
150
+ if [ ${composer_ok} -eq 0 ] ; then
151
+ echo "composer failed — aborting before the install." ;
152
+ cd ${WORKSPACE_ROOT}/${doc_name};
153
+ return 1 ;
154
+ fi
155
+
156
+ set_default_settings ;
157
+
158
+ echo "Install ${distribution_title} with the Webship installer and the ${template} site template.";
159
+ if ! ddev drush site:install webship --yes \
160
+ installer_site_template_form.add_ons=${template} \
161
+ --site-name="${distribution_title}" \
162
+ --account-name="${account_name}" --account-pass="${account_pass}" --account-mail="${account_mail}" \
163
+ --locale="en" ; then
164
+ echo "" ;
165
+ echo "The ${template} install failed — read the error above. The codebase is kept: ${base_url}/core/install.php" ;
166
+ cd ${WORKSPACE_ROOT}/${doc_name} ;
167
+ return 1 ;
168
+ fi
169
+
170
+ website_after_install ;
171
+ }
172
+
173
+ # One site-template recipe on a plain Drupal 11.4.x recommended project.
174
+ function build_website_site_template() {
175
+ website_create_project "drupal/recommended-project:${website_core_version}" || return 1 ;
176
+
177
+ website_add_pending_fixes $(website_pending_fixes_for ${site_template_name}) ;
178
+
179
+ if ! ddev composer require -W --no-interaction "drush/drush:^13" "${site_template_package}:${site_version}" ; then
180
+ echo "composer require ${site_template_package}:${site_version} failed — aborting before the install." ;
181
+ cd ${WORKSPACE_ROOT}/${doc_name};
182
+ return 1 ;
183
+ fi
184
+
185
+ set_default_settings ;
186
+
187
+ echo "Install Drupal ${website_core_version} with the ${site_template_title} recipe.";
188
+ if ! ddev drush site:install /var/www/html/recipes/${site_template_name} --yes \
189
+ --site-name="${site_template_title}" \
190
+ --account-name="${account_name}" --account-pass="${account_pass}" --account-mail="${account_mail}" \
191
+ --locale="en" ; then
192
+ echo "" ;
193
+ echo "The ${site_template_title} install failed — read the error above." ;
194
+ cd ${WORKSPACE_ROOT}/${doc_name} ;
195
+ return 1 ;
196
+ fi
197
+
198
+ website_after_install ;
199
+ }
@@ -0,0 +1,243 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Run the code-quality checks a package ALREADY declares.
4
+ #
5
+ # Nearly every package in this workspace carries its own quality scripts — `lint:js`, `lint:css`,
6
+ # `lint:yaml`, `spellcheck`, `phpcs`, `test:chromium` — and until now nothing ran them from one
7
+ # place. This verb reads a package's package.json, maps the names it happens to use onto a fixed set
8
+ # of canonical checks, and runs them. It never invents a command: every check is a script the
9
+ # package declared for itself.
10
+ #
11
+ # The map, the safety rule, the package manager and the dependency test all live in ONE place —
12
+ # core/scripts/libs/checks_plan.js — which the dashboard also requires for the caption under its
13
+ # Checks button. This file does not re-implement any of it; it asks for a plan and executes the rows
14
+ # the resolver marked `ready`. That is what stops the button and the command disagreeing.
15
+ #
16
+ # Everything runs inside DDEV. A site runs its scripts in its own web container. A PACKAGE has no
17
+ # DDEV project of its own, so it runs in the dashboard's container, which bind-mounts the whole
18
+ # workspace tree at the same absolute path — /home/…/workspace/products/webship_core means the same
19
+ # directory inside it and out. There is no host node, no host composer and no raw docker exec.
20
+
21
+ readonly CHECKS_PLAN_JS="${WORKSPACE_SCRIPTS}/libs/checks_plan.js";
22
+ readonly CHECKS_STATE_DIR="${WORKSPACE_PATH}/state/checks";
23
+
24
+ # Where a project's checks run, and how a command is wrapped to get there.
25
+ #
26
+ # site the project has its own .ddev/config.yaml -> its own web container
27
+ # here we are already inside a DDEV web container -> run in place, do not nest ddev exec
28
+ # dashboard a package, invoked from the host -> the dashboard's container
29
+ function checks_where() {
30
+ local project_path="$1";
31
+ if [ -f "${project_path}/.ddev/config.yaml" ] ; then printf 'site' ; return 0 ; fi
32
+ if [ -n "${IS_DDEV_PROJECT:-}" ] ; then printf 'here' ; return 0 ; fi
33
+ printf 'dashboard';
34
+ }
35
+
36
+ # One check, run where it belongs. Output streams through unmodified — nothing is swallowed, so the
37
+ # dashboard toast shows what a terminal would.
38
+ #
39
+ # `< /dev/null` on every one of them, and it is not decoration: the caller is a `while read` loop fed
40
+ # by a process substitution, and `ddev exec` reads stdin. Without it the first check swallows the
41
+ # rest of the plan and the run silently stops after one row — which is exactly what it did. It is the
42
+ # same reason every job the dashboard starts closes stdin.
43
+ function checks_run_one() {
44
+ local where="$1" project_path="$2" runner="$3" script="$4";
45
+ case "${where}" in
46
+ site)
47
+ ( cd "${project_path}" && ddev exec "${runner} run ${script}" ) < /dev/null ;;
48
+ here)
49
+ ( cd "${project_path}" && bash -lc "${runner} run ${script}" ) < /dev/null ;;
50
+ dashboard)
51
+ ( cd "${WORKSPACE_PATH}/workspace-app" && ddev exec -d "${project_path}" "${runner} run ${script}" ) < /dev/null ;;
52
+ esac
53
+ }
54
+
55
+ # The add-on's own commands, which are already whole checks — used only where the project carries
56
+ # github.com/Webship/ddev-dev-tools.
57
+ function checks_run_addon() {
58
+ local project_path="$1" command="$2";
59
+ ( cd "${project_path}" && ${command} ) < /dev/null ;
60
+ }
61
+
62
+ # Is the container this project needs actually up? A package with a stopped dashboard container has
63
+ # nowhere to run, and saying so beats a docker error.
64
+ function checks_require_container() {
65
+ local where="$1" project_path="$2";
66
+ case "${where}" in
67
+ site)
68
+ if ! ( cd "${project_path}" && ddev describe -j 2>/dev/null | grep -q '"status":"running"' ) ; then
69
+ echo "Starting ${doc_name}/${PROJECT_NAME}…";
70
+ ( cd "${project_path}" && ddev start -y ) || return 1 ;
71
+ fi
72
+ ;;
73
+ dashboard)
74
+ if ! docker ps --format '{{.Names}}' 2>/dev/null | grep -q '^ddev-workspace-web$' ; then
75
+ echo "The workspace dashboard container is not running, and a package has no DDEV project of its own.";
76
+ echo " Start it: cd ${WORKSPACE_PATH}/workspace-app && ddev start -y";
77
+ return 1 ;
78
+ fi
79
+ ;;
80
+ esac
81
+ return 0 ;
82
+ }
83
+
84
+ function checks_command() {
85
+ local project_path="${WORKSPACE_ROOT}/${doc_name}/${PROJECT_NAME}";
86
+ local where runner runner_reason deps_installed deps_evidence postinstall_count has_package is_site;
87
+ local started status=0 ran=0 passed=0 failed=0 refused=0 skipped=0 declared=0;
88
+ local failed_ids="";
89
+
90
+ if [ ! -d "${project_path}" ] ; then
91
+ echo "No ${PROJECT_NAME} in ${WORKSPACE_ROOT}/${doc_name}.";
92
+ return 2 ;
93
+ fi
94
+
95
+ # The plan, from the one resolver. `--format=meta` answers the questions about the package as a
96
+ # whole; the default TSV answers them per check.
97
+ local plan_args="";
98
+ [ ! "${ONLY}" == '_none_' ] && plan_args="${plan_args} --only=${ONLY}";
99
+ [ ! "${SKIP}" == '_none_' ] && plan_args="${plan_args} --skip=${SKIP}";
100
+ [ ! "${RUNNER}" == '_none_' ] && plan_args="${plan_args} --runner=${RUNNER}";
101
+ [ "${E2E}" == 'yes' ] && plan_args="${plan_args} --e2e";
102
+ plan_args="${plan_args} --browser=${BROWSER}";
103
+
104
+ IFS=$'\t' read -r runner runner_reason deps_installed deps_evidence postinstall_count has_package is_site \
105
+ < <(node "${CHECKS_PLAN_JS}" "${project_path}" --format=meta ${plan_args} | head -1);
106
+
107
+ where="$(checks_where "${project_path}")";
108
+
109
+ echo "";
110
+ echo "── Checks · ${doc_name}/${PROJECT_NAME} ─────────────────────────────";
111
+ if [ "${has_package}" == 'yes' ] ; then
112
+ echo " ${runner:-(no runner)} (${runner_reason}) · dependencies $([ "${deps_installed}" == 'yes' ] && echo 'installed' || echo 'NOT installed') (${deps_evidence})";
113
+ else
114
+ echo " no package.json — only the checks a DDEV add-on provides can apply here";
115
+ fi
116
+ echo " running in: ${where}";
117
+ echo "";
118
+
119
+ # --list is pure filesystem work: it starts nothing and needs no dependencies.
120
+ if [ "${LIST}" == 'yes' ] ; then
121
+ node "${CHECKS_PLAN_JS}" "${project_path}" ${plan_args} \
122
+ | awk -F'\t' '{ printf " %-9s %-14s %-14s %s\n", $1, $3, $4, ($5 != "" ? $5 : $6) }';
123
+ if [ "${postinstall_count}" != '0' ] ; then
124
+ echo "";
125
+ echo " Installing this package would also run:";
126
+ node "${CHECKS_PLAN_JS}" "${project_path}" --format=meta | tail -n +2 | awk -F'\t' '{ printf " %s\n", $2 }';
127
+ fi
128
+ echo "";
129
+ return 0 ;
130
+ fi
131
+
132
+ # Dependencies are never installed behind your back: a package's own postinstall can write into a
133
+ # docroot or run a webpack build, so --install is the arming step and it says what it will run.
134
+ if [ "${has_package}" == 'yes' ] && [ "${deps_installed}" == 'no' ] ; then
135
+ if [ "${INSTALL}" == 'yes' ] ; then
136
+ checks_require_container "${where}" "${project_path}" || return 2 ;
137
+ echo "Installing with ${runner} (${runner_reason}).";
138
+ if [ "${postinstall_count}" != '0' ] ; then
139
+ echo "This package runs ${postinstall_count} script(s) on install, which write into the tree:";
140
+ node "${CHECKS_PLAN_JS}" "${project_path}" --format=meta | tail -n +2 | awk -F'\t' '{ printf " %s\n", $2 }';
141
+ fi
142
+ case "${where}" in
143
+ site) ( cd "${project_path}" && ddev ${runner} install ) || return 2 ;;
144
+ here) ( cd "${project_path}" && bash -lc "${runner} install" ) || return 2 ;;
145
+ dashboard) ( cd "${WORKSPACE_PATH}/workspace-app" && ddev exec -d "${project_path}" "${runner} install" ) || return 2 ;;
146
+ esac
147
+ plan_args="${plan_args} --assume-installed";
148
+ else
149
+ echo "Nothing ran: the dependencies of ${doc_name}/${PROJECT_NAME} are not installed.";
150
+ echo " Install them and check: bash cmd-tools-checks.sh ${PROJECT_NAME} --install";
151
+ echo " See the plan first: bash cmd-tools-checks.sh ${PROJECT_NAME} --list";
152
+ return 2 ;
153
+ fi
154
+ fi
155
+
156
+ started="$(date +%s)";
157
+ local summary="";
158
+
159
+ while IFS=$'\t' read -r id label row_status script command reason ; do
160
+ case "${row_status}" in
161
+ ready)
162
+ declared=$(( declared + 1 ));
163
+ checks_require_container "${where}" "${project_path}" || return 2 ;
164
+ echo "── ${id} ───────────────────────────────────────────────";
165
+ local one_started one_status;
166
+ one_started="$(date +%s)";
167
+ if [[ "${script}" == ddev\ * ]] ; then
168
+ checks_run_addon "${project_path}" "${command}";
169
+ elif [ "${id}" == 'e2e' ] && [ -f "${WORKSPACE_ROOT}/${doc_name}/cmd-tools-testing.sh" ] ; then
170
+ # The browser suite already has a command of its own, with the shared browser cache and the
171
+ # report handling in it. Hand over rather than reimplement half of it here.
172
+ bash "${WORKSPACE_ROOT}/${doc_name}/cmd-tools-testing.sh" "${PROJECT_NAME}" --run --browser "${BROWSER}" < /dev/null ;
173
+ else
174
+ checks_run_one "${where}" "${project_path}" "${runner}" "${script}";
175
+ fi
176
+ one_status=$? ;
177
+ ran=$(( ran + 1 ));
178
+ if [ ${one_status} -eq 0 ] ; then
179
+ passed=$(( passed + 1 ));
180
+ summary="${summary} ✅ $(printf '%-9s' "${id}") $(printf '%4ss' "$(( $(date +%s) - one_started ))") ${script}\n";
181
+ else
182
+ failed=$(( failed + 1 ));
183
+ failed_ids="${failed_ids} ${id}";
184
+ status=1 ;
185
+ summary="${summary} ❌ $(printf '%-9s' "${id}") $(printf '%4ss' "$(( $(date +%s) - one_started ))") ${script}\n";
186
+ if [ "${FAIL_FAST}" == 'yes' ] ; then
187
+ echo "";
188
+ echo "Stopping at the first failure, as asked (--fail-fast).";
189
+ break ;
190
+ fi
191
+ fi
192
+ echo "";
193
+ ;;
194
+ masked)
195
+ # A masked script cannot be trusted and cannot be ignored: it FAILS the run. The visible
196
+ # escape is --skip <id>, which is printed in the summary rather than hidden in a config.
197
+ declared=$(( declared + 1 ));
198
+ failed=$(( failed + 1 ));
199
+ failed_ids="${failed_ids} ${id}";
200
+ status=1 ;
201
+ summary="${summary} ⛔ $(printf '%-9s' "${id}") — ${script} — ${reason}\n";
202
+ ;;
203
+ refused)
204
+ declared=$(( declared + 1 ));
205
+ refused=$(( refused + 1 ));
206
+ summary="${summary} 🚫 $(printf '%-9s' "${id}") — ${script} — ${reason}\n";
207
+ ;;
208
+ skipped|deps-missing|unresolved-runner)
209
+ declared=$(( declared + 1 ));
210
+ skipped=$(( skipped + 1 ));
211
+ summary="${summary} ⏭ $(printf '%-9s' "${id}") — ${script:-—} — ${reason}\n";
212
+ ;;
213
+ *)
214
+ summary="${summary} ➖ $(printf '%-9s' "${id}") — ${reason}\n";
215
+ ;;
216
+ esac
217
+ done < <(node "${CHECKS_PLAN_JS}" "${project_path}" ${plan_args});
218
+
219
+ echo "";
220
+ echo "── Summary · ${doc_name}/${PROJECT_NAME} ────────────────────────────";
221
+ printf "%b" "${summary}";
222
+ echo "";
223
+ echo " ${ran} ran · ${passed} passed · ${failed} failed · ${refused} refused · ${skipped} skipped ($(( $(date +%s) - started ))s)";
224
+ if [ -n "${failed_ids}" ] ; then
225
+ echo " Failed:${failed_ids}";
226
+ echo " Re-run just those: bash cmd-tools-checks.sh ${PROJECT_NAME} --only $(echo "${failed_ids}" | tr -s ' ' | sed 's/^ //;s/ /,/g')";
227
+ fi
228
+ if [ ${ran} -eq 0 ] && [ ${failed} -eq 0 ] ; then
229
+ echo " Nothing ran. ${PROJECT_NAME} declares no check this verb can run — see --list.";
230
+ fi
231
+ echo "";
232
+
233
+ # The marker the dashboard reads for its caption. Written outside the package, like a graph, so a
234
+ # shipped repository never carries a file this tooling made.
235
+ if [ ${ran} -gt 0 ] ; then
236
+ mkdir -p "${CHECKS_STATE_DIR}/${doc_name}";
237
+ printf '{"at":%s,"workspace":"%s","project":"%s","ran":%s,"passed":%s,"failed":%s,"refused":%s,"skipped":%s,"seconds":%s}\n' \
238
+ "$(date +%s)" "${doc_name}" "${PROJECT_NAME}" "${ran}" "${passed}" "${failed}" "${refused}" "${skipped}" "$(( $(date +%s) - started ))" \
239
+ > "${CHECKS_STATE_DIR}/${doc_name}/${PROJECT_NAME}.json";
240
+ fi
241
+
242
+ return ${status} ;
243
+ }