v8x 0.1.2__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 (307) hide show
  1. v8x-0.1.2/.github/copilot-instructions.md +79 -0
  2. v8x-0.1.2/.github/workflows/ci.yml +70 -0
  3. v8x-0.1.2/.github/workflows/publish.yml +204 -0
  4. v8x-0.1.2/.github/workflows/update-docs.yml +265 -0
  5. v8x-0.1.2/.gitignore +68 -0
  6. v8x-0.1.2/LICENSE +674 -0
  7. v8x-0.1.2/PKG-INFO +127 -0
  8. v8x-0.1.2/README.md +88 -0
  9. v8x-0.1.2/docusaurus/.gitignore +20 -0
  10. v8x-0.1.2/docusaurus/README.md +41 -0
  11. v8x-0.1.2/docusaurus/data/version.yml +9 -0
  12. v8x-0.1.2/docusaurus/docusaurus.config.ts +298 -0
  13. v8x-0.1.2/docusaurus/package.json +49 -0
  14. v8x-0.1.2/docusaurus/scripts/build-with-version.sh +8 -0
  15. v8x-0.1.2/docusaurus/sidebars.ts +69 -0
  16. v8x-0.1.2/docusaurus/src/css/commands.css +80 -0
  17. v8x-0.1.2/docusaurus/src/css/custom.css +229 -0
  18. v8x-0.1.2/docusaurus/static/.nojekyll +0 -0
  19. v8x-0.1.2/docusaurus/tsconfig.json +8 -0
  20. v8x-0.1.2/docusaurus/yarn.lock +9894 -0
  21. v8x-0.1.2/pyproject.toml +148 -0
  22. v8x-0.1.2/scripts/add_license_headers.py +223 -0
  23. v8x-0.1.2/scripts/generate_complete_docs.py +671 -0
  24. v8x-0.1.2/scripts/update_docs_version.py +75 -0
  25. v8x-0.1.2/uv.lock +2394 -0
  26. v8x-0.1.2/v8x/__init__.py +509 -0
  27. v8x-0.1.2/v8x/apps/__init__.py +15 -0
  28. v8x-0.1.2/v8x/apps/lxd/__init__.py +12 -0
  29. v8x-0.1.2/v8x/apps/lxd/slurm/__init__.py +17 -0
  30. v8x-0.1.2/v8x/apps/lxd/slurm/app.py +1281 -0
  31. v8x-0.1.2/v8x/apps/lxd/slurm/constants.py +23 -0
  32. v8x-0.1.2/v8x/apps/lxd/slurm/render.py +51 -0
  33. v8x-0.1.2/v8x/apps/lxd/slurm/templates.py +168 -0
  34. v8x-0.1.2/v8x/apps/lxd/slurm/utils.py +12 -0
  35. v8x-0.1.2/v8x/apps/on_prem/__init__.py +12 -0
  36. v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/__init__.py +16 -0
  37. v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/app.py +352 -0
  38. v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/constants.py +304 -0
  39. v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/render.py +134 -0
  40. v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/templates.py +319 -0
  41. v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/utils.py +129 -0
  42. v8x-0.1.2/v8x/auth.py +589 -0
  43. v8x-0.1.2/v8x/cache.py +170 -0
  44. v8x-0.1.2/v8x/client.py +96 -0
  45. v8x-0.1.2/v8x/commands/__init__.py +12 -0
  46. v8x-0.1.2/v8x/commands/alias/__init__.py +34 -0
  47. v8x-0.1.2/v8x/commands/alias/apps.py +25 -0
  48. v8x-0.1.2/v8x/commands/alias/cloud_accounts.py +31 -0
  49. v8x-0.1.2/v8x/commands/alias/clouds.py +31 -0
  50. v8x-0.1.2/v8x/commands/alias/clusters.py +25 -0
  51. v8x-0.1.2/v8x/commands/alias/deployments.py +34 -0
  52. v8x-0.1.2/v8x/commands/alias/federations.py +25 -0
  53. v8x-0.1.2/v8x/commands/alias/networks.py +25 -0
  54. v8x-0.1.2/v8x/commands/alias/profiles.py +26 -0
  55. v8x-0.1.2/v8x/commands/alias/support_tickets.py +25 -0
  56. v8x-0.1.2/v8x/commands/alias/teams.py +26 -0
  57. v8x-0.1.2/v8x/commands/app/__init__.py +53 -0
  58. v8x-0.1.2/v8x/commands/app/deployment/__init__.py +90 -0
  59. v8x-0.1.2/v8x/commands/app/deployment/cleanup.py +225 -0
  60. v8x-0.1.2/v8x/commands/app/deployment/create.py +15 -0
  61. v8x-0.1.2/v8x/commands/app/deployment/delete.py +150 -0
  62. v8x-0.1.2/v8x/commands/app/deployment/get.py +54 -0
  63. v8x-0.1.2/v8x/commands/app/deployment/list.py +59 -0
  64. v8x-0.1.2/v8x/commands/app/deployment/render.py +298 -0
  65. v8x-0.1.2/v8x/commands/app/list.py +58 -0
  66. v8x-0.1.2/v8x/commands/cloud/__init__.py +31 -0
  67. v8x-0.1.2/v8x/commands/cloud/account/__init__.py +37 -0
  68. v8x-0.1.2/v8x/commands/cloud/account/create.py +311 -0
  69. v8x-0.1.2/v8x/commands/cloud/account/delete.py +101 -0
  70. v8x-0.1.2/v8x/commands/cloud/account/get.py +109 -0
  71. v8x-0.1.2/v8x/commands/cloud/account/list.py +92 -0
  72. v8x-0.1.2/v8x/commands/cloud/get.py +61 -0
  73. v8x-0.1.2/v8x/commands/cloud/list.py +57 -0
  74. v8x-0.1.2/v8x/commands/cluster/__init__.py +63 -0
  75. v8x-0.1.2/v8x/commands/cluster/compute_pool/__init__.py +31 -0
  76. v8x-0.1.2/v8x/commands/cluster/compute_pool/_helpers.py +53 -0
  77. v8x-0.1.2/v8x/commands/cluster/compute_pool/create.py +203 -0
  78. v8x-0.1.2/v8x/commands/cluster/compute_pool/delete.py +92 -0
  79. v8x-0.1.2/v8x/commands/cluster/compute_pool/get.py +107 -0
  80. v8x-0.1.2/v8x/commands/cluster/compute_pool/list.py +111 -0
  81. v8x-0.1.2/v8x/commands/cluster/create.py +738 -0
  82. v8x-0.1.2/v8x/commands/cluster/delete.py +301 -0
  83. v8x-0.1.2/v8x/commands/cluster/extend.py +216 -0
  84. v8x-0.1.2/v8x/commands/cluster/federation/__init__.py +35 -0
  85. v8x-0.1.2/v8x/commands/cluster/federation/create.py +72 -0
  86. v8x-0.1.2/v8x/commands/cluster/federation/delete.py +82 -0
  87. v8x-0.1.2/v8x/commands/cluster/federation/get.py +65 -0
  88. v8x-0.1.2/v8x/commands/cluster/federation/list.py +61 -0
  89. v8x-0.1.2/v8x/commands/cluster/federation/update.py +88 -0
  90. v8x-0.1.2/v8x/commands/cluster/get.py +80 -0
  91. v8x-0.1.2/v8x/commands/cluster/inference_endpoint/__init__.py +29 -0
  92. v8x-0.1.2/v8x/commands/cluster/inference_endpoint/_helpers.py +34 -0
  93. v8x-0.1.2/v8x/commands/cluster/inference_endpoint/create.py +174 -0
  94. v8x-0.1.2/v8x/commands/cluster/inference_endpoint/delete.py +61 -0
  95. v8x-0.1.2/v8x/commands/cluster/inference_endpoint/get.py +90 -0
  96. v8x-0.1.2/v8x/commands/cluster/inference_endpoint/list.py +89 -0
  97. v8x-0.1.2/v8x/commands/cluster/inference_endpoint/logs.py +67 -0
  98. v8x-0.1.2/v8x/commands/cluster/inference_endpoint/runtimes.py +80 -0
  99. v8x-0.1.2/v8x/commands/cluster/inference_endpoint/start_stop.py +85 -0
  100. v8x-0.1.2/v8x/commands/cluster/inference_preset/__init__.py +34 -0
  101. v8x-0.1.2/v8x/commands/cluster/inference_preset/_helpers.py +53 -0
  102. v8x-0.1.2/v8x/commands/cluster/inference_preset/create.py +142 -0
  103. v8x-0.1.2/v8x/commands/cluster/inference_preset/delete.py +88 -0
  104. v8x-0.1.2/v8x/commands/cluster/inference_preset/get.py +95 -0
  105. v8x-0.1.2/v8x/commands/cluster/inference_preset/list.py +93 -0
  106. v8x-0.1.2/v8x/commands/cluster/kubeflow/__init__.py +39 -0
  107. v8x-0.1.2/v8x/commands/cluster/kubeflow/_helpers.py +68 -0
  108. v8x-0.1.2/v8x/commands/cluster/kubeflow/create.py +125 -0
  109. v8x-0.1.2/v8x/commands/cluster/kubeflow/delete.py +123 -0
  110. v8x-0.1.2/v8x/commands/cluster/kubeflow/get.py +88 -0
  111. v8x-0.1.2/v8x/commands/cluster/list.py +74 -0
  112. v8x-0.1.2/v8x/commands/cluster/model_registry/__init__.py +39 -0
  113. v8x-0.1.2/v8x/commands/cluster/model_registry/_helpers.py +43 -0
  114. v8x-0.1.2/v8x/commands/cluster/model_registry/create.py +125 -0
  115. v8x-0.1.2/v8x/commands/cluster/model_registry/delete.py +61 -0
  116. v8x-0.1.2/v8x/commands/cluster/model_registry/get.py +78 -0
  117. v8x-0.1.2/v8x/commands/cluster/model_registry/job.py +74 -0
  118. v8x-0.1.2/v8x/commands/cluster/model_registry/list.py +92 -0
  119. v8x-0.1.2/v8x/commands/cluster/model_registry/search.py +84 -0
  120. v8x-0.1.2/v8x/commands/cluster/model_registry/update.py +74 -0
  121. v8x-0.1.2/v8x/commands/cluster/model_registry/versions.py +83 -0
  122. v8x-0.1.2/v8x/commands/cluster/namespace/__init__.py +31 -0
  123. v8x-0.1.2/v8x/commands/cluster/namespace/_helpers.py +48 -0
  124. v8x-0.1.2/v8x/commands/cluster/namespace/create.py +81 -0
  125. v8x-0.1.2/v8x/commands/cluster/namespace/delete.py +71 -0
  126. v8x-0.1.2/v8x/commands/cluster/namespace/get.py +89 -0
  127. v8x-0.1.2/v8x/commands/cluster/namespace/list.py +82 -0
  128. v8x-0.1.2/v8x/commands/cluster/network/__init__.py +36 -0
  129. v8x-0.1.2/v8x/commands/cluster/network/_helpers.py +267 -0
  130. v8x-0.1.2/v8x/commands/cluster/network/create.py +191 -0
  131. v8x-0.1.2/v8x/commands/cluster/network/delete.py +71 -0
  132. v8x-0.1.2/v8x/commands/cluster/network/get.py +80 -0
  133. v8x-0.1.2/v8x/commands/cluster/network/list.py +74 -0
  134. v8x-0.1.2/v8x/commands/cluster/network/update.py +134 -0
  135. v8x-0.1.2/v8x/commands/cluster/node_group/_helpers.py +56 -0
  136. v8x-0.1.2/v8x/commands/cluster/node_group/create.py +202 -0
  137. v8x-0.1.2/v8x/commands/cluster/render.py +214 -0
  138. v8x-0.1.2/v8x/commands/cluster/secret/__init__.py +24 -0
  139. v8x-0.1.2/v8x/commands/cluster/secret/_helpers.py +56 -0
  140. v8x-0.1.2/v8x/commands/cluster/secret/create.py +116 -0
  141. v8x-0.1.2/v8x/commands/cluster/secret/delete.py +62 -0
  142. v8x-0.1.2/v8x/commands/cluster/secret/get.py +86 -0
  143. v8x-0.1.2/v8x/commands/cluster/secret/list.py +92 -0
  144. v8x-0.1.2/v8x/commands/cluster/secret/test.py +68 -0
  145. v8x-0.1.2/v8x/commands/cluster/service/__init__.py +41 -0
  146. v8x-0.1.2/v8x/commands/cluster/service/create.py +171 -0
  147. v8x-0.1.2/v8x/commands/cluster/service/delete.py +114 -0
  148. v8x-0.1.2/v8x/commands/cluster/service/disable.py +403 -0
  149. v8x-0.1.2/v8x/commands/cluster/service/enable.py +155 -0
  150. v8x-0.1.2/v8x/commands/cluster/service/get.py +111 -0
  151. v8x-0.1.2/v8x/commands/cluster/service/list.py +157 -0
  152. v8x-0.1.2/v8x/commands/cluster/service/update.py +124 -0
  153. v8x-0.1.2/v8x/commands/cluster/slurm/__init__.py +45 -0
  154. v8x-0.1.2/v8x/commands/cluster/slurm/_helpers.py +68 -0
  155. v8x-0.1.2/v8x/commands/cluster/slurm/create.py +254 -0
  156. v8x-0.1.2/v8x/commands/cluster/slurm/delete.py +146 -0
  157. v8x-0.1.2/v8x/commands/cluster/slurm/deploy.py +201 -0
  158. v8x-0.1.2/v8x/commands/cluster/slurm/get.py +101 -0
  159. v8x-0.1.2/v8x/commands/cluster/slurm/list.py +97 -0
  160. v8x-0.1.2/v8x/commands/cluster/slurm/update.py +123 -0
  161. v8x-0.1.2/v8x/commands/cluster/update.py +335 -0
  162. v8x-0.1.2/v8x/commands/cluster/user_service/_crud.py +325 -0
  163. v8x-0.1.2/v8x/commands/cluster/user_service/_helpers.py +66 -0
  164. v8x-0.1.2/v8x/commands/cluster/utils.py +137 -0
  165. v8x-0.1.2/v8x/commands/cluster/workspace_preset/__init__.py +31 -0
  166. v8x-0.1.2/v8x/commands/cluster/workspace_preset/_helpers.py +53 -0
  167. v8x-0.1.2/v8x/commands/cluster/workspace_preset/create.py +152 -0
  168. v8x-0.1.2/v8x/commands/cluster/workspace_preset/delete.py +88 -0
  169. v8x-0.1.2/v8x/commands/cluster/workspace_preset/get.py +114 -0
  170. v8x-0.1.2/v8x/commands/cluster/workspace_preset/list.py +91 -0
  171. v8x-0.1.2/v8x/commands/config/__init__.py +27 -0
  172. v8x-0.1.2/v8x/commands/config/clear.py +85 -0
  173. v8x-0.1.2/v8x/commands/federation/__init__.py +40 -0
  174. v8x-0.1.2/v8x/commands/federation/create.py +58 -0
  175. v8x-0.1.2/v8x/commands/federation/delete.py +60 -0
  176. v8x-0.1.2/v8x/commands/federation/get.py +54 -0
  177. v8x-0.1.2/v8x/commands/federation/list.py +50 -0
  178. v8x-0.1.2/v8x/commands/federation/update.py +64 -0
  179. v8x-0.1.2/v8x/commands/get_kubeconfig.py +113 -0
  180. v8x-0.1.2/v8x/commands/job/__init__.py +39 -0
  181. v8x-0.1.2/v8x/commands/job/client.py +28 -0
  182. v8x-0.1.2/v8x/commands/job/script/__init__.py +35 -0
  183. v8x-0.1.2/v8x/commands/job/script/create.py +50 -0
  184. v8x-0.1.2/v8x/commands/job/script/delete.py +61 -0
  185. v8x-0.1.2/v8x/commands/job/script/get.py +44 -0
  186. v8x-0.1.2/v8x/commands/job/script/list.py +63 -0
  187. v8x-0.1.2/v8x/commands/job/script/update.py +79 -0
  188. v8x-0.1.2/v8x/commands/job/submission/__init__.py +30 -0
  189. v8x-0.1.2/v8x/commands/job/submission/create.py +89 -0
  190. v8x-0.1.2/v8x/commands/job/submission/delete.py +61 -0
  191. v8x-0.1.2/v8x/commands/job/submission/get.py +40 -0
  192. v8x-0.1.2/v8x/commands/job/submission/list.py +73 -0
  193. v8x-0.1.2/v8x/commands/job/submission/update.py +88 -0
  194. v8x-0.1.2/v8x/commands/job/template/__init__.py +28 -0
  195. v8x-0.1.2/v8x/commands/job/template/create.py +70 -0
  196. v8x-0.1.2/v8x/commands/job/template/delete.py +63 -0
  197. v8x-0.1.2/v8x/commands/job/template/get.py +46 -0
  198. v8x-0.1.2/v8x/commands/job/template/list.py +59 -0
  199. v8x-0.1.2/v8x/commands/job/template/update.py +85 -0
  200. v8x-0.1.2/v8x/commands/license/__init__.py +51 -0
  201. v8x-0.1.2/v8x/commands/license/booking/__init__.py +29 -0
  202. v8x-0.1.2/v8x/commands/license/booking/create.py +73 -0
  203. v8x-0.1.2/v8x/commands/license/booking/delete.py +48 -0
  204. v8x-0.1.2/v8x/commands/license/booking/get.py +40 -0
  205. v8x-0.1.2/v8x/commands/license/booking/list.py +60 -0
  206. v8x-0.1.2/v8x/commands/license/booking/main.py +160 -0
  207. v8x-0.1.2/v8x/commands/license/client.py +28 -0
  208. v8x-0.1.2/v8x/commands/license/configuration/__init__.py +35 -0
  209. v8x-0.1.2/v8x/commands/license/configuration/create.py +62 -0
  210. v8x-0.1.2/v8x/commands/license/configuration/delete.py +53 -0
  211. v8x-0.1.2/v8x/commands/license/configuration/get.py +40 -0
  212. v8x-0.1.2/v8x/commands/license/configuration/list.py +56 -0
  213. v8x-0.1.2/v8x/commands/license/configuration/update.py +65 -0
  214. v8x-0.1.2/v8x/commands/license/deployment/__init__.py +35 -0
  215. v8x-0.1.2/v8x/commands/license/deployment/create.py +63 -0
  216. v8x-0.1.2/v8x/commands/license/deployment/delete.py +51 -0
  217. v8x-0.1.2/v8x/commands/license/deployment/get.py +52 -0
  218. v8x-0.1.2/v8x/commands/license/deployment/list.py +79 -0
  219. v8x-0.1.2/v8x/commands/license/deployment/update.py +74 -0
  220. v8x-0.1.2/v8x/commands/license/feature/__init__.py +37 -0
  221. v8x-0.1.2/v8x/commands/license/feature/create.py +64 -0
  222. v8x-0.1.2/v8x/commands/license/feature/delete.py +54 -0
  223. v8x-0.1.2/v8x/commands/license/feature/get.py +40 -0
  224. v8x-0.1.2/v8x/commands/license/feature/list.py +53 -0
  225. v8x-0.1.2/v8x/commands/license/feature/update.py +68 -0
  226. v8x-0.1.2/v8x/commands/license/product/__init__.py +35 -0
  227. v8x-0.1.2/v8x/commands/license/product/create.py +61 -0
  228. v8x-0.1.2/v8x/commands/license/product/delete.py +54 -0
  229. v8x-0.1.2/v8x/commands/license/product/get.py +40 -0
  230. v8x-0.1.2/v8x/commands/license/product/list.py +53 -0
  231. v8x-0.1.2/v8x/commands/license/product/update.py +64 -0
  232. v8x-0.1.2/v8x/commands/license/server/__init__.py +35 -0
  233. v8x-0.1.2/v8x/commands/license/server/create.py +60 -0
  234. v8x-0.1.2/v8x/commands/license/server/delete.py +54 -0
  235. v8x-0.1.2/v8x/commands/license/server/get.py +49 -0
  236. v8x-0.1.2/v8x/commands/license/server/list.py +53 -0
  237. v8x-0.1.2/v8x/commands/license/server/update.py +64 -0
  238. v8x-0.1.2/v8x/commands/network/__init__.py +39 -0
  239. v8x-0.1.2/v8x/commands/network/attach.py +81 -0
  240. v8x-0.1.2/v8x/commands/network/create.py +97 -0
  241. v8x-0.1.2/v8x/commands/network/delete.py +42 -0
  242. v8x-0.1.2/v8x/commands/network/detach.py +85 -0
  243. v8x-0.1.2/v8x/commands/network/get.py +92 -0
  244. v8x-0.1.2/v8x/commands/network/list.py +85 -0
  245. v8x-0.1.2/v8x/commands/network/update.py +60 -0
  246. v8x-0.1.2/v8x/commands/profile/__init__.py +31 -0
  247. v8x-0.1.2/v8x/commands/profile/crud.py +240 -0
  248. v8x-0.1.2/v8x/commands/profile/render.py +65 -0
  249. v8x-0.1.2/v8x/commands/storage/__init__.py +57 -0
  250. v8x-0.1.2/v8x/commands/storage/_helpers.py +80 -0
  251. v8x-0.1.2/v8x/commands/storage/create.py +109 -0
  252. v8x-0.1.2/v8x/commands/storage/delete.py +97 -0
  253. v8x-0.1.2/v8x/commands/storage/external_expose/__init__.py +27 -0
  254. v8x-0.1.2/v8x/commands/storage/external_expose/cephfs.py +448 -0
  255. v8x-0.1.2/v8x/commands/storage/external_expose/nfs.py +216 -0
  256. v8x-0.1.2/v8x/commands/storage/get.py +89 -0
  257. v8x-0.1.2/v8x/commands/storage/list.py +95 -0
  258. v8x-0.1.2/v8x/commands/storage/list_available.py +78 -0
  259. v8x-0.1.2/v8x/commands/storage/namespace_import/__init__.py +663 -0
  260. v8x-0.1.2/v8x/commands/storage/namespace_import/cephfs.py +236 -0
  261. v8x-0.1.2/v8x/commands/storage/namespace_import/internal.py +318 -0
  262. v8x-0.1.2/v8x/commands/storage/namespace_import/nfs.py +221 -0
  263. v8x-0.1.2/v8x/commands/storage/system.py +376 -0
  264. v8x-0.1.2/v8x/commands/support_ticket/__init__.py +30 -0
  265. v8x-0.1.2/v8x/commands/support_ticket/create.py +88 -0
  266. v8x-0.1.2/v8x/commands/support_ticket/delete.py +77 -0
  267. v8x-0.1.2/v8x/commands/support_ticket/get.py +77 -0
  268. v8x-0.1.2/v8x/commands/support_ticket/list.py +108 -0
  269. v8x-0.1.2/v8x/commands/support_ticket/update.py +107 -0
  270. v8x-0.1.2/v8x/commands/team/__init__.py +40 -0
  271. v8x-0.1.2/v8x/commands/team/add_member.py +48 -0
  272. v8x-0.1.2/v8x/commands/team/add_resource.py +49 -0
  273. v8x-0.1.2/v8x/commands/team/create.py +86 -0
  274. v8x-0.1.2/v8x/commands/team/delete.py +34 -0
  275. v8x-0.1.2/v8x/commands/team/get.py +72 -0
  276. v8x-0.1.2/v8x/commands/team/list.py +72 -0
  277. v8x-0.1.2/v8x/commands/team/list_members.py +42 -0
  278. v8x-0.1.2/v8x/commands/team/remove_member.py +34 -0
  279. v8x-0.1.2/v8x/commands/team/set_role.py +39 -0
  280. v8x-0.1.2/v8x/commands/team/set_roles.py +55 -0
  281. v8x-0.1.2/v8x/commands/team/update.py +46 -0
  282. v8x-0.1.2/v8x/commands/vdeployer_web/__init__.py +30 -0
  283. v8x-0.1.2/v8x/commands/vdeployer_web/deploy.py +424 -0
  284. v8x-0.1.2/v8x/commands/vdeployer_web/destroy.py +160 -0
  285. v8x-0.1.2/v8x/commands/vdeployer_web/status.py +107 -0
  286. v8x-0.1.2/v8x/config.py +275 -0
  287. v8x-0.1.2/v8x/constants.py +70 -0
  288. v8x-0.1.2/v8x/deployment_apps/__init__.py +45 -0
  289. v8x-0.1.2/v8x/deployment_apps/common.py +164 -0
  290. v8x-0.1.2/v8x/deployment_apps/constants.py +21 -0
  291. v8x-0.1.2/v8x/deployment_apps/crud.py +279 -0
  292. v8x-0.1.2/v8x/deployment_apps/schema.py +34 -0
  293. v8x-0.1.2/v8x/deployments/__init__.py +21 -0
  294. v8x-0.1.2/v8x/deployments/crud.py +408 -0
  295. v8x-0.1.2/v8x/deployments/schema.py +170 -0
  296. v8x-0.1.2/v8x/exceptions.py +139 -0
  297. v8x-0.1.2/v8x/gql_client.py +710 -0
  298. v8x-0.1.2/v8x/libjuju/__init__.py +1097 -0
  299. v8x-0.1.2/v8x/main.py +499 -0
  300. v8x-0.1.2/v8x/profiles/__init__.py +16 -0
  301. v8x-0.1.2/v8x/profiles/crud.py +303 -0
  302. v8x-0.1.2/v8x/profiles/schema.py +108 -0
  303. v8x-0.1.2/v8x/render.py +2409 -0
  304. v8x-0.1.2/v8x/schemas.py +102 -0
  305. v8x-0.1.2/v8x/time_loop.py +134 -0
  306. v8x-0.1.2/v8x/utils.py +22 -0
  307. v8x-0.1.2/v8x/vantage_rest_api_client.py +343 -0
