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.
Files changed (174) hide show
  1. {wasm_cli-1.0.0/src/wasm_cli.egg-info → wasm_cli-1.0.1}/PKG-INFO +1 -1
  2. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/pyproject.toml +1 -1
  3. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/setup.py +1 -1
  4. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/__init__.py +1 -1
  5. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/base.py +1 -1
  6. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/package_manager.py +64 -14
  7. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/monorepo.py +5 -2
  8. {wasm_cli-1.0.0 → wasm_cli-1.0.1/src/wasm_cli.egg-info}/PKG-INFO +1 -1
  9. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/LICENSE +0 -0
  10. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/MANIFEST.in +0 -0
  11. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/README.md +0 -0
  12. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/MONITOR.md +0 -0
  13. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/OBS_SETUP.md +0 -0
  14. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/assets/logo.png +0 -0
  15. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/assets/logo_bg.png +0 -0
  16. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/superpowers/specs/2026-08-12-wasm-panel-design-direction.md +0 -0
  17. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/docs/superpowers/specs/2026-08-12-wasm-v1-refactor-design.md +0 -0
  18. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/man/wasm.1 +0 -0
  19. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/setup.cfg +0 -0
  20. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/__main__.py +0 -0
  21. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/__init__.py +0 -0
  22. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/app.py +0 -0
  23. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/__init__.py +0 -0
  24. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/backup.py +0 -0
  25. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/cert.py +0 -0
  26. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/config.py +0 -0
  27. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/db.py +0 -0
  28. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/env.py +0 -0
  29. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/health.py +0 -0
  30. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/monitor.py +0 -0
  31. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/service.py +0 -0
  32. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/setup.py +0 -0
  33. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/site.py +0 -0
  34. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/store.py +0 -0
  35. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/version.py +0 -0
  36. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/web.py +0 -0
  37. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/commands/webapp.py +0 -0
  38. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/cli/interactive.py +0 -0
  39. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/__init__.py +0 -0
  40. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/config.py +0 -0
  41. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/dependencies.py +0 -0
  42. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/exceptions.py +0 -0
  43. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/fs.py +0 -0
  44. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/logger.py +0 -0
  45. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/runner.py +0 -0
  46. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/store.py +0 -0
  47. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/update_checker.py +0 -0
  48. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/core/utils.py +0 -0
  49. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/__init__.py +0 -0
  50. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/auto.py +0 -0
  51. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/docker_compose.py +0 -0
  52. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/__init__.py +0 -0
  53. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/env_manager.py +0 -0
  54. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/health.py +0 -0
  55. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/nginx_config.py +0 -0
  56. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/path_resolver.py +0 -0
  57. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/preflight.py +0 -0
  58. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/prisma.py +0 -0
  59. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/registration.py +0 -0
  60. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/summary.py +0 -0
  61. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/turbo.py +0 -0
  62. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/helpers/workspace.py +0 -0
  63. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/interface.py +0 -0
  64. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/nextjs.py +0 -0
  65. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/nodejs.py +0 -0
  66. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/pipeline.py +0 -0
  67. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/python.py +0 -0
  68. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/registry.py +0 -0
  69. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/static.py +0 -0
  70. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/deployers/vite.py +0 -0
  71. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/main.py +0 -0
  72. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/__init__.py +0 -0
  73. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/apache_manager.py +0 -0
  74. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/backup_manager.py +0 -0
  75. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/backup_scheduler.py +0 -0
  76. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/base_manager.py +0 -0
  77. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/cert_manager.py +0 -0
  78. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/__init__.py +0 -0
  79. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/base.py +0 -0
  80. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/mongodb.py +0 -0
  81. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/mysql.py +0 -0
  82. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/postgres.py +0 -0
  83. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/redis.py +0 -0
  84. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/database/registry.py +0 -0
  85. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/nginx_manager.py +0 -0
  86. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/service_manager.py +0 -0
  87. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/source_manager.py +0 -0
  88. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/managers/webserver.py +0 -0
  89. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/__init__.py +0 -0
  90. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/email_notifier.py +0 -0
  91. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/metrics.py +0 -0
  92. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/models.py +0 -0
  93. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/observation_store.py +0 -0
  94. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/process_monitor.py +0 -0
  95. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/monitor/signals.py +0 -0
  96. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/__init__.py +0 -0
  97. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/apache/proxy.conf.j2 +0 -0
  98. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/apache/static.conf.j2 +0 -0
  99. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/nginx/advanced.conf.j2 +0 -0
  100. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/nginx/monorepo.conf.j2 +0 -0
  101. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/nginx/proxy.conf.j2 +0 -0
  102. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/nginx/static.conf.j2 +0 -0
  103. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/systemd/_escape.j2 +0 -0
  104. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/systemd/app.service.j2 +0 -0
  105. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/systemd/backup-service.j2 +0 -0
  106. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/systemd/backup-timer.j2 +0 -0
  107. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/templates/systemd/docker-compose.service.j2 +0 -0
  108. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/__init__.py +0 -0
  109. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/domain.py +0 -0
  110. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/environment.py +0 -0
  111. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/names.py +0 -0
  112. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/port.py +0 -0
  113. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/source.py +0 -0
  114. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/validators/ssh.py +0 -0
  115. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/__init__.py +0 -0
  116. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/__init__.py +0 -0
  117. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/apps.py +0 -0
  118. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/auth.py +0 -0
  119. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/backups.py +0 -0
  120. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/certs.py +0 -0
  121. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/config.py +0 -0
  122. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/databases.py +0 -0
  123. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/deps.py +0 -0
  124. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/jobs.py +0 -0
  125. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/monitor.py +0 -0
  126. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/router.py +0 -0
  127. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/services.py +0 -0
  128. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/sites.py +0 -0
  129. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/api/system.py +0 -0
  130. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/auth.py +0 -0
  131. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/jobs.py +0 -0
  132. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/server.py +0 -0
  133. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/app.css +0 -0
  134. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/logo.png +0 -0
  135. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/logo.webp +0 -0
  136. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/panel.js +0 -0
  137. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/alpine.min.js +0 -0
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {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
  144. {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
  145. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/htmx.min.js +0 -0
  146. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/uplot.min.css +0 -0
  147. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/uplot.min.js +0 -0
  148. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/xterm.css +0 -0
  149. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/static/vendor/xterm.js +0 -0
  150. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/_macros.html +0 -0
  151. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/base.html +0 -0
  152. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/fragments/machine.html +0 -0
  153. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/login.html +0 -0
  154. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/activity.html +0 -0
  155. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/app.html +0 -0
  156. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/backups.html +0 -0
  157. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/certificates.html +0 -0
  158. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/dashboard.html +0 -0
  159. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/missing.html +0 -0
  160. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/resources.html +0 -0
  161. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/templates/pages/settings.html +0 -0
  162. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/__init__.py +0 -0
  163. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/context.py +0 -0
  164. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/machine.py +0 -0
  165. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/rendering.py +0 -0
  166. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/resources.py +0 -0
  167. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/views/router.py +0 -0
  168. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/websockets/__init__.py +0 -0
  169. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm/web/websockets/router.py +0 -0
  170. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm_cli.egg-info/SOURCES.txt +0 -0
  171. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm_cli.egg-info/dependency_links.txt +0 -0
  172. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm_cli.egg-info/entry_points.txt +0 -0
  173. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm_cli.egg-info/requires.txt +0 -0
  174. {wasm_cli-1.0.0 → wasm_cli-1.0.1}/src/wasm_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wasm-cli
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Web App System Management - Deploy and manage web applications on Linux servers
5
5
  Author: Yago López Prado
6
6
  Author-email: Yago López Prado <yago.lopez.adeje@gmail.com>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "wasm-cli"
7
- version = "1.0.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.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.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.utils import command_exists
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
- def __init__(self, logger: Logger | None = None):
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
- Verify the package manager is installed and available.
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: Requested 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
- Available package manager (may differ from requested).
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: If no package manager is available.
104
+ DeploymentError: When the manager is missing and no substitute is
105
+ acceptable, or when none is installed at all.
81
106
  """
82
- if command_exists(package_manager):
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
- # Fall back to first available package manager
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 command_exists(pm):
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
- self.package_manager = self._pm_helper.verify("pnpm")
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"],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wasm-cli
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Web App System Management - Deploy and manage web applications on Linux servers
5
5
  Author: Yago López Prado
6
6
  Author-email: Yago López Prado <yago.lopez.adeje@gmail.com>
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