sima-cli 2.1.10__tar.gz → 2.1.11__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 (145) hide show
  1. {sima_cli-2.1.10/sima_cli.egg-info → sima_cli-2.1.11}/PKG-INFO +56 -16
  2. {sima_cli-2.1.10 → sima_cli-2.1.11}/README.md +53 -13
  3. {sima_cli-2.1.10 → sima_cli-2.1.11}/pyproject.toml +2 -2
  4. {sima_cli-2.1.10 → sima_cli-2.1.11}/setup.cfg +1 -1
  5. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/__version__.py +1 -1
  6. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/app_zoo/commands.py +23 -1
  7. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/auth/auth0.py +2 -2
  8. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/auth/devportal.py +2 -3
  9. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/cli.py +1 -8
  10. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/data/resources_public.yaml +2 -2
  11. sima_cli-2.1.11/sima_cli/install/compatibility.py +161 -0
  12. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/metadata_installer.py +28 -4
  13. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/metadata_validator.py +40 -6
  14. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/package_builder.py +10 -1
  15. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/registry.py +54 -0
  16. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/commands.py +19 -1
  17. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/install.py +35 -6
  18. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/preinstall.py +33 -24
  19. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/utils.py +34 -20
  20. sima_cli-2.1.11/sima_cli/utils/deprecation.py +8 -0
  21. {sima_cli-2.1.10 → sima_cli-2.1.11/sima_cli.egg-info}/PKG-INFO +56 -16
  22. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli.egg-info/SOURCES.txt +5 -1
  23. sima_cli-2.1.11/tests/unit/test_appzoo_commands.py +37 -0
  24. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_auth.py +23 -0
  25. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_auth0.py +5 -0
  26. sima_cli-2.1.11/tests/unit/test_deprecation.py +29 -0
  27. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_install_stub.py +81 -2
  28. sima_cli-2.1.11/tests/unit/test_metadata_installer.py +413 -0
  29. sima_cli-2.1.11/tests/unit/test_metadata_validator.py +77 -0
  30. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_package_builder.py +125 -0
  31. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_sdk_image_detection.py +153 -9
  32. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_sdk_preinstall.py +30 -1
  33. sima_cli-2.1.10/sima_cli/auth/oauth.py +0 -203
  34. sima_cli-2.1.10/tests/unit/test_metadata_installer.py +0 -207
  35. {sima_cli-2.1.10 → sima_cli-2.1.11}/LICENSE +0 -0
  36. {sima_cli-2.1.10 → sima_cli-2.1.11}/MANIFEST.in +0 -0
  37. {sima_cli-2.1.10 → sima_cli-2.1.11}/requirements.txt +0 -0
  38. {sima_cli-2.1.10 → sima_cli-2.1.11}/setup.py +0 -0
  39. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/__init__.py +0 -0
  40. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/__main__.py +0 -0
  41. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/app_zoo/__init__.py +0 -0
  42. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/app_zoo/app.py +0 -0
  43. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/auth/__init__.py +0 -0
  44. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/auth/login.py +0 -0
  45. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/data/__init__.py +0 -0
  46. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/data/resources_internal.yaml +0 -0
  47. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/deploy_only/__init__.py +0 -0
  48. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/deploy_only/device/__init__.py +0 -0
  49. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/deploy_only/device/commands.py +0 -0
  50. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/deploy_only/mpk/__init__.py +0 -0
  51. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/deploy_only/mpk/commands.py +0 -0
  52. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/discover/__init__.py +0 -0
  53. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/discover/discover.py +0 -0
  54. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/discover/linuxll.py +0 -0
  55. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/download/__init__.py +0 -0
  56. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/download/downloader.py +0 -0
  57. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/__init__.py +0 -0
  58. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/github_assets.py +0 -0
  59. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/hostdriver.py +0 -0
  60. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/metadata_info.py +0 -0
  61. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/optiview.py +0 -0
  62. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/install/palette.py +0 -0
  63. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/mla/__init__.py +0 -0
  64. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/mla/meminfo.py +0 -0
  65. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/model_zoo/__init__.py +0 -0
  66. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/model_zoo/model.py +0 -0
  67. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/network/__init__.py +0 -0
  68. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/network/network.py +0 -0
  69. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/playbooks/__init__.py +0 -0
  70. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/playbooks/commands.py +0 -0
  71. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/playbooks/manager.py +0 -0
  72. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/__init__.py +0 -0
  73. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/cmdexec.py +0 -0
  74. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/config.py +0 -0
  75. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/linux_shared_network.py +0 -0
  76. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/neat.py +0 -0
  77. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/requirements.json +0 -0
  78. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/script.py +0 -0
  79. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/stop.py +0 -0
  80. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/sdk/uninstall.py +0 -0
  81. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/serial/__init__.py +0 -0
  82. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/serial/serial.py +0 -0
  83. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/storage/__init__.py +0 -0
  84. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/storage/nvme.py +0 -0
  85. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/storage/sdcard.py +0 -0
  86. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/__init__.py +0 -0
  87. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/bmaptool.py +0 -0
  88. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/bootimg.py +0 -0
  89. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/cleanlog.py +0 -0
  90. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/elxr.py +0 -0
  91. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/local.py +0 -0
  92. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/netboot.py +0 -0
  93. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/query.py +0 -0
  94. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/remote.py +0 -0
  95. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/update/updater.py +0 -0
  96. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/upgrade/__init__.py +0 -0
  97. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/upgrade/selfupdate.py +0 -0
  98. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/__init__.py +0 -0
  99. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/api_common.py +0 -0
  100. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/artifactory.py +0 -0
  101. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/common.py +0 -0
  102. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/config.py +0 -0
  103. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/config_loader.py +0 -0
  104. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/container_registries.py +0 -0
  105. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/device_api.py +0 -0
  106. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/disk.py +0 -0
  107. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/docker.py +0 -0
  108. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/env.py +0 -0
  109. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/errors.py +0 -0
  110. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/mpk_api.py +0 -0
  111. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/net.py +0 -0
  112. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/network.py +0 -0
  113. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/pcie.py +0 -0
  114. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/pkg_update_check.py +0 -0
  115. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/serializers.py +0 -0
  116. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/services.py +0 -0
  117. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/utils/tag.py +0 -0
  118. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/vulcan/__init__.py +0 -0
  119. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/vulcan/artifacts.py +0 -0
  120. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli/vulcan/commands.py +0 -0
  121. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli.egg-info/dependency_links.txt +0 -0
  122. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli.egg-info/entry_points.txt +0 -0
  123. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli.egg-info/requires.txt +0 -0
  124. {sima_cli-2.1.10 → sima_cli-2.1.11}/sima_cli.egg-info/top_level.txt +0 -0
  125. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/__init__.py +0 -0
  126. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/e2e/__init__.py +0 -0
  127. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/__init__.py +0 -0
  128. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_app_zoo.py +0 -0
  129. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_cli.py +0 -0
  130. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_cli_stdio.py +0 -0
  131. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_cli_update.py +0 -0
  132. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_cli_update_rerun.py +0 -0
  133. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_docker_utils.py +0 -0
  134. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_download.py +0 -0
  135. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_elxr_update.py +0 -0
  136. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_firmware.py +0 -0
  137. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_model_zoo.py +0 -0
  138. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_netboot.py +0 -0
  139. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_pkg_update_check.py +0 -0
  140. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_sdk_uninstall.py +0 -0
  141. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_selfupdate.py +0 -0
  142. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_skills_commands.py +0 -0
  143. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_skills_manager.py +0 -0
  144. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_utils.py +0 -0
  145. {sima_cli-2.1.10 → sima_cli-2.1.11}/tests/unit/test_vulcan.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sima-cli
