@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,93 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Use python's argparse module in shell scripts
|
|
4
|
+
#
|
|
5
|
+
# The function `argparse` parses its arguments using
|
|
6
|
+
# argparse.ArgumentParser; the parser is defined in the function's
|
|
7
|
+
# stdin.
|
|
8
|
+
#
|
|
9
|
+
# Executing ``argparse.bash`` (as opposed to sourcing it) prints a
|
|
10
|
+
# script template.
|
|
11
|
+
#
|
|
12
|
+
# https://github.com/nhoffman/argparse-bash
|
|
13
|
+
# MIT License - Copyright (c) 2015 Noah Hoffman
|
|
14
|
+
|
|
15
|
+
argparse(){
|
|
16
|
+
argparser=$(mktemp 2>/dev/null || mktemp -t argparser)
|
|
17
|
+
cat > "$argparser" <<EOF
|
|
18
|
+
from __future__ import print_function
|
|
19
|
+
import sys
|
|
20
|
+
import argparse
|
|
21
|
+
import os
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class MyArgumentParser(argparse.ArgumentParser):
|
|
25
|
+
def print_help(self, file=None):
|
|
26
|
+
"""Print help and exit with error"""
|
|
27
|
+
super(MyArgumentParser, self).print_help(file=file)
|
|
28
|
+
sys.exit(1)
|
|
29
|
+
|
|
30
|
+
parser = MyArgumentParser(prog=os.path.basename("$0"),
|
|
31
|
+
description="""$ARGPARSE_DESCRIPTION""")
|
|
32
|
+
EOF
|
|
33
|
+
|
|
34
|
+
# stdin to this function should contain the parser definition
|
|
35
|
+
cat >> "$argparser"
|
|
36
|
+
|
|
37
|
+
cat >> "$argparser" <<EOF
|
|
38
|
+
args = parser.parse_args()
|
|
39
|
+
for arg in [a for a in dir(args) if not a.startswith('_')]:
|
|
40
|
+
key = arg.upper()
|
|
41
|
+
value = getattr(args, arg, None)
|
|
42
|
+
|
|
43
|
+
if isinstance(value, bool) or value is None:
|
|
44
|
+
print('{0}="{1}";'.format(key, 'yes' if value else ''))
|
|
45
|
+
elif isinstance(value, list):
|
|
46
|
+
print('{0}=({1});'.format(key, ' '.join('"{0}"'.format(s) for s in value)))
|
|
47
|
+
else:
|
|
48
|
+
print('{0}="{1}";'.format(key, value))
|
|
49
|
+
EOF
|
|
50
|
+
|
|
51
|
+
# Define variables corresponding to the options if the args can be
|
|
52
|
+
# parsed without errors; otherwise, print the text of the error
|
|
53
|
+
# message.
|
|
54
|
+
#
|
|
55
|
+
# The command substitution MUST be quoted. Unquoted, the shell word-splits
|
|
56
|
+
# and glob-expands the generated assignments before eval ever sees them, so
|
|
57
|
+
# any argument value containing *, ? or [...] is silently rewritten to
|
|
58
|
+
# whatever it happens to match in the current directory:
|
|
59
|
+
#
|
|
60
|
+
# --summary "manage every cmd-*.sh here"
|
|
61
|
+
# run from commands/ -> "manage every cmd-tools-commands.sh here"
|
|
62
|
+
# run from elsewhere -> unchanged
|
|
63
|
+
#
|
|
64
|
+
# It corrupts quietly and the result depends on the working directory, which
|
|
65
|
+
# is why it went unnoticed: a glob matching nothing survives untouched.
|
|
66
|
+
if python "$argparser" "$@" &> /dev/null; then
|
|
67
|
+
eval "$(python "$argparser" "$@")"
|
|
68
|
+
retval=0
|
|
69
|
+
else
|
|
70
|
+
python "$argparser" "$@"
|
|
71
|
+
retval=1
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
rm "$argparser"
|
|
75
|
+
return $retval
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# print a script template when this script is executed
|
|
79
|
+
if [[ $0 == *argparse.bash ]]; then
|
|
80
|
+
cat <<FOO
|
|
81
|
+
#!/usr/bin/env bash
|
|
82
|
+
|
|
83
|
+
source \$(dirname \$0)/argparse.bash || exit 1
|
|
84
|
+
argparse "\$@" <<EOF || exit 1
|
|
85
|
+
parser.add_argument('infile')
|
|
86
|
+
parser.add_argument('-o', '--outfile')
|
|
87
|
+
|
|
88
|
+
EOF
|
|
89
|
+
|
|
90
|
+
echo "INFILE: \${INFILE}"
|
|
91
|
+
echo "OUTFILE: \${OUTFILE}"
|
|
92
|
+
FOO
|
|
93
|
+
fi
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# shellcheck disable=SC1003
|
|
3
|
+
|
|
4
|
+
# Based on https://gist.github.com/pkuczynski/8665367
|
|
5
|
+
|
|
6
|
+
parse_yaml() {
|
|
7
|
+
local yaml_file=$1
|
|
8
|
+
local prefix=$2
|
|
9
|
+
local s
|
|
10
|
+
local w
|
|
11
|
+
local fs
|
|
12
|
+
|
|
13
|
+
s='[[:space:]]*'
|
|
14
|
+
w='[a-zA-Z0-9_.-]*'
|
|
15
|
+
fs="$(echo @|tr @ '\034')"
|
|
16
|
+
|
|
17
|
+
(
|
|
18
|
+
sed -e '/- [^\“]'"[^\']"'.*: /s|\([ ]*\)- \([[:space:]]*\)|\1-\'$'\n'' \1\2|g' |
|
|
19
|
+
|
|
20
|
+
sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \
|
|
21
|
+
-e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \
|
|
22
|
+
-e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
|
|
23
|
+
-e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" |
|
|
24
|
+
|
|
25
|
+
awk -F"$fs" '{
|
|
26
|
+
indent = length($1)/2;
|
|
27
|
+
if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";}
|
|
28
|
+
vname[indent] = $2;
|
|
29
|
+
for (i in vname) {if (i > indent) {delete vname[i]}}
|
|
30
|
+
if (length($3) > 0) {
|
|
31
|
+
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
|
|
32
|
+
printf("%s%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1],$3);
|
|
33
|
+
}
|
|
34
|
+
}' |
|
|
35
|
+
|
|
36
|
+
sed -e 's/_=/+=/g' |
|
|
37
|
+
|
|
38
|
+
awk 'BEGIN {
|
|
39
|
+
FS="=";
|
|
40
|
+
OFS="="
|
|
41
|
+
}
|
|
42
|
+
/(-|\.).*=/ {
|
|
43
|
+
gsub("-|\\.", "_", $1)
|
|
44
|
+
}
|
|
45
|
+
{ print }'
|
|
46
|
+
) < "$yaml_file"
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
create_variables() {
|
|
50
|
+
local yaml_file="$1"
|
|
51
|
+
eval "$(parse_yaml "$yaml_file")"
|
|
52
|
+
}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What checks a package already declares, and which of them are safe to run.
|
|
3
|
+
*
|
|
4
|
+
* The workspace is full of packages — 79 products, 16 modules, 5 themes, 3 libraries, plus every
|
|
5
|
+
* Drupal site in dev/test/demos — and nearly all of them already declare their own quality scripts:
|
|
6
|
+
* `lint:js`, `lint:css`, `lint:yaml`, `spellcheck`, `phpcs`, `test:chromium`. They just spell them
|
|
7
|
+
* differently, and nothing ran them from one place. This resolves a package's own vocabulary onto a
|
|
8
|
+
* fixed set of canonical checks, so `cmd-tools-checks.sh <name>` means the same thing everywhere.
|
|
9
|
+
*
|
|
10
|
+
* It NEVER invents a command. Every row points at a script the package itself declared; the runner
|
|
11
|
+
* is what puts node_modules/.bin on PATH, so execution is always `<npm|yarn> run <script>`, never a
|
|
12
|
+
* raw shell exec of the declared text.
|
|
13
|
+
*
|
|
14
|
+
* One module, two callers: the shell verb shells out to it for a plan, and the dashboard requires it
|
|
15
|
+
* for the caption under the Checks button. Neither re-implements the map, so the button and the
|
|
16
|
+
* command can never disagree about what a package offers.
|
|
17
|
+
*
|
|
18
|
+
* No dependencies — Node's own fs and path. It is read by a bash function through a TSV contract and
|
|
19
|
+
* by a Node app through require(), and it must work in both without a package.json around it.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
'use strict';
|
|
23
|
+
|
|
24
|
+
const fs = require('fs');
|
|
25
|
+
const path = require('path');
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The canonical checks, in the order they run: cheap and hermetic first, PHP after the Node ones
|
|
29
|
+
* because it is the one most often skipped, the browser suite last because it needs a running site.
|
|
30
|
+
*
|
|
31
|
+
* `names` is the preference order of DECLARED script names. First match wins; the rest of the row is
|
|
32
|
+
* not considered, so a package that declares both `lint:js` and `lint:eslint` runs one of them.
|
|
33
|
+
*/
|
|
34
|
+
const ALIASES = [
|
|
35
|
+
{ id: 'format', label: 'Formatting', names: ['format:check', 'lint:prettier', 'prettier:check'] },
|
|
36
|
+
{ id: 'js', label: 'JavaScript', names: ['lint:js', 'lint:eslint', 'eslint'] },
|
|
37
|
+
{ id: 'css', label: 'CSS', names: ['lint:css', 'lint:stylelint', 'stylelint'] },
|
|
38
|
+
{ id: 'yaml', label: 'YAML', names: ['lint:yaml', 'yamllint'] },
|
|
39
|
+
{ id: 'spelling', label: 'Spelling', names: ['spellcheck', 'lint:cspell', 'cspell'] },
|
|
40
|
+
{ id: 'types', label: 'Types', names: ['lint:tsc', 'typecheck', 'tsc'] },
|
|
41
|
+
{ id: 'php', label: 'PHP standards', names: ['phpcs'] },
|
|
42
|
+
{ id: 'twig', label: 'Twig', names: [] }, // add-on only; no package declares one
|
|
43
|
+
{ id: 'e2e', label: 'Browser suite', names: [] }, // resolved separately: test:<browser>
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
const LINT_IDS = ['format', 'js', 'css', 'yaml', 'spelling', 'types'];
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* A script that lies about its exit code. `something || exit 0` reports success whatever happened,
|
|
50
|
+
* so a green summary built on it would be a lie — and one module in this tree does exactly that to
|
|
51
|
+
* three of its lint scripts. Refusing it FAILS the run rather than skipping quietly: the workspace
|
|
52
|
+
* rule is that no check may be masked, and the visible escape is --skip <id>.
|
|
53
|
+
*/
|
|
54
|
+
const MASK = /\|\|\s*(true|exit\s+0)\b/;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Commands that write, watch or serve. Matched on the command TEXT, before the name, and that order
|
|
58
|
+
* matters: a script called `lint-all` whose body ends in `--fix` writes to the tree, and a theme's
|
|
59
|
+
* `theme:build` ends in `stylelint --fix`. Name matching alone lets both through.
|
|
60
|
+
*/
|
|
61
|
+
const DENY_COMMAND = new RegExp([
|
|
62
|
+
'(^|\\s)--fix(\\s|$)', '(^|\\s)--write(\\s|$)',
|
|
63
|
+
'\\bnodemon\\b', '(^|\\s)--watch(\\s|$)',
|
|
64
|
+
'\\bhugo\\s+server\\b', '\\bhttp-server\\b', '\\bkarma\\s+start\\b',
|
|
65
|
+
'\\bplaywright\\s+install\\b', '\\bHEADLESS=false\\b', '\\blint-staged\\b',
|
|
66
|
+
'\\bnpm-run-all\\b', '\\bconcurrently\\b', '\\bwebpack\\b',
|
|
67
|
+
'\\bnpm\\s+install\\b', '\\byarn\\s+install\\b', '\\brm\\s+-rf\\b',
|
|
68
|
+
].join('|'));
|
|
69
|
+
|
|
70
|
+
/** Script names never dispatched in read-only mode, whatever their body says. */
|
|
71
|
+
const DENY_NAMES = new Set([
|
|
72
|
+
'phpcbf', 'format', 'fix', 'lint-all', 'lint-staged', 'watch', 'start', 'dev', 'serve',
|
|
73
|
+
'docs-serve', 'build', 'dist', 'js-test', 'docs-build', 'postinstall', 'prepare', 'prepublish',
|
|
74
|
+
'css:watch', 'css:build', 'css:compile', 'theme:watch', 'theme:build', 'theme:init',
|
|
75
|
+
'theme:full-build', 'components:build', 'storybook', 'storybook:build',
|
|
76
|
+
'test:headed', 'test:playwright',
|
|
77
|
+
]);
|
|
78
|
+
|
|
79
|
+
/** A `test` script is only a browser suite if it actually drives one. */
|
|
80
|
+
const E2E_OK = /\bcucumber(-js)?\b|\bcucumber\.js\b|\bplaywright\s+test\b/;
|
|
81
|
+
|
|
82
|
+
/** With --fix, these three are the only rows, and only these names are allowed to write. */
|
|
83
|
+
const FIX_MAP = [
|
|
84
|
+
{ id: 'php', label: 'PHP standards', names: ['phpcbf'] },
|
|
85
|
+
{ id: 'format', label: 'Formatting', names: ['format', 'fix'] },
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
const readJson = (file) => {
|
|
89
|
+
try { return JSON.parse(fs.readFileSync(file, 'utf8')); } catch (_) { return null; }
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Which package manager, and why. The reason is printed, because "it used yarn" is a question
|
|
94
|
+
* somebody asks when a check behaves differently from their terminal.
|
|
95
|
+
*/
|
|
96
|
+
function resolveRunner(dir, forced) {
|
|
97
|
+
if (forced && forced !== '_none_') return { runner: forced, reason: `--runner ${forced}` };
|
|
98
|
+
const pkg = readJson(path.join(dir, 'package.json')) || {};
|
|
99
|
+
const bothLocks = fs.existsSync(path.join(dir, 'yarn.lock')) && fs.existsSync(path.join(dir, 'package-lock.json'));
|
|
100
|
+
if (typeof pkg.packageManager === 'string' && pkg.packageManager.startsWith('yarn')) {
|
|
101
|
+
return { runner: 'yarn', reason: `packageManager: ${pkg.packageManager}${bothLocks ? ' (both lockfiles present — pass --runner npm to override)' : ''}` };
|
|
102
|
+
}
|
|
103
|
+
if (typeof pkg.packageManager === 'string' && pkg.packageManager.startsWith('npm')) {
|
|
104
|
+
return { runner: 'npm', reason: `packageManager: ${pkg.packageManager}` };
|
|
105
|
+
}
|
|
106
|
+
if (fs.existsSync(path.join(dir, 'yarn.lock'))) {
|
|
107
|
+
return { runner: 'yarn', reason: bothLocks ? 'yarn.lock (both lockfiles present — pass --runner npm to override)' : 'yarn.lock' };
|
|
108
|
+
}
|
|
109
|
+
if (fs.existsSync(path.join(dir, 'package-lock.json'))) return { runner: 'npm', reason: 'package-lock.json' };
|
|
110
|
+
return { runner: null, reason: 'no lockfile and no packageManager field — pass --runner' };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Are the dependencies there? `.pnp.cjs` as well as `node_modules`: four packages here are Yarn PnP
|
|
115
|
+
* and have no node_modules at all while being perfectly runnable, and a node_modules-only test
|
|
116
|
+
* reports them as broken.
|
|
117
|
+
*/
|
|
118
|
+
function resolveDeps(dir) {
|
|
119
|
+
if (fs.existsSync(path.join(dir, 'node_modules', '.bin'))) return { installed: true, evidence: 'node_modules/.bin' };
|
|
120
|
+
// Yarn PnP has no node_modules at all and is still runnable — but only when PnP is what the
|
|
121
|
+
// package actually uses. `.pnp.cjs` left behind by an earlier install, beside a `.yarnrc.yml` that
|
|
122
|
+
// now says `nodeLinker: node-modules`, is not an installed package: yarn answers "Couldn't find
|
|
123
|
+
// the node_modules state file" and every check fails for a reason that has nothing to do with the
|
|
124
|
+
// code. Both conditions, or it is not installed.
|
|
125
|
+
if (fs.existsSync(path.join(dir, '.pnp.cjs'))) {
|
|
126
|
+
let rc = '';
|
|
127
|
+
try { rc = fs.readFileSync(path.join(dir, '.yarnrc.yml'), 'utf8'); } catch (_) { /* none is fine */ }
|
|
128
|
+
if (!/nodeLinker:\s*node-modules/.test(rc)) return { installed: true, evidence: '.pnp.cjs (Yarn PnP)' };
|
|
129
|
+
return { installed: false, evidence: '.pnp.cjs is stale — .yarnrc.yml asks for nodeLinker: node-modules' };
|
|
130
|
+
}
|
|
131
|
+
return { installed: false, evidence: 'no node_modules/.bin and no .pnp.cjs' };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** The first declared name in the row's preference order, with the reason it was or was not taken. */
|
|
135
|
+
function pick(scripts, names) {
|
|
136
|
+
for (const name of names) {
|
|
137
|
+
if (Object.prototype.hasOwnProperty.call(scripts, name)) return { name, command: String(scripts[name]) };
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** The safety rule, in order. The first hit wins and the row is never executed. */
|
|
143
|
+
function judge(id, name, command, { fix = false } = {}) {
|
|
144
|
+
if (MASK.test(command)) {
|
|
145
|
+
return { status: 'masked', reason: 'the script ends in || exit 0 — a green result from it would be a lie' };
|
|
146
|
+
}
|
|
147
|
+
if (!fix) {
|
|
148
|
+
const denied = DENY_COMMAND.exec(command);
|
|
149
|
+
if (denied) return { status: 'refused', reason: `the command ${denied[0].trim()} writes, watches or serves` };
|
|
150
|
+
if (DENY_NAMES.has(name)) return { status: 'refused', reason: `${name} is not a read-only check` };
|
|
151
|
+
}
|
|
152
|
+
// A stylelint call with a config and no path lints nothing at all, and says so with exit 0.
|
|
153
|
+
if (id === 'css' && /stylelint/.test(command) && !/(^|\s)[^-\s][^\s]*\.(css|scss)|(^|\s)"[^"]+"|(^|\s)'[^']+'|(^|\s)\.(\s|$)/.test(command.replace(/--config[= ]\S+/, ''))) {
|
|
154
|
+
return { status: 'refused', reason: 'stylelint names no files — this script checks nothing' };
|
|
155
|
+
}
|
|
156
|
+
return { status: 'ready', reason: '' };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* The plan for one package.
|
|
161
|
+
*
|
|
162
|
+
* @param {string} dir absolute path to the package or site
|
|
163
|
+
* @param {object} opts { only, skip, runner, e2e, browser, fix, assumeInstalled, isSite, hasDevTools }
|
|
164
|
+
* @returns {object} { dir, hasPackageJson, runner, runnerReason, deps, rows: [...] }
|
|
165
|
+
*/
|
|
166
|
+
function resolvePlan(dir, opts = {}) {
|
|
167
|
+
const {
|
|
168
|
+
only = null, skip = null, runner: forcedRunner = null, e2e = false,
|
|
169
|
+
browser = 'chromium', fix = false, assumeInstalled = false,
|
|
170
|
+
isSite = fs.existsSync(path.join(dir, '.ddev', 'config.yaml')),
|
|
171
|
+
hasDevTools = fs.existsSync(path.join(dir, '.ddev', 'commands', 'web', 'dev-phpcs')),
|
|
172
|
+
} = opts;
|
|
173
|
+
|
|
174
|
+
const pkg = readJson(path.join(dir, 'package.json'));
|
|
175
|
+
const scripts = (pkg && pkg.scripts) || {};
|
|
176
|
+
const { runner, reason: runnerReason } = resolveRunner(dir, forcedRunner);
|
|
177
|
+
const deps = assumeInstalled ? { installed: true, evidence: 'just installed' } : resolveDeps(dir);
|
|
178
|
+
const wanted = (list) => (list && list !== '_none_' ? String(list).split(',').map((s) => s.trim()).filter(Boolean) : null);
|
|
179
|
+
const onlyIds = wanted(only);
|
|
180
|
+
const skipIds = wanted(skip) || [];
|
|
181
|
+
|
|
182
|
+
const map = fix ? FIX_MAP : ALIASES;
|
|
183
|
+
const rows = [];
|
|
184
|
+
let anyLintPart = false;
|
|
185
|
+
|
|
186
|
+
for (const alias of map) {
|
|
187
|
+
const row = { id: alias.id, label: alias.label, script: '', command: '', status: 'none', reason: 'not declared' };
|
|
188
|
+
|
|
189
|
+
// e2e is resolved on the browser rather than on a fixed name.
|
|
190
|
+
if (alias.id === 'e2e') {
|
|
191
|
+
const byBrowser = pick(scripts, [`test:${browser}`]);
|
|
192
|
+
const generic = pick(scripts, ['test']);
|
|
193
|
+
const found = byBrowser || (generic && E2E_OK.test(generic.command) ? generic : null);
|
|
194
|
+
if (found) {
|
|
195
|
+
row.script = found.name;
|
|
196
|
+
row.command = found.command;
|
|
197
|
+
if (!e2e) { row.status = 'none'; row.reason = `${found.name} is declared — add --e2e to run it`; }
|
|
198
|
+
else if (!isSite) { row.status = 'refused'; row.reason = 'a package has no site to test against — build one in dev/ and run cmd-tools-testing.sh there'; }
|
|
199
|
+
else Object.assign(row, judge(alias.id, found.name, found.command));
|
|
200
|
+
} else if (generic) {
|
|
201
|
+
row.reason = 'a test script is declared but it does not drive a browser';
|
|
202
|
+
}
|
|
203
|
+
} else {
|
|
204
|
+
const found = pick(scripts, alias.names);
|
|
205
|
+
if (found) {
|
|
206
|
+
row.script = found.name;
|
|
207
|
+
row.command = found.command;
|
|
208
|
+
Object.assign(row, judge(alias.id, found.name, found.command, { fix }));
|
|
209
|
+
} else if (alias.id === 'php' && hasDevTools) {
|
|
210
|
+
row.script = 'ddev dev-phpcs';
|
|
211
|
+
row.command = 'ddev dev-phpcs --all';
|
|
212
|
+
row.status = 'ready';
|
|
213
|
+
row.reason = 'from the ddev-dev-tools add-on';
|
|
214
|
+
} else if (alias.id === 'twig' && hasDevTools) {
|
|
215
|
+
row.script = 'ddev dev-twigcs';
|
|
216
|
+
row.command = 'ddev dev-twigcs --all';
|
|
217
|
+
row.status = 'ready';
|
|
218
|
+
row.reason = 'from the ddev-dev-tools add-on';
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// What a row needs before it can run.
|
|
223
|
+
//
|
|
224
|
+
// The Node checks need the package manager and its node_modules; phpcs does not — it is a
|
|
225
|
+
// composer binary, and `yarn run phpcs` only puts node_modules/.bin on PATH. Reporting a phpcs
|
|
226
|
+
// row green without vendor/bin/phpcs having existed would be reporting a command that never ran.
|
|
227
|
+
if (row.status === 'ready' && !row.script.startsWith('ddev ')) {
|
|
228
|
+
if (row.id === 'php') {
|
|
229
|
+
if (!fs.existsSync(path.join(dir, 'vendor', 'bin', 'phpcs'))) {
|
|
230
|
+
row.status = 'skipped';
|
|
231
|
+
row.reason = 'phpcs is declared but there is no vendor/bin/phpcs here — run it in a site, or add the ddev-dev-tools add-on there';
|
|
232
|
+
}
|
|
233
|
+
} else if (!runner) {
|
|
234
|
+
row.status = 'unresolved-runner';
|
|
235
|
+
row.reason = runnerReason;
|
|
236
|
+
} else if (!deps.installed) {
|
|
237
|
+
row.status = 'deps-missing';
|
|
238
|
+
row.reason = `${deps.evidence} — pass --install`;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (row.status === 'ready' && LINT_IDS.includes(row.id)) anyLintPart = true;
|
|
243
|
+
if (onlyIds && !onlyIds.includes(row.id) && row.status === 'ready') { row.status = 'none'; row.reason = `not in --only ${onlyIds.join(',')}`; }
|
|
244
|
+
if (skipIds.includes(row.id) && row.status !== 'none') { row.status = 'skipped'; row.reason = `--skip ${row.id}`; }
|
|
245
|
+
rows.push(row);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* The aggregate rule. A package that declares `lint` AND its parts would otherwise run both — the
|
|
250
|
+
* double work the requirement warns about. The parts win; the aggregate is only used when nothing
|
|
251
|
+
* else resolved, and is then judged like any other row.
|
|
252
|
+
*/
|
|
253
|
+
if (!fix && !anyLintPart && Object.prototype.hasOwnProperty.call(scripts, 'lint')) {
|
|
254
|
+
const command = String(scripts.lint);
|
|
255
|
+
const verdict = judge('lint', 'lint', command);
|
|
256
|
+
const at = rows.findIndex((r) => r.id === 'js');
|
|
257
|
+
rows.splice(at, 0, {
|
|
258
|
+
id: 'lint', label: 'All linters (aggregate)', script: 'lint', command, ...verdict,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return {
|
|
263
|
+
dir,
|
|
264
|
+
hasPackageJson: !!pkg,
|
|
265
|
+
isSite,
|
|
266
|
+
hasDevTools,
|
|
267
|
+
runner,
|
|
268
|
+
runnerReason,
|
|
269
|
+
deps,
|
|
270
|
+
postinstall: ['postinstall', 'prepare', 'prepublish'].filter((n) => scripts[n]).map((n) => `${n}: ${scripts[n]}`),
|
|
271
|
+
rows,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/* ---------------------------------------------------------------------------
|
|
276
|
+
* The CLI the shell function talks to. TSV rather than JSON, because bash reads
|
|
277
|
+
* it with `while IFS=$'\t' read` and nothing else has to be installed.
|
|
278
|
+
* ------------------------------------------------------------------------ */
|
|
279
|
+
|
|
280
|
+
function main(argv) {
|
|
281
|
+
const dir = argv[0];
|
|
282
|
+
if (!dir) { process.stderr.write('usage: checks_plan.js <project-path> [--format=tsv|meta|json] [--only=…] [--skip=…]\n'); return 2; }
|
|
283
|
+
const flag = (name, fallback = null) => {
|
|
284
|
+
const hit = argv.find((a) => a.startsWith(`--${name}=`));
|
|
285
|
+
return hit ? hit.slice(name.length + 3) : fallback;
|
|
286
|
+
};
|
|
287
|
+
const has = (name) => argv.includes(`--${name}`);
|
|
288
|
+
const plan = resolvePlan(dir, {
|
|
289
|
+
only: flag('only'), skip: flag('skip'), runner: flag('runner'),
|
|
290
|
+
browser: flag('browser', 'chromium'), e2e: has('e2e'), fix: has('fix'),
|
|
291
|
+
assumeInstalled: has('assume-installed'),
|
|
292
|
+
});
|
|
293
|
+
const format = flag('format', 'tsv');
|
|
294
|
+
|
|
295
|
+
if (format === 'json') { process.stdout.write(`${JSON.stringify(plan, null, 2)}\n`); return 0; }
|
|
296
|
+
if (format === 'meta') {
|
|
297
|
+
process.stdout.write([
|
|
298
|
+
plan.runner || '', plan.runnerReason, plan.deps.installed ? 'yes' : 'no', plan.deps.evidence,
|
|
299
|
+
String(plan.postinstall.length), plan.hasPackageJson ? 'yes' : 'no', plan.isSite ? 'yes' : 'no',
|
|
300
|
+
].join('\t') + '\n');
|
|
301
|
+
for (const line of plan.postinstall) process.stdout.write(`postinstall\t${line}\n`);
|
|
302
|
+
return 0;
|
|
303
|
+
}
|
|
304
|
+
for (const r of plan.rows) {
|
|
305
|
+
process.stdout.write([r.id, r.label, r.status, r.script, r.command.replace(/\s+/g, ' '), r.reason].join('\t') + '\n');
|
|
306
|
+
}
|
|
307
|
+
return 0;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (require.main === module) process.exit(main(process.argv.slice(2)));
|
|
311
|
+
|
|
312
|
+
module.exports = { resolvePlan, resolveRunner, resolveDeps, judge, ALIASES, DENY_NAMES, DENY_COMMAND, MASK, E2E_OK, LINT_IDS };
|