@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,25 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# The Website project template (drupal/website) is installed by the Webship
|
|
4
|
+
# installer, which offers the three Webship site templates. Pick one.
|
|
5
|
+
|
|
6
|
+
argparse "$@" <<EOF || exit 1
|
|
7
|
+
parser.add_argument('PROJECT_NAME',
|
|
8
|
+
help='The name of the project. It becomes https://<PROJECT_NAME>.ddev.site')
|
|
9
|
+
parser.add_argument('-t', '--template',
|
|
10
|
+
default="website_starter",
|
|
11
|
+
choices=['website_starter', 'webship_starter', 'webship_portal'],
|
|
12
|
+
help='The site template the Webship installer installs [default %(default)s].')
|
|
13
|
+
parser.add_argument('-a', '--add-users',
|
|
14
|
+
action='store_true',
|
|
15
|
+
default=False,
|
|
16
|
+
help='Add the default set of users after the install.')
|
|
17
|
+
parser.add_argument('-f', '--with-pending-fixes',
|
|
18
|
+
action='store_true',
|
|
19
|
+
default=False,
|
|
20
|
+
help='Pin the web* issue-fork branches that are not merged yet (webblog MR !4, webreleases MR !5).')
|
|
21
|
+
parser.add_argument('-p', '--php-version',
|
|
22
|
+
default="",
|
|
23
|
+
choices=['8.5', '8.4', '8.3', '8.2', '8.1', '8.0', '7.4'],
|
|
24
|
+
help='PHP version for the project container. The seven most recent PHP releases DDEV supports; empty means the builder default. Example: --php-version 8.3')
|
|
25
|
+
EOF
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
argparse "$@" <<ARGEOF || exit 1
|
|
4
|
+
parser.add_argument('PROJECT_NAME',
|
|
5
|
+
help='The name of the project.')
|
|
6
|
+
parser.add_argument('-i', '--install',
|
|
7
|
+
action='store_true',
|
|
8
|
+
default=False,
|
|
9
|
+
help='Install WordPress, with the workspace account as the administrator.')
|
|
10
|
+
parser.add_argument('-l', '--launch',
|
|
11
|
+
action='store_true',
|
|
12
|
+
default=False,
|
|
13
|
+
help='Open the site in a browser when it is ready.')
|
|
14
|
+
parser.add_argument('--php-version',
|
|
15
|
+
default="",
|
|
16
|
+
choices=['8.5', '8.4', '8.3', '8.2', '8.1'],
|
|
17
|
+
help='PHP version for the project container; empty means DDEV\'s default. Example: --php-version 8.3')
|
|
18
|
+
ARGEOF
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# What the boot service runs. Kept as its own file, not inlined into the unit, so that what runs at
|
|
4
|
+
# boot is the same thing you can run by hand and read the output of — `core/scripts/autostart.sh --now`
|
|
5
|
+
# calls exactly this.
|
|
6
|
+
#
|
|
7
|
+
# The whole job is: wait until Docker will actually answer, then `ddev start` the configured projects.
|
|
8
|
+
# The waiting is the part that matters. At boot this races dockerd, and `ddev start` against a socket
|
|
9
|
+
# that is not listening yet fails in a way that leaves the project half-configured — so it polls
|
|
10
|
+
# rather than assuming, and gives up loudly instead of silently doing nothing.
|
|
11
|
+
|
|
12
|
+
# No `set -u`: bootstrap.sh and libs/bash-yaml.sh both read variables that are legitimately unset
|
|
13
|
+
# (WORKSPACE_REPO, parse_yaml's optional prefix), so it aborts the chain before Docker is even
|
|
14
|
+
# checked. Nothing else in this tree sets it either.
|
|
15
|
+
|
|
16
|
+
WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}";
|
|
17
|
+
source "${WORKSPACE_SCRIPTS}/bootstrap.sh" || exit 1 ;
|
|
18
|
+
|
|
19
|
+
eval $(parse_yaml "${WORKSPACE_CONFIG}/settings.yml" 2>/dev/null);
|
|
20
|
+
|
|
21
|
+
log() { printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" ; }
|
|
22
|
+
|
|
23
|
+
# WHICH PROJECTS, and why this is not just a list of names.
|
|
24
|
+
#
|
|
25
|
+
# A hand-maintained list is wrong within a week: you build a project, you never think about this file
|
|
26
|
+
# again, and after the next reboot it is not there. So the setting takes a small vocabulary as well as
|
|
27
|
+
# literal names:
|
|
28
|
+
#
|
|
29
|
+
# workspace just the dashboard. The default, and usually the right answer — it boots in seconds
|
|
30
|
+
# and you can start anything else from it with one click.
|
|
31
|
+
# running whatever was running when the machine last shut down cleanly. This is what people
|
|
32
|
+
# actually mean by "bring my work back", and it needs no maintenance.
|
|
33
|
+
# all every project DDEV has registered. Honest about the cost: 11 projects here is 11×
|
|
34
|
+
# (web + db) containers competing for RAM and disk at boot.
|
|
35
|
+
# a,b,c exactly these, in this order.
|
|
36
|
+
#
|
|
37
|
+
# The dashboard is ALWAYS first and always included, whatever the setting says. It is the way in to
|
|
38
|
+
# everything else, so a boot that brings back four sites and no dashboard is a worse outcome than one
|
|
39
|
+
# that brings back only the dashboard.
|
|
40
|
+
readonly STATE_FILE="${WORKSPACE_PATH}/state/autostart-was-running";
|
|
41
|
+
|
|
42
|
+
function resolve_projects() {
|
|
43
|
+
local setting="${dashboard_autostart:-workspace}" resolved="";
|
|
44
|
+
|
|
45
|
+
case "${setting}" in
|
|
46
|
+
all)
|
|
47
|
+
resolved="$(ddev list --json-output 2>/dev/null | jq -r '.raw[]?.name // empty' 2>/dev/null | paste -sd, -)";
|
|
48
|
+
;;
|
|
49
|
+
running)
|
|
50
|
+
# Recorded by the service's ExecStop on a clean shutdown. A hard poweroff never runs ExecStop,
|
|
51
|
+
# so the file may be stale or missing — the dashboard-only fallback below covers that rather
|
|
52
|
+
# than the boot failing over a missing file.
|
|
53
|
+
[ -f "${STATE_FILE}" ] && resolved="$(cat "${STATE_FILE}" 2>/dev/null)";
|
|
54
|
+
[ -z "${resolved}" ] && log "no record of what was running (hard poweroff?) — starting the dashboard only" ;
|
|
55
|
+
;;
|
|
56
|
+
*)
|
|
57
|
+
resolved="${setting}";
|
|
58
|
+
;;
|
|
59
|
+
esac
|
|
60
|
+
|
|
61
|
+
# Dashboard first, then the rest, no duplicates and order preserved.
|
|
62
|
+
printf 'workspace\n%s\n' "$(printf '%s' "${resolved}" | tr ',' '\n')" \
|
|
63
|
+
| sed 's/^[[:space:]]*//; s/[[:space:]]*$//' | sed '/^$/d' | awk '!seen[$0]++';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
# `--list` prints what WOULD start and exits. The status display calls this rather than re-deriving
|
|
67
|
+
# the list, so the two can never disagree about what a reboot will bring back — the same reason the
|
|
68
|
+
# checks command asks checks_plan.js instead of keeping its own copy of the map.
|
|
69
|
+
if [ "${1:-}" == '--list' ] ; then
|
|
70
|
+
resolve_projects ;
|
|
71
|
+
exit 0 ;
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# Docker, before anything else. 24 × 5s = two minutes, which covers a cold boot on a slow disk
|
|
75
|
+
# without hanging the unit for the full 900s timeout when Docker is genuinely broken.
|
|
76
|
+
attempt=0 ;
|
|
77
|
+
until docker info > /dev/null 2>&1 ; do
|
|
78
|
+
attempt=$(( attempt + 1 )) ;
|
|
79
|
+
if [ "${attempt}" -ge 24 ] ; then
|
|
80
|
+
log "Docker did not become available after 2 minutes. Nothing was started." ;
|
|
81
|
+
exit 1 ;
|
|
82
|
+
fi
|
|
83
|
+
log "waiting for Docker… (${attempt}/24)" ;
|
|
84
|
+
sleep 5 ;
|
|
85
|
+
done
|
|
86
|
+
log "Docker is up." ;
|
|
87
|
+
|
|
88
|
+
# DDEV's own shared infrastructure, before any project. `ddev-router` and `ddev-ssh-agent` are not
|
|
89
|
+
# projects — every project depends on them, but nothing owns starting them back up.
|
|
90
|
+
#
|
|
91
|
+
# This is the actual bug behind "ddev start did not work" and the boot service silently not
|
|
92
|
+
# starting the dashboard: a laptop suspend/reboot leaves these containers `exited` (Docker gives
|
|
93
|
+
# them no restart policy, same as every project container), and an EXITED container has no live
|
|
94
|
+
# network attachment, so Docker's own DNS has nothing to resolve `ddev-router` to. The web
|
|
95
|
+
# container's nginx fails at startup with "host not found in upstream ddev-router", supervisord
|
|
96
|
+
# gives up after three quick retries, and the WHOLE container exits — cleanly, exit code 0, which
|
|
97
|
+
# is why this reads as nothing having failed while nothing comes up either.
|
|
98
|
+
#
|
|
99
|
+
# `ddev start` does not reliably fix this on its own: it recreates the PROJECT's containers and
|
|
100
|
+
# leaves the router exactly as it found it. Confirmed by hand — starting the router first, then
|
|
101
|
+
# `ddev start`, works in one try; `ddev start` alone against a dead router does not, however many
|
|
102
|
+
# times it is retried.
|
|
103
|
+
for infra in ddev-router ddev-ssh-agent ; do
|
|
104
|
+
# Absent entirely is fine — a machine that has never run a project has neither yet, and `ddev
|
|
105
|
+
# start` creates what it needs. Only an EXISTING, stopped container is the failure to repair.
|
|
106
|
+
state="$(docker inspect "${infra}" --format '{{.State.Status}}' 2>/dev/null)" ;
|
|
107
|
+
if [ -n "${state}" ] && [ "${state}" != 'running' ] ; then
|
|
108
|
+
log "${infra} is ${state}, not running — starting it before any project." ;
|
|
109
|
+
docker start "${infra}" > /dev/null 2>&1 ;
|
|
110
|
+
# Give it a moment to attach to the network and pass its own health check before the project
|
|
111
|
+
# that depends on it starts racing it. Not a hard wait: if it is still not running after this,
|
|
112
|
+
# the project start below will fail loudly and say why, rather than hanging silently on it.
|
|
113
|
+
for _ in 1 2 3 4 5 6 ; do
|
|
114
|
+
[ "$(docker inspect "${infra}" --format '{{.State.Status}}' 2>/dev/null)" == 'running' ] && break ;
|
|
115
|
+
sleep 2 ;
|
|
116
|
+
done
|
|
117
|
+
fi
|
|
118
|
+
done
|
|
119
|
+
|
|
120
|
+
projects="$(resolve_projects | paste -sd' ' -)";
|
|
121
|
+
log "starting: ${projects}" ;
|
|
122
|
+
|
|
123
|
+
status=0 ;
|
|
124
|
+
for project in ${projects} ; do
|
|
125
|
+
case "${project}" in
|
|
126
|
+
workspace) project_path="${WORKSPACE_PATH}/workspace-app" ;;
|
|
127
|
+
*) project_path="$(ddev list --json-output 2>/dev/null \
|
|
128
|
+
| jq -r --arg n "${project}" '.raw[]? | select(.name==$n) | .approot' 2>/dev/null | head -1)" ;;
|
|
129
|
+
esac
|
|
130
|
+
|
|
131
|
+
if [ -z "${project_path}" ] || [ ! -d "${project_path}/.ddev" ] ; then
|
|
132
|
+
log "skipping ${project}: no DDEV project found for it." ;
|
|
133
|
+
continue ;
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
log "starting ${project} (${project_path})…" ;
|
|
137
|
+
if ( cd "${project_path}" && ddev start -y ) ; then
|
|
138
|
+
log "started ${project}." ;
|
|
139
|
+
else
|
|
140
|
+
log "FAILED to start ${project}." ;
|
|
141
|
+
status=1 ;
|
|
142
|
+
fi
|
|
143
|
+
done
|
|
144
|
+
|
|
145
|
+
# The screen runner belongs to the same "the machine came back" job. Sessions run on the
|
|
146
|
+
# HOST — that is the whole point of them, so `screen -r` works in your own terminal and a
|
|
147
|
+
# browser an agent drives opens on your desktop — and the dashboard runs in a container,
|
|
148
|
+
# which cannot start a host process. So without this, every Screens page action and every
|
|
149
|
+
# item-sync button answers "its runner is not up" until somebody runs one command, on a
|
|
150
|
+
# machine that otherwise looks fully set up.
|
|
151
|
+
screen_host="${WORKSPACE_PATH}/workspace-app/scripts/screen-host.sh";
|
|
152
|
+
if [ -f "${screen_host}" ] ; then
|
|
153
|
+
if bash "${screen_host}" --status 2>/dev/null | grep -q '^Running' ; then
|
|
154
|
+
log "screen runner already up." ;
|
|
155
|
+
elif bash "${screen_host}" --start > /dev/null 2>&1 ; then
|
|
156
|
+
log "started the screen runner." ;
|
|
157
|
+
else
|
|
158
|
+
log "could not start the screen runner — the Screens page will say so." ;
|
|
159
|
+
fi
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
exit "${status}" ;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Record which projects were running, so `autostart: running` has something to restore.
|
|
4
|
+
#
|
|
5
|
+
# Run as the service's ExecStop, which systemd calls on a clean shutdown or reboot. A hard poweroff
|
|
6
|
+
# never runs it, so the file can be stale or absent — the boot side treats that as "dashboard only"
|
|
7
|
+
# rather than failing, because a boot that starts nothing is worse than a boot that starts one thing.
|
|
8
|
+
#
|
|
9
|
+
# It records rather than acts: nothing here stops a project. `ddev poweroff` on shutdown would be
|
|
10
|
+
# tidier in theory and is wrong in practice — Docker is already going down around it, and a half-
|
|
11
|
+
# stopped project is how a database volume gets corrupted.
|
|
12
|
+
|
|
13
|
+
WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}";
|
|
14
|
+
source "${WORKSPACE_SCRIPTS}/bootstrap.sh" || exit 0 ;
|
|
15
|
+
|
|
16
|
+
STATE_DIR="${WORKSPACE_PATH}/state";
|
|
17
|
+
STATE_FILE="${STATE_DIR}/autostart-was-running";
|
|
18
|
+
|
|
19
|
+
mkdir -p "${STATE_DIR}" 2>/dev/null ;
|
|
20
|
+
|
|
21
|
+
running="$(ddev list --json-output 2>/dev/null \
|
|
22
|
+
| jq -r '.raw[]? | select(.status=="running") | .name' 2>/dev/null | paste -sd, -)";
|
|
23
|
+
|
|
24
|
+
# Only overwrite when the answer is believable. If Docker is already gone the query returns nothing,
|
|
25
|
+
# and writing that empty result would erase a perfectly good record from the previous shutdown.
|
|
26
|
+
if [ -n "${running}" ] ; then
|
|
27
|
+
printf '%s\n' "${running}" > "${STATE_FILE}" ;
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
exit 0 ;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Runs every couple of minutes from webship-workspace-watch.timer.
|
|
4
|
+
#
|
|
5
|
+
# The boot service starts the dashboard once. When Docker itself restarts afterwards (an update, a crash,
|
|
6
|
+
# somebody running `systemctl restart docker`), every DDEV container stops and nothing starts them again,
|
|
7
|
+
# so every workspace URL answers 404 until a person notices. This notices: it remembers when Docker last
|
|
8
|
+
# started, and when that moment has changed it runs the same script the boot service runs, once.
|
|
9
|
+
#
|
|
10
|
+
# It never starts anything just because the dashboard is not running. A dashboard stopped on purpose
|
|
11
|
+
# stays stopped; only "Docker came back since I last looked" restores it.
|
|
12
|
+
#
|
|
13
|
+
# Overrides, for tests: AUTOSTART_WATCH_STATE (the stamp file), AUTOSTART_WATCH_DOCKER_STAMP (the value
|
|
14
|
+
# systemd would report) and AUTOSTART_WATCH_RUN (what to run instead of autostart-run.sh).
|
|
15
|
+
|
|
16
|
+
WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}"
|
|
17
|
+
STATE="${AUTOSTART_WATCH_STATE:-${XDG_STATE_HOME:-${HOME}/.local/state}/webship-workspace/docker-started}"
|
|
18
|
+
RUN="${AUTOSTART_WATCH_RUN:-bash ${WORKSPACE_SCRIPTS}/autostart-run.sh}"
|
|
19
|
+
|
|
20
|
+
log() { printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" ; }
|
|
21
|
+
|
|
22
|
+
if [ -n "${AUTOSTART_WATCH_DOCKER_STAMP+x}" ] ; then
|
|
23
|
+
current="${AUTOSTART_WATCH_DOCKER_STAMP}"
|
|
24
|
+
else
|
|
25
|
+
[ "$(systemctl is-active docker 2>/dev/null)" = "active" ] || exit 0
|
|
26
|
+
current="$(systemctl show docker --property=ActiveEnterTimestamp --value 2>/dev/null)"
|
|
27
|
+
fi
|
|
28
|
+
[ -n "${current}" ] || exit 0
|
|
29
|
+
|
|
30
|
+
mkdir -p "$(dirname "${STATE}")"
|
|
31
|
+
previous="$(cat "${STATE}" 2>/dev/null)"
|
|
32
|
+
|
|
33
|
+
if [ -z "${previous}" ] ; then
|
|
34
|
+
printf '%s\n' "${current}" > "${STATE}"
|
|
35
|
+
log "first look: Docker started ${current}; nothing to do"
|
|
36
|
+
exit 0
|
|
37
|
+
fi
|
|
38
|
+
[ "${current}" = "${previous}" ] && exit 0
|
|
39
|
+
|
|
40
|
+
# Record it BEFORE running, so a start that fails is not retried every two minutes.
|
|
41
|
+
printf '%s\n' "${current}" > "${STATE}"
|
|
42
|
+
log "Docker restarted (${previous} -> ${current}); starting the dashboard again"
|
|
43
|
+
bash -c "${RUN}"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# The dashboard's own hostnames, and getting it back after a reboot.
|
|
4
|
+
#
|
|
5
|
+
# A DDEV project's containers carry `restart: no`, so nothing brings the dashboard back when the
|
|
6
|
+
# machine boots — every workspace URL then answers 404 from a router with nothing behind it. This
|
|
7
|
+
# installs a systemd USER service that runs `ddev start` for the configured projects at boot, and
|
|
8
|
+
# manages `hub_domain` — the one field every dashboard URL and DDEV's own routing are built from.
|
|
9
|
+
#
|
|
10
|
+
# Machine setup rather than per-project work, which is why it lives in core/scripts beside
|
|
11
|
+
# sync-tooling.sh and install.sh: it is run once when a machine is set up, takes no project name, and
|
|
12
|
+
# configures the box rather than acting on a project.
|
|
13
|
+
|
|
14
|
+
# Bootstrap.
|
|
15
|
+
# Find the workspace tooling from this script, so a fresh clone needs no setup.
|
|
16
|
+
WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}";
|
|
17
|
+
source ${WORKSPACE_SCRIPTS}/bootstrap.sh || exit 1 ;
|
|
18
|
+
|
|
19
|
+
eval $(parse_yaml ${WORKSPACE_CONFIG}/settings.yml);
|
|
20
|
+
|
|
21
|
+
ARGPARSE_DESCRIPTION="Bring the dashboard back after a reboot, and set the domain everything is built from"
|
|
22
|
+
source ${WORKSPACE_SCRIPTS}/args/arg-autostart.sh || exit 1 ;
|
|
23
|
+
|
|
24
|
+
shift $#;
|
|
25
|
+
|
|
26
|
+
autostart_command ;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Include users functions.
|
|
4
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-users.sh || exit 1 ;
|
|
5
|
+
|
|
6
|
+
# Include Default settings functions.
|
|
7
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-default-settings.sh || exit 1 ;
|
|
8
|
+
|
|
9
|
+
# Include Database functions.
|
|
10
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-database.sh || exit 1 ;
|
|
11
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-ddev-telemetry.sh || exit 1 ;
|
|
12
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-ddev-nodejs.sh || exit 1 ;
|
|
13
|
+
|
|
14
|
+
# Include Files functions.
|
|
15
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-files.sh || exit 1 ;
|
|
16
|
+
|
|
17
|
+
# Include backup functions.
|
|
18
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-backup-item.sh || exit 1 ;
|
|
19
|
+
|
|
20
|
+
# Include clone-project functions.
|
|
21
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-clone-project.sh || exit 1 ;
|
|
22
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-git-worktrees.sh || exit 1 ;
|
|
23
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-ddev-hostnames.sh || exit 1 ;
|
|
24
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-hostnames-cli.sh || exit 1 ;
|
|
25
|
+
|
|
26
|
+
# Include screen-session functions.
|
|
27
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-screen.sh || exit 1 ;
|
|
28
|
+
|
|
29
|
+
# Include project removal functions.
|
|
30
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-remove-project.sh || exit 1 ;
|
|
31
|
+
|
|
32
|
+
# Include drush functions.
|
|
33
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-drush.sh || exit 1 ;
|
|
34
|
+
|
|
35
|
+
# Include distribution functions.
|
|
36
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-build-distribution.sh || exit 1 ;
|
|
37
|
+
|
|
38
|
+
# Include site template functions.
|
|
39
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-build-site-template.sh || exit 1 ;
|
|
40
|
+
|
|
41
|
+
# Include the Website stack and the Webships API build families.
|
|
42
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-build-website.sh || exit 1 ;
|
|
43
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-build-webships.sh || exit 1 ;
|
|
44
|
+
|
|
45
|
+
# Include Obsidian (reading a project's graph as a vault) functions.
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# Include AI provider key functions.
|
|
49
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-ai-providers.sh || exit 1 ;
|
|
50
|
+
|
|
51
|
+
# Include GitLab CI (gitlab-ci-local green-gate) functions.
|
|
52
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-gitlab-ci.sh || exit 1 ;
|
|
53
|
+
|
|
54
|
+
# Include AI item (agents/skills/prompts) functions.
|
|
55
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-ai-items.sh || exit 1 ;
|
|
56
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-ai-items-lock.sh || exit 1 ;
|
|
57
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-ai-items-sources.sh || exit 1 ;
|
|
58
|
+
|
|
59
|
+
# Include workspace command management functions.
|
|
60
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-commands.sh || exit 1 ;
|
|
61
|
+
|
|
62
|
+
# Include Penpot (self-hosted design platform in DDEV) functions.
|
|
63
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-penpot.sh || exit 1 ;
|
|
64
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-wordpress.sh || exit 1 ;
|
|
65
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-odoo.sh || exit 1 ;
|
|
66
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-avatar.sh || exit 1 ;
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
# Include Milvus (self-hosted vector database in DDEV) functions.
|
|
70
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-milvus.sh || exit 1 ;
|
|
71
|
+
|
|
72
|
+
# Include RAG index build (ragify) functions.
|
|
73
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-ragify.sh || exit 1 ;
|
|
74
|
+
|
|
75
|
+
# Include rag workspace (the index store and its MCP wiring) functions.
|
|
76
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-rag.sh || exit 1 ;
|
|
77
|
+
|
|
78
|
+
# Include Google Drive (push a workspace folder to a Drive folder, and its MCP server) functions.
|
|
79
|
+
|
|
80
|
+
# Include automated-testing (set up and run a project's suite) functions.
|
|
81
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-testing.sh || exit 1 ;
|
|
82
|
+
|
|
83
|
+
# The code-quality checks a package already declares (cmd-tools-checks.sh).
|
|
84
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-checks.sh || exit 1 ;
|
|
85
|
+
|
|
86
|
+
# Reclaiming the disk that removed projects left behind (cmd-tools-reclaim.sh).
|
|
87
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-reclaim.sh || exit 1 ;
|
|
88
|
+
|
|
89
|
+
# The dashboard's hostnames and its boot service (core/scripts/autostart.sh).
|
|
90
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-autostart.sh || exit 1 ;
|
|
91
|
+
|
|
92
|
+
# ElevenLabs, for the final voiceover of a narrated video (videos/cmd-tools-elevenlabs.sh).
|
|
93
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-elevenlabs.sh || exit 1 ;
|
|
94
|
+
|
|
95
|
+
# Voices for the audio workspace: Piper and ElevenLabs (audio/cmd-tools-voice.sh).
|
|
96
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-voice.sh || exit 1 ;
|
|
97
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-video-edit.sh || exit 1 ;
|
|
98
|
+
|
|
99
|
+
# Include SPDD (structured-prompt-driven design artifacts) functions.
|
|
100
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-spdd.sh || exit 1 ;
|
|
101
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-specs-share.sh || exit 1 ;
|
|
102
|
+
|
|
103
|
+
# trim_project_name — the one place PROJECT_NAME gets a trailing slash trimmed, called from every
|
|
104
|
+
# cmd-*.sh that takes one.
|
|
105
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-project-name.sh || exit 1 ;
|
|
106
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-version.sh || exit 1 ;
|
|
107
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-release.sh || exit 1 ;
|
|
108
|
+
|
|
109
|
+
# Workspace folders kept on a second disk (core/scripts/storage.sh).
|
|
110
|
+
source ${WORKSPACE_SCRIPTS}/functions/fun-storage.sh || exit 1 ;
|
|
111
|
+
|
|
112
|
+
# The functions installed plugins ship (core/scripts/plugins.sh --install <name> puts them in
|
|
113
|
+
# core/scripts/plugins/<name>/functions/). Sourced last, so a plugin can build on everything above.
|
|
114
|
+
for plugin_functions_file in "${WORKSPACE_SCRIPTS}"/plugins/*/functions/*.sh ; do
|
|
115
|
+
[ -f "${plugin_functions_file}" ] || continue ;
|
|
116
|
+
source "${plugin_functions_file}" || exit 1 ;
|
|
117
|
+
done
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Include Bash YAML library.
|
|
4
|
+
source ${WORKSPACE_SCRIPTS}/libs/bash-yaml.sh || exit 1 ;
|
|
5
|
+
|
|
6
|
+
# Include the arguments parser
|
|
7
|
+
source ${WORKSPACE_SCRIPTS}/libs/argparse.sh || exit 1 ;
|
|
8
|
+
|
|
9
|
+
# Include Bash Progress Bar library.
|
|
10
|
+
source ${WORKSPACE_SCRIPTS}/libs/progress-bar.sh || exit 1 ;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
current_path=$(pwd);
|
|
4
|
+
user_name="$USER";
|
|
5
|
+
|
|
6
|
+
# Where this tooling comes from, and where a proposed change is filed. Captured HERE, before
|
|
7
|
+
# settings.yml is parsed: parse_yaml would overwrite an exported override with the file's value,
|
|
8
|
+
# and an export is meant to win for a one-off run.
|
|
9
|
+
_env_workspace_repo="${WORKSPACE_REPO}";
|
|
10
|
+
_env_workspace_repo_ref="${WORKSPACE_REPO_REF}";
|
|
11
|
+
_env_ai_items_repo="${AI_ITEMS_REPO}";
|
|
12
|
+
_env_ai_items_ref="${AI_ITEMS_REF}";
|
|
13
|
+
|
|
14
|
+
# These were WEBSHIP_WORKSPACE_* until the rename. Anyone still exporting the old names meant them
|
|
15
|
+
# as an override, so honour them rather than silently ignoring the override and picking the
|
|
16
|
+
# checkout instead.
|
|
17
|
+
WORKSPACE_ROOT="${WORKSPACE_ROOT:-${WEBSHIP_WORKSPACE_ROOT}}";
|
|
18
|
+
WORKSPACE_PATH="${WORKSPACE_PATH:-${WEBSHIP_WORKSPACE_PATH}}";
|
|
19
|
+
WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-${WEBSHIP_WORKSPACE_SCRIPTS}}";
|
|
20
|
+
WORKSPACE_CONFIG="${WORKSPACE_CONFIG:-${WEBSHIP_WORKSPACE_CONFIG}}";
|
|
21
|
+
|
|
22
|
+
# Locate the workspace from this file, so a fresh clone works with no setup:
|
|
23
|
+
# core/scripts/bootstrap.sh -> core/scripts -> core -> the workspace root.
|
|
24
|
+
# Exported WORKSPACE_* variables still win, for a workspace kept
|
|
25
|
+
# somewhere other than the checkout that is running.
|
|
26
|
+
WORKSPACE_SCRIPTS="${WORKSPACE_SCRIPTS:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}";
|
|
27
|
+
WORKSPACE_PATH="${WORKSPACE_PATH:-$(dirname "${WORKSPACE_SCRIPTS}")}";
|
|
28
|
+
WORKSPACE_ROOT="${WORKSPACE_ROOT:-$(dirname "${WORKSPACE_PATH}")}";
|
|
29
|
+
WORKSPACE_CONFIG="${WORKSPACE_CONFIG:-${WORKSPACE_PATH}/config}";
|
|
30
|
+
export WORKSPACE_ROOT WORKSPACE_PATH WORKSPACE_SCRIPTS WORKSPACE_CONFIG ;
|
|
31
|
+
|
|
32
|
+
# Include Bootstrap libraries.
|
|
33
|
+
source ${WORKSPACE_SCRIPTS}/bootstrap-libraries.sh || exit 1 ;
|
|
34
|
+
|
|
35
|
+
# Include Bootstrap functions.
|
|
36
|
+
source ${WORKSPACE_SCRIPTS}/bootstrap-functions.sh || exit 1 ;
|
|
37
|
+
|
|
38
|
+
# Load settings.
|
|
39
|
+
eval $(parse_yaml ${WORKSPACE_CONFIG}/settings.yml);
|
|
40
|
+
|
|
41
|
+
# The settings files installed plugins own (core/config/plugin.<name>.settings.yml), as
|
|
42
|
+
# plugin_<name>_<key> variables, so a plugin's bash hooks read the same values the dashboard does.
|
|
43
|
+
for plugin_settings_file in "${WORKSPACE_CONFIG}"/plugin.*.settings.yml ; do
|
|
44
|
+
[ -f "${plugin_settings_file}" ] || continue ;
|
|
45
|
+
plugin_settings_name="$(basename "${plugin_settings_file}" .settings.yml)";
|
|
46
|
+
plugin_settings_name="${plugin_settings_name#plugin.}";
|
|
47
|
+
eval $(parse_yaml "${plugin_settings_file}" "plugin_${plugin_settings_name//-/_}_");
|
|
48
|
+
done
|
|
49
|
+
unset plugin_settings_file plugin_settings_name ;
|
|
50
|
+
|
|
51
|
+
# settings.yml carries no paths: they follow the checkout, for whoever is running
|
|
52
|
+
# it. Set root/path/scripts/config/backups there only to override that.
|
|
53
|
+
root="${root:-${WORKSPACE_ROOT}}";
|
|
54
|
+
path="${path:-${WORKSPACE_PATH}}";
|
|
55
|
+
scripts="${scripts:-${WORKSPACE_SCRIPTS}}";
|
|
56
|
+
config="${config:-${WORKSPACE_CONFIG}}";
|
|
57
|
+
backups="${backups:-${root}/backups}";
|
|
58
|
+
|
|
59
|
+
# The tooling repository, from sources.tooling in settings.yml. The commands tooling compares
|
|
60
|
+
# against it, pulls from it, and proposes back to it.
|
|
61
|
+
WORKSPACE_REPO="${_env_workspace_repo:-${sources_tooling_repo:-webship/workspace}}";
|
|
62
|
+
WORKSPACE_REPO_REF="${_env_workspace_repo_ref:-${sources_tooling_ref:-1.0.x}}";
|
|
63
|
+
|
|
64
|
+
# The shared AI agents, skills and prompts come from their own repository, and go back to it the
|
|
65
|
+
# same way commands go back to the tooling one.
|
|
66
|
+
AI_ITEMS_REPO="${_env_ai_items_repo:-${sources_ai_items_repo:-webship/ai-agents}}";
|
|
67
|
+
AI_ITEMS_REF="${_env_ai_items_ref:-${sources_ai_items_ref:-main}}";
|
|
68
|
+
export WORKSPACE_REPO WORKSPACE_REPO_REF AI_ITEMS_REPO AI_ITEMS_REF ;
|
|
69
|
+
|
|
70
|
+
# The backups folder is the one directory that is not in the checkout.
|
|
71
|
+
mkdir -p "${backups}" 2>/dev/null ;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
################################################################################
|
|
4
|
+
## `ddev`, serialised on the router. A shim, not a replacement.
|
|
5
|
+
################################################################################
|
|
6
|
+
## Every router-mutating verb — start, stop, restart, poweroff, delete — tears the
|
|
7
|
+
## ONE shared ddev-router down and brings it back with the routes of whatever is
|
|
8
|
+
## running. Two at a time race on a single container: one removes it while the
|
|
9
|
+
## other has just created it, and the loser can leave it removed for good. What
|
|
10
|
+
## that looks like is the whole workspace going dark — every *.ddev.site address,
|
|
11
|
+
## the dashboard's hub included — with healthy web containers behind it, and DDEV
|
|
12
|
+
## then refusing to start anything at all:
|
|
13
|
+
##
|
|
14
|
+
## Failed to start workspace: Error response from daemon:
|
|
15
|
+
## No such container: ddev-router
|
|
16
|
+
##
|
|
17
|
+
## Recovering needs `ddev poweroff`. Five clicks in thirty-eight seconds did it.
|
|
18
|
+
##
|
|
19
|
+
## The dashboard's own buttons and its AI assistant already take this lock. This
|
|
20
|
+
## shim is for every OTHER caller — a cmd-*.sh script, an agent, a person in a
|
|
21
|
+
## terminal or in `ddev ssh` — because a rule that each caller must remember is a
|
|
22
|
+
## rule that gets forgotten, including by callers nobody has written yet.
|
|
23
|
+
##
|
|
24
|
+
## Install: PATH must reach this file before the real ddev.
|
|
25
|
+
## container: /usr/local/sbin/ddev (PATH has /usr/local/sbin before /usr/local/bin)
|
|
26
|
+
## host: core/scripts/install.sh offers it, same path, needs sudo
|
|
27
|
+
##
|
|
28
|
+
## FOUR RULES THIS FILE LIVES BY, because a wrong shim breaks every ddev call on
|
|
29
|
+
## the machine — including the dashboard's own status reads every twenty seconds:
|
|
30
|
+
##
|
|
31
|
+
## 1. The real ddev is resolved by ABSOLUTE PATH and checked not to be this
|
|
32
|
+
## file. Resolving through PATH would find the shim again and fork forever.
|
|
33
|
+
## 2. Anything that is not a router verb is exec'd immediately, with no lock,
|
|
34
|
+
## no subshell and no added latency. `ddev list --json-output` must cost
|
|
35
|
+
## exactly what it cost before.
|
|
36
|
+
## 3. Nothing here is fatal. If flock is missing, or the lock file cannot be
|
|
37
|
+
## created, it says so once on stderr and runs the command anyway. Refusing
|
|
38
|
+
## to run ddev because a lock could not be taken would be a worse failure
|
|
39
|
+
## than the one being prevented.
|
|
40
|
+
## 4. It never re-locks a lock already held. The dashboard wraps its own calls
|
|
41
|
+
## in flock, and taking the same lock again from inside would deadlock for
|
|
42
|
+
## the full timeout — so DDEV_ROUTER_LOCK_HELD is the interlock, set by
|
|
43
|
+
## whoever holds it and exported here for anything ddev itself shells out to.
|
|
44
|
+
################################################################################
|
|
45
|
+
|
|
46
|
+
set -u
|
|
47
|
+
|
|
48
|
+
# --- 1. the real ddev, by absolute path, and never this file -------------------
|
|
49
|
+
SELF="$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || echo "${BASH_SOURCE[0]}")"
|
|
50
|
+
REAL_DDEV=''
|
|
51
|
+
for candidate in /usr/local/bin/ddev /usr/bin/ddev /opt/homebrew/bin/ddev /snap/bin/ddev ; do
|
|
52
|
+
[ -x "${candidate}" ] || continue
|
|
53
|
+
[ "$(readlink -f "${candidate}" 2>/dev/null || echo "${candidate}")" == "${SELF}" ] && continue
|
|
54
|
+
REAL_DDEV="${candidate}"
|
|
55
|
+
break
|
|
56
|
+
done
|
|
57
|
+
if [ -z "${REAL_DDEV}" ] ; then
|
|
58
|
+
echo "ddev: this is the workspace's router-lock shim, and the real ddev binary was not found" >&2
|
|
59
|
+
echo " (looked in /usr/local/bin, /usr/bin, /opt/homebrew/bin, /snap/bin)" >&2
|
|
60
|
+
exit 127
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
# --- 2. which verb is this? ----------------------------------------------------
|
|
64
|
+
# `ddev [global flags] <verb> [args]`, so the verb is the first argument that is
|
|
65
|
+
# not a flag and not a flag's value. Only the verb matters here, and an unknown
|
|
66
|
+
# shape falls through to the pass-through path, which is the safe direction.
|
|
67
|
+
VERB=''
|
|
68
|
+
for arg in "$@" ; do
|
|
69
|
+
case "${arg}" in
|
|
70
|
+
-*) continue ;;
|
|
71
|
+
*) VERB="${arg}"; break ;;
|
|
72
|
+
esac
|
|
73
|
+
done
|
|
74
|
+
|
|
75
|
+
case "${VERB}" in
|
|
76
|
+
start|stop|restart|poweroff|delete) ;;
|
|
77
|
+
# Everything else — list, describe, drush, composer, exec, ssh, snapshot,
|
|
78
|
+
# export-db, add-on, config, and every verb added in future — is none of this
|
|
79
|
+
# shim's business. Straight through, same process, no measurable overhead.
|
|
80
|
+
*) exec "${REAL_DDEV}" "$@" ;;
|
|
81
|
+
esac
|
|
82
|
+
|
|
83
|
+
# --- 3. the lock ---------------------------------------------------------------
|
|
84
|
+
# Already held by a caller above us: run, do not re-lock (see rule 4).
|
|
85
|
+
if [ -n "${DDEV_ROUTER_LOCK_HELD:-}" ] ; then
|
|
86
|
+
exec "${REAL_DDEV}" "$@"
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
WS_ROOT="${WORKSPACE_ROOT:-${HOME}/workspace}"
|
|
90
|
+
LOCK="${WS_ROOT}/.ddev-router.lock"
|
|
91
|
+
|
|
92
|
+
if ! command -v flock > /dev/null 2>&1 ; then
|
|
93
|
+
echo "ddev: flock is not installed, so '${VERB}' runs unserialised — concurrent" >&2
|
|
94
|
+
echo " start/stop can destroy the shared ddev-router. Install util-linux." >&2
|
|
95
|
+
exec "${REAL_DDEV}" "$@"
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
# The lock file has to be creatable. It normally exists already; when it does not
|
|
99
|
+
# (a fresh checkout, a different WORKSPACE_ROOT) create it, and if that fails say
|
|
100
|
+
# so and carry on rather than blocking the command.
|
|
101
|
+
if [ ! -e "${LOCK}" ] ; then
|
|
102
|
+
if ! ( umask 022 && : > "${LOCK}" ) 2>/dev/null ; then
|
|
103
|
+
echo "ddev: cannot create ${LOCK}, so '${VERB}' runs unserialised." >&2
|
|
104
|
+
exec "${REAL_DDEV}" "$@"
|
|
105
|
+
fi
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
# Say something only when there is really something to wait for: a free lock has
|
|
109
|
+
# to cost nothing and print nothing, or every start grows a line of noise.
|
|
110
|
+
if ! flock -n "${LOCK}" true 2>/dev/null ; then
|
|
111
|
+
echo "ddev: waiting — another ddev start/stop/restart holds the router lock." >&2
|
|
112
|
+
echo " They cannot run at once: each one recreates the shared ddev-router." >&2
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Exported so anything the real ddev shells out to (including ddev calling itself)
|
|
116
|
+
# does not queue behind a lock this process already owns.
|
|
117
|
+
export DDEV_ROUTER_LOCK_HELD=1
|
|
118
|
+
|
|
119
|
+
# -w: bounded, so a wedged start cannot hold the queue for ever. The command's own
|
|
120
|
+
# exit status is what leaves this script, because callers check it.
|
|
121
|
+
flock -w 1800 "${LOCK}" "${REAL_DDEV}" "$@"
|
|
122
|
+
exit $?
|