sima-cli 2.1.17__tar.gz → 2.1.19__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 (242) hide show
  1. {sima_cli-2.1.17/sima_cli.egg-info → sima_cli-2.1.19}/PKG-INFO +35 -2
  2. {sima_cli-2.1.17 → sima_cli-2.1.19}/README.md +32 -0
  3. {sima_cli-2.1.17 → sima_cli-2.1.19}/pyproject.toml +3 -2
  4. {sima_cli-2.1.17 → sima_cli-2.1.19}/requirements.txt +2 -1
  5. {sima_cli-2.1.17 → sima_cli-2.1.19}/setup.py +2 -1
  6. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/__version__.py +1 -1
  7. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/cli.py +157 -24
  8. sima_cli-2.1.19/sima_cli/cloudex/__init__.py +5 -0
  9. sima_cli-2.1.19/sima_cli/cloudex/client.py +880 -0
  10. sima_cli-2.1.19/sima_cli/cloudex/commands.py +422 -0
  11. sima_cli-2.1.19/sima_cli/cloudex/installer.py +196 -0
  12. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/deploy_only/device/commands.py +1 -1
  13. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/discover/discover.py +91 -9
  14. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/download/downloader.py +90 -33
  15. sima_cli-2.1.19/sima_cli/download/parallel.py +164 -0
  16. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/metadata_installer.py +5 -2
  17. sima_cli-2.1.19/sima_cli/mla/meminfo.py +274 -0
  18. sima_cli-2.1.19/sima_cli/models/client.py +891 -0
  19. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/models/commands.py +127 -18
  20. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/models/rendering.py +213 -32
  21. sima_cli-2.1.19/sima_cli/network/network.py +636 -0
  22. sima_cli-2.1.19/sima_cli/peripherals/__init__.py +5 -0
  23. sima_cli-2.1.19/sima_cli/peripherals/commands.py +208 -0
  24. sima_cli-2.1.19/sima_cli/peripherals/model.py +426 -0
  25. sima_cli-2.1.19/sima_cli/peripherals/sentinel.py +145 -0
  26. sima_cli-2.1.19/sima_cli/sdk/browser_ca.py +53 -0
  27. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/commands.py +85 -5
  28. sima_cli-2.1.19/sima_cli/sdk/container_registry.py +385 -0
  29. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/install.py +136 -17
  30. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/neat.py +130 -21
  31. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/network_doctor.py +141 -17
  32. sima_cli-2.1.19/sima_cli/sdk/preinstall.py +1759 -0
  33. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/utils.py +453 -64
  34. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/vscode_extensions.py +15 -13
  35. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/ab_state.py +32 -12
  36. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/emmc.py +34 -2
  37. sima_cli-2.1.19/sima_cli/update/host.py +231 -0
  38. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/netboot.py +749 -41
  39. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/netboot_artifacts.py +103 -14
  40. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/netboot_device.py +128 -17
  41. sima_cli-2.1.19/sima_cli/update/overlay.py +348 -0
  42. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/rootfs.py +5 -11
  43. sima_cli-2.1.19/sima_cli/update/swap.py +81 -0
  44. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/swu.py +259 -14
  45. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/swu_artifacts.py +5 -5
  46. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/uboot_environment.py +62 -24
  47. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/updater.py +71 -16
  48. sima_cli-2.1.19/sima_cli/utils/streaming.py +84 -0
  49. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/vulcan/artifacts.py +31 -18
  50. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/vulcan/commands.py +1 -1
  51. {sima_cli-2.1.17 → sima_cli-2.1.19/sima_cli.egg-info}/PKG-INFO +35 -2
  52. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli.egg-info/SOURCES.txt +41 -0
  53. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli.egg-info/requires.txt +6 -1
  54. sima_cli-2.1.19/tests/unit/peripherals_fixtures.py +131 -0
  55. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_ab_overlay.py +7 -8
  56. sima_cli-2.1.19/tests/unit/test_artifact_parallel_integration.py +174 -0
  57. sima_cli-2.1.19/tests/unit/test_cli_update.py +150 -0
  58. sima_cli-2.1.19/tests/unit/test_cloudex_client.py +647 -0
  59. sima_cli-2.1.19/tests/unit/test_cloudex_commands.py +370 -0
  60. sima_cli-2.1.19/tests/unit/test_cloudex_installer.py +185 -0
  61. sima_cli-2.1.19/tests/unit/test_code_ui_readiness.py +81 -0
  62. sima_cli-2.1.19/tests/unit/test_device_discovery_cloudex.py +113 -0
  63. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_download.py +1 -0
  64. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_emmc.py +87 -3
  65. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_generate_cli_markdown_docs.py +10 -8
  66. sima_cli-2.1.19/tests/unit/test_host_update.py +254 -0
  67. sima_cli-2.1.19/tests/unit/test_install_force.py +39 -0
  68. sima_cli-2.1.19/tests/unit/test_localized_docs_links.py +23 -0
  69. sima_cli-2.1.19/tests/unit/test_mla_meminfo.py +159 -0
  70. sima_cli-2.1.19/tests/unit/test_model_deployments.py +794 -0
  71. sima_cli-2.1.19/tests/unit/test_models.py +1248 -0
  72. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_netboot.py +6 -1
  73. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_netboot_autoflash.py +36 -4
  74. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_netboot_device.py +247 -19
  75. sima_cli-2.1.19/tests/unit/test_netboot_images.py +344 -0
  76. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_netboot_mirror.py +11 -6
  77. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_netboot_trootctl.py +5 -1
  78. sima_cli-2.1.19/tests/unit/test_network_custom_static.py +271 -0
  79. sima_cli-2.1.19/tests/unit/test_network_safety.py +152 -0
  80. sima_cli-2.1.19/tests/unit/test_overlay.py +309 -0
  81. sima_cli-2.1.19/tests/unit/test_parallel_downloads.py +131 -0
  82. sima_cli-2.1.19/tests/unit/test_peripherals_commands.py +293 -0
  83. sima_cli-2.1.19/tests/unit/test_peripherals_contract.py +96 -0
  84. sima_cli-2.1.19/tests/unit/test_peripherals_model.py +219 -0
  85. sima_cli-2.1.19/tests/unit/test_peripherals_sentinel.py +127 -0
  86. sima_cli-2.1.19/tests/unit/test_sdk_browser_ca.py +119 -0
  87. sima_cli-2.1.19/tests/unit/test_sdk_container_registry.py +544 -0
  88. sima_cli-2.1.19/tests/unit/test_sdk_host_key_trust.py +128 -0
  89. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_sdk_image_detection.py +547 -16
  90. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_sdk_model_compiler.py +1 -1
  91. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_sdk_network_doctor.py +181 -1
  92. sima_cli-2.1.19/tests/unit/test_sdk_preinstall.py +1325 -0
  93. sima_cli-2.1.19/tests/unit/test_slot_swap.py +145 -0
  94. sima_cli-2.1.19/tests/unit/test_streaming_downloads.py +296 -0
  95. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_swu.py +413 -35
  96. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_swu_mirror.py +21 -2
  97. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_uboot_environment.py +72 -2
  98. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_update_staging.py +11 -4
  99. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_vscode_extension_pins.py +81 -25
  100. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_vulcan.py +3 -0
  101. sima_cli-2.1.17/sima_cli/mla/meminfo.py +0 -47
  102. sima_cli-2.1.17/sima_cli/models/client.py +0 -372
  103. sima_cli-2.1.17/sima_cli/network/network.py +0 -307
  104. sima_cli-2.1.17/sima_cli/sdk/preinstall.py +0 -597
  105. sima_cli-2.1.17/tests/unit/test_cli_update.py +0 -76
  106. sima_cli-2.1.17/tests/unit/test_models.py +0 -632
  107. sima_cli-2.1.17/tests/unit/test_sdk_preinstall.py +0 -286
  108. {sima_cli-2.1.17 → sima_cli-2.1.19}/LICENSE +0 -0
  109. {sima_cli-2.1.17 → sima_cli-2.1.19}/MANIFEST.in +0 -0
  110. {sima_cli-2.1.17 → sima_cli-2.1.19}/setup.cfg +0 -0
  111. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/__init__.py +0 -0
  112. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/__main__.py +0 -0
  113. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/app_zoo/__init__.py +0 -0
  114. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/app_zoo/app.py +0 -0
  115. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/app_zoo/commands.py +0 -0
  116. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/auth/__init__.py +0 -0
  117. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/auth/auth0.py +0 -0
  118. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/auth/devportal.py +0 -0
  119. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/auth/login.py +0 -0
  120. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/data/__init__.py +0 -0
  121. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/data/resources_internal.yaml +0 -0
  122. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/data/resources_public.yaml +0 -0
  123. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/deploy_only/__init__.py +0 -0
  124. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/deploy_only/device/__init__.py +0 -0
  125. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/deploy_only/mpk/__init__.py +0 -0
  126. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/deploy_only/mpk/commands.py +0 -0
  127. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/discover/__init__.py +0 -0
  128. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/discover/linuxll.py +0 -0
  129. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/download/__init__.py +0 -0
  130. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/__init__.py +0 -0
  131. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/compatibility.py +0 -0
  132. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/github_assets.py +0 -0
  133. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/hostdriver.py +0 -0
  134. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/metadata_info.py +0 -0
  135. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/metadata_validator.py +0 -0
  136. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/optiview.py +0 -0
  137. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/package_builder.py +0 -0
  138. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/palette.py +0 -0
  139. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/install/registry.py +0 -0
  140. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/mla/__init__.py +0 -0
  141. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/model_zoo/__init__.py +0 -0
  142. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/model_zoo/model.py +0 -0
  143. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/models/__init__.py +0 -0
  144. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/network/__init__.py +0 -0
  145. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/playbooks/__init__.py +0 -0
  146. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/playbooks/commands.py +0 -0
  147. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/playbooks/manager.py +0 -0
  148. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/__init__.py +0 -0
  149. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/cmdexec.py +0 -0
  150. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/config.py +0 -0
  151. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/docker_staging.py +0 -0
  152. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/linux_devkit_network.py +0 -0
  153. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/linux_shared_network.py +0 -0
  154. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/model_compiler.py +0 -0
  155. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/requirements.json +0 -0
  156. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/script.py +0 -0
  157. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/stop.py +0 -0
  158. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/sdk/uninstall.py +0 -0
  159. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/serial/__init__.py +0 -0
  160. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/serial/serial.py +0 -0
  161. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/storage/__init__.py +0 -0
  162. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/storage/nvme.py +0 -0
  163. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/storage/sdcard.py +0 -0
  164. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/__init__.py +0 -0
  165. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/bmaptool.py +0 -0
  166. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/bootimg.py +0 -0
  167. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/cleanlog.py +0 -0
  168. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/elxr.py +0 -0
  169. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/fast_upload.py +0 -0
  170. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/local.py +0 -0
  171. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/query.py +0 -0
  172. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/remote.py +0 -0
  173. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/staging.py +0 -0
  174. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/swu_certificate.py +0 -0
  175. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/update/swu_target.py +0 -0
  176. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/upgrade/__init__.py +0 -0
  177. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/upgrade/selfupdate.py +0 -0
  178. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/__init__.py +0 -0
  179. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/api_common.py +0 -0
  180. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/artifactory.py +0 -0
  181. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/common.py +0 -0
  182. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/config.py +0 -0
  183. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/config_loader.py +0 -0
  184. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/container_registries.py +0 -0
  185. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/deprecation.py +0 -0
  186. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/device_api.py +0 -0
  187. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/disk.py +0 -0
  188. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/docker.py +0 -0
  189. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/env.py +0 -0
  190. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/errors.py +0 -0
  191. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/mpk_api.py +0 -0
  192. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/net.py +0 -0
  193. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/network.py +0 -0
  194. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/pcie.py +0 -0
  195. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/pkg_update_check.py +0 -0
  196. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/serializers.py +0 -0
  197. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/services.py +0 -0
  198. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/utils/tag.py +0 -0
  199. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli/vulcan/__init__.py +0 -0
  200. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli.egg-info/dependency_links.txt +0 -0
  201. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli.egg-info/entry_points.txt +0 -0
  202. {sima_cli-2.1.17 → sima_cli-2.1.19}/sima_cli.egg-info/top_level.txt +0 -0
  203. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/__init__.py +0 -0
  204. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/e2e/__init__.py +0 -0
  205. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/__init__.py +0 -0
  206. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_app_zoo.py +0 -0
  207. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_appzoo_commands.py +0 -0
  208. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_auth.py +0 -0
  209. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_auth0.py +0 -0
  210. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_bootimg_defaults.py +0 -0
  211. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_bootimg_recovery.py +0 -0
  212. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_cli.py +0 -0
  213. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_cli_stdio.py +0 -0
  214. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_cli_update_rerun.py +0 -0
  215. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_container_registries.py +0 -0
  216. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_deprecation.py +0 -0
  217. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_docker_utils.py +0 -0
  218. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_elxr_update.py +0 -0
  219. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_fast_upload.py +0 -0
  220. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_firmware.py +0 -0
  221. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_firmware_creation_order.py +0 -0
  222. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_firmware_layout.py +0 -0
  223. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_firmware_selector.py +0 -0
  224. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_install_stub.py +0 -0
  225. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_metadata_installer.py +0 -0
  226. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_metadata_validator.py +0 -0
  227. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_model_zoo.py +0 -0
  228. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_modelzoo_commands.py +0 -0
  229. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_netboot_ip_recovery.py +0 -0
  230. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_package_builder.py +0 -0
  231. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_palette_image_discovery.py +0 -0
  232. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_pcie.py +0 -0
  233. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_pkg_update_check.py +0 -0
  234. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_sdk_linux_shared_network.py +0 -0
  235. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_sdk_uninstall.py +0 -0
  236. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_selfupdate.py +0 -0
  237. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_skills_commands.py +0 -0
  238. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_skills_manager.py +0 -0
  239. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_swu_certificate.py +0 -0
  240. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_swu_errors.py +0 -0
  241. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_swu_target.py +0 -0
  242. {sima_cli-2.1.17 → sima_cli-2.1.19}/tests/unit/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sima-cli