@@ -0,0 +1,79 @@
1
+ # GitHub Copilot Instructions for v8x
2
+
3
+ ## Python Command Execution
4
+
5
+ **ALWAYS use `uv run` for Python commands in this project.**
6
+
7
+ This project uses `uv` for dependency management and virtual environment handling. All Python commands must be prefixed with `uv run`.
8
+
9
+ ### Examples:
10
+
11
+ ✅ **CORRECT:**
12
+ - `uv run python script.py`
13
+
14
+
15
+ ❌ **INCORRECT:**
16
+ - `python script.py`
17
+ - `pytest tests/`
18
+ - `python -m v8x.main`
19
+ - `v8x --help`
20
+ - `coverage run`
21
+ - `mypy .`
22
+ - `black .`
23
+ - `ruff check`
24
+
25
+ ### Just Commands (Primary Development Workflow):
26
+
27
+ **Testing:**
28
+ - `just unit` - Run unit tests with coverage (80% threshold)
29
+ - `just integration` - Run integration tests
30
+ - `just coverage-all` - Run full test suite with combined coverage
31
+
32
+ **Code Quality:**
33
+ - `just typecheck` - Run static type checker (pyright)
34
+ - `just lint` - Check code against style standards (codespell + ruff)
35
+ - `just fmt` - Apply coding style standards (ruff format + fix)
36
+
37
+ **Documentation:**
38
+ - `just docs-dev` - Start Docusaurus development server
39
+ - `just docs-dev-port [port]` - Start dev server on specific port
40
+ - `just docs-build` - Build documentation for production
41
+ - `just docs-serve` - Serve built documentation
42
+ - `just docs-clean` - Clean documentation build artifacts
43
+ - `just docs-help` - Show documentation commands
44
+
45
+ **Development:**
46
+ - `just lock` - Regenerate uv.lock file
47
+
48
+ ### Direct UV Commands (When Needed):
49
+ - Run CLI: `uv run v8x [command]`
50
+ - Specific test: `uv run pytest tests/unit/test_example.py::test_function`
51
+ - Add dependency: `uv add package-name`
52
+ - Add dev dependency: `uv add --dev package-name`
53
+
54
+ ### Installation Commands:
55
+ - Install dependencies: `uv sync`
56
+ - Add new dependency: `uv add package-name`
57
+ - Add dev dependency: `uv add --dev package-name`
58
+ - Regenerate lock: `just lock`
59
+
60
+ ## Project Structure
61
+
62
+ This is a Python CLI application using:
63
+ - `uv` for dependency management
64
+ - `typer` for CLI framework
65
+ - `rich` for terminal output
66
+ - `pytest` for testing
67
+ - `RenderStepOutput` for progress rendering with JSON bypass support
68
+
69
+ ## Test Patterns
70
+
71
+ When working with tests, ensure:
72
+ 1. MockConsole includes all necessary Rich console methods
73
+ 2. Use `RenderStepOutput.json_bypass()` for JSON output tests
74
+ 3. All async functions are properly awaited in tests
75
+ 4. Function signatures match current implementation
76
+
77
+ ## Never Forget
78
+
79
+ **EVERY Python command MUST start with `uv run`** - this is critical for proper dependency resolution and virtual environment isolation in this project.
@@ -0,0 +1,70 @@
1
+ # Copyright 2025 Vantage Compute Corporation
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ name: v8x Code Quality Checks
16
+ on:
17
+ workflow_call:
18
+ pull_request:
19
+ branches:
20
+ - main
21
+
22
+ concurrency:
23
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
24
+ cancel-in-progress: true
25
+
26
+ jobs:
27
+ commitlint:
28
+ runs-on: ubuntu-latest
29
+ permissions:
30
+ contents: read
31
+ if: github.event_name == 'pull_request'
32
+ steps:
33
+ - name: Checkout
34
+ uses: actions/checkout@v4
35
+ with:
36
+ fetch-depth: 0
37
+ - name: Setup node
38
+ uses: actions/setup-node@v4
39
+ with:
40
+ node-version: lts/*
41
+ - name: Install commitlint
42
+ run: npm install -D @commitlint/cli @commitlint/config-conventional
43
+ - name: Validate PR commits with commitlint
44
+ run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose
45
+
46
+ ci-tests:
47
+ name: CI-Tests (Python ${{ matrix.python-version }})
48
+ runs-on: ubuntu-24.04
49
+ strategy:
50
+ matrix:
51
+ python-version: ['3.12', '3.13', '3.14']
52
+ steps:
53
+ - name: Checkout
54
+ uses: actions/checkout@v4
55
+ - name: Setup Python
56
+ uses: actions/setup-python@v5
57
+ with:
58
+ python-version: ${{ matrix.python-version }}
59
+ - name: Install `just`
60
+ run: sudo snap install just --classic
61
+ - name: Install `uv`
62
+ run: sudo snap install astral-uv --classic
63
+ - name: Run lint checks
64
+ run: just lint
65
+ - name: Run type checks
66
+ run: just typecheck
67
+ - name: Run unit tests
68
+ run: just unit
69
+ - name: Run integration tests
70
+ run: just integration
@@ -0,0 +1,204 @@
1
+ # Copyright (c) 2025 Vantage Compute Corporation.
2
+ name: Build and Release
3
+
4
+ on:
5
+ push:
6
+ tags:
7
+ - "v[0-9]+.[0-9]+.[0-9]+"
8
+ - "v[0-9]+.[0-9]+.[0-9]+-alpha.[0-9]+"
9
+ - "v[0-9]+.[0-9]+.[0-9]+-beta.[0-9]+"
10
+ - "v[0-9]+.[0-9]+.[0-9]+a[0-9]+"
11
+ - "v[0-9]+.[0-9]+.[0-9]+b[0-9]+"
12
+ - "v[0-9]+.[0-9]+.[0-9]+rc[0-9]+"
13
+
14
+ permissions:
15
+ contents: write # Required for creating releases
16
+ id-token: write # Required for PyPI trusted publishing
17
+
18
+ jobs:
19
+ build:
20
+ name: Build Distribution
21
+ runs-on: ubuntu-latest
22
+
23
+ steps:
24
+ - name: Checkout code
25
+ uses: actions/checkout@v4
26
+ with:
27
+ fetch-depth: 0 # Fetch full history for proper version detection
28
+
29
+ - name: Set up Python
30
+ uses: actions/setup-python@v5
31
+ with:
32
+ python-version: '3.12'
33
+
34
+ - name: Install system dependencies
35
+ run: |
36
+ sudo apt-get update
37
+ sudo apt-get install -y build-essential
38
+ sudo snap install astral-uv --classic
39
+
40
+
41
+ - name: Install git-cliff
42
+ run: |
43
+ curl -L https://github.com/orhun/git-cliff/releases/download/v2.10.0/git-cliff-2.10.0-x86_64-unknown-linux-gnu.tar.gz | tar xz
44
+ sudo mv git-cliff-*/git-cliff /usr/local/bin/
45
+ git-cliff --version
46
+
47
+ - name: Build Python package
48
+ run: |
49
+ uv build
50
+
51
+ - name: Check build artifacts
52
+ run: |
53
+ ls -la dist/
54
+ # Basic validation - ensure files exist
55
+ test -n "$(find dist -name '*.whl')" || (echo "No wheel files found" && exit 1)
56
+ test -n "$(find dist -name '*.tar.gz')" || (echo "No source distribution found" && exit 1)
57
+
58
+ - name: Upload build artifacts
59
+ uses: actions/upload-artifact@v4
60
+ with:
61
+ name: distribution-files
62
+ path: dist/
63
+ retention-days: 7
64
+
65
+ test-install:
66
+ name: Test Installation
67
+ needs: build
68
+ runs-on: ubuntu-latest
69
+ strategy:
70
+ matrix:
71
+ python-version: ['3.12', '3.13', '3.14']
72
+
73
+ steps:
74
+ - name: Set up Python ${{ matrix.python-version }}
75
+ uses: actions/setup-python@v5
76
+ with:
77
+ python-version: ${{ matrix.python-version }}
78
+
79
+ - name: Download build artifacts
80
+ uses: actions/download-artifact@v4
81
+ with:
82
+ name: distribution-files
83
+ path: dist/
84
+
85
+ - name: Test wheel installation
86
+ run: |
87
+ sudo snap install astral-uv --classic
88
+ uv venv
89
+ uv pip install dist/*.whl
90
+ uv run python3 -c "import v8x; print('Package imported successfully')"
91
+
92
+ publish-pypi:
93
+ name: Publish to PyPI
94
+ needs: [build, test-install]
95
+ runs-on: ubuntu-latest
96
+ if: startsWith(github.ref, 'refs/tags/')
97
+ environment:
98
+ name: pypi
99
+ url: https://pypi.org/p/v8x
100
+
101
+ steps:
102
+ - name: Download build artifacts
103
+ uses: actions/download-artifact@v4
104
+ with:
105
+ name: distribution-files
106
+ path: dist/
107
+
108
+ - name: Publish to PyPI
109
+ run: |
110
+ sudo snap install astral-uv --classic
111
+ uv publish
112
+
113
+ create-release:
114
+ name: Create GitHub Release
115
+ needs: [build, test-install]
116
+ runs-on: ubuntu-latest
117
+ if: startsWith(github.ref, 'refs/tags/')
118
+
119
+ steps:
120
+ - name: Checkout code
121
+ uses: actions/checkout@v4
122
+ with:
123
+ fetch-depth: 0
124
+
125
+ - name: Download build artifacts
126
+ uses: actions/download-artifact@v4
127
+ with:
128
+ name: distribution-files
129
+ path: dist/
130
+
131
+ - name: Extract version from tag
132
+ id: get_version
133
+ run: |
134
+ VERSION=${GITHUB_REF#refs/tags/}
135
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
136
+ echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
137
+
138
+ - name: Generate release notes
139
+ id: release_notes
140
+ run: |
141
+ # Extract release notes from CHANGELOG.md if it exists
142
+ if [ -f "CHANGELOG.md" ]; then
143
+ # Try to extract notes for this version using git-cliff for consistency
144
+ VERSION="${{ steps.get_version.outputs.version }}"
145
+
146
+ # Use git-cliff to generate notes for this specific version
147
+ git-cliff --latest --strip header --strip footer > release_notes.txt || true
148
+
149
+ # If that fails, fall back to grep method
150
+ if [ ! -s release_notes.txt ]; then
151
+ grep -A 1000 "^## .*${VERSION}" CHANGELOG.md | grep -B 1000 -m 2 "^## " | head -n -1 | tail -n +2 > release_notes.txt || true
152
+ fi
153
+
154
+ # If no specific version notes found, create generic notes
155
+ if [ ! -s release_notes.txt ]; then
156
+ echo "Release ${{ steps.get_version.outputs.tag }}" > release_notes.txt
157
+ echo "" >> release_notes.txt
158
+ echo "### Changes" >> release_notes.txt
159
+ echo "- See CHANGELOG.md for detailed changes" >> release_notes.txt
160
+ fi
161
+ else
162
+ echo "Release ${{ steps.get_version.outputs.tag }}" > release_notes.txt
163
+ echo "" >> release_notes.txt
164
+ echo "### Files" >> release_notes.txt
165
+ echo "- Source distribution (tar.gz)" >> release_notes.txt
166
+ echo "- Wheel distribution (.whl)" >> release_notes.txt
167
+ fi
168
+
169
+ echo "Release notes:"
170
+ cat release_notes.txt
171
+
172
+ - name: Create Release
173
+ uses: softprops/action-gh-release@v1
174
+ with:
175
+ name: Release ${{ steps.get_version.outputs.tag }}
176
+ body_path: release_notes.txt
177
+ files: |
178
+ dist/*.tar.gz
179
+ dist/*.whl
180
+ draft: false
181
+ prerelease: ${{ contains(steps.get_version.outputs.version, 'rc') || contains(steps.get_version.outputs.version, 'beta') || contains(steps.get_version.outputs.version, 'alpha') }}
182
+ generate_release_notes: true
183
+ env:
184
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
185
+
186
+ notify-success:
187
+ name: Notify Success
188
+ needs: [publish-pypi, create-release]
189
+ runs-on: ubuntu-latest
190
+ if: success() && startsWith(github.ref, 'refs/tags/')
191
+
192
+ steps:
193
+ - name: Extract version from tag
194
+ id: get_version
195
+ run: |
196
+ VERSION=${GITHUB_REF#refs/tags/}
197
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
198
+ echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
199
+
200
+ - name: Success notification
201
+ run: |
202
+ echo "🎉 Successfully released v8x ${{ steps.get_version.outputs.tag }}"
203
+ echo "📦 Published to PyPI: https://pypi.org/project/v8x/${{ steps.get_version.outputs.version }}/"
204
+ echo "🚀 GitHub Release: ${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ steps.get_version.outputs.tag }}"
@@ -0,0 +1,265 @@
1
+ # Copyright 2025 Vantage Compute Corporation
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ name: Update Documentation
16
+
17
+ on:
18
+ push:
19
+ branches: ["main"]
20
+ paths:
21
+ - 'v8x/**'
22
+ - 'scripts/generate_complete_docs.py'
23
+ - 'scripts/update_docs_version.py'
24
+ - 'pyproject.toml'
25
+ - 'docusaurus/**'
26
+ workflow_dispatch:
27
+
28
+ concurrency:
29
+ group: "update-docs"
30
+ cancel-in-progress: true
31
+
32
+ permissions:
33
+ contents: write
34
+ pull-requests: write
35
+ id-token: write
36
+ pages: write
37
+
38
+ env:
39
+ BASE_BRANCH: main
40
+
41
+ jobs:
42
+ update-docs:
43
+ name: Update Documentation
44
+ runs-on: ubuntu-24.04
45
+ environment: github-pages
46
+
47
+ steps:
48
+ - uses: actions/checkout@v4
49
+ with:
50
+ fetch-depth: 0
51
+ # GITHUB_TOKEN is provided automatically; no need to pass from secrets
52
+ token: ${{ github.token }}
53
+
54
+ - uses: actions/setup-node@v4
55
+ with:
56
+ node-version: 22
57
+ cache: yarn
58
+ cache-dependency-path: docusaurus/yarn.lock
59
+
60
+ - name: Install just
61
+ run: sudo snap install just --classic
62
+
63
+ - name: Install UV
64
+ run: sudo snap install astral-uv --classic
65
+
66
+ - name: Ensure GitHub CLI auth
67
+ env:
68
+ GH_TOKEN: ${{ github.token }}
69
+ run: |
70
+ gh --version
71
+ gh auth status -h github.com
72
+
73
+ - name: Create docs update branch & commit
74
+ id: commit_changes
75
+ env:
76
+ GH_TOKEN: ${{ github.token }}
77
+ run: |
78
+ set -euo pipefail
79
+
80
+ BRANCH_NAME="docs/auto-update-$(date +%Y%m%d-%H%M%S)"
81
+
82
+ # Make sure base exists locally and is up to date
83
+ git fetch origin --prune
84
+ if ! git ls-remote --exit-code --heads origin "${BASE_BRANCH}" >/dev/null 2>&1; then
85
+ echo "Base branch '${BASE_BRANCH}' not found on origin." >&2
86
+ exit 1
87
+ fi
88
+ git checkout -B "${BASE_BRANCH}" "origin/${BASE_BRANCH}"
89
+
90
+ # Create/update working branch from base
91
+ git switch -C "${BRANCH_NAME}"
92
+
93
+ python3 scripts/generate_complete_docs.py
94
+ python3 scripts/update_docs_version.py
95
+ just docs-build
96
+
97
+ # Stage only intended paths
98
+ git add docusaurus/ || true
99
+
100
+ # Check if anything changed
101
+ if git diff --cached --quiet; then
102
+ echo "changes=false" >> "$GITHUB_OUTPUT"
103
+ echo "No changes detected; skipping PR."
104
+ exit 0
105
+ fi
106
+
107
+ git config user.name "github-actions[bot]"
108
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
109
+
110
+ git commit -m "docs: auto-update generated documentation
111
+
112
+ - Updated CLI command documentation
113
+ - Regenerated Docusaurus build files
114
+ - Updated version information
115
+
116
+ Auto-generated by GitHub Actions"
117
+
118
+ git push -u origin "${BRANCH_NAME}"
119
+
120
+ echo "branch=${BRANCH_NAME}" >> "$GITHUB_OUTPUT"
121
+ echo "changes=true" >> "$GITHUB_OUTPUT"
122
+
123
+ - name: Open PR
124
+ if: steps.commit_changes.outputs.changes == 'true'
125
+ id: open_pr
126
+ env:
127
+ GH_TOKEN: ${{ github.token }}
128
+ run: |
129
+ set -euo pipefail
130
+ BRANCH_NAME="${{ steps.commit_changes.outputs.branch }}"
131
+
132
+ # Create PR targeting main (change if you use a different base)
133
+ if ! PR_URL=$(
134
+ gh pr create \
135
+ --base "${BASE_BRANCH}" \
136
+ --label "deploy-docs" \
137
+ --label "auto-merge" \
138
+ --title "docs: auto-update generated documentation" \
139
+ --body $'🤖 **Automated Documentation Update**\n\n- ✅ Updated CLI command documentation\n- ✅ Regenerated Docusaurus build files\n- ✅ Updated version information\n\n> Created by GitHub Actions.'
140
+ ); then
141
+ echo "PR create failed—attempting to fetch existing PR…"
142
+ PR_URL="$(gh pr view "${BRANCH_NAME}" --json url -q .url || true)"
143
+ fi
144
+
145
+ if [ -z "${PR_URL}" ]; then
146
+ echo "Could not create or find the PR." >&2
147
+ exit 1
148
+ fi
149
+
150
+ echo "url=${PR_URL}" >> "$GITHUB_OUTPUT"
151
+ echo "PR_URL=${PR_URL}" >> "$GITHUB_ENV"
152
+ echo "Opened PR: ${PR_URL}"
153
+
154
+ - name: Merge or enable auto-merge
155
+ if: steps.commit_changes.outputs.changes == 'true'
156
+ env:
157
+ GH_TOKEN: ${{ github.token }}
158
+ PR_URL: ${{ steps.open_pr.outputs.url }}
159
+ run: |
160
+ set -euo pipefail
161
+
162
+ # Fetch PR status
163
+ ms=$(gh pr view "$PR_URL" --json mergeStateStatus -q .mergeStateStatus)
164
+ rd=$(gh pr view "$PR_URL" --json reviewDecision -q .reviewDecision)
165
+ draft=$(gh pr view "$PR_URL" --json isDraft -q .isDraft)
166
+
167
+ echo "mergeStateStatus=${ms}"
168
+ echo "reviewDecision=${rd}"
169
+ echo "isDraft=${draft}"
170
+
171
+ case "$ms" in
172
+ CLEAN)
173
+ echo "PR is clean/mergeable now. Merging immediately…"
174
+ gh pr merge "$PR_URL" --squash --delete-branch
175
+ ;;
176
+
177
+ BLOCKED|BEHIND|UNSTABLE|DIRTY)
178
+ echo "PR is not immediately mergeable (status: $ms). Attempting to enable auto-merge…"
179
+ # Will succeed only if repo has Auto-merge enabled and required conditions will pass later.
180
+ if gh pr merge "$PR_URL" --squash --auto; then
181
+ echo "Auto-merge enabled."
182
+ else
183
+ echo "Could not enable auto-merge. Likely reasons:"
184
+ echo " - Repo hasn’t enabled Auto-merge (Settings → Pull requests → Enable auto-merge)"
185
+ echo " - Required reviews/checks not satisfied (reviewDecision=$rd, draft=$draft)"
186
+ echo " - Branch is behind or needs an update (status=$ms)"
187
+ exit 1
188
+ fi
189
+ ;;
190
+
191
+ *)
192
+ echo "Unexpected mergeStateStatus: $ms"
193
+ gh pr view "$PR_URL" --json url,mergeable,mergeStateStatus,reviewDecision,isDraft,requiredStatusCheckContexts
194
+ exit 1
195
+ ;;
196
+ esac
197
+
198
+ - name: Setup Pages
199
+ uses: actions/configure-pages@v5
200
+
201
+ - name: Upload artifact
202
+ uses: actions/upload-pages-artifact@v3
203
+ with:
204
+ # Upload build directory
205
+ path: './docusaurus/build'
206
+
207
+ - name: Deploy to GitHub Pages
208
+ id: deployment
209
+ uses: actions/deploy-pages@v4
210
+
211
+ - name: Gather context
212
+ id: ctx
213
+ run: |
214
+ echo "sha=$(git rev-parse --short HEAD || echo $GITHUB_SHA)" >> $GITHUB_OUTPUT
215
+ echo "ref=$GITHUB_REF" >> $GITHUB_OUTPUT
216
+ echo "repo=${GITHUB_REPOSITORY}" >> $GITHUB_OUTPUT
217
+ echo "actor=${GITHUB_ACTOR}" >> $GITHUB_OUTPUT
218
+
219
+ - name: Send repository_dispatch to vantage-docs
220
+ env:
221
+ TOKEN: ${{ secrets.PLATFORM_REPO_TOKEN }}
222
+ TARGET_REPO: vantagecompute/vantage-docs
223
+ EVENT_TYPE: cli-docs-updated
224
+ SHA: ${{ steps.ctx.outputs.sha }}
225
+ REF: ${{ steps.ctx.outputs.ref }}
226
+ REPO: ${{ steps.ctx.outputs.repo }}
227
+ ACTOR: ${{ steps.ctx.outputs.actor }}
228
+ run: |
229
+ set -euo pipefail
230
+
231
+ # Build the JSON payload using cat instead of read
232
+ PAYLOAD=$(cat <<EOF
233
+ {
234
+ "event_type": "${EVENT_TYPE}",
235
+ "client_payload": {
236
+ "source_repo": "${REPO}",
237
+ "source_ref": "${REF}",
238
+ "source_sha": "${SHA}",
239
+ "actor": "${ACTOR}"
240
+ }
241
+ }
242
+ EOF
243
+ )
244
+
245
+ # Validate payload is not empty
246
+ if [ -z "${PAYLOAD}" ]; then
247
+ echo "Error: Payload is empty" >&2
248
+ exit 1
249
+ fi
250
+
251
+ echo "Sending dispatch with payload:"
252
+ echo "${PAYLOAD}"
253
+
254
+ # Fire the dispatch
255
+ curl -sS -X POST \
256
+ -H "Authorization: token ${TOKEN}" \
257
+ -H "Accept: application/vnd.github+json" \
258
+ -H "Content-Type: application/json" \
259
+ https://api.github.com/repos/${TARGET_REPO}/dispatches \
260
+ -d "${PAYLOAD}"
261
+
262
+ # Optional: prevent overlapping dispatches
263
+ concurrency:
264
+ group: notify-platform-${{ github.ref }}
265
+ cancel-in-progress: false
v8x-0.1.2/.gitignore ADDED
@@ -0,0 +1,68 @@
1
+ __pycache__/
2
+ **/__pycache__/
3
+ **/**/__pycache__/
4
+
5
+ # Docusaurus
6
+ docs/node_modules
7
+ docs/yarn-global
8
+ docs/yarn-cache
9
+ docs/.docusaurus
10
+ docs/build
11
+ docs/.yarn
12
+ docs/yarn-error.log
13
+ docs/npm-debug.log*
14
+ docs/yarn-debug.log*
15
+
16
+
17
+ # Python virtual environments
18
+ .venv
19
+ venv/
20
+ env/
21
+ .env
22
+ **/.env
23
+
24
+ # Coverage reports
25
+ .coverage
26
+ cover_unit
27
+ cover_integration
28
+ cover_combined
29
+ .coverage.*
30
+ coverage
31
+ cover/
32
+ htmlcov/
33
+
34
+ # Testing and linting
35
+ .tox/
36
+ .nox/
37
+ .pytest_cache/
38
+ .pytest_cache/**
39
+ .pytest_cache/**/*
40
+ .pytest_cache/**/*
41
+ .ruff_cache/
42
+ .mypy_cache/
43
+ .dmypy.json
44
+ .dmypy.json/**
45
+ .pyre/
46
+ .pyre/**
47
+ .pyre/**/*
48
+
49
+ # Jupyter
50
+ .ipynb_checkpoints
51
+
52
+ # IDE and editor files
53
+ .vscode/
54
+ .idea/
55
+ *.swp
56
+ *.swo
57
+ *~
58
+
59
+ # OS generated files
60
+ .DS_Store
61
+ .DS_Store?
62
+ ._*
63
+ .Spotlight-V100
64
+ .Trashes
65
+ ehthumbs.db
66
+ Thumbs.db
67
+ *.tar.gz
68
+ *.tgz