3
- Version: 2.1.10
3
+ Version: 2.1.11
4
4
  Summary: CLI tool for SiMa Developer Portal to download models, firmware, and apps.
5
- Home-page: https://developer.sima.ai/
5
+ Home-page: https://community.sima.ai/
6
6
  Author: SiMa.ai
7
7
  Author-email: "Sima.ai" <support@sima.ai>
8
8
  License: MIT
9
- Project-URL: Homepage, https://developer.sima.ai/
9
+ Project-URL: Homepage, https://community.sima.ai/
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Operating System :: OS Independent
12
12
  Classifier: Development Status :: 3 - Alpha
@@ -41,12 +41,12 @@ Dynamic: requires-python
41
41
  [![Python 3.12](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=Compatibility%20Python%203.12&label=python%203.12)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
42
42
  [![Python 3.13](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=Compatibility%20Python%203.13&label=python%203.13)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
43
43
  [![Python 3.14](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=Compatibility%20Python%203.14&label=python%203.14)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
44
- [![E2E macOS](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=E2E%20Install%20(macOS%20CLI%20only)&label=e2e%20macOS&logo=apple&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
44
+ [![E2E macOS](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=E2E%20Install%20(macOS)&label=e2e%20macOS&logo=apple&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
45
45
  [![E2E Windows](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=E2E%20Install%20(Windows)&label=e2e%20Windows&logo=windows&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
46
46
  [![E2E Ubuntu x86](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=E2E%20Install%20(Ubuntu%20x86)&label=e2e%20Ubuntu%20x86&logo=ubuntu&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
47
47
  [![E2E Ubuntu ARM64](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=E2E%20Install%20(Ubuntu%20ARM64)&label=e2e%20Ubuntu%20ARM64&logo=ubuntu&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
48
48
 
49
- `sima-cli` is the command-line interface for SiMa developer workflows. It handles authentication, SDK container setup, DevKit updates, package installation, artifact downloads, Model Zoo/App Zoo access, and related development utilities.
49
+ `sima-cli` is the command-line interface for SiMa developer workflows. Use it to authenticate, set up SDK containers, update DevKits, install packages, download artifacts, and access Model Zoo and App Zoo content.
50
50
 
51
51
  ## Documentation
52
52
 
@@ -59,16 +59,45 @@ Use the generated docs for detailed options, arguments, subcommands, and full he
59
59
 
60
60
  ## Installation
61
61
 
62
- Install the latest `main` build:
62
+ For most users, install the latest official release from the public installer URL for your operating system.
63
+
64
+ ### Linux, macOS, and DevKit
65
+
66
+ Run the installer from a terminal:
67
+
68
+ ```bash
69
+ curl -fsSL https://artifacts.neat.sima.ai/sima-cli/linux-mac.sh | bash
70
+ ```
71
+
72
+ After installation, open a new terminal or reload your shell profile, then verify the install:
63
73
 
64
74
  ```bash
65
- curl -fsSL https://artifacts.sima-neat.com/tools/sima-cli-install.py -o sima-cli-install.py
66
- python3 sima-cli-install.py main latest
75
+ sima-cli --version
76
+ ```
77
+
78
+ ### Windows PowerShell
79
+
80
+ Download and run the Windows installer from PowerShell:
81
+
82
+ ```powershell
83
+ Invoke-WebRequest https://artifacts.neat.sima.ai/sima-cli/windows.bat -OutFile windows.bat
84
+ .\windows.bat
67
85
  ```
68
86
 
69
- Install interactively:
87
+ After installation, open a new Command Prompt or PowerShell window, then verify the install:
88
+
89
+ ```powershell
90
+ sima-cli --version
91
+ ```
92
+
93
+ ### Advanced: choose a branch or release
94
+
95
+ Use `install.py` only when you need to choose a specific tested branch build or release instead of installing the latest official PyPI release.
96
+
97
+ On Linux, macOS, or DevKit:
70
98
 
71
99
  ```bash
100
+ curl -fsSL https://artifacts.neat.sima.ai/sima-cli/install.py -o sima-cli-install.py
72
101
  python3 sima-cli-install.py
73
102
  ```
74
103
 
@@ -82,10 +111,19 @@ python3 sima-cli-install.py v2.1.6 latest
82
111
  On Windows PowerShell:
83
112
 
84
113
  ```powershell
85
- Invoke-WebRequest https://artifacts.sima-neat.com/tools/sima-cli-install.py -OutFile sima-cli-install.py
86
- python .\sima-cli-install.py main latest
114
+ Invoke-WebRequest https://artifacts.neat.sima.ai/sima-cli/install.py -OutFile sima-cli-install.py
115
+ python .\sima-cli-install.py
87
116
  ```
88
117
 
118
+ To install a specific branch or release:
119
+
120
+ ```powershell
121
+ python .\sima-cli-install.py feature/my-branch latest
122
+ python .\sima-cli-install.py v2.1.6 latest
123
+ ```
124
+
125
+ Release tags such as `v2.1.6` install from public PyPI. Branch names install tested artifacts from `artifacts.neat.sima.ai/sima-cli`.
126
+
89
127
  Public PyPI releases can also be installed directly:
90
128
 
91
129
  ```bash
@@ -96,15 +134,15 @@ pip install sima-cli
96
134
 
97
135
  ```bash
98
136
  sima-cli --help
137
+ sima-cli --version
99
138
  sima-cli login
100
- sima-cli version
101
139
  ```
102
140
 
103
141
  Use `--internal` or `SIMA_CLI_INTERNAL=1` when internal Artifactory resources are required:
104
142
 
105
143
  ```bash
106
144
  sima-cli --internal login
107
- SIMA_CLI_INTERNAL=1 sima-cli install -v 2.1.1 sdk-extensions/model
145
+ SIMA_CLI_INTERNAL=1 sima-cli install -v 2.1.2 tools/model-compiler/amd64
108
146
  ```
109
147
 
110
148
  ## Common Workflows
@@ -116,10 +154,13 @@ sima-cli sdk setup
116
154
  sima-cli sdk neat
117
155
  ```
118
156
 
119
- Install a package from metadata:
157
+ Install Model Compiler from package metadata:
120
158
 
121
159
  ```bash
122
- sima-cli install -v 2.1.1 sdk-extensions/model
160
+ # amd64 host
161
+ sima-cli install -v 2.1.2 tools/model-compiler/amd64
162
+ # arm64 host
163
+ sima-cli install -v 2.1.2 tools/model-compiler/arm64
123
164
  ```
124
165
 
125
166
  Download or install Neat artifacts:
@@ -165,7 +206,6 @@ sima-cli appzoo list
165
206
  | `sima-cli selfupdate` | Update sima-cli manually. | [docs](docs/sima-cli/commands/sima-cli-selfupdate.md) |
166
207
  | `sima-cli serial` | Connect to the UART serial console of a DevKit. | [docs](docs/sima-cli/commands/sima-cli-serial.md) |
167
208
  | `sima-cli update` | Update a SiMa DevKit or remote device. | [docs](docs/sima-cli/commands/sima-cli-update.md) |
168
- | `sima-cli version` | Show the installed CLI version. | [docs](docs/sima-cli/commands/sima-cli-version.md) |
169
209
 
170
210
  ## Development
171
211
 
@@ -7,12 +7,12 @@
7
7
  [![Python 3.12](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=Compatibility%20Python%203.12&label=python%203.12)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
8
8
  [![Python 3.13](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=Compatibility%20Python%203.13&label=python%203.13)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
9
9
  [![Python 3.14](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=Compatibility%20Python%203.14&label=python%203.14)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
10
- [![E2E macOS](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=E2E%20Install%20(macOS%20CLI%20only)&label=e2e%20macOS&logo=apple&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
10
+ [![E2E macOS](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=E2E%20Install%20(macOS)&label=e2e%20macOS&logo=apple&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
11
11
  [![E2E Windows](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=E2E%20Install%20(Windows)&label=e2e%20Windows&logo=windows&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
12
12
  [![E2E Ubuntu x86](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=E2E%20Install%20(Ubuntu%20x86)&label=e2e%20Ubuntu%20x86&logo=ubuntu&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
13
13
  [![E2E Ubuntu ARM64](https://img.shields.io/github/actions/workflow/status/sima-neat/sima-cli/vulcan-ci.yml?branch=main&job=E2E%20Install%20(Ubuntu%20ARM64)&label=e2e%20Ubuntu%20ARM64&logo=ubuntu&logoColor=white)](https://github.com/sima-neat/sima-cli/actions/workflows/vulcan-ci.yml)
14
14
 
15
- `sima-cli` is the command-line interface for SiMa developer workflows. It handles authentication, SDK container setup, DevKit updates, package installation, artifact downloads, Model Zoo/App Zoo access, and related development utilities.
15
+ `sima-cli` is the command-line interface for SiMa developer workflows. Use it to authenticate, set up SDK containers, update DevKits, install packages, download artifacts, and access Model Zoo and App Zoo content.
16
16
 
17
17
  ## Documentation
18
18
 
@@ -25,16 +25,45 @@ Use the generated docs for detailed options, arguments, subcommands, and full he
25
25
 
26
26
  ## Installation
27
27
 
28
- Install the latest `main` build:
28
+ For most users, install the latest official release from the public installer URL for your operating system.
29
+
30
+ ### Linux, macOS, and DevKit
31
+
32
+ Run the installer from a terminal:
33
+
34
+ ```bash
35
+ curl -fsSL https://artifacts.neat.sima.ai/sima-cli/linux-mac.sh | bash
36
+ ```
37
+
38
+ After installation, open a new terminal or reload your shell profile, then verify the install:
29
39
 
30
40
  ```bash
31
- curl -fsSL https://artifacts.sima-neat.com/tools/sima-cli-install.py -o sima-cli-install.py
32
- python3 sima-cli-install.py main latest
41
+ sima-cli --version
42
+ ```
43
+
44
+ ### Windows PowerShell
45
+
46
+ Download and run the Windows installer from PowerShell:
47
+
48
+ ```powershell
49
+ Invoke-WebRequest https://artifacts.neat.sima.ai/sima-cli/windows.bat -OutFile windows.bat
50
+ .\windows.bat
33
51
  ```
34
52
 
35
- Install interactively:
53
+ After installation, open a new Command Prompt or PowerShell window, then verify the install:
54
+
55
+ ```powershell
56
+ sima-cli --version
57
+ ```
58
+
59
+ ### Advanced: choose a branch or release
60
+
61
+ Use `install.py` only when you need to choose a specific tested branch build or release instead of installing the latest official PyPI release.
62
+
63
+ On Linux, macOS, or DevKit:
36
64
 
37
65
  ```bash
66
+ curl -fsSL https://artifacts.neat.sima.ai/sima-cli/install.py -o sima-cli-install.py
38
67
  python3 sima-cli-install.py
39
68
  ```
40
69
 
@@ -48,10 +77,19 @@ python3 sima-cli-install.py v2.1.6 latest
48
77
  On Windows PowerShell:
49
78
 
50
79
  ```powershell
51
- Invoke-WebRequest https://artifacts.sima-neat.com/tools/sima-cli-install.py -OutFile sima-cli-install.py
52
- python .\sima-cli-install.py main latest
80
+ Invoke-WebRequest https://artifacts.neat.sima.ai/sima-cli/install.py -OutFile sima-cli-install.py
81
+ python .\sima-cli-install.py
53
82
  ```
54
83
 
84
+ To install a specific branch or release:
85
+
86
+ ```powershell
87
+ python .\sima-cli-install.py feature/my-branch latest
88
+ python .\sima-cli-install.py v2.1.6 latest
89
+ ```
90
+
91
+ Release tags such as `v2.1.6` install from public PyPI. Branch names install tested artifacts from `artifacts.neat.sima.ai/sima-cli`.
92
+
55
93
  Public PyPI releases can also be installed directly:
56
94
 
57
95
  ```bash
@@ -62,15 +100,15 @@ pip install sima-cli
62
100
 
63
101
  ```bash
64
102
  sima-cli --help
103
+ sima-cli --version
65
104
  sima-cli login
66
- sima-cli version
67
105
  ```
68
106
 
69
107
  Use `--internal` or `SIMA_CLI_INTERNAL=1` when internal Artifactory resources are required:
70
108
 
71
109
  ```bash
72
110
  sima-cli --internal login
73
- SIMA_CLI_INTERNAL=1 sima-cli install -v 2.1.1 sdk-extensions/model
111
+ SIMA_CLI_INTERNAL=1 sima-cli install -v 2.1.2 tools/model-compiler/amd64
74
112
  ```
75
113
 
76
114
  ## Common Workflows
@@ -82,10 +120,13 @@ sima-cli sdk setup
82
120
  sima-cli sdk neat
83
121
  ```
84
122
 
85
- Install a package from metadata:
123
+ Install Model Compiler from package metadata:
86
124
 
87
125
  ```bash
88
- sima-cli install -v 2.1.1 sdk-extensions/model
126
+ # amd64 host
127
+ sima-cli install -v 2.1.2 tools/model-compiler/amd64
128
+ # arm64 host
129
+ sima-cli install -v 2.1.2 tools/model-compiler/arm64
89
130
  ```
90
131
 
91
132
  Download or install Neat artifacts:
@@ -131,7 +172,6 @@ sima-cli appzoo list
131
172
  | `sima-cli selfupdate` | Update sima-cli manually. | [docs](docs/sima-cli/commands/sima-cli-selfupdate.md) |
132
173
  | `sima-cli serial` | Connect to the UART serial console of a DevKit. | [docs](docs/sima-cli/commands/sima-cli-serial.md) |
133
174
  | `sima-cli update` | Update a SiMa DevKit or remote device. | [docs](docs/sima-cli/commands/sima-cli-update.md) |
134
- | `sima-cli version` | Show the installed CLI version. | [docs](docs/sima-cli/commands/sima-cli-version.md) |
135
175
 
136
176
  ## Development
137
177
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sima-cli"
7
- version = "2.1.10"
7
+ version = "2.1.11"
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"
@@ -37,7 +37,7 @@ dependencies = [
37
37
  ]
38
38
 
39
39
  [project.urls]
40
- Homepage = "https://developer.sima.ai/"
40
+ Homepage = "https://community.sima.ai/"
41
41
 
42
42
  [project.scripts]
43
43
  sima-cli = "sima_cli.cli:main"
@@ -5,7 +5,7 @@ author_email = support@sima.ai
5
5
  description = CLI tool for SiMa Developer Portal to download models, firmware, and apps.
6
6
  long_description = file: README.md
7
7
  long_description_content_type = text/markdown
8
- url = https://developer.sima.ai/
8
+ url = https://community.sima.ai/
9
9
  license = MIT
10
10
  classifiers =
11
11
  Programming Language :: Python :: 3
@@ -1,2 +1,2 @@
1
1
  # sima_cli/__version__.py
2
- __version__ = "2.1.10"
2
+ __version__ = "2.1.11"
@@ -1,9 +1,31 @@
1
1
 
2
2
  import click
3
+ from rich.console import Console
4
+ from rich.panel import Panel
3
5
 
4
6
  from sima_cli.app_zoo.app import list_apps, download_app, describe_app, clone_apps
7
+ from sima_cli.utils.deprecation import should_show_post_neat_ga_deprecation_notice
5
8
  from sima_cli.utils.tag import resolve_version
6
9
 
10
+ console = Console()
11
+
12
+
13
+ def show_appzoo_deprecation_notice() -> None:
14
+ if not should_show_post_neat_ga_deprecation_notice():
15
+ return
16
+
17
+ console.print(
18
+ Panel(
19
+ "[yellow]App Zoo is compatible with legacy Palette SDKs and will be deprecated soon.[/yellow]\n\n"
20
+ "Use https://developer.sima.ai/examples to access current example applications.",
21
+ title="App Zoo Deprecation Notice",
22
+ border_style="yellow",
23
+ style="yellow",
24
+ expand=False,
25
+ )
26
+ )
27
+
28
+
7
29
  @click.group()
8
30
  @click.option(
9
31
  "-v", "--ver", "--version",
@@ -15,6 +37,7 @@ from sima_cli.utils.tag import resolve_version
15
37
  def appzoo(ctx, ver):
16
38
  """Access sample apps from the App Zoo."""
17
39
  ctx.ensure_object(dict)
40
+ show_appzoo_deprecation_notice()
18
41
  internal = ctx.obj.get("internal", False)
19
42
  if not internal:
20
43
  ver = resolve_version(ver)
@@ -71,4 +94,3 @@ def register_appzoo_commands(main):
71
94
  register_appzoo_commands(main)
72
95
  """
73
96
  main.add_command(appzoo)
74
-
@@ -32,8 +32,8 @@ USERINFO_AUDIENCE = PROD_USERINFO_AUDIENCE
32
32
  LATEST_EULA_GRANT = "LatestEULA"
33
33
  DOC_ACCESS_GRANT = "DocsAccess"
34
34
  DOC_ACCESS_GRANT_ALIASES = (DOC_ACCESS_GRANT, "DocAccess")
35
- PROD_DISCOURSE_URL = "https://developer.sima.ai/login"
36
- STAGING_DISCOURSE_URL = "https://discourse-dev.sima.ai/login"
35
+ PROD_DISCOURSE_URL = "https://community.sima.ai/login"
36
+ STAGING_DISCOURSE_URL = "https://community-dev.sima.ai/login"
37
37
 
38
38
  # ─────────────────────────────────────────────
39
39
  # Configuration loader
@@ -40,15 +40,14 @@ HOST_DOCKER_CONTEXTS_DIR = os.path.join(os.path.expanduser("~"), ".docker", "con
40
40
  # Detect staging or production environment
41
41
  is_staging = False
42
42
  if os.getenv("USE_STAGING_DEV_PORTAL", "false").lower() in ("1", "true", "yes"):
43
- DEV_PORTAL = "https://discourse-dev.sima.ai"
43
+ DEV_PORTAL = "https://community-dev.sima.ai"
44
44
  DOCS_PORTAL = "https://docs-dev.sima.ai"
45
45
  is_staging = True
46
46
  else:
47
- DEV_PORTAL = "https://developer.sima.ai"
47
+ DEV_PORTAL = "https://community.sima.ai"
48
48
  DOCS_PORTAL = "https://docs.sima.ai"
49
49
 
50
50
  # Derived endpoints
51
- LOGIN_URL = f"{DEV_PORTAL}/session"
52
51
  DEV_PORTAL_LOGIN_URL = f"{DEV_PORTAL}/login"
53
52
  DUMMY_CHECK_URL = f"{DOCS_PORTAL}/pkg_downloads/validation"
54
53
  ACCESS_REQUEST_FORM_URL = "https://www2.sima.ai/l/1041271/2025-05-05/37bndg"
@@ -82,6 +82,7 @@ def _rerun_current_command() -> None:
82
82
  # Entry point for the CLI tool using Click's command group decorator
83
83
  @click.group(context_settings=dict(help_option_names=["-h", "--help", "-?"], max_content_width=120))
84
84
  @click.option('-i', '--internal', is_flag=True, help="Use internal Artifactory resources, Authorized Sima employees only")
85
+ @click.version_option(version=f"{__version__}", message="SiMa CLI version: %(version)s")
85
86
  @click.pass_context
86
87
  def main(ctx, internal):
87
88
  """
@@ -143,14 +144,6 @@ def login(ctx):
143
144
  internal = ctx.obj.get("internal", False)
144
145
  perform_login.login("internal" if internal else "external")
145
146
 
146
- # ----------------------
147
- # Version Command
148
- # ----------------------
149
- @main.command(name="version")
150
- def version_cmd():
151
- """Show the version of the CLI tool."""
152
- click.echo(f"SiMa CLI version: {__version__}")
153
-
154
147
  # ----------------------
155
148
  # Logout Command
156
149
  # ----------------------
@@ -1,5 +1,5 @@
1
1
  artifactory:
2
- url: "https://developer.sima.ai"
2
+ url: "https://community.sima.ai"
3
3
 
4
4
  auth:
5
5
  auth_url: "/login"
@@ -18,4 +18,4 @@ auth-dev:
18
18
  client-id: Rjrv1TXE5VWjMmCmWyT6OmLYEN1K5AIS
19
19
 
20
20
  download:
21
- download_url: "https://docs.sima.ai/pkg_downloads/"
21
+ download_url: "https://docs.sima.ai/pkg_downloads/"
@@ -0,0 +1,161 @@
1
+ import re
2
+ from typing import Dict, List, Optional, Sequence
3
+
4
+
5
+ VALID_OS = {"linux", "windows", "mac", "ubuntu"}
6
+ VALID_PLATFORM_TYPES = {"board", "palette", "host"}
7
+
8
+ _COMPATIBLE_NAME_RE = re.compile(r"^[A-Za-z0-9_.-]+$")
9
+ _VERSION_RE = r"v?\d+(?:\.\d+)*"
10
+ _VERSION_CLAUSE_RE = re.compile(r"^(>=|<=|==|=|>|<)?\s*({})$".format(_VERSION_RE))
11
+
12
+
13
+ def _split_csv(value: str) -> List[str]:
14
+ return [item.strip() for item in value.split(",") if item.strip()]
15
+
16
+
17
+ def _version_tuple(version: str) -> tuple:
18
+ normalized = version.strip()
19
+ if normalized.startswith("v"):
20
+ normalized = normalized[1:]
21
+ return tuple(int(part) for part in normalized.split("."))
22
+
23
+
24
+ def _pad_versions(left: tuple, right: tuple) -> tuple:
25
+ length = max(len(left), len(right))
26
+ return left + (0,) * (length - len(left)), right + (0,) * (length - len(right))
27
+
28
+
29
+ def normalize_version_spec(spec: str) -> str:
30
+ if not isinstance(spec, str) or not spec.strip():
31
+ raise ValueError("version spec must be a non-empty string")
32
+
33
+ clauses = []
34
+ for raw_clause in spec.split(","):
35
+ clause = raw_clause.strip()
36
+ if not clause:
37
+ raise ValueError("version spec contains an empty clause")
38
+ match = _VERSION_CLAUSE_RE.fullmatch(clause)
39
+ if not match:
40
+ raise ValueError(
41
+ "invalid version spec '{}'; expected versions like 2.1.1, ==2.1.1, "
42
+ ">=2.1.0, or >=2.1.0,<=2.1.2".format(spec)
43
+ )
44
+ op, version = match.groups()
45
+ clauses.append("{}{}".format(op or "", version))
46
+
47
+ return ",".join(clauses)
48
+
49
+
50
+ def validate_version_spec(spec: str) -> None:
51
+ normalize_version_spec(spec)
52
+
53
+
54
+ def normalize_exact_version(version: str) -> str:
55
+ if not isinstance(version, str) or not version.strip():
56
+ raise ValueError("version must be a non-empty string")
57
+ normalized = version.strip()
58
+ if not re.fullmatch(_VERSION_RE, normalized):
59
+ raise ValueError("invalid exact version '{}'; expected a version like 2.0.0".format(version))
60
+ return normalized
61
+
62
+
63
+ def version_matches(version: str, spec: str) -> bool:
64
+ normalized_spec = normalize_version_spec(spec)
65
+ current = _version_tuple(version)
66
+
67
+ for clause in normalized_spec.split(","):
68
+ match = _VERSION_CLAUSE_RE.fullmatch(clause)
69
+ if not match:
70
+ return False
71
+ op, target_value = match.groups()
72
+ op = op or "=="
73
+ target = _version_tuple(target_value)
74
+ left, right = _pad_versions(current, target)
75
+
76
+ if op in ("=", "=="):
77
+ clause_matches = left == right
78
+ elif op == ">":
79
+ clause_matches = left > right
80
+ elif op == ">=":
81
+ clause_matches = left >= right
82
+ elif op == "<":
83
+ clause_matches = left < right
84
+ elif op == "<=":
85
+ clause_matches = left <= right
86
+ else:
87
+ clause_matches = False
88
+
89
+ if not clause_matches:
90
+ return False
91
+
92
+ return True
93
+
94
+
95
+ def parse_host_platform_specs(host_platforms: Optional[Sequence[str]]) -> List[Dict]:
96
+ platforms = []
97
+ for raw_spec in host_platforms or []:
98
+ os_values = []
99
+ seen = set()
100
+ for value in _split_csv(raw_spec):
101
+ os_value = value.lower()
102
+ if os_value not in VALID_OS:
103
+ raise ValueError(
104
+ "invalid host platform OS '{}'; supported values are {}".format(
105
+ value, ", ".join(sorted(VALID_OS))
106
+ )
107
+ )
108
+ if os_value not in seen:
109
+ seen.add(os_value)
110
+ os_values.append(os_value)
111
+ if not os_values:
112
+ raise ValueError("host platform spec must include at least one OS")
113
+ platforms.append({"type": "host", "os": os_values})
114
+ return platforms
115
+
116
+
117
+ def parse_board_platform_spec(spec: str) -> Dict:
118
+ if not isinstance(spec, str) or not spec.strip():
119
+ raise ValueError("board platform spec must be a non-empty string")
120
+
121
+ raw_compat, separator, raw_version_spec = spec.strip().partition("@")
122
+ compatible_with = []
123
+ seen = set()
124
+ for value in _split_csv(raw_compat):
125
+ if not _COMPATIBLE_NAME_RE.fullmatch(value):
126
+ raise ValueError(
127
+ "invalid board compatibility target '{}'; use letters, numbers, dots, underscores, or hyphens".format(
128
+ value
129
+ )
130
+ )
131
+ if value not in seen:
132
+ seen.add(value)
133
+ compatible_with.append(value)
134
+
135
+ if not compatible_with:
136
+ raise ValueError("board platform spec must include at least one compatibility target")
137
+
138
+ platform = {"type": "board", "compatible_with": compatible_with}
139
+ if separator:
140
+ platform["version"] = normalize_version_spec(raw_version_spec)
141
+ return platform
142
+
143
+
144
+ def parse_board_platform_specs(board_platforms: Optional[Sequence[str]]) -> List[Dict]:
145
+ return [parse_board_platform_spec(spec) for spec in board_platforms or []]
146
+
147
+
148
+ def build_platform_specs(
149
+ host_platforms: Optional[Sequence[str]] = None,
150
+ board_platforms: Optional[Sequence[str]] = None,
151
+ palette_platform: Optional[str] = None,
152
+ ) -> List[Dict]:
153
+ platforms = []
154
+ platforms.extend(parse_host_platform_specs(host_platforms))
155
+ platforms.extend(parse_board_platform_specs(board_platforms))
156
+ if palette_platform is not None:
157
+ platform = {"type": "palette"}
158
+ if palette_platform:
159
+ platform["version"] = normalize_exact_version(palette_platform)
160
+ platforms.append(platform)
161
+ return platforms
@@ -28,6 +28,7 @@ from sima_cli.utils.disk import check_disk_space
28
28
  from sima_cli.utils.env import get_environment_type, get_exact_devkit_type, get_sima_build_version
29
29
  from sima_cli.download.downloader import download_file_from_url
30
30
  from sima_cli.install.metadata_validator import validate_metadata, MetadataValidationError
31
+ from sima_cli.install.compatibility import version_matches
31
32
  from sima_cli.install.metadata_info import print_metadata_summary, parse_size_string_to_bytes
32
33
  from sima_cli.utils.container_registries import install_from_cr
33
34
  from sima_cli.install.registry import PackageRegistry
@@ -1114,6 +1115,19 @@ def _compare_versions(current: str, condition: str) -> bool:
1114
1115
  return cur <= target
1115
1116
  return False
1116
1117
 
1118
+
1119
+ def _get_palette_sdk_version(release_file: Path = Path("/etc/sdk-release")) -> str:
1120
+ try:
1121
+ content = release_file.read_text(encoding="utf-8")
1122
+ except OSError:
1123
+ return ""
1124
+
1125
+ match = re.search(r"^SDK Version\s*=\s*(\S+)", content, flags=re.MULTILINE)
1126
+ if not match:
1127
+ return ""
1128
+ return match.group(1).split("_", 1)[0].strip()
1129
+
1130
+
1117
1131
  def _is_platform_compatible(metadata: dict, force: bool = False) -> bool:
1118
1132
  """
1119
1133
  Determines if the current environment is compatible with the package metadata.
@@ -1169,7 +1183,17 @@ def _is_platform_compatible(metadata: dict, force: bool = False) -> bool:
1169
1183
  for platform_entry in platforms:
1170
1184
  platform_type = platform_entry.get("type")
1171
1185
  if (platform_type, env_type, env_subtype) == ("palette", "sdk", "palette"):
1172
- return True
1186
+ compatible_palette_version = platform_entry.get("version", "")
1187
+ if not compatible_palette_version:
1188
+ return True
1189
+ palette_sdk_version = _get_palette_sdk_version()
1190
+ if palette_sdk_version and version_matches(palette_sdk_version, compatible_palette_version):
1191
+ return True
1192
+ click.echo(
1193
+ f"❌ Palette SDK version {palette_sdk_version or 'unknown'} is not compatible. "
1194
+ f"Required: {compatible_palette_version}"
1195
+ )
1196
+ continue
1173
1197
  if platform_type != env_type:
1174
1198
  continue
1175
1199
 
@@ -1179,10 +1203,10 @@ def _is_platform_compatible(metadata: dict, force: bool = False) -> bool:
1179
1203
  if env_subtype not in compat and exact_devkit_type not in compat:
1180
1204
  continue
1181
1205
  else:
1182
- compatible_board_version = platform_entry.get('version', '')
1183
- # If version field exists in metadata then check if the board is running compatible version
1206
+ compatible_board_version = platform_entry.get("version", "")
1207
+ # If version field exists in metadata then check if the board is running compatible version.
1184
1208
  if len(compatible_board_version) > 0:
1185
- if board_ver == compatible_board_version:
1209
+ if board_ver and version_matches(board_ver, compatible_board_version):
1186
1210
  return True
1187
1211
  else:
1188
1212
  # otherwise return true as it's generally compatible