systemlink-cli 1.22.0__tar.gz → 1.22.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 (154) hide show
  1. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/PKG-INFO +1 -1
  2. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/pyproject.toml +1 -1
  3. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/_version.py +1 -1
  4. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_bootstrap.py +35 -1
  5. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/LICENSE +0 -0
  6. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/dff-editor/editor.js +0 -0
  7. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/dff-editor/index.html +0 -0
  8. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/__init__.py +0 -0
  9. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/__main__.py +0 -0
  10. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/alarm_click.py +0 -0
  11. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/asset_click.py +0 -0
  12. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/cli_formatters.py +0 -0
  13. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/cli_utils.py +0 -0
  14. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/comment_click.py +0 -0
  15. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/completion_click.py +0 -0
  16. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/config.py +0 -0
  17. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/config_click.py +0 -0
  18. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/dataframe_click.py +0 -0
  19. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/dff_click.py +0 -0
  20. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/dff_decorators.py +0 -0
  21. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/example_click.py +0 -0
  22. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/example_loader.py +0 -0
  23. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/example_provisioner.py +0 -0
  24. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/README.md +0 -0
  25. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/_schema/schema-v1.0.json +0 -0
  26. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/demo-data-1/README.md +0 -0
  27. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/demo-data-1/config.yaml +0 -0
  28. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/demo-data-2/README.md +0 -0
  29. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/demo-data-2/config.yaml +0 -0
  30. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/demo-data-3/config.yaml +0 -0
  31. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/demo-data-3/leakage-current-results.json +0 -0
  32. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/demo-data-3/overvoltage-results.json +0 -0
  33. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/demo-data-3/product-xyz-compliance-report.json +0 -0
  34. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/demo-data-3/product-xyz-specification.csv +0 -0
  35. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/demo-data-3/thermal-response-results.json +0 -0
  36. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/exercise-5-1-parametric-insights/README.md +0 -0
  37. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/exercise-5-1-parametric-insights/config.yaml +0 -0
  38. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/exercise-7-1-test-plans/README.md +0 -0
  39. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/exercise-7-1-test-plans/config.yaml +0 -0
  40. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/spec-compliance-notebooks/README.md +0 -0
  41. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/spec-compliance-notebooks/config.yaml +0 -0
  42. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecAnalysis_ComplianceCalculation.ipynb +0 -0
  43. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecComplianceCalculation.ipynb +0 -0
  44. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/spec-compliance-notebooks/notebooks/SpecfileExtractionAndIngestion.ipynb +0 -0
  45. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/examples/spec-compliance-notebooks/spec_template.xlsx +0 -0
  46. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/feed_click.py +0 -0
  47. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/file_click.py +0 -0
  48. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/function_click.py +0 -0
  49. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/function_templates.py +0 -0
  50. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/main.py +0 -0
  51. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/mcp_click.py +0 -0
  52. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/mcp_reachability.py +0 -0
  53. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/mcp_server.py +0 -0
  54. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/notebook_click.py +0 -0
  55. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/platform.py +0 -0
  56. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/policy_click.py +0 -0
  57. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/policy_utils.py +0 -0
  58. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/profiles.py +0 -0
  59. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/response_handlers.py +0 -0
  60. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/rich_output.py +0 -0
  61. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/routine_click.py +0 -0
  62. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skill_click.py +0 -0
  63. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/SKILL.md +0 -0
  64. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/analysis-recipes.md +0 -0
  65. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/commands.md +0 -0
  66. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/datasheet-workflow.md +0 -0
  67. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/example-authoring.md +0 -0
  68. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/filtering.md +0 -0
  69. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/import-specs.min.json +0 -0
  70. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/job-debugging/overview.md +0 -0
  71. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/nipkg/overview.md +0 -0
  72. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/notebook/interfaces.md +0 -0
  73. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/notebook/notebook-patterns.md +0 -0
  74. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/notebook/overview.md +0 -0
  75. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/python-test/overview.md +0 -0
  76. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/routine-examples.md +0 -0
  77. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/troubleshooting.md +0 -0
  78. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/webapp/angular-ui-packages.md +0 -0
  79. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/webapp/deployment.md +0 -0
  80. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/webapp/layout-patterns.md +0 -0
  81. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/webapp/nimble-angular.md +0 -0
  82. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/webapp/overview.md +0 -0
  83. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/webapp/systemlink-services.md +0 -0
  84. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/references/webapp/troubleshooting.md +0 -0
  85. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/skills/slcli/scripts/spec_import_helper.py +0 -0
  86. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/spec_click.py +0 -0
  87. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/ssl_trust.py +0 -0
  88. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/state_click.py +0 -0
  89. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/system_click.py +0 -0
  90. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/system_query_utils.py +0 -0
  91. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/table_utils.py +0 -0
  92. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/tag_click.py +0 -0
  93. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/templates_click.py +0 -0
  94. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/testmonitor_click.py +0 -0
  95. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/universal_handlers.py +0 -0
  96. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/user_click.py +0 -0
  97. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/utils.py +0 -0
  98. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/web_editor.py +0 -0
  99. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_click.py +0 -0
  100. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/.gitignore +0 -0
  101. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/README.md +0 -0
  102. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/angular.json +0 -0
  103. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/package.json +0 -0
  104. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/app-routing.module.ts +0 -0
  105. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/app.component.html +0 -0
  106. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/app.component.scss +0 -0
  107. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/app.component.ts +0 -0
  108. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/app.module.ts +0 -0
  109. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.html +0 -0
  110. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.scss +0 -0
  111. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/core/layout/app-shell.component.ts +0 -0
  112. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/core/state/app-view-state.service.ts +0 -0
  113. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/systemlink-context.service.ts +0 -0
  114. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/theme-sync.service.ts +0 -0
  115. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/core/systemlink/webapp-home-data.service.ts +0 -0
  116. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.html +0 -0
  117. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.scss +0 -0
  118. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/assets/assets-page.component.ts +0 -0
  119. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.html +0 -0
  120. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.scss +0 -0
  121. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/datasets/datasets-page.component.ts +0 -0
  122. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.html +0 -0
  123. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.scss +0 -0
  124. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/home/home-page.component.ts +0 -0
  125. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.html +0 -0
  126. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.scss +0 -0
  127. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/master-detail/master-detail-page.component.ts +0 -0
  128. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.html +0 -0
  129. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.scss +0 -0
  130. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/operations/operations-page.component.ts +0 -0
  131. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.html +0 -0
  132. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.scss +0 -0
  133. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/features/settings/settings-page.component.ts +0 -0
  134. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.html +0 -0
  135. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.scss +0 -0
  136. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/empty-state.component.ts +0 -0
  137. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.html +0 -0
  138. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.scss +0 -0
  139. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/error-banner.component.ts +0 -0
  140. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.html +0 -0
  141. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.scss +0 -0
  142. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/shared/components/loading-state.component.ts +0 -0
  143. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/app/shared/states/view-state.model.ts +0 -0
  144. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/assets/README.md +0 -0
  145. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/index.html +0 -0
  146. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/main.ts +0 -0
  147. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/src/styles.scss +0 -0
  148. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/tsconfig.app.json +0 -0
  149. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/webapp_templates/angular/blank/tsconfig.json +0 -0
  150. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/workflow_preview.py +0 -0
  151. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/workflows_click.py +0 -0
  152. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/workitem_click.py +0 -0
  153. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/workspace_click.py +0 -0
  154. {systemlink_cli-1.22.0 → systemlink_cli-1.22.1}/slcli/workspace_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: systemlink-cli