3
- Version: 2.1.17
3
+ Version: 2.1.19
4
4
  Summary: CLI tool for SiMa Developer Portal to download models, firmware, and apps.
5
5
  Home-page: https://community.sima.ai/
6
6
  Author: SiMa.ai
@@ -27,7 +27,8 @@ Requires-Dist: rich==14.0.0
27
27
  Requires-Dist: InquirerPy==0.3.4
28
28
  Requires-Dist: tftpy==0.8.6
29
29
  Requires-Dist: psutil==7.0.0
30
- Requires-Dist: huggingface-hub<1.0,>=0.34.0
30
+ Requires-Dist: huggingface-hub<3.0,>=2.2.0; python_version >= "3.10"
31
+ Requires-Dist: huggingface-hub<2.0,>=0.34.0; python_version < "3.10"
31
32
  Requires-Dist: tabulate==0.9.0
32
33
  Dynamic: author
33
34
  Dynamic: license-file
@@ -148,6 +149,20 @@ sima-cli --internal login
148
149
  SIMA_CLI_INTERNAL=1 sima-cli install -v 2.1.2 tools/model-compiler/amd64
149
150
  ```
150
151
 
152
+ Full-system SWU updates prefer RAM-backed `/tmp` when available memory can
153
+ hold both the bundle and its extraction, plus a reserve of at least 512 MiB
154
+ or 10% of total RAM (whichever is larger). Otherwise they stage in `/data`,
155
+ with NVMe as a further fallback if `/data` lacks space. RAM staging is temporary;
156
+ interrupted updates retained there do not survive a reboot.
157
+
158
+ Public-mirror downloads, `models download`, and `neat artifacts` split files
159
+ of at least 64 MiB into four byte ranges when supported by the server. Models
160
+ and Neat artifacts share a limit of four active download connections across
161
+ files and ranges, including single-connection fallbacks. Ranges must match the
162
+ expected size and an object validator or the expected SHA-256 before the file is published. Models retain signed-URL refresh and
163
+ cancellation handling. Existing public-mirror partial downloads continue
164
+ sequentially; servers without range support use a single connection.
165
+
151
166
  ## Common Workflows
152
167
 
153
168
  Set up SDK containers:
@@ -157,6 +172,14 @@ sima-cli sdk setup
157
172
  sima-cli sdk neat
158
173
  ```
