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.
- v8x-0.1.2/.github/copilot-instructions.md +79 -0
- v8x-0.1.2/.github/workflows/ci.yml +70 -0
- v8x-0.1.2/.github/workflows/publish.yml +204 -0
- v8x-0.1.2/.github/workflows/update-docs.yml +265 -0
- v8x-0.1.2/.gitignore +68 -0
- v8x-0.1.2/LICENSE +674 -0
- v8x-0.1.2/PKG-INFO +127 -0
- v8x-0.1.2/README.md +88 -0
- v8x-0.1.2/docusaurus/.gitignore +20 -0
- v8x-0.1.2/docusaurus/README.md +41 -0
- v8x-0.1.2/docusaurus/data/version.yml +9 -0
- v8x-0.1.2/docusaurus/docusaurus.config.ts +298 -0
- v8x-0.1.2/docusaurus/package.json +49 -0
- v8x-0.1.2/docusaurus/scripts/build-with-version.sh +8 -0
- v8x-0.1.2/docusaurus/sidebars.ts +69 -0
- v8x-0.1.2/docusaurus/src/css/commands.css +80 -0
- v8x-0.1.2/docusaurus/src/css/custom.css +229 -0
- v8x-0.1.2/docusaurus/static/.nojekyll +0 -0
- v8x-0.1.2/docusaurus/tsconfig.json +8 -0
- v8x-0.1.2/docusaurus/yarn.lock +9894 -0
- v8x-0.1.2/pyproject.toml +148 -0
- v8x-0.1.2/scripts/add_license_headers.py +223 -0
- v8x-0.1.2/scripts/generate_complete_docs.py +671 -0
- v8x-0.1.2/scripts/update_docs_version.py +75 -0
- v8x-0.1.2/uv.lock +2394 -0
- v8x-0.1.2/v8x/__init__.py +509 -0
- v8x-0.1.2/v8x/apps/__init__.py +15 -0
- v8x-0.1.2/v8x/apps/lxd/__init__.py +12 -0
- v8x-0.1.2/v8x/apps/lxd/slurm/__init__.py +17 -0
- v8x-0.1.2/v8x/apps/lxd/slurm/app.py +1281 -0
- v8x-0.1.2/v8x/apps/lxd/slurm/constants.py +23 -0
- v8x-0.1.2/v8x/apps/lxd/slurm/render.py +51 -0
- v8x-0.1.2/v8x/apps/lxd/slurm/templates.py +168 -0
- v8x-0.1.2/v8x/apps/lxd/slurm/utils.py +12 -0
- v8x-0.1.2/v8x/apps/on_prem/__init__.py +12 -0
- v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/__init__.py +16 -0
- v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/app.py +352 -0
- v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/constants.py +304 -0
- v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/render.py +134 -0
- v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/templates.py +319 -0
- v8x-0.1.2/v8x/apps/on_prem/slurm_multipass/utils.py +129 -0
- v8x-0.1.2/v8x/auth.py +589 -0
- v8x-0.1.2/v8x/cache.py +170 -0
- v8x-0.1.2/v8x/client.py +96 -0
- v8x-0.1.2/v8x/commands/__init__.py +12 -0
- v8x-0.1.2/v8x/commands/alias/__init__.py +34 -0
- v8x-0.1.2/v8x/commands/alias/apps.py +25 -0
- v8x-0.1.2/v8x/commands/alias/cloud_accounts.py +31 -0
- v8x-0.1.2/v8x/commands/alias/clouds.py +31 -0
- v8x-0.1.2/v8x/commands/alias/clusters.py +25 -0
- v8x-0.1.2/v8x/commands/alias/deployments.py +34 -0
- v8x-0.1.2/v8x/commands/alias/federations.py +25 -0
- v8x-0.1.2/v8x/commands/alias/networks.py +25 -0
- v8x-0.1.2/v8x/commands/alias/profiles.py +26 -0
- v8x-0.1.2/v8x/commands/alias/support_tickets.py +25 -0
- v8x-0.1.2/v8x/commands/alias/teams.py +26 -0
- v8x-0.1.2/v8x/commands/app/__init__.py +53 -0
- v8x-0.1.2/v8x/commands/app/deployment/__init__.py +90 -0
- v8x-0.1.2/v8x/commands/app/deployment/cleanup.py +225 -0
- v8x-0.1.2/v8x/commands/app/deployment/create.py +15 -0
- v8x-0.1.2/v8x/commands/app/deployment/delete.py +150 -0
- v8x-0.1.2/v8x/commands/app/deployment/get.py +54 -0
- v8x-0.1.2/v8x/commands/app/deployment/list.py +59 -0
- v8x-0.1.2/v8x/commands/app/deployment/render.py +298 -0
- v8x-0.1.2/v8x/commands/app/list.py +58 -0
- v8x-0.1.2/v8x/commands/cloud/__init__.py +31 -0
- v8x-0.1.2/v8x/commands/cloud/account/__init__.py +37 -0
- v8x-0.1.2/v8x/commands/cloud/account/create.py +311 -0
- v8x-0.1.2/v8x/commands/cloud/account/delete.py +101 -0
- v8x-0.1.2/v8x/commands/cloud/account/get.py +109 -0
- v8x-0.1.2/v8x/commands/cloud/account/list.py +92 -0
- v8x-0.1.2/v8x/commands/cloud/get.py +61 -0
- v8x-0.1.2/v8x/commands/cloud/list.py +57 -0
- v8x-0.1.2/v8x/commands/cluster/__init__.py +63 -0
- v8x-0.1.2/v8x/commands/cluster/compute_pool/__init__.py +31 -0
- v8x-0.1.2/v8x/commands/cluster/compute_pool/_helpers.py +53 -0
- v8x-0.1.2/v8x/commands/cluster/compute_pool/create.py +203 -0
- v8x-0.1.2/v8x/commands/cluster/compute_pool/delete.py +92 -0
- v8x-0.1.2/v8x/commands/cluster/compute_pool/get.py +107 -0
- v8x-0.1.2/v8x/commands/cluster/compute_pool/list.py +111 -0
- v8x-0.1.2/v8x/commands/cluster/create.py +738 -0
- v8x-0.1.2/v8x/commands/cluster/delete.py +301 -0
- v8x-0.1.2/v8x/commands/cluster/extend.py +216 -0
- v8x-0.1.2/v8x/commands/cluster/federation/__init__.py +35 -0
- v8x-0.1.2/v8x/commands/cluster/federation/create.py +72 -0
- v8x-0.1.2/v8x/commands/cluster/federation/delete.py +82 -0
- v8x-0.1.2/v8x/commands/cluster/federation/get.py +65 -0
- v8x-0.1.2/v8x/commands/cluster/federation/list.py +61 -0
- v8x-0.1.2/v8x/commands/cluster/federation/update.py +88 -0
- v8x-0.1.2/v8x/commands/cluster/get.py +80 -0
- v8x-0.1.2/v8x/commands/cluster/inference_endpoint/__init__.py +29 -0
- v8x-0.1.2/v8x/commands/cluster/inference_endpoint/_helpers.py +34 -0
- v8x-0.1.2/v8x/commands/cluster/inference_endpoint/create.py +174 -0
- v8x-0.1.2/v8x/commands/cluster/inference_endpoint/delete.py +61 -0
- v8x-0.1.2/v8x/commands/cluster/inference_endpoint/get.py +90 -0
- v8x-0.1.2/v8x/commands/cluster/inference_endpoint/list.py +89 -0
- v8x-0.1.2/v8x/commands/cluster/inference_endpoint/logs.py +67 -0
- v8x-0.1.2/v8x/commands/cluster/inference_endpoint/runtimes.py +80 -0
- v8x-0.1.2/v8x/commands/cluster/inference_endpoint/start_stop.py +85 -0
- v8x-0.1.2/v8x/commands/cluster/inference_preset/__init__.py +34 -0
- v8x-0.1.2/v8x/commands/cluster/inference_preset/_helpers.py +53 -0
- v8x-0.1.2/v8x/commands/cluster/inference_preset/create.py +142 -0
- v8x-0.1.2/v8x/commands/cluster/inference_preset/delete.py +88 -0
- v8x-0.1.2/v8x/commands/cluster/inference_preset/get.py +95 -0
- v8x-0.1.2/v8x/commands/cluster/inference_preset/list.py +93 -0
- v8x-0.1.2/v8x/commands/cluster/kubeflow/__init__.py +39 -0
- v8x-0.1.2/v8x/commands/cluster/kubeflow/_helpers.py +68 -0
- v8x-0.1.2/v8x/commands/cluster/kubeflow/create.py +125 -0
- v8x-0.1.2/v8x/commands/cluster/kubeflow/delete.py +123 -0
- v8x-0.1.2/v8x/commands/cluster/kubeflow/get.py +88 -0
- v8x-0.1.2/v8x/commands/cluster/list.py +74 -0
- v8x-0.1.2/v8x/commands/cluster/model_registry/__init__.py +39 -0
- v8x-0.1.2/v8x/commands/cluster/model_registry/_helpers.py +43 -0
- v8x-0.1.2/v8x/commands/cluster/model_registry/create.py +125 -0
- v8x-0.1.2/v8x/commands/cluster/model_registry/delete.py +61 -0
- v8x-0.1.2/v8x/commands/cluster/model_registry/get.py +78 -0
- v8x-0.1.2/v8x/commands/cluster/model_registry/job.py +74 -0
- v8x-0.1.2/v8x/commands/cluster/model_registry/list.py +92 -0
- v8x-0.1.2/v8x/commands/cluster/model_registry/search.py +84 -0
- v8x-0.1.2/v8x/commands/cluster/model_registry/update.py +74 -0
- v8x-0.1.2/v8x/commands/cluster/model_registry/versions.py +83 -0
- v8x-0.1.2/v8x/commands/cluster/namespace/__init__.py +31 -0
- v8x-0.1.2/v8x/commands/cluster/namespace/_helpers.py +48 -0
- v8x-0.1.2/v8x/commands/cluster/namespace/create.py +81 -0
- v8x-0.1.2/v8x/commands/cluster/namespace/delete.py +71 -0
- v8x-0.1.2/v8x/commands/cluster/namespace/get.py +89 -0
- v8x-0.1.2/v8x/commands/cluster/namespace/list.py +82 -0
- v8x-0.1.2/v8x/commands/cluster/network/__init__.py +36 -0
- v8x-0.1.2/v8x/commands/cluster/network/_helpers.py +267 -0
- v8x-0.1.2/v8x/commands/cluster/network/create.py +191 -0
- v8x-0.1.2/v8x/commands/cluster/network/delete.py +71 -0
- v8x-0.1.2/v8x/commands/cluster/network/get.py +80 -0
- v8x-0.1.2/v8x/commands/cluster/network/list.py +74 -0
- v8x-0.1.2/v8x/commands/cluster/network/update.py +134 -0
- v8x-0.1.2/v8x/commands/cluster/node_group/_helpers.py +56 -0
- v8x-0.1.2/v8x/commands/cluster/node_group/create.py +202 -0
- v8x-0.1.2/v8x/commands/cluster/render.py +214 -0
- v8x-0.1.2/v8x/commands/cluster/secret/__init__.py +24 -0
- v8x-0.1.2/v8x/commands/cluster/secret/_helpers.py +56 -0
- v8x-0.1.2/v8x/commands/cluster/secret/create.py +116 -0
- v8x-0.1.2/v8x/commands/cluster/secret/delete.py +62 -0
- v8x-0.1.2/v8x/commands/cluster/secret/get.py +86 -0
- v8x-0.1.2/v8x/commands/cluster/secret/list.py +92 -0
- v8x-0.1.2/v8x/commands/cluster/secret/test.py +68 -0
- v8x-0.1.2/v8x/commands/cluster/service/__init__.py +41 -0
- v8x-0.1.2/v8x/commands/cluster/service/create.py +171 -0
- v8x-0.1.2/v8x/commands/cluster/service/delete.py +114 -0
- v8x-0.1.2/v8x/commands/cluster/service/disable.py +403 -0
- v8x-0.1.2/v8x/commands/cluster/service/enable.py +155 -0
- v8x-0.1.2/v8x/commands/cluster/service/get.py +111 -0
- v8x-0.1.2/v8x/commands/cluster/service/list.py +157 -0
- v8x-0.1.2/v8x/commands/cluster/service/update.py +124 -0
- v8x-0.1.2/v8x/commands/cluster/slurm/__init__.py +45 -0
- v8x-0.1.2/v8x/commands/cluster/slurm/_helpers.py +68 -0
- v8x-0.1.2/v8x/commands/cluster/slurm/create.py +254 -0
- v8x-0.1.2/v8x/commands/cluster/slurm/delete.py +146 -0
- v8x-0.1.2/v8x/commands/cluster/slurm/deploy.py +201 -0
- v8x-0.1.2/v8x/commands/cluster/slurm/get.py +101 -0
- v8x-0.1.2/v8x/commands/cluster/slurm/list.py +97 -0
- v8x-0.1.2/v8x/commands/cluster/slurm/update.py +123 -0
- v8x-0.1.2/v8x/commands/cluster/update.py +335 -0
- v8x-0.1.2/v8x/commands/cluster/user_service/_crud.py +325 -0
- v8x-0.1.2/v8x/commands/cluster/user_service/_helpers.py +66 -0
- v8x-0.1.2/v8x/commands/cluster/utils.py +137 -0
- v8x-0.1.2/v8x/commands/cluster/workspace_preset/__init__.py +31 -0
- v8x-0.1.2/v8x/commands/cluster/workspace_preset/_helpers.py +53 -0
- v8x-0.1.2/v8x/commands/cluster/workspace_preset/create.py +152 -0
- v8x-0.1.2/v8x/commands/cluster/workspace_preset/delete.py +88 -0
- v8x-0.1.2/v8x/commands/cluster/workspace_preset/get.py +114 -0
- v8x-0.1.2/v8x/commands/cluster/workspace_preset/list.py +91 -0
- v8x-0.1.2/v8x/commands/config/__init__.py +27 -0
- v8x-0.1.2/v8x/commands/config/clear.py +85 -0
- v8x-0.1.2/v8x/commands/federation/__init__.py +40 -0
- v8x-0.1.2/v8x/commands/federation/create.py +58 -0
- v8x-0.1.2/v8x/commands/federation/delete.py +60 -0
- v8x-0.1.2/v8x/commands/federation/get.py +54 -0
- v8x-0.1.2/v8x/commands/federation/list.py +50 -0
- v8x-0.1.2/v8x/commands/federation/update.py +64 -0
- v8x-0.1.2/v8x/commands/get_kubeconfig.py +113 -0
- v8x-0.1.2/v8x/commands/job/__init__.py +39 -0
- v8x-0.1.2/v8x/commands/job/client.py +28 -0
- v8x-0.1.2/v8x/commands/job/script/__init__.py +35 -0
- v8x-0.1.2/v8x/commands/job/script/create.py +50 -0
- v8x-0.1.2/v8x/commands/job/script/delete.py +61 -0
- v8x-0.1.2/v8x/commands/job/script/get.py +44 -0
- v8x-0.1.2/v8x/commands/job/script/list.py +63 -0
- v8x-0.1.2/v8x/commands/job/script/update.py +79 -0
- v8x-0.1.2/v8x/commands/job/submission/__init__.py +30 -0
- v8x-0.1.2/v8x/commands/job/submission/create.py +89 -0
- v8x-0.1.2/v8x/commands/job/submission/delete.py +61 -0
- v8x-0.1.2/v8x/commands/job/submission/get.py +40 -0
- v8x-0.1.2/v8x/commands/job/submission/list.py +73 -0
- v8x-0.1.2/v8x/commands/job/submission/update.py +88 -0
- v8x-0.1.2/v8x/commands/job/template/__init__.py +28 -0
- v8x-0.1.2/v8x/commands/job/template/create.py +70 -0
- v8x-0.1.2/v8x/commands/job/template/delete.py +63 -0
- v8x-0.1.2/v8x/commands/job/template/get.py +46 -0
- v8x-0.1.2/v8x/commands/job/template/list.py +59 -0
- v8x-0.1.2/v8x/commands/job/template/update.py +85 -0
- v8x-0.1.2/v8x/commands/license/__init__.py +51 -0
- v8x-0.1.2/v8x/commands/license/booking/__init__.py +29 -0
- v8x-0.1.2/v8x/commands/license/booking/create.py +73 -0
- v8x-0.1.2/v8x/commands/license/booking/delete.py +48 -0
- v8x-0.1.2/v8x/commands/license/booking/get.py +40 -0
- v8x-0.1.2/v8x/commands/license/booking/list.py +60 -0
- v8x-0.1.2/v8x/commands/license/booking/main.py +160 -0
- v8x-0.1.2/v8x/commands/license/client.py +28 -0
- v8x-0.1.2/v8x/commands/license/configuration/__init__.py +35 -0
- v8x-0.1.2/v8x/commands/license/configuration/create.py +62 -0
- v8x-0.1.2/v8x/commands/license/configuration/delete.py +53 -0
- v8x-0.1.2/v8x/commands/license/configuration/get.py +40 -0
- v8x-0.1.2/v8x/commands/license/configuration/list.py +56 -0
- v8x-0.1.2/v8x/commands/license/configuration/update.py +65 -0
- v8x-0.1.2/v8x/commands/license/deployment/__init__.py +35 -0
- v8x-0.1.2/v8x/commands/license/deployment/create.py +63 -0
- v8x-0.1.2/v8x/commands/license/deployment/delete.py +51 -0
- v8x-0.1.2/v8x/commands/license/deployment/get.py +52 -0
- v8x-0.1.2/v8x/commands/license/deployment/list.py +79 -0
- v8x-0.1.2/v8x/commands/license/deployment/update.py +74 -0
- v8x-0.1.2/v8x/commands/license/feature/__init__.py +37 -0
- v8x-0.1.2/v8x/commands/license/feature/create.py +64 -0
- v8x-0.1.2/v8x/commands/license/feature/delete.py +54 -0
- v8x-0.1.2/v8x/commands/license/feature/get.py +40 -0
- v8x-0.1.2/v8x/commands/license/feature/list.py +53 -0
- v8x-0.1.2/v8x/commands/license/feature/update.py +68 -0
- v8x-0.1.2/v8x/commands/license/product/__init__.py +35 -0
- v8x-0.1.2/v8x/commands/license/product/create.py +61 -0
- v8x-0.1.2/v8x/commands/license/product/delete.py +54 -0
- v8x-0.1.2/v8x/commands/license/product/get.py +40 -0
- v8x-0.1.2/v8x/commands/license/product/list.py +53 -0
- v8x-0.1.2/v8x/commands/license/product/update.py +64 -0
- v8x-0.1.2/v8x/commands/license/server/__init__.py +35 -0
- v8x-0.1.2/v8x/commands/license/server/create.py +60 -0
- v8x-0.1.2/v8x/commands/license/server/delete.py +54 -0
- v8x-0.1.2/v8x/commands/license/server/get.py +49 -0
- v8x-0.1.2/v8x/commands/license/server/list.py +53 -0
- v8x-0.1.2/v8x/commands/license/server/update.py +64 -0
- v8x-0.1.2/v8x/commands/network/__init__.py +39 -0
- v8x-0.1.2/v8x/commands/network/attach.py +81 -0
- v8x-0.1.2/v8x/commands/network/create.py +97 -0
- v8x-0.1.2/v8x/commands/network/delete.py +42 -0
- v8x-0.1.2/v8x/commands/network/detach.py +85 -0
- v8x-0.1.2/v8x/commands/network/get.py +92 -0
- v8x-0.1.2/v8x/commands/network/list.py +85 -0
- v8x-0.1.2/v8x/commands/network/update.py +60 -0
- v8x-0.1.2/v8x/commands/profile/__init__.py +31 -0
- v8x-0.1.2/v8x/commands/profile/crud.py +240 -0
- v8x-0.1.2/v8x/commands/profile/render.py +65 -0
- v8x-0.1.2/v8x/commands/storage/__init__.py +57 -0
- v8x-0.1.2/v8x/commands/storage/_helpers.py +80 -0
- v8x-0.1.2/v8x/commands/storage/create.py +109 -0
- v8x-0.1.2/v8x/commands/storage/delete.py +97 -0
- v8x-0.1.2/v8x/commands/storage/external_expose/__init__.py +27 -0
- v8x-0.1.2/v8x/commands/storage/external_expose/cephfs.py +448 -0
- v8x-0.1.2/v8x/commands/storage/external_expose/nfs.py +216 -0
- v8x-0.1.2/v8x/commands/storage/get.py +89 -0
- v8x-0.1.2/v8x/commands/storage/list.py +95 -0
- v8x-0.1.2/v8x/commands/storage/list_available.py +78 -0
- v8x-0.1.2/v8x/commands/storage/namespace_import/__init__.py +663 -0
- v8x-0.1.2/v8x/commands/storage/namespace_import/cephfs.py +236 -0
- v8x-0.1.2/v8x/commands/storage/namespace_import/internal.py +318 -0
- v8x-0.1.2/v8x/commands/storage/namespace_import/nfs.py +221 -0
- v8x-0.1.2/v8x/commands/storage/system.py +376 -0
- v8x-0.1.2/v8x/commands/support_ticket/__init__.py +30 -0
- v8x-0.1.2/v8x/commands/support_ticket/create.py +88 -0
- v8x-0.1.2/v8x/commands/support_ticket/delete.py +77 -0
- v8x-0.1.2/v8x/commands/support_ticket/get.py +77 -0
- v8x-0.1.2/v8x/commands/support_ticket/list.py +108 -0
- v8x-0.1.2/v8x/commands/support_ticket/update.py +107 -0
- v8x-0.1.2/v8x/commands/team/__init__.py +40 -0
- v8x-0.1.2/v8x/commands/team/add_member.py +48 -0
- v8x-0.1.2/v8x/commands/team/add_resource.py +49 -0
- v8x-0.1.2/v8x/commands/team/create.py +86 -0
- v8x-0.1.2/v8x/commands/team/delete.py +34 -0
- v8x-0.1.2/v8x/commands/team/get.py +72 -0
- v8x-0.1.2/v8x/commands/team/list.py +72 -0
- v8x-0.1.2/v8x/commands/team/list_members.py +42 -0
- v8x-0.1.2/v8x/commands/team/remove_member.py +34 -0
- v8x-0.1.2/v8x/commands/team/set_role.py +39 -0
- v8x-0.1.2/v8x/commands/team/set_roles.py +55 -0
- v8x-0.1.2/v8x/commands/team/update.py +46 -0
- v8x-0.1.2/v8x/commands/vdeployer_web/__init__.py +30 -0
- v8x-0.1.2/v8x/commands/vdeployer_web/deploy.py +424 -0
- v8x-0.1.2/v8x/commands/vdeployer_web/destroy.py +160 -0
- v8x-0.1.2/v8x/commands/vdeployer_web/status.py +107 -0
- v8x-0.1.2/v8x/config.py +275 -0
- v8x-0.1.2/v8x/constants.py +70 -0
- v8x-0.1.2/v8x/deployment_apps/__init__.py +45 -0
- v8x-0.1.2/v8x/deployment_apps/common.py +164 -0
- v8x-0.1.2/v8x/deployment_apps/constants.py +21 -0
- v8x-0.1.2/v8x/deployment_apps/crud.py +279 -0
- v8x-0.1.2/v8x/deployment_apps/schema.py +34 -0
- v8x-0.1.2/v8x/deployments/__init__.py +21 -0
- v8x-0.1.2/v8x/deployments/crud.py +408 -0
- v8x-0.1.2/v8x/deployments/schema.py +170 -0
- v8x-0.1.2/v8x/exceptions.py +139 -0
- v8x-0.1.2/v8x/gql_client.py +710 -0
- v8x-0.1.2/v8x/libjuju/__init__.py +1097 -0
- v8x-0.1.2/v8x/main.py +499 -0
- v8x-0.1.2/v8x/profiles/__init__.py +16 -0
- v8x-0.1.2/v8x/profiles/crud.py +303 -0
- v8x-0.1.2/v8x/profiles/schema.py +108 -0
- v8x-0.1.2/v8x/render.py +2409 -0
- v8x-0.1.2/v8x/schemas.py +102 -0
- v8x-0.1.2/v8x/time_loop.py +134 -0
- v8x-0.1.2/v8x/utils.py +22 -0
- 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
|