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