wasm-cli 1.0.0__tar.gz → 1.0.1__tar.gz
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.
- {wasm_cli-1.0.0/src/wasm_cli.egg-info → wasm_cli-1.0.1}/PKG-INFO +1 -1
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/pyproject.toml +1 -1
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/setup.py +1 -1
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/__init__.py +1 -1
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/base.py +1 -1
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/package_manager.py +64 -14
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/monorepo.py +5 -2
- {wasm_cli-1.0.0 → wasm_cli-1.0.1/src/wasm_cli.egg-info}/PKG-INFO +1 -1
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/LICENSE +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/MANIFEST.in +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/README.md +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/MONITOR.md +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/OBS_SETUP.md +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/assets/logo.png +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/assets/logo_bg.png +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/superpowers/specs/2026-08-12-wasm-panel-design-direction.md +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/superpowers/specs/2026-08-12-wasm-v1-refactor-design.md +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/man/wasm.1 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/setup.cfg +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/__main__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/app.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/backup.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/cert.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/config.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/db.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/env.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/health.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/monitor.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/service.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/setup.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/site.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/store.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/version.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/web.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/webapp.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/interactive.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/config.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/dependencies.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/exceptions.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/fs.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/logger.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/runner.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/store.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/update_checker.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/utils.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/auto.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/docker_compose.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/env_manager.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/health.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/nginx_config.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/path_resolver.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/preflight.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/prisma.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/registration.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/summary.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/turbo.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/workspace.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/interface.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/nextjs.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/nodejs.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/pipeline.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/python.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/registry.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/static.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/vite.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/main.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/apache_manager.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/backup_manager.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/backup_scheduler.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/base_manager.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/cert_manager.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/base.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/mongodb.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/mysql.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/postgres.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/redis.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/registry.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/nginx_manager.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/service_manager.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/source_manager.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/webserver.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/email_notifier.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/metrics.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/models.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/observation_store.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/process_monitor.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/signals.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/apache/proxy.conf.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/apache/static.conf.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/nginx/advanced.conf.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/nginx/monorepo.conf.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/nginx/proxy.conf.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/nginx/static.conf.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/systemd/_escape.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/systemd/app.service.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/systemd/backup-service.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/systemd/backup-timer.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/systemd/docker-compose.service.j2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/domain.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/environment.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/names.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/port.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/source.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/ssh.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/apps.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/auth.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/backups.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/certs.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/config.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/databases.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/deps.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/jobs.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/monitor.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/router.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/services.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/sites.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/system.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/auth.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/jobs.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/server.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/app.css +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/logo.png +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/logo.webp +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/panel.js +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/alpine.min.js +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/fonts/ibm-plex-mono-latin-400-normal.woff2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/fonts/ibm-plex-mono-latin-500-normal.woff2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/fonts/ibm-plex-sans-condensed-latin-500-normal.woff2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/fonts/ibm-plex-sans-condensed-latin-600-normal.woff2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/fonts/ibm-plex-sans-latin-400-normal.woff2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/fonts/ibm-plex-sans-latin-500-normal.woff2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/fonts/ibm-plex-sans-latin-600-normal.woff2 +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/htmx.min.js +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/uplot.min.css +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/uplot.min.js +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/xterm.css +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/xterm.js +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/_macros.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/base.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/fragments/machine.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/login.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/activity.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/app.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/backups.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/certificates.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/dashboard.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/missing.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/resources.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/settings.html +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/context.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/machine.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/rendering.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/resources.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/router.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/websockets/__init__.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/websockets/router.py +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm_cli.egg-info/SOURCES.txt +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm_cli.egg-info/dependency_links.txt +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm_cli.egg-info/entry_points.txt +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm_cli.egg-info/requires.txt +0 -0
- {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm_cli.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "wasm-cli"
|
|
7
|
-
version = "1.0.
|
|
7
|
+
version = "1.0.1"
|
|
8
8
|
description = "Web App System Management - Deploy and manage web applications on Linux servers"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "WASM-NCSAL" }
|
|
@@ -9,7 +9,7 @@ from setuptools import setup, find_packages
|
|
|
9
9
|
|
|
10
10
|
setup(
|
|
11
11
|
name="wasm-cli",
|
|
12
|
-
version="1.0.
|
|
12
|
+
version="1.0.1",
|
|
13
13
|
description="Web App System Management - Deploy and manage web applications on Linux servers",
|
|
14
14
|
author="Yago López Prado",
|
|
15
15
|
author_email="yago.lopez.adeje@gmail.com",
|
|
@@ -15,7 +15,7 @@ from importlib.metadata import version as _installed_version
|
|
|
15
15
|
#: as an OBS build directory. The single source of truth is the ``version``
|
|
16
16
|
#: field of pyproject.toml; ``scripts/release.py`` keeps this literal and the
|
|
17
17
|
#: distribution packaging files in step with it.
|
|
18
|
-
_FALLBACK_VERSION = "1.0.
|
|
18
|
+
_FALLBACK_VERSION = "1.0.1"
|
|
19
19
|
|
|
20
20
|
try:
|
|
21
21
|
__version__ = _installed_version("wasm-cli")
|
|
@@ -120,7 +120,7 @@ class BaseDeployer(AppDeployer):
|
|
|
120
120
|
self._registrar: StoreRegistrar | None = None
|
|
121
121
|
|
|
122
122
|
# Helpers
|
|
123
|
-
self._pm_helper = PackageManagerHelper(logger=self.logger)
|
|
123
|
+
self._pm_helper = PackageManagerHelper(logger=self.logger, runner=self.runner)
|
|
124
124
|
self._path_resolver = PathResolver(logger=self.logger)
|
|
125
125
|
self._prisma_helper: PrismaHelper | None = None # Initialized after app_path is set
|
|
126
126
|
|
|
@@ -7,14 +7,21 @@ Package manager helper for deployers.
|
|
|
7
7
|
|
|
8
8
|
Handles detection, verification, and command generation for
|
|
9
9
|
Node.js package managers (npm, pnpm, yarn, bun).
|
|
10
|
+
|
|
11
|
+
Availability is asked of the injected :class:`~wasm.core.runner.CommandRunner`,
|
|
12
|
+
not of the process PATH. Reading the PATH directly made the answer depend on
|
|
13
|
+
whichever machine happened to run the code, which is untestable and, worse,
|
|
14
|
+
meant a deploy could silently substitute one package manager for another.
|
|
10
15
|
"""
|
|
11
16
|
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
12
19
|
from pathlib import Path
|
|
13
20
|
from typing import Literal
|
|
14
21
|
|
|
15
22
|
from wasm.core.exceptions import DeploymentError
|
|
16
23
|
from wasm.core.logger import Logger
|
|
17
|
-
from wasm.core.
|
|
24
|
+
from wasm.core.runner import CommandRunner, get_runner
|
|
18
25
|
|
|
19
26
|
PackageManager = Literal["npm", "pnpm", "bun", "yarn", "auto"]
|
|
20
27
|
|
|
@@ -27,14 +34,30 @@ class PackageManagerHelper:
|
|
|
27
34
|
Node.js package managers.
|
|
28
35
|
"""
|
|
29
36
|
|
|
30
|
-
|
|
37
|
+
#: Lock files, in the order that decides which manager a project uses.
|
|
38
|
+
LOCK_FILES: tuple[tuple[str, str], ...] = (
|
|
39
|
+
("pnpm-lock.yaml", "pnpm"),
|
|
40
|
+
("pnpm-workspace.yaml", "pnpm"),
|
|
41
|
+
("bun.lockb", "bun"),
|
|
42
|
+
("yarn.lock", "yarn"),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
def __init__(self, logger: Logger | None = None, runner: CommandRunner | None = None):
|
|
31
46
|
"""
|
|
32
47
|
Initialize package manager helper.
|
|
33
48
|
|
|
34
49
|
Args:
|
|
35
50
|
logger: Logger instance for output.
|
|
51
|
+
runner: Runner used to ask whether a program is installed. Defaults
|
|
52
|
+
to the process-wide one.
|
|
36
53
|
"""
|
|
37
54
|
self.logger = logger or Logger()
|
|
55
|
+
self._runner = runner
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def runner(self) -> CommandRunner:
|
|
59
|
+
"""The runner availability is asked of."""
|
|
60
|
+
return self._runner if self._runner is not None else get_runner()
|
|
38
61
|
|
|
39
62
|
def detect(self, app_path: Path, requested: PackageManager = "auto") -> str:
|
|
40
63
|
"""
|
|
@@ -63,23 +86,25 @@ class PackageManagerHelper:
|
|
|
63
86
|
|
|
64
87
|
return "npm"
|
|
65
88
|
|
|
66
|
-
def verify(self, package_manager: str) -> str:
|
|
89
|
+
def verify(self, package_manager: str, *, negotiable: bool = True) -> str:
|
|
67
90
|
"""
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
Falls back to an available package manager if the requested
|
|
71
|
-
one is not installed.
|
|
91
|
+
Check the package manager is installed, or explain what to do.
|
|
72
92
|
|
|
73
93
|
Args:
|
|
74
|
-
package_manager:
|
|
94
|
+
package_manager: The manager the project needs.
|
|
95
|
+
negotiable: Whether another manager would do. False for a workspace
|
|
96
|
+
that only one manager can install, where substituting produces
|
|
97
|
+
a broken tree rather than a different one.
|
|
75
98
|
|
|
76
99
|
Returns:
|
|
77
|
-
|
|
100
|
+
The manager to use. Differs from the request only when the request
|
|
101
|
+
was negotiable and unavailable.
|
|
78
102
|
|
|
79
103
|
Raises:
|
|
80
|
-
DeploymentError:
|
|
104
|
+
DeploymentError: When the manager is missing and no substitute is
|
|
105
|
+
acceptable, or when none is installed at all.
|
|
81
106
|
"""
|
|
82
|
-
if
|
|
107
|
+
if self.runner.exists(package_manager):
|
|
83
108
|
return package_manager
|
|
84
109
|
|
|
85
110
|
# Requested PM not available, check what is available
|
|
@@ -98,13 +123,38 @@ class PackageManagerHelper:
|
|
|
98
123
|
),
|
|
99
124
|
)
|
|
100
125
|
|
|
101
|
-
#
|
|
126
|
+
# Falling back is only safe when nothing in the project asked for a
|
|
127
|
+
# particular manager. A repository carrying pnpm-lock.yaml installed
|
|
128
|
+
# with npm resolves a different dependency tree than the one that was
|
|
129
|
+
# tested, and the failure shows up at runtime as something unrelated.
|
|
102
130
|
fallback = available[0]
|
|
131
|
+
if not negotiable:
|
|
132
|
+
raise DeploymentError(
|
|
133
|
+
f"This project needs {package_manager}, which is not installed",
|
|
134
|
+
details=(
|
|
135
|
+
f"Its workspace layout is {package_manager}'s and no other package "
|
|
136
|
+
f"manager can install it: the dependency links it declares only "
|
|
137
|
+
f"resolve under {package_manager}.\n\n"
|
|
138
|
+
f"Install it:\n npm install -g {package_manager}"
|
|
139
|
+
),
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
if package_manager != "npm":
|
|
143
|
+
raise DeploymentError(
|
|
144
|
+
f"This project needs {package_manager}, which is not installed",
|
|
145
|
+
details=(
|
|
146
|
+
f"Its lock file is {package_manager}'s, and installing it with "
|
|
147
|
+
f"{fallback} resolves a different dependency tree than the one the "
|
|
148
|
+
f"project was tested with.\n\n"
|
|
149
|
+
f"Install it:\n npm install -g {package_manager}\n\n"
|
|
150
|
+
f"Or pass --pm {fallback} to accept the substitution."
|
|
151
|
+
),
|
|
152
|
+
)
|
|
153
|
+
|
|
103
154
|
self.logger.warning(
|
|
104
155
|
f"Package manager '{package_manager}' not installed. Using '{fallback}' instead."
|
|
105
156
|
)
|
|
106
157
|
self.logger.info(f"Available package managers: {', '.join(available)}")
|
|
107
|
-
|
|
108
158
|
return fallback
|
|
109
159
|
|
|
110
160
|
def get_available(self) -> list[str]:
|
|
@@ -116,7 +166,7 @@ class PackageManagerHelper:
|
|
|
116
166
|
"""
|
|
117
167
|
available = []
|
|
118
168
|
for pm in ["npm", "pnpm", "yarn", "bun"]:
|
|
119
|
-
if
|
|
169
|
+
if self.runner.exists(pm):
|
|
120
170
|
available.append(pm)
|
|
121
171
|
return available
|
|
122
172
|
|
|
@@ -138,7 +138,7 @@ class MonorepoDeployer(AppDeployer):
|
|
|
138
138
|
self._cert_manager: CertManager | None = None
|
|
139
139
|
|
|
140
140
|
# Helpers
|
|
141
|
-
self._pm_helper = PackageManagerHelper(logger=self.logger)
|
|
141
|
+
self._pm_helper = PackageManagerHelper(logger=self.logger, runner=self.runner)
|
|
142
142
|
self._path_resolver = PathResolver(logger=self.logger)
|
|
143
143
|
self._workspace_helper = WorkspaceHelper(logger=self.logger)
|
|
144
144
|
self._turbo_helper = TurboHelper(logger=self.logger)
|
|
@@ -848,7 +848,10 @@ class MonorepoDeployer(AppDeployer):
|
|
|
848
848
|
def _install_dependencies(self) -> None:
|
|
849
849
|
"""Install dependencies using pnpm."""
|
|
850
850
|
# Verify pnpm
|
|
851
|
-
|
|
851
|
+
# Not negotiable: a turbo/pnpm workspace declares its internal
|
|
852
|
+
# dependencies with pnpm's workspace protocol, which npm cannot
|
|
853
|
+
# resolve at all.
|
|
854
|
+
self.package_manager = self._pm_helper.verify("pnpm", negotiable=False)
|
|
852
855
|
|
|
853
856
|
result = self._run(
|
|
854
857
|
["pnpm", "install", "--frozen-lockfile"],
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/superpowers/specs/2026-08-12-wasm-panel-design-direction.md
RENAMED
|
File without changes
|
{wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/superpowers/specs/2026-08-12-wasm-v1-refactor-design.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|