159
174
 
175
+ When pairing with `sdk setup --devkit`, a new DevKit host key is automatically
176
+ recorded in the SDK user's `~/.ssh/known_hosts`, including during unattended
177
+ setup or after SDK container recreation. Subsequent pairing preserves saved
178
+ keys and rejects a changed key at the same address and SSH port. After a device
179
+ reimage or key rotation, verify the replacement fingerprint before explicitly
180
+ updating that entry. For environments requiring verified trust before the first
181
+ connection, provision verified host keys in the SDK user's `known_hosts`.
182
+
160
183
  Install Model Compiler from package metadata:
161
184
 
162
185
  ```bash
@@ -238,3 +261,13 @@ For command-specific prerequisites, see the generated [command reference](docs/s
238
261
  ## Support
239
262
 
240
263
  For issues and feature requests, use the sima-cli GitHub repository or contact the SiMa.ai development team.
264
+
265
+ ### Remote browser certificate help
266
+
267
+ SDK setup stages a verified public mkcert CA certificate alongside the SDK HTTPS
268
+ certificate. SDK images with browser certificate help can offer that file for
269
+ download on the sign-in page, with instructions for the browser computer.
270
+ Only the public certificate is staged; the mkcert private key stays on the host.
271
+ If the issuing CA cannot be verified, including a plain self-signed fallback,
272
+ no CA download is published. Re-running setup refreshes the staged file even
273
+ when the existing HTTPS certificate does not need to be reissued.
@@ -113,6 +113,20 @@ sima-cli --internal login
113
113
  SIMA_CLI_INTERNAL=1 sima-cli install -v 2.1.2 tools/model-compiler/amd64
114
114
  ```
