@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,203 @@
|
|
|
1
|
+
# Docker-outside-of-Docker: install the docker CLI (talks to the host's
|
|
2
|
+
# docker.sock, bind-mounted in via docker-compose.dood.yaml) and the ddev
|
|
3
|
+
# binary itself, so cmd-*.sh scripts run from inside this container can
|
|
4
|
+
# manage sibling ddev projects exactly like they do on the host.
|
|
5
|
+
# On Debian trixie the `docker.io` package ships only the daemon; the client
|
|
6
|
+
# lives in `docker-cli`, which is all Docker-outside-of-Docker needs.
|
|
7
|
+
# wkhtmltopdf was dropped from Debian trixie (the ddev-webserver base image
|
|
8
|
+
# since DDEV 1.25), and upstream abandoned it. WeasyPrint renders the doc PDFs
|
|
9
|
+
# and headless Chromium takes the site screenshots instead.
|
|
10
|
+
RUN apt-get update -o Acquire::AllowInsecureRepositories=true || true \
|
|
11
|
+
&& apt-get install -y --no-install-recommends --allow-unauthenticated curl ca-certificates \
|
|
12
|
+
pandoc weasyprint chromium screen \
|
|
13
|
+
vim links lynx git diffutils htop wget p7zip-full unzip zip sed \
|
|
14
|
+
gcc g++ make python3 python-is-python3 \
|
|
15
|
+
# The docker client: `docker-cli` on trixie (DDEV >= 1.25), `docker.io` on bookworm (DDEV 1.24).
|
|
16
|
+
&& (apt-get install -y --no-install-recommends --allow-unauthenticated docker-cli \
|
|
17
|
+
|| apt-get install -y --no-install-recommends --allow-unauthenticated docker.io) \
|
|
18
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
19
|
+
|
|
20
|
+
# The Docker Compose plugin, for the DOCKER menu's state and verbs (docker compose ps/up/down/logs)
|
|
21
|
+
# from the dashboard. Neither Debian repository the image may be on ships it, so it comes PINNED from
|
|
22
|
+
# its release, into the directory the docker client already looks in (docker-buildx is there).
|
|
23
|
+
ARG COMPOSE_VERSION=v2.29.7
|
|
24
|
+
RUN mkdir -p /usr/libexec/docker/cli-plugins \
|
|
25
|
+
&& curl -fsSL "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-$(uname -m)" \
|
|
26
|
+
-o /usr/libexec/docker/cli-plugins/docker-compose \
|
|
27
|
+
&& chmod +x /usr/libexec/docker/cli-plugins/docker-compose \
|
|
28
|
+
&& docker compose version
|
|
29
|
+
|
|
30
|
+
# code-server — VS Code in the browser, the Web IDE the project rows link to.
|
|
31
|
+
#
|
|
32
|
+
# The standalone tarball, not their install script: the script wants apt/yum and root and
|
|
33
|
+
# picks its own version, and this image is rebuilt often enough that "whatever is latest"
|
|
34
|
+
# is not a thing to depend on. PINNED, because an editor that changes under people between
|
|
35
|
+
# rebuilds is a support question nobody can answer.
|
|
36
|
+
#
|
|
37
|
+
# It is served on its own hostname (ide.workspace.ddev.site) rather than a subpath — see
|
|
38
|
+
# .ddev/nginx_full/nginx-site.conf for why — and bound to LOOPBACK, so the only way in is
|
|
39
|
+
# through that vhost.
|
|
40
|
+
ARG CODE_SERVER_VERSION=4.135.0
|
|
41
|
+
RUN set -eux; \
|
|
42
|
+
arch="$(dpkg --print-architecture)"; \
|
|
43
|
+
case "$arch" in amd64) cs_arch=amd64 ;; arm64) cs_arch=arm64 ;; *) echo "no code-server build for $arch" >&2; exit 1 ;; esac; \
|
|
44
|
+
wget -qO /tmp/code-server.tar.gz \
|
|
45
|
+
"https://github.com/coder/code-server/releases/download/v${CODE_SERVER_VERSION}/code-server-${CODE_SERVER_VERSION}-linux-${cs_arch}.tar.gz"; \
|
|
46
|
+
mkdir -p /usr/local/lib/code-server; \
|
|
47
|
+
tar -xzf /tmp/code-server.tar.gz -C /usr/local/lib/code-server --strip-components=1; \
|
|
48
|
+
ln -sf /usr/local/lib/code-server/bin/code-server /usr/local/bin/code-server; \
|
|
49
|
+
rm -f /tmp/code-server.tar.gz; \
|
|
50
|
+
code-server --version
|
|
51
|
+
|
|
52
|
+
# The ddev router-lock shim, EARLY on PATH so every `ddev` in this container goes
|
|
53
|
+
# through it — the assistant's Bash calls, the cmd-*.sh scripts, a person in
|
|
54
|
+
# `ddev ssh`, and the Web IDE's terminals. /usr/local/sbin precedes /usr/local/bin
|
|
55
|
+
# in this image's PATH, so the real binary at /usr/local/bin/ddev stays exactly
|
|
56
|
+
# where it is and is found by the shim by absolute path.
|
|
57
|
+
#
|
|
58
|
+
# COPIED, not symlinked into the bind-mounted tree: a symlink would dangle if the
|
|
59
|
+
# workspace were ever not mounted, and a dangling `ddev` breaks every call in here
|
|
60
|
+
# including the dashboard's own status reads. core/scripts/install.sh installs the
|
|
61
|
+
# same file on the host.
|
|
62
|
+
COPY ddev-shim-ddev /usr/local/sbin/ddev
|
|
63
|
+
RUN chmod 0755 /usr/local/sbin/ddev \
|
|
64
|
+
&& /usr/local/sbin/ddev --version > /dev/null \
|
|
65
|
+
&& echo "ddev shim active: $(command -v ddev)"
|
|
66
|
+
|
|
67
|
+
# `ll` — every shell in here is someone reading a directory, and typing
|
|
68
|
+
# `ls -alh` each time is the kind of friction that makes people leave the
|
|
69
|
+
# browser terminal for a real one.
|
|
70
|
+
RUN printf '%s\n' \
|
|
71
|
+
"alias ll='ls -alhF --color=auto'" \
|
|
72
|
+
"alias la='ls -A'" \
|
|
73
|
+
"alias l='ls -CF'" \
|
|
74
|
+
> /etc/profile.d/workspace-aliases.sh \
|
|
75
|
+
&& chmod 0644 /etc/profile.d/workspace-aliases.sh \
|
|
76
|
+
# An alias only exists in an interactive shell, and half the shells here are
|
|
77
|
+
# not one — a screen session running a command, a script, `ddev exec`. So
|
|
78
|
+
# `ll` is also a real command, and behaves the same in both.
|
|
79
|
+
&& printf '%s\n' '#!/bin/sh' 'exec ls -alhF --color=auto "$@"' > /usr/local/bin/ll \
|
|
80
|
+
&& chmod 0755 /usr/local/bin/ll
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# The ddev in here has to be the SAME VERSION as the one on the host, because ddev picks its
|
|
84
|
+
# webserver image from its own version. v1.24.7 pulls ddev/ddev-webserver:v1.24.7, which is Debian
|
|
85
|
+
# bookworm, and the packages.sury.org signing key for bookworm has expired — so `apt-get update`
|
|
86
|
+
# refuses that repo and any project whose `webimage_extra_packages` names a php extension
|
|
87
|
+
# (`php${DDEV_PHP_VERSION}-yaml`, which both site-template projects do) cannot build its web image.
|
|
88
|
+
# The symptom is confusing rather than obvious: setting up a testing environment FROM THE DASHBOARD
|
|
89
|
+
# failed with "Unable to locate package php8.4-yaml" while the identical command succeeded on the
|
|
90
|
+
# host, because only one of the two was on the version whose base image is trixie.
|
|
91
|
+
ARG DDEV_VERSION=1.25.2
|
|
92
|
+
# DDEV 1.25.1 and later build images through `docker compose build`, which needs the buildx CLI
|
|
93
|
+
# plugin — the `docker-cli` package does not carry it, and without it every build from in here
|
|
94
|
+
# stops at "compose build requires buildx 0.17.0 or later". Installed as a plugin binary, which is
|
|
95
|
+
# all the client needs; the actual building happens on the host's daemon over the mounted socket.
|
|
96
|
+
ARG BUILDX_VERSION=0.34.1
|
|
97
|
+
RUN mkdir -p /usr/libexec/docker/cli-plugins \
|
|
98
|
+
&& curl -fsSL "https://github.com/docker/buildx/releases/download/v${BUILDX_VERSION}/buildx-v${BUILDX_VERSION}.linux-amd64" \
|
|
99
|
+
-o /usr/libexec/docker/cli-plugins/docker-buildx \
|
|
100
|
+
&& chmod +x /usr/libexec/docker/cli-plugins/docker-buildx
|
|
101
|
+
|
|
102
|
+
RUN curl -fsSL "https://github.com/ddev/ddev/releases/download/v${DDEV_VERSION}/ddev_linux-amd64.v${DDEV_VERSION}.tar.gz" \
|
|
103
|
+
-o /tmp/ddev.tar.gz \
|
|
104
|
+
&& tar -xzf /tmp/ddev.tar.gz -C /tmp \
|
|
105
|
+
&& mv /tmp/ddev /usr/local/bin/ddev \
|
|
106
|
+
&& chmod +x /usr/local/bin/ddev \
|
|
107
|
+
&& rm -rf /tmp/ddev.tar.gz
|
|
108
|
+
|
|
109
|
+
# The GitHub CLI: the agents/skills pages read webship/ai-agents (private)
|
|
110
|
+
# and fetch items from it. Auth comes from the host's ~/.config/gh, which the
|
|
111
|
+
# dood compose file bind-mounts alongside ~/.claude.
|
|
112
|
+
RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \
|
|
113
|
+
-o /usr/share/keyrings/githubcli-archive-keyring.gpg \
|
|
114
|
+
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \
|
|
115
|
+
> /etc/apt/sources.list.d/github-cli.list \
|
|
116
|
+
&& apt-get update -o Acquire::AllowInsecureRepositories=true || true \
|
|
117
|
+
&& apt-get install -y --no-install-recommends --allow-unauthenticated gh \
|
|
118
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
119
|
+
|
|
120
|
+
# graphify: the knowledge-graph tool behind the Graph button and
|
|
121
|
+
# cmd-tools-graphify.sh. The container has no uv/pipx and no ensurepip, so
|
|
122
|
+
# install uv first and pin the version — graphify's CLI silently ignores
|
|
123
|
+
# unknown flags, so an unpinned upgrade would degrade without erroring.
|
|
124
|
+
#
|
|
125
|
+
# UV_TOOL_DIR matters as much as UV_TOOL_BIN_DIR. Without it, `uv tool install`
|
|
126
|
+
# puts the launcher in /usr/local/bin but the payload under the BUILD user's
|
|
127
|
+
# home — /root/.local/share/uv/tools — and /root is drwx------. The app runs as
|
|
128
|
+
# the web user, so `graphify` resolved to an unreadable path: "Permission
|
|
129
|
+
# denied" for it, `command -v graphify` false, ensure_graphify then reinstalling
|
|
130
|
+
# into a ~/.local/bin that is not on PATH, and the Graph button failing every
|
|
131
|
+
# time while `graphify --version` worked fine as root.
|
|
132
|
+
RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh \
|
|
133
|
+
&& UV_TOOL_DIR=/usr/local/share/uv/tools UV_TOOL_BIN_DIR=/usr/local/bin \
|
|
134
|
+
uv tool install --force "graphifyy[sql]==0.9.28" \
|
|
135
|
+
&& chmod -R a+rX /usr/local/share/uv
|
|
136
|
+
|
|
137
|
+
# Claude Code CLI for the AI assistant chat (/actions/chat shells out to
|
|
138
|
+
# `claude -p`). Auth comes from the host's ~/.claude + ~/.claude.json,
|
|
139
|
+
# bind-mounted in via docker-compose.dood.yaml.
|
|
140
|
+
RUN npm install -g @anthropic-ai/claude-code
|
|
141
|
+
|
|
142
|
+
# graphify (github.com/Graphify-Labs/graphify) parses a codebase with tree-sitter into a knowledge
|
|
143
|
+
# graph. Installed with uv rather than pip: this base image has no pip at all, and Debian's python
|
|
144
|
+
# is externally managed (PEP 668), so a virtual environment is the supported way in — which is what
|
|
145
|
+
# `uv tool install` makes. Pinned, because graphify's node-id scheme changed inside 0.9.x and its
|
|
146
|
+
# CLI ignores unknown flags, so an unpinned upgrade degrades quietly instead of failing.
|
|
147
|
+
#
|
|
148
|
+
# The mcp extra is pinned below 2 separately: graphify 0.9.28 imports `AnyUrl` from a module mcp
|
|
149
|
+
# 2.x moved, and the failure surfaces only as "Connection closed" from whatever tries to use it.
|
|
150
|
+
RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh \
|
|
151
|
+
&& UV_TOOL_BIN_DIR=/usr/local/bin UV_TOOL_DIR=/opt/uv-tools \
|
|
152
|
+
uv tool install --force 'graphifyy[sql]==0.9.28' --with 'mcp<2' \
|
|
153
|
+
&& graphify --version
|
|
154
|
+
|
|
155
|
+
# The browser webship-js drives, plus the system libraries it needs. Chromium only: the suite
|
|
156
|
+
# asserts behaviour, not rendering differences between engines.
|
|
157
|
+
#
|
|
158
|
+
# The apt dance is the same one the automated-testing builder does: a third-party PHP repository
|
|
159
|
+
# with an expired signing key is enabled in this image, and `apt-get update` fails while it is —
|
|
160
|
+
# which makes playwright's own dependency install fail with a message about chromium rather than
|
|
161
|
+
# about apt. The list is parked for the install and put straight back.
|
|
162
|
+
#
|
|
163
|
+
# playwright-core rather than the playwright CLI: the package that ships the browser downloader is
|
|
164
|
+
# already a dependency of webship-js, so nothing extra is installed to install it.
|
|
165
|
+
RUN npm install -g playwright-core@1.56.0 \
|
|
166
|
+
&& mkdir -p /tmp/apt-off \
|
|
167
|
+
&& (mv /etc/apt/sources.list.d/php.list /tmp/apt-off/ 2>/dev/null || true) \
|
|
168
|
+
&& apt-get update -qq \
|
|
169
|
+
&& npx --yes playwright-core@1.56.0 install --with-deps chromium \
|
|
170
|
+
&& (mv /tmp/apt-off/php.list /etc/apt/sources.list.d/ 2>/dev/null || true) \
|
|
171
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
172
|
+
|
|
173
|
+
# The host's /var/run/docker.sock (bind-mounted in) is owned by root:docker
|
|
174
|
+
# with the HOST's docker group GID — find yours with `getent group docker`
|
|
175
|
+
# and adjust the 984 below if it differs. It must be the web user's PRIMARY
|
|
176
|
+
# group, not just a supplementary one: supervisord (which launches
|
|
177
|
+
# web_extra_daemons) drops privileges without calling initgroups(), so
|
|
178
|
+
# supplementary groups from /etc/group never apply to the daemon process —
|
|
179
|
+
# only the primary GID from passwd does. ($username is provided by DDEV's
|
|
180
|
+
# base image build args and matches your host username.)
|
|
181
|
+
# (`docker-cli` does not create the group the way the old `docker.io` package
|
|
182
|
+
# did, so create it when it is missing.)
|
|
183
|
+
RUN if getent group docker > /dev/null; then groupmod -g 973 docker; else groupadd -g 973 docker; fi \
|
|
184
|
+
&& usermod -g 973 $username
|
|
185
|
+
|
|
186
|
+
# `twg` resolves to the host's current binary on every call.
|
|
187
|
+
#
|
|
188
|
+
# The host's ~/.local/bin is bind-mounted at /host-local-bin (see
|
|
189
|
+
# .ddev/docker-compose.twg.yaml); this wrapper is what keeps the NAME on PATH
|
|
190
|
+
# while the file behind it is free to change. Mounting the binary itself bound
|
|
191
|
+
# an inode, so a `twg update` on the host never reached this container and the
|
|
192
|
+
# dashboard kept running a version the server had stopped accepting.
|
|
193
|
+
#
|
|
194
|
+
# `exec` so signals and the exit code pass straight through, and a plain
|
|
195
|
+
# message rather than a 127 when nothing is installed on the host.
|
|
196
|
+
RUN printf '%s\n' '#!/bin/sh' \
|
|
197
|
+
'# Generated by Dockerfile.workspace-app — see .ddev/docker-compose.twg.yaml' \
|
|
198
|
+
'if [ ! -x /host-local-bin/twg ]; then' \
|
|
199
|
+
' echo "twg is not installed on the host (~/.local/bin/twg)." >&2' \
|
|
200
|
+
' exit 127' \
|
|
201
|
+
'fi' \
|
|
202
|
+
'exec /host-local-bin/twg "$@"' > /usr/local/bin/twg \
|
|
203
|
+
&& chmod 0755 /usr/local/bin/twg
|
|
@@ -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 $?
|