3
- Version: 1.22.0
3
+ Version: 1.22.1
4
4
  Summary: SystemLink Integrator CLI - cross-platform CLI for SystemLink workflows and templates.
5
5
  License-File: LICENSE
6
6
  Author: Fred Visser
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "systemlink-cli"
3
- version = "1.22.0"
3
+ version = "1.22.1"
4
4
  description = "SystemLink Integrator CLI - cross-platform CLI for SystemLink workflows and templates."
5
5
  authors = ["Fred Visser <fred.visser@emerson.com>"]
6
6
  packages = [{ include = "slcli" }]
@@ -1,4 +1,4 @@
1
1
  """Version information for slcli."""
2
2
 
3
3
  # This file is auto-generated. Do not edit manually.
4
- __version__ = "1.22.0"
4
+ __version__ = "1.22.1"
@@ -1,6 +1,7 @@
1
1
  """Hosted Angular webapp bootstrap commands and template generation helpers."""
2
2
 
3
3
  import re
4
+ import shutil
4
5
  import subprocess
5
6
  import sys
6
7
  from pathlib import Path
@@ -1006,15 +1007,45 @@ def _initialize_plugin_manager_files(directory: Path, project_name: str, publish
1006
1007
  save_json_file(config, str(directory / "nipkg.config.json"))
1007
1008
 
1008
1009
 
1010
+ def _npm_executable() -> str:
1011
+ """Return the npm executable name for the current platform."""
1012
+ return "npm.cmd" if sys.platform == "win32" else "npm"
1013
+
1014
+
1015
+ def _validate_webapp_prerequisites() -> None:
1016
+ """Verify the external runtimes required to install and build a webapp."""
1017
+ required_commands = [("Node.js", "node"), ("npm", _npm_executable())]
1018
+ missing_commands = [
1019
+ display_name
1020
+ for display_name, executable in required_commands
1021
+ if shutil.which(executable) is None
1022
+ ]
1023
+ if missing_commands:
1024
+ click.echo(
1025
+ "✗ Missing required webapp dependencies: " + ", ".join(missing_commands),
1026
+ err=True,
1027
+ )
1028
+ click.echo(
1029
+ "Install Node.js 24+ and ensure both node and npm are available on PATH.",
1030
+ err=True,
1031
+ )
1032
+ sys.exit(ExitCodes.GENERAL_ERROR)
1033
+
1034
+
1009
1035
  def _run_webapp_local_command(directory: Path, command: List[str], label: str) -> None:
1010
1036
  """Run a local process for webapp generation and surface actionable failures."""
1011
1037
  click.echo(f"→ {label}")
1038
+ local_command = list(command)
1039
+ if sys.platform == "win32" and local_command and local_command[0] == "npm":
1040
+ local_command[0] = _npm_executable()
1012
1041
  try:
1013
1042
  result = subprocess.run(
1014
- command,
1043
+ local_command,
1015
1044
  cwd=directory,
1016
1045
  capture_output=True,
1017
1046
  text=True,
1047
+ encoding="utf-8",
1048
+ errors="replace",
1018
1049
  check=False,
1019
1050
  )
1020
1051
  except FileNotFoundError as exc:
@@ -1131,6 +1162,9 @@ def _generate_new_webapp(
1131
1162
  )
1132
1163
  return
1133
1164
 
1165
+ if not skip_install:
1166
+ _validate_webapp_prerequisites()
1167
+
1134
1168
  _ensure_generation_directory(target_dir, force)
1135
1169
  _write_rendered_template_tree(template_dir, target_dir, replacements)
1136
1170
  _apply_selected_webapp_template(
File without changes