115
115
 
116
+ Full-system SWU updates prefer RAM-backed `/tmp` when available memory can
117
+ hold both the bundle and its extraction, plus a reserve of at least 512 MiB
118
+ or 10% of total RAM (whichever is larger). Otherwise they stage in `/data`,
119
+ with NVMe as a further fallback if `/data` lacks space. RAM staging is temporary;
120
+ interrupted updates retained there do not survive a reboot.
121
+
122
+ Public-mirror downloads, `models download`, and `neat artifacts` split files
123
+ of at least 64 MiB into four byte ranges when supported by the server. Models
124
+ and Neat artifacts share a limit of four active download connections across
125
+ files and ranges, including single-connection fallbacks. Ranges must match the
126
+ expected size and an object validator or the expected SHA-256 before the file is published. Models retain signed-URL refresh and
127
+ cancellation handling. Existing public-mirror partial downloads continue
128
+ sequentially; servers without range support use a single connection.
129
+
116
130
  ## Common Workflows
117
131
 
118
132
  Set up SDK containers:
@@ -122,6 +136,14 @@ sima-cli sdk setup
122
136
  sima-cli sdk neat
123
137
  ```
124
138
 
139
+ When pairing with `sdk setup --devkit`, a new DevKit host key is automatically
140
+ recorded in the SDK user's `~/.ssh/known_hosts`, including during unattended
141
+ setup or after SDK container recreation. Subsequent pairing preserves saved
142
+ keys and rejects a changed key at the same address and SSH port. After a device
143
+ reimage or key rotation, verify the replacement fingerprint before explicitly
144
+ updating that entry. For environments requiring verified trust before the first
145
+ connection, provision verified host keys in the SDK user's `known_hosts`.
146
+
125
147
  Install Model Compiler from package metadata:
126
148
 
127
149
  ```bash
@@ -203,3 +225,13 @@ For command-specific prerequisites, see the generated [command reference](docs/s
203
225
  ## Support
204
226
 
205
227
  For issues and feature requests, use the sima-cli GitHub repository or contact the SiMa.ai development team.
228
+
229
+ ### Remote browser certificate help
230
+
231
+ SDK setup stages a verified public mkcert CA certificate alongside the SDK HTTPS
232
+ certificate. SDK images with browser certificate help can offer that file for
233
+ download on the sign-in page, with instructions for the browser computer.
234
+ Only the public certificate is staged; the mkcert private key stays on the host.
235
+ If the issuing CA cannot be verified, including a plain self-signed fallback,
236
+ no CA download is published. Re-running setup refreshes the staged file even
237
+ when the existing HTTPS certificate does not need to be reissued.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sima-cli"
7
- version = "2.1.17"
7
+ version = "2.1.19"
8
8
  description = "CLI tool for SiMa Developer Portal to download models, firmware, and apps."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -33,7 +33,8 @@ dependencies = [
33
33
  "InquirerPy==0.3.4",
34
34
  "tftpy==0.8.6",
35
35
  "psutil==7.0.0",
36
- "huggingface-hub>=0.34.0,<1.0",
36
+ "huggingface-hub>=2.2.0,<3.0; python_version >= '3.10'",
37
+ "huggingface-hub>=0.34.0,<2.0; python_version < '3.10'",
37
38
  "tabulate==0.9.0"
38
39
  ]
39
40
 
@@ -8,5 +8,6 @@ rich==14.0.0
8
8
  InquirerPy==0.3.4
9
9
  tftpy==0.8.6
10
10
  psutil==7.0.0
11
- huggingface-hub>=0.34.0,<1.0
11
+ huggingface-hub>=2.2.0,<3.0; python_version >= "3.10"
12
+ huggingface-hub>=0.34.0,<2.0; python_version < "3.10"
12
13
  tabulate==0.9.0
@@ -23,7 +23,8 @@ setup(
23
23
  "InquirerPy>=0.3.4,<0.4",
24
24
  "tftpy>=0.8.6,<0.9",
25
25
  "psutil>=7.0.0,<8.0",
26
- "huggingface-hub>=0.34.0,<1.0",
26
+ "huggingface-hub>=2.2.0,<3.0; python_version >= '3.10'",
27
+ "huggingface-hub>=0.34.0,<2.0; python_version < '3.10'",
27
28
  "rich>=13.7,<14.0"
28
29
  ],
29
30
  entry_points={
@@ -1,2 +1,2 @@
1
1
  # sima_cli/__version__.py
2
- __version__ = "2.1.17"
2
+ __version__ = "2.1.19"
@@ -2,17 +2,19 @@ import os
2
2
  import shutil
3
3
  import sys
4
4
  from contextlib import nullcontext, redirect_stdout
5
+ from pathlib import Path
5
6
  import click
6
7
  from rich.console import Console
7
8
  from rich.panel import Panel
8
9
  from rich.text import Text
9
10
  from sima_cli.utils.env import get_environment_type
10
11
  from sima_cli.update.updater import perform_update
12
+ from sima_cli.update.host import install_host_package
11
13
  from sima_cli.update.swu import handle_update
12
14
  from sima_cli.model_zoo.model import list_models, download_model, describe_model
13
15
  from sima_cli.app_zoo.app import list_apps, download_app, describe_app
14
16
  from sima_cli.utils.config_loader import internal_resource_exists
15
- from sima_cli.mla.meminfo import monitor_simaai_mem_chart
17
+ from sima_cli.mla.meminfo import MemoryTelemetryError, monitor_simaai_mem_chart
16
18
  from sima_cli.__version__ import __version__
17
19
  from sima_cli.utils.config import CONFIG_PATH
18
20
  from sima_cli.install.optiview import install_optiview
@@ -40,6 +42,8 @@ from sima_cli.upgrade.selfupdate import register_selfupdate_command
40
42
  from sima_cli.playbooks import register_playbook_commands
41
43
  from sima_cli.vulcan import register_vulcan_commands
42
44
  from sima_cli.models import register_models_commands
45
+ from sima_cli.peripherals import register_peripherals_commands
46
+ from sima_cli.cloudex import register_cloudex_commands
43
47
  from sima_cli.vulcan.commands import (
44
48
  ENV_METAVAR,
45
49
  _environment_shortcut_options,
@@ -102,6 +106,13 @@ def _rerun_current_command() -> None:
102
106
  os.execvpe(sys.executable, cmd, env)
103
107
 
104
108
 
109
+ # Command groups whose stdout is a machine-readable document: root diagnostics go to stderr for them.
110
+ QUIET_STDOUT_SUBCOMMANDS = ("models", "peripherals")
111
+ # Command groups that only read the DevKit they run on: no PyPI update check and no Artifactory
112
+ # gate before them, so they work offline and never prompt or exit early.
113
+ LOCAL_ONLY_SUBCOMMANDS = ("peripherals",)
114
+
115
+
105
116
  def _initialize_main_context(ctx, internal, yes):
106
117
  _configure_stdio_errors()
107
118
  auto_accept_update = yes or _update_auto_confirm_requested(sys.argv)
@@ -109,7 +120,8 @@ def _initialize_main_context(ctx, internal, yes):
109
120
  if auto_accept_update:
110
121
  os.environ["SIMA_CLI_AUTO_ACCEPT_UPDATE"] = "1"
111
122
  try:
112
- if check_for_update('sima-cli') and _should_rerun_after_update(sys.argv):
123
+ if (ctx.invoked_subcommand not in LOCAL_ONLY_SUBCOMMANDS
124
+ and check_for_update('sima-cli') and _should_rerun_after_update(sys.argv)):
113
125
  _rerun_current_command()
114
126
  finally:
115
127
  if auto_accept_update:
@@ -125,14 +137,15 @@ def _initialize_main_context(ctx, internal, yes):
125
137
  if not internal:
126
138
  internal = os.getenv("SIMA_CLI_INTERNAL", "0") in ("1", "true", "yes")
127
139
 
128
- defer_artifactory_access = ctx.invoked_subcommand == "update" or ctx.meta.get("daily_netboot", False)
140
+ local_only = ctx.invoked_subcommand in LOCAL_ONLY_SUBCOMMANDS
141
+ defer_artifactory_access = local_only or ctx.invoked_subcommand == "update" or ctx.meta.get("daily_netboot", False)
129
142
  if internal and not internal_resource_exists() and not defer_artifactory_access:
130
143
  click.echo("❌ You have specified -i or --internal argument to access internal resources, but you do not have an internal resource map configured.")
131
144
  click.echo("Refer to the confluence page to find out how to configure internal resource map.")
132
145
  exit(0)
133
146
 
134
147
  internal_reachable = True
135
- if internal:
148
+ if internal and not local_only:
136
149
  internal_reachable = check_artifactory_reachability()
137
150
 
138
151
  if internal and not internal_reachable and not defer_artifactory_access and not _allows_external_prerelease_fallback(sys.argv):
@@ -167,7 +180,7 @@ class InspectionAwareGroup(click.Group):
167
180
  _command_name_from_argv(['sima-cli'] + options) == 'bootimg'
168
181
  and any(arg in ('--netboot', '-n', '--autoflash', '-a') for arg in options)
169
182
  )
170
- if _command_name_from_argv(['sima-cli'] + options) == 'update' and '--inspect' in options:
183
+ if _command_name_from_argv(['sima-cli'] + options) == 'update' and any(arg in ('--inspect', '--swap') for arg in options):
171
184
  ctx.meta['update_inspect'] = True
172
185
  return super().parse_args(ctx, args)
173
186
 
@@ -188,18 +201,18 @@ def main(ctx, internal, yes):
188
201
  internal = internal or os.getenv("SIMA_CLI_INTERNAL", "0") in ("1", "true", "yes")
189
202
  if internal:
190
203
  Console(stderr=True).print(Panel(
191
- "Pre-release software may be unstable. Use at your own risk.",
192
- title="Pre-release software", border_style="yellow",
204
+ Text("Pre-release software may be unstable. Use at your own risk.", style="yellow"),
205
+ title="Pre-release software", border_style="yellow", width=72,
193
206
  ))
194
207
  if ctx.meta.get('update_inspect'):
195
208
  ctx.ensure_object(dict)
196
209
  ctx.obj.update(internal=internal, yes=yes)
197
210
  return
198
- # Model Registry JSON must remain parseable on stdout. Route root-level
199
- # update and environment diagnostics to stderr for this command group.
211
+ # Model Registry and peripherals JSON must remain parseable on stdout. Route root-level
212
+ # update and environment diagnostics to stderr for these command groups.
200
213
  output_context = (
201
214
  redirect_stdout(sys.stderr)
202
- if ctx.invoked_subcommand == "models"
215
+ if ctx.invoked_subcommand in QUIET_STDOUT_SUBCOMMANDS
203
216
  else nullcontext()
204
217
  )
205
218
  with output_context:
@@ -213,6 +226,8 @@ register_sdk_commands(main)
213
226
  register_playbook_commands(main)
214
227
  register_vulcan_commands(main)
215
228
  register_models_commands(main)
229
+ register_peripherals_commands(main)
230
+ register_cloudex_commands(main)
216
231
 
217
232
 
218
233
  # ----------------------
@@ -314,7 +329,7 @@ def download(ctx, url, dest):
314
329
  @click.option(
315
330
  "-y", "--yes",
316
331
  is_flag=True,
317
- help="Assume yes for update confirmation prompts."
332
+ help="Assume yes for update confirmation prompts and select the newest matching full-system build."
318
333
  )
319
334
  @click.option(
320
335
  "-p", "--passwd",
@@ -348,15 +363,17 @@ def download(ctx, url, dest):
348
363
  "--dryrun",
349
364
  is_flag=True,
350
365
  default=False,
351
- help="For eLxr updates, validate the update path and show the command without installing."
366
+ help="For eLxr, preview an update or slot swap without installing, switching slots, or rebooting."
352
367
  )
353
- @click.option("--inspect", "inspect_state", is_flag=True, help="Show eLxr 3.0+ A/B slot state without updating (local or --ip).")
368
+ @click.option("--inspect", "inspect_state", is_flag=True, help="Show eLxr 3.0+ A/B slots and overlay customizations without updating (local or --ip).")
369
+ @click.option("--swap", is_flag=True, help="Select the available inactive eLxr 3.0+ slot for next boot; use --reboot to restart now.")
370
+ @click.option("--verbose", is_flag=True, help="Show detailed overlay file categories during eLxr 3.0+ inspection or update.")
354
371
  @click.option("--signing-cert", metavar="URL_OR_FILE", help="SWUpdate PEM verification certificate: HTTP(S) URL or local file. Defaults to the certificate for the selected channel when configured (eLxr 3.0+).")
355
- @click.option("--reboot", is_flag=True, help="Reboot after successful eLxr 3.0+ installation; verify remote boot health.")
372
+ @click.option("--reboot", is_flag=True, help="Reboot after successful eLxr 3.0+ installation or slot selection; verify remote boot health.")
356
373
  @click.pass_context
357
- def update(ctx, version_or_url, version_option, ip, yes, passwd, flavor, force, troot_only, dryrun, inspect_state, reboot, signing_cert):
374
+ def update(ctx, version_or_url, version_option, ip, yes, passwd, flavor, force, troot_only, dryrun, inspect_state, verbose, reboot, signing_cert, swap):
358
375
  """
359
- Update the software on a SiMa DevKit or remote SiMa device.
376
+ Update a SiMa DevKit, remote device, or Linux PCIe host.
360
377
 
361
378
  This command downloads and applies system software updates across
362
379
  different SiMa environments (Modalix, MLSoC/Davinci, headless images,
@@ -365,6 +382,15 @@ def update(ctx, version_or_url, version_option, ip, yes, passwd, flavor, force,
365
382
 
366
383
  eLxr 3.0+ uses signed full-system SWU bundles. Use --inspect for A/B
367
384
  state, --ip for remote updates, and --reboot to reboot after installation.
385
+
386
+ Use --swap to select the valid inactive slot without downloading an update.
387
+ The current and target versions are shown before confirmation; --yes skips
388
+ confirmation. Reboot separately to apply, or add --reboot to restart now.
389
+ Shared data and overlay customizations persist and can override files in
390
+ the selected version. Blank, invalid, pending, and unknown states are refused.
391
+
392
+ Examples: sima-cli update --swap; sima-cli update --ip 192.168.6.5 --swap --reboot
393
+
368
394
  The verification certificate is downloaded for the selected channel when configured; use
369
395
  --signing-cert URL_OR_FILE for an image signed with your own certificate.
370
396
  Developer-portal version lookup for 3.0 is not available yet.
@@ -397,6 +423,9 @@ def update(ctx, version_or_url, version_option, ip, yes, passwd, flavor, force,
397
423
 
398
424
  • Remote updates require an accessible IP address (``--ip``)
399
425
 
426
+ • PCIe host updates require Linux and ``-i/--internal``; omit the
427
+ version to choose from the available daily platform builds
428
+
400
429
  Typical Use Cases:
401
430
 
402
431
  • Updating a SiMa DevKit to the latest GA release
@@ -407,6 +436,8 @@ def update(ctx, version_or_url, version_option, ip, yes, passwd, flavor, force,
407
436
 
408
437
  • Running updates from both the device itself or a host PC
409
438
 
439
+ • Installing a daily PCIe host package on a Linux development host
440
+
410
441
  \b
411
442
  Examples:
412
443
 
@@ -438,6 +469,14 @@ def update(ctx, version_or_url, version_option, ip, yes, passwd, flavor, force,
438
469
 
439
470
  sima-cli -i update -y
440
471
 
472
+ # Select and install a PCIe host package from the daily build catalog (Linux only)
473
+
474
+ sima-cli -i update
475
+
476
+ # Or install a specific indexed daily platform build
477
+
478
+ sima-cli -i update -v 3.0.0_daily_develop_B1774
479
+
441
480
  # Update legacy eLxr (<3.0) from the public pre-release mirror without prompts
442
481
 
443
482
  sima-cli -y update -f -y
@@ -453,7 +492,34 @@ def update(ctx, version_or_url, version_option, ip, yes, passwd, flavor, force,
453
492
  """
454
493
  # Prioritize explicit --version option over positional argument
455
494
  version_or_url = version_option or version_or_url
495
+ env_type, env_subtype = get_environment_type()
496
+ internal = ctx.obj.get("internal", False)
497
+ auto_confirm = yes or ctx.obj.get("yes", False)
498
+
499
+ device_update_options = (
500
+ dryrun
501
+ or troot_only
502
+ or inspect_state
503
+ or swap
504
+ or verbose
505
+ or reboot
506
+ or force
507
+ or signing_cert is not None
508
+ or flavor != "auto"
509
+ )
510
+ # A plain update with no remote target means installing the PCIe host
511
+ # package. Device-specific operations continue to the existing dispatcher.
512
+ if env_type == "host" and not ip and not device_update_options:
513
+ if env_subtype != "linux":
514
+ raise click.UsageError("PCIe host updates are only supported on Linux hosts.")
515
+ if not internal:
516
+ raise click.UsageError("Linux PCIe host updates require -i/--internal.")
517
+ install_host_package(version_or_url, auto_confirm=auto_confirm)
518
+ return
519
+
456
520
  is_elxr = is_devkit_running_elxr()
521
+ if swap and (inspect_state or version_or_url or force or troot_only or signing_cert is not None or flavor != "auto"):
522
+ raise click.UsageError("--swap cannot be combined with --inspect or installation options.")
457
523
  if inspect_state and (version_or_url or dryrun or force or troot_only or reboot or signing_cert is not None or flavor != 'auto'):
458
524
  raise click.UsageError("--inspect cannot be combined with installation options.")
459
525
  try:
@@ -461,7 +527,7 @@ def update(ctx, version_or_url, version_option, ip, yes, passwd, flavor, force,
461
527
  internal=ctx.obj.get("internal", False),
462
528
  auto_confirm=yes or ctx.obj.get("yes", False), dryrun=dryrun,
463
529
  signing_cert=signing_cert, reboot=reboot, inspect=inspect_state, force=force,
464
- troot_only=troot_only, flavor=flavor, local_elxr=is_elxr):
530
+ troot_only=troot_only, flavor=flavor, local_elxr=is_elxr, verbose=verbose, swap=swap):
465
531
  return
466
532
  except (click.ClickException, click.Abort):
467
533
  raise
@@ -590,25 +656,34 @@ def mla(ctx):
590
656
  @click.pass_context
591
657
  def show_mla_memory_usage(ctx):
592
658
  """Show MLA Memory usage overtime."""
593
- monitor_simaai_mem_chart()
594
- pass
659
+ try:
660
+ monitor_simaai_mem_chart()
661
+ except MemoryTelemetryError as exc:
662
+ raise click.ClickException(str(exc)) from exc
595
663
 
596
664
 
597
665
  # ----------------------
598
666
  # bootimg Command
599
667
  # ----------------------
600
668
  @main.command(name="bootimg")
601
- @click.option("-v", "--version", required=True, help="Firmware version to download and write (e.g., 1.6.0)")
669
+ @click.option("-v", "--version", required=False, help="Firmware version to download and write (e.g., 1.6.0)")
602
670
  @click.option("-b", "--boardtype", type=click.Choice(["modalix", "mlsoc"], case_sensitive=False), default="modalix", show_default=True, help="Target board type.")
603
671
  @click.option("-t", "--fwtype", type=click.Choice(["yocto", "elxr"], case_sensitive=False), default="elxr", show_default=True, help="Target firmware type.")
604
672
  @click.option("-n", "--netboot", is_flag=True, default=False, show_default=True, help="Prepare image for network boot and launch TFTP server.")
673
+ @click.option(
674
+ "--images",
675
+ type=click.Path(exists=True, file_okay=False, dir_okay=True, readable=True, path_type=Path),
676
+ help="Directory containing local netboot source images.",
677
+ )
678
+ @click.option("--delete-cache", is_flag=True, help="Delete the managed netboot cache after the session exits.")
605
679
  @click.option("-f", "--force", is_flag=True, help="Allow daily mirror fallback if Artifactory is unavailable (internal Modalix eLxr netboot only).")
606
680
  @click.option("--recovery", is_flag=True, help="Write eLxr Modalix recovery media for automatic eMMC recovery.")
607
681
  @click.option("--devkit", "--devkit-ip", "devkit_ip", required=False, help="DevKit IP for remote netboot; discover and select a DevKit when omitted.")
608
682
  @click.option("-r", "--rootfs", required=False, help="Custom root fs folders (internal use only)")
609
683
  @click.option("-a", "--autoflash", is_flag=True, default=False, show_default=True, help="Network boot the selected DevKit, then automatically flash its internal storage once SSH is ready.")
610
684
  @click.pass_context
611
- def bootimg_cmd(ctx, version, boardtype, netboot, devkit_ip, autoflash, fwtype, rootfs, recovery=False, force=False):
685
+ def bootimg_cmd(ctx, version, boardtype, netboot, images, delete_cache, devkit_ip,
686
+ autoflash, fwtype, rootfs, recovery=False, force=False):
612
687
  """
613
688
  Prepare a bootable image for the SiMa DevKit.
614
689
 
@@ -641,6 +716,17 @@ def bootimg_cmd(ctx, version, boardtype, netboot, devkit_ip, autoflash, fwtype,
641
716
 
642
717
  • Automating eMMC flashing over the network
643
718
 
719
+ Local Images and Cache:
720
+
721
+ • Use ``--images DIRECTORY`` to recursively discover local netboot
722
+ artifacts. eLxr requires a minimal TFTP archive and an eMMC
723
+ ``.img.gz``; Yocto requires a release archive.
724
+
725
+ • The supplied directory remains read-only. Prepared content is cached
726
+ under the platform temporary directory in ``sima-cli/netboot`` and is
727
+ reused by default. ``--delete-cache`` removes only the managed cache
728
+ entry after the session exits.
729
+
644
730
  \b
645
731
  Examples:
646
732
 
@@ -664,12 +750,28 @@ def bootimg_cmd(ctx, version, boardtype, netboot, devkit_ip, autoflash, fwtype,
664
750
 
665
751
  sima-cli bootimg -v 2.0.0 --netboot
666
752
 
753
+ # Prepare netboot from images already downloaded to a local directory
754
+
755
+ sima-cli bootimg --netboot --boardtype modalix --fwtype elxr --images /path/to/images
756
+
667
757
  # Prepare USB/SD recovery media that automatically recovers eMMC
668
758
 
669
759
  sima-cli bootimg -v 3.0.0 --recovery
670
760
 
671
761
  """
672
762
 
763
+ uses_netboot = netboot or autoflash
764
+ if images and not uses_netboot:
765
+ raise click.UsageError("--images requires --netboot or --autoflash.")
766
+ if delete_cache and not uses_netboot:
767
+ raise click.UsageError("--delete-cache requires --netboot or --autoflash.")
768
+ if images and version:
769
+ raise click.UsageError("--images and --version cannot be used together.")
770
+ if images and rootfs:
771
+ raise click.UsageError("--images and --rootfs cannot be used together.")
772
+ if not version and not images:
773
+ raise click.UsageError("Provide --version, or use --images for netboot.")
774
+
673
775
  if recovery:
674
776
  if netboot or autoflash or rootfs or devkit_ip:
675
777
  raise click.UsageError("--recovery cannot be combined with --netboot, --autoflash, --rootfs, or --devkit-ip.")
@@ -693,13 +795,23 @@ def bootimg_cmd(ctx, version, boardtype, netboot, devkit_ip, autoflash, fwtype,
693
795
  click.echo(f" 🔹 F/W Type : {fwtype}")
694
796
  click.echo(f" 🔹 F/W Flavor: headless")
695
797
  click.echo(f" 🔹 Custom RootFS: {rootfs}")
798
+ click.echo(f" 🔹 Local Images: {images}")
696
799
  click.echo(f" 🔹 DevKit IP : {devkit_ip}")
697
800
 
698
801
  try:
699
802
  boardtype = boardtype if boardtype != 'mlsoc' else 'davinci'
700
803
  if netboot or autoflash:
701
- setup_netboot(version, boardtype, internal, autoflash, flavor='headless', rootfs=rootfs, swtype=fwtype, allow_daily_fallback=force, devkit=devkit_ip)
702
- click.echo("✅ Netboot image prepared and TFTP server is running.")
804
+ netboot_options = {}
805
+ if images:
806
+ netboot_options["images"] = str(images)
807
+ if delete_cache:
808
+ netboot_options["delete_cache"] = True
809
+ setup_netboot(
810
+ version, boardtype, internal, autoflash, flavor='headless',
811
+ rootfs=rootfs, swtype=fwtype, allow_daily_fallback=force,
812
+ devkit=devkit_ip, **netboot_options,
813
+ )
814
+ click.echo("✅ Netboot session ended and the TFTP server is stopped.")
703
815
  else:
704
816
  write_image(version, boardtype, fwtype, internal, flavor='headless', recovery=recovery)
705
817
  click.echo("✅ Boot image successfully written.")
@@ -982,7 +1094,28 @@ def network_cmd(ctx):
982
1094
  """
983
1095
  Setup Network IP address on the DevKit
984
1096
 
985
- This command only works on the DevKit. It allows user to switch between DHCP and Static (Default addresses) IP.
1097
+ This command only works on the DevKit. Select an interface, then choose DHCP,
1098
+ Default Static IP, or Custom Static IP.
1099
+
1100
+ Custom Static IP prompts for an IPv4 address, such as 192.168.1.50, or an
1101
+ address with a subnet prefix, such as 192.168.1.50/24. A bare address uses
1102
+ the default static profile's prefix. Invalid addresses are rejected;
1103
+ leave the prompt blank to cancel.
1104
+
1105
+ Custom addresses are activated without changing the existing boot
1106
+ configuration. The default static settings are copied into a temporary
1107
+ custom profile with autoconnect disabled on NetworkManager, or a runtime
1108
+ configuration on systemd-networkd. After reboot, the board uses its
1109
+ existing startup configuration. Selecting DHCP or
1110
+ Default Static IP disables the custom configuration.
1111
+ DNS and other default static settings are inherited. If an inherited IPv4
1112
+ gateway is incompatible with the new address, enter a replacement gateway
1113
+ or leave it blank for no gateway. The default profile is not modified.
1114
+
1115
+ Network changes must be made from the DevKit serial console. SSH sessions,
1116
+ including commands launched through sudo, are rejected before configuration
1117
+ changes. A replacement custom profile is activated before the old one is
1118
+ removed.
986
1119
 
987
1120
  """
988
1121
  network_menu()
@@ -0,0 +1,5 @@
1
+ """Experimental CloudEx commands."""
2
+
3
+ from .commands import register_cloudex_commands
4
+
5
+ __all__ = ["register_cloudex_commands"]