argus-app-testing 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- argus_app_testing-0.1.1/.github/CODEOWNERS +1 -0
- argus_app_testing-0.1.1/.github/ISSUE_TEMPLATE/bug.yml +62 -0
- argus_app_testing-0.1.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
- argus_app_testing-0.1.1/.github/ISSUE_TEMPLATE/feature.yml +31 -0
- argus_app_testing-0.1.1/.github/PULL_REQUEST_TEMPLATE.md +29 -0
- argus_app_testing-0.1.1/.github/dependabot.yml +29 -0
- argus_app_testing-0.1.1/.github/scripts/next_release.py +47 -0
- argus_app_testing-0.1.1/.github/workflows/build-artifacts.yml +365 -0
- argus_app_testing-0.1.1/.github/workflows/dependency-review.yml +17 -0
- argus_app_testing-0.1.1/.github/workflows/package-preview.yml +36 -0
- argus_app_testing-0.1.1/.github/workflows/release-on-merge.yml +201 -0
- argus_app_testing-0.1.1/.github/workflows/release.yml +131 -0
- argus_app_testing-0.1.1/.github/workflows/static.yml +47 -0
- argus_app_testing-0.1.1/.github/workflows/tests.yml +97 -0
- argus_app_testing-0.1.1/.gitignore +12 -0
- argus_app_testing-0.1.1/CHANGELOG.md +44 -0
- argus_app_testing-0.1.1/CONTRIBUTING.md +51 -0
- argus_app_testing-0.1.1/LICENSE +21 -0
- argus_app_testing-0.1.1/PKG-INFO +484 -0
- argus_app_testing-0.1.1/README.md +427 -0
- argus_app_testing-0.1.1/SECURITY.md +41 -0
- argus_app_testing-0.1.1/argus/__init__.py +17 -0
- argus_app_testing-0.1.1/argus/__main__.py +4 -0
- argus_app_testing-0.1.1/argus/actions.py +222 -0
- argus_app_testing-0.1.1/argus/adapters/__init__.py +19 -0
- argus_app_testing-0.1.1/argus/adapters/base.py +291 -0
- argus_app_testing-0.1.1/argus/adapters/browser_adapter.py +209 -0
- argus_app_testing-0.1.1/argus/adapters/cli_adapter.py +112 -0
- argus_app_testing-0.1.1/argus/adapters/linux_gui.py +252 -0
- argus_app_testing-0.1.1/argus/adapters/windows_gui.py +411 -0
- argus_app_testing-0.1.1/argus/adapters/windows_safe.py +589 -0
- argus_app_testing-0.1.1/argus/ates/__init__.py +124 -0
- argus_app_testing-0.1.1/argus/ates/artifacts.py +917 -0
- argus_app_testing-0.1.1/argus/ates/audit.py +1675 -0
- argus_app_testing-0.1.1/argus/ates/authority_guards.py +777 -0
- argus_app_testing-0.1.1/argus/ates/core.py +1238 -0
- argus_app_testing-0.1.1/argus/ates/evidence_validation.py +2006 -0
- argus_app_testing-0.1.1/argus/ates/finalization.py +618 -0
- argus_app_testing-0.1.1/argus/ates/finalization_io.py +504 -0
- argus_app_testing-0.1.1/argus/ates/finalization_types.py +42 -0
- argus_app_testing-0.1.1/argus/ates/ids.py +47 -0
- argus_app_testing-0.1.1/argus/ates/package.py +65 -0
- argus_app_testing-0.1.1/argus/ates/privacy.py +469 -0
- argus_app_testing-0.1.1/argus/ates/recovery_policy.py +64 -0
- argus_app_testing-0.1.1/argus/ates/reports.py +1360 -0
- argus_app_testing-0.1.1/argus/ates/status.py +160 -0
- argus_app_testing-0.1.1/argus/ates/store.py +1310 -0
- argus_app_testing-0.1.1/argus/ates/transaction_guards.py +578 -0
- argus_app_testing-0.1.1/argus/ates/trust_guards.py +822 -0
- argus_app_testing-0.1.1/argus/capsule/__init__.py +27 -0
- argus_app_testing-0.1.1/argus/capsule/base.py +218 -0
- argus_app_testing-0.1.1/argus/capsule/files.py +162 -0
- argus_app_testing-0.1.1/argus/capsule/guest.py +502 -0
- argus_app_testing-0.1.1/argus/capsule/guest_agent.py +719 -0
- argus_app_testing-0.1.1/argus/capsule/host_collect.py +102 -0
- argus_app_testing-0.1.1/argus/capsule/hyperv.py +369 -0
- argus_app_testing-0.1.1/argus/capsule/hyperv_isolated.py +314 -0
- argus_app_testing-0.1.1/argus/capsule/libvirt.py +1122 -0
- argus_app_testing-0.1.1/argus/capsule/safe_open.py +333 -0
- argus_app_testing-0.1.1/argus/capsule/safe_output.py +418 -0
- argus_app_testing-0.1.1/argus/capsule/secure_client.py +97 -0
- argus_app_testing-0.1.1/argus/capsule/secure_guest_agent.py +217 -0
- argus_app_testing-0.1.1/argus/cli.py +568 -0
- argus_app_testing-0.1.1/argus/config.py +509 -0
- argus_app_testing-0.1.1/argus/engine/__init__.py +0 -0
- argus_app_testing-0.1.1/argus/engine/agent.py +303 -0
- argus_app_testing-0.1.1/argus/engine/ates_artifacts.py +315 -0
- argus_app_testing-0.1.1/argus/engine/ates_runtime.py +1094 -0
- argus_app_testing-0.1.1/argus/engine/results.py +266 -0
- argus_app_testing-0.1.1/argus/engine/roam.py +86 -0
- argus_app_testing-0.1.1/argus/engine/roam_ates_impl.py +253 -0
- argus_app_testing-0.1.1/argus/engine/roam_impl.py +534 -0
- argus_app_testing-0.1.1/argus/engine/runner.py +66 -0
- argus_app_testing-0.1.1/argus/engine/runner_impl.py +788 -0
- argus_app_testing-0.1.1/argus/engine/spec.py +285 -0
- argus_app_testing-0.1.1/argus/execution/__init__.py +21 -0
- argus_app_testing-0.1.1/argus/execution/ates_collection.py +198 -0
- argus_app_testing-0.1.1/argus/execution/base.py +237 -0
- argus_app_testing-0.1.1/argus/execution/capsule.py +583 -0
- argus_app_testing-0.1.1/argus/execution/secure_capsule.py +291 -0
- argus_app_testing-0.1.1/argus/fleet/__init__.py +123 -0
- argus_app_testing-0.1.1/argus/fleet/ates_transport.py +704 -0
- argus_app_testing-0.1.1/argus/fleet/enrollment.py +594 -0
- argus_app_testing-0.1.1/argus/fleet/execution.py +326 -0
- argus_app_testing-0.1.1/argus/fleet/heartbeat.py +296 -0
- argus_app_testing-0.1.1/argus/fleet/heartbeat_impl.py +960 -0
- argus_app_testing-0.1.1/argus/fleet/identity.py +207 -0
- argus_app_testing-0.1.1/argus/fleet/placement.py +1308 -0
- argus_app_testing-0.1.1/argus/gui/__init__.py +0 -0
- argus_app_testing-0.1.1/argus/gui/__main__.py +4 -0
- argus_app_testing-0.1.1/argus/gui/app.py +308 -0
- argus_app_testing-0.1.1/argus/gui/web/app.js +295 -0
- argus_app_testing-0.1.1/argus/gui/web/index.html +402 -0
- argus_app_testing-0.1.1/argus/knowledge/__init__.py +177 -0
- argus_app_testing-0.1.1/argus/knowledge/base.py +128 -0
- argus_app_testing-0.1.1/argus/knowledge/docker_manager.py +162 -0
- argus_app_testing-0.1.1/argus/knowledge/embeddings.py +41 -0
- argus_app_testing-0.1.1/argus/knowledge/fingerprint.py +58 -0
- argus_app_testing-0.1.1/argus/knowledge/json_store.py +319 -0
- argus_app_testing-0.1.1/argus/knowledge/remote.py +353 -0
- argus_app_testing-0.1.1/argus/knowledge/store.py +359 -0
- argus_app_testing-0.1.1/argus/policy.py +44 -0
- argus_app_testing-0.1.1/argus/providers/__init__.py +10 -0
- argus_app_testing-0.1.1/argus/providers/anthropic_provider.py +109 -0
- argus_app_testing-0.1.1/argus/providers/base.py +77 -0
- argus_app_testing-0.1.1/argus/providers/ollama.py +147 -0
- argus_app_testing-0.1.1/argus/providers/openai_provider.py +175 -0
- argus_app_testing-0.1.1/argus/providers/registry.py +69 -0
- argus_app_testing-0.1.1/argus/serve/__init__.py +0 -0
- argus_app_testing-0.1.1/argus/serve/app.py +463 -0
- argus_app_testing-0.1.1/argus/tokens.py +177 -0
- argus_app_testing-0.1.1/argus_app_testing.egg-info/PKG-INFO +484 -0
- argus_app_testing-0.1.1/argus_app_testing.egg-info/SOURCES.txt +236 -0
- argus_app_testing-0.1.1/argus_app_testing.egg-info/dependency_links.txt +1 -0
- argus_app_testing-0.1.1/argus_app_testing.egg-info/entry_points.txt +3 -0
- argus_app_testing-0.1.1/argus_app_testing.egg-info/requires.txt +43 -0
- argus_app_testing-0.1.1/argus_app_testing.egg-info/scm_file_list.json +232 -0
- argus_app_testing-0.1.1/argus_app_testing.egg-info/scm_version.json +8 -0
- argus_app_testing-0.1.1/argus_app_testing.egg-info/top_level.txt +1 -0
- argus_app_testing-0.1.1/docs/README.md +122 -0
- argus_app_testing-0.1.1/docs/ates-action-dispatch.md +45 -0
- argus_app_testing-0.1.1/docs/ates-artifacts.md +115 -0
- argus_app_testing-0.1.1/docs/ates-core.md +142 -0
- argus_app_testing-0.1.1/docs/ates-event-store.md +160 -0
- argus_app_testing-0.1.1/docs/ates-privacy.md +200 -0
- argus_app_testing-0.1.1/docs/ates-runtime.md +56 -0
- argus_app_testing-0.1.1/docs/ates.md +1109 -0
- argus_app_testing-0.1.1/docs/capsules-hyperv.md +180 -0
- argus_app_testing-0.1.1/docs/capsules-multi-os.md +311 -0
- argus_app_testing-0.1.1/docs/consolidated-roadmap.md +189 -0
- argus_app_testing-0.1.1/docs/fleet.md +732 -0
- argus_app_testing-0.1.1/docs/releasing.md +120 -0
- argus_app_testing-0.1.1/index.html +160 -0
- argus_app_testing-0.1.1/packaging/linux/AppRun +5 -0
- argus_app_testing-0.1.1/packaging/linux/argus-cli +3 -0
- argus_app_testing-0.1.1/packaging/linux/argus-gui +4 -0
- argus_app_testing-0.1.1/packaging/linux/argus.desktop +9 -0
- argus_app_testing-0.1.1/packaging/make_icons.py +64 -0
- argus_app_testing-0.1.1/packaging/windows/argus.iss +58 -0
- argus_app_testing-0.1.1/packaging/windows/argus.wxs +41 -0
- argus_app_testing-0.1.1/packaging/windows/make_wix.py +189 -0
- argus_app_testing-0.1.1/pyproject.toml +105 -0
- argus_app_testing-0.1.1/setup.cfg +4 -0
- argus_app_testing-0.1.1/tests/__init__.py +0 -0
- argus_app_testing-0.1.1/tests/ates_test_support.py +830 -0
- argus_app_testing-0.1.1/tests/conftest.py +138 -0
- argus_app_testing-0.1.1/tests/fixtures/windows_uia_launcher.py +16 -0
- argus_app_testing-0.1.1/tests/fixtures/windows_uia_spawn_child_target.py +119 -0
- argus_app_testing-0.1.1/tests/fixtures/windows_uia_target.py +96 -0
- argus_app_testing-0.1.1/tests/test_agent.py +39 -0
- argus_app_testing-0.1.1/tests/test_ates_action_dispatch.py +303 -0
- argus_app_testing-0.1.1/tests/test_ates_approvals.py +777 -0
- argus_app_testing-0.1.1/tests/test_ates_artifact_durability.py +114 -0
- argus_app_testing-0.1.1/tests/test_ates_artifact_hardening.py +102 -0
- argus_app_testing-0.1.1/tests/test_ates_artifact_metadata.py +77 -0
- argus_app_testing-0.1.1/tests/test_ates_artifact_runtime.py +289 -0
- argus_app_testing-0.1.1/tests/test_ates_artifact_short_writes.py +44 -0
- argus_app_testing-0.1.1/tests/test_ates_artifacts.py +290 -0
- argus_app_testing-0.1.1/tests/test_ates_audit_storage.py +292 -0
- argus_app_testing-0.1.1/tests/test_ates_authority_guards.py +310 -0
- argus_app_testing-0.1.1/tests/test_ates_capture_validation.py +360 -0
- argus_app_testing-0.1.1/tests/test_ates_core.py +929 -0
- argus_app_testing-0.1.1/tests/test_ates_core_relationship_regressions.py +182 -0
- argus_app_testing-0.1.1/tests/test_ates_core_review_regressions_round7.py +155 -0
- argus_app_testing-0.1.1/tests/test_ates_core_review_regressions_round8.py +257 -0
- argus_app_testing-0.1.1/tests/test_ates_event_store.py +344 -0
- argus_app_testing-0.1.1/tests/test_ates_event_store_review_regressions.py +232 -0
- argus_app_testing-0.1.1/tests/test_ates_event_store_review_regressions_round2.py +273 -0
- argus_app_testing-0.1.1/tests/test_ates_event_store_review_regressions_round3.py +122 -0
- argus_app_testing-0.1.1/tests/test_ates_event_store_review_regressions_round4.py +256 -0
- argus_app_testing-0.1.1/tests/test_ates_event_store_review_regressions_round5.py +430 -0
- argus_app_testing-0.1.1/tests/test_ates_evidence_validation.py +458 -0
- argus_app_testing-0.1.1/tests/test_ates_finalization.py +239 -0
- argus_app_testing-0.1.1/tests/test_ates_finalization_recovery.py +418 -0
- argus_app_testing-0.1.1/tests/test_ates_incomplete_reports.py +157 -0
- argus_app_testing-0.1.1/tests/test_ates_integrity_contract.py +309 -0
- argus_app_testing-0.1.1/tests/test_ates_lifecycle_validation.py +382 -0
- argus_app_testing-0.1.1/tests/test_ates_package_integration.py +198 -0
- argus_app_testing-0.1.1/tests/test_ates_privacy.py +361 -0
- argus_app_testing-0.1.1/tests/test_ates_privacy_hardening.py +66 -0
- argus_app_testing-0.1.1/tests/test_ates_report_publication.py +204 -0
- argus_app_testing-0.1.1/tests/test_ates_reports.py +385 -0
- argus_app_testing-0.1.1/tests/test_ates_runtime_integration.py +468 -0
- argus_app_testing-0.1.1/tests/test_ates_trust_boundary_regressions.py +587 -0
- argus_app_testing-0.1.1/tests/test_capsule.py +344 -0
- argus_app_testing-0.1.1/tests/test_capsule_isolation_pr6.py +446 -0
- argus_app_testing-0.1.1/tests/test_capsule_isolation_pr6_policy.py +26 -0
- argus_app_testing-0.1.1/tests/test_capsule_multi_os_pr7.py +242 -0
- argus_app_testing-0.1.1/tests/test_capsule_provider_capabilities_pr7.py +33 -0
- argus_app_testing-0.1.1/tests/test_capsule_retained_recovery_pr6.py +161 -0
- argus_app_testing-0.1.1/tests/test_capsule_security.py +266 -0
- argus_app_testing-0.1.1/tests/test_capsule_transfer_security.py +139 -0
- argus_app_testing-0.1.1/tests/test_capsule_transfers.py +383 -0
- argus_app_testing-0.1.1/tests/test_cli_adapter.py +59 -0
- argus_app_testing-0.1.1/tests/test_codex_pr12_regressions.py +263 -0
- argus_app_testing-0.1.1/tests/test_codex_pr12_round2.py +166 -0
- argus_app_testing-0.1.1/tests/test_codex_pr12_round3.py +224 -0
- argus_app_testing-0.1.1/tests/test_codex_pr14_regressions.py +239 -0
- argus_app_testing-0.1.1/tests/test_codex_pr14_round2.py +242 -0
- argus_app_testing-0.1.1/tests/test_codex_pr14_round3.py +169 -0
- argus_app_testing-0.1.1/tests/test_codex_pr14_round4.py +347 -0
- argus_app_testing-0.1.1/tests/test_codex_pr14_round5.py +146 -0
- argus_app_testing-0.1.1/tests/test_codex_pr14_round6.py +120 -0
- argus_app_testing-0.1.1/tests/test_config.py +60 -0
- argus_app_testing-0.1.1/tests/test_execution_environment.py +162 -0
- argus_app_testing-0.1.1/tests/test_execution_safety.py +250 -0
- argus_app_testing-0.1.1/tests/test_failure_capsule_error_results.py +150 -0
- argus_app_testing-0.1.1/tests/test_failure_capsule_teardown.py +111 -0
- argus_app_testing-0.1.1/tests/test_failure_capsules.py +465 -0
- argus_app_testing-0.1.1/tests/test_fleet_ates_transport.py +259 -0
- argus_app_testing-0.1.1/tests/test_fleet_enrollment.py +221 -0
- argus_app_testing-0.1.1/tests/test_fleet_execution.py +435 -0
- argus_app_testing-0.1.1/tests/test_fleet_execution_reconciliation.py +221 -0
- argus_app_testing-0.1.1/tests/test_fleet_heartbeat.py +261 -0
- argus_app_testing-0.1.1/tests/test_fleet_heartbeat_boot_order.py +194 -0
- argus_app_testing-0.1.1/tests/test_fleet_placement.py +316 -0
- argus_app_testing-0.1.1/tests/test_key_policy_regressions.py +160 -0
- argus_app_testing-0.1.1/tests/test_knowledge.py +340 -0
- argus_app_testing-0.1.1/tests/test_pr14_posix_artifact_pinning.py +128 -0
- argus_app_testing-0.1.1/tests/test_pr19_review_regressions.py +261 -0
- argus_app_testing-0.1.1/tests/test_pr19_round2_review_regressions.py +168 -0
- argus_app_testing-0.1.1/tests/test_pr20_review_regressions.py +224 -0
- argus_app_testing-0.1.1/tests/test_pr20_round2_review_regressions.py +303 -0
- argus_app_testing-0.1.1/tests/test_pr20_round3_review_regressions.py +177 -0
- argus_app_testing-0.1.1/tests/test_pr20_round4_review_regressions.py +227 -0
- argus_app_testing-0.1.1/tests/test_pr20_round5_review_regressions.py +116 -0
- argus_app_testing-0.1.1/tests/test_pr21_review_regressions.py +204 -0
- argus_app_testing-0.1.1/tests/test_pr21_round2_review_regressions.py +345 -0
- argus_app_testing-0.1.1/tests/test_pr21_round3_review_regressions.py +284 -0
- argus_app_testing-0.1.1/tests/test_pr21_round4_review_regressions.py +219 -0
- argus_app_testing-0.1.1/tests/test_providers.py +96 -0
- argus_app_testing-0.1.1/tests/test_roam.py +97 -0
- argus_app_testing-0.1.1/tests/test_runner.py +106 -0
- argus_app_testing-0.1.1/tests/test_runner_extras.py +124 -0
- argus_app_testing-0.1.1/tests/test_spec.py +75 -0
- argus_app_testing-0.1.1/tests/test_spec_extras.py +59 -0
- argus_app_testing-0.1.1/tests/test_tokens.py +53 -0
- argus_app_testing-0.1.1/tests/test_windows_safe_integration.py +214 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @Varun-SV
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a reproducible Argus defect
|
|
3
|
+
title: "[Bug] "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for helping improve Argus. For security-sensitive reports, please use the process in SECURITY.md instead of posting exploit details publicly.
|
|
10
|
+
|
|
11
|
+
- type: input
|
|
12
|
+
id: version
|
|
13
|
+
attributes:
|
|
14
|
+
label: Argus version
|
|
15
|
+
description: Run `argus --version` or provide the release tag.
|
|
16
|
+
placeholder: v0.2.0
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
|
|
20
|
+
- type: dropdown
|
|
21
|
+
id: platform
|
|
22
|
+
attributes:
|
|
23
|
+
label: Platform
|
|
24
|
+
options:
|
|
25
|
+
- Windows x64
|
|
26
|
+
- Windows ARM64
|
|
27
|
+
- macOS Apple Silicon
|
|
28
|
+
- macOS Intel
|
|
29
|
+
- Linux x86_64
|
|
30
|
+
- Linux ARM64
|
|
31
|
+
- Other
|
|
32
|
+
validations:
|
|
33
|
+
required: true
|
|
34
|
+
|
|
35
|
+
- type: textarea
|
|
36
|
+
id: reproduce
|
|
37
|
+
attributes:
|
|
38
|
+
label: Steps to reproduce
|
|
39
|
+
description: Include the smallest reliable reproduction you can.
|
|
40
|
+
validations:
|
|
41
|
+
required: true
|
|
42
|
+
|
|
43
|
+
- type: textarea
|
|
44
|
+
id: expected
|
|
45
|
+
attributes:
|
|
46
|
+
label: Expected behavior
|
|
47
|
+
validations:
|
|
48
|
+
required: true
|
|
49
|
+
|
|
50
|
+
- type: textarea
|
|
51
|
+
id: actual
|
|
52
|
+
attributes:
|
|
53
|
+
label: Actual behavior
|
|
54
|
+
validations:
|
|
55
|
+
required: true
|
|
56
|
+
|
|
57
|
+
- type: textarea
|
|
58
|
+
id: logs
|
|
59
|
+
attributes:
|
|
60
|
+
label: Logs or evidence
|
|
61
|
+
description: Redact credentials, tokens, private hostnames, and sensitive application data.
|
|
62
|
+
render: text
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose a product or engineering improvement
|
|
3
|
+
title: "[Feature] "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: Problem to solve
|
|
10
|
+
description: What limitation or workflow problem should Argus address?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
|
|
14
|
+
- type: textarea
|
|
15
|
+
id: outcome
|
|
16
|
+
attributes:
|
|
17
|
+
label: Desired outcome
|
|
18
|
+
description: Describe the behavior or result rather than prescribing an implementation.
|
|
19
|
+
validations:
|
|
20
|
+
required: true
|
|
21
|
+
|
|
22
|
+
- type: textarea
|
|
23
|
+
id: constraints
|
|
24
|
+
attributes:
|
|
25
|
+
label: Constraints or trust-boundary considerations
|
|
26
|
+
description: Note platform, Capsule/Fleet, ATES, privacy, security, or compatibility constraints if relevant.
|
|
27
|
+
|
|
28
|
+
- type: textarea
|
|
29
|
+
id: alternatives
|
|
30
|
+
attributes:
|
|
31
|
+
label: Alternatives considered
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What does this change and why? -->
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
<!-- Call out what is intentionally out of scope. -->
|
|
8
|
+
|
|
9
|
+
## Validation
|
|
10
|
+
|
|
11
|
+
- [ ] Relevant tests pass locally or in CI
|
|
12
|
+
- [ ] New behavior has regression coverage where practical
|
|
13
|
+
- [ ] Documentation is updated when user-facing behavior changes
|
|
14
|
+
- [ ] No secrets, generated scratch files, or review-round artifacts are committed
|
|
15
|
+
|
|
16
|
+
## Release
|
|
17
|
+
|
|
18
|
+
By default, a merged PR creates a **patch** release.
|
|
19
|
+
|
|
20
|
+
Choose a label when another policy is needed:
|
|
21
|
+
|
|
22
|
+
- `bump:minor` — next minor release
|
|
23
|
+
- `bump:major` — next major release
|
|
24
|
+
- `bump:patch` — explicit patch release
|
|
25
|
+
- `release:none` — merge without an automatic release
|
|
26
|
+
|
|
27
|
+
## Security / trust-boundary impact
|
|
28
|
+
|
|
29
|
+
<!-- Note changes to execution authority, authentication, evidence, packaging, release signing, or network boundaries. Write "None" if not applicable. -->
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: pip
|
|
4
|
+
directory: /
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
day: monday
|
|
8
|
+
time: "04:00"
|
|
9
|
+
timezone: Asia/Kolkata
|
|
10
|
+
open-pull-requests-limit: 10
|
|
11
|
+
groups:
|
|
12
|
+
python-minor-patch:
|
|
13
|
+
update-types:
|
|
14
|
+
- minor
|
|
15
|
+
- patch
|
|
16
|
+
|
|
17
|
+
- package-ecosystem: github-actions
|
|
18
|
+
directory: /
|
|
19
|
+
schedule:
|
|
20
|
+
interval: weekly
|
|
21
|
+
day: monday
|
|
22
|
+
time: "04:30"
|
|
23
|
+
timezone: Asia/Kolkata
|
|
24
|
+
open-pull-requests-limit: 10
|
|
25
|
+
groups:
|
|
26
|
+
actions-minor-patch:
|
|
27
|
+
update-types:
|
|
28
|
+
- minor
|
|
29
|
+
- patch
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Calculate the next Argus release version without mutating the source tree."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
|
|
10
|
+
SEMVER_RE = re.compile(r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def bump(version: str, kind: str) -> str:
|
|
14
|
+
if not SEMVER_RE.fullmatch(version):
|
|
15
|
+
raise SystemExit(f"current version is not SemVer X.Y.Z: {version}")
|
|
16
|
+
major, minor, patch = (int(piece) for piece in version.split("."))
|
|
17
|
+
if kind == "major":
|
|
18
|
+
return f"{major + 1}.0.0"
|
|
19
|
+
if kind == "minor":
|
|
20
|
+
return f"{major}.{minor + 1}.0"
|
|
21
|
+
if kind == "patch":
|
|
22
|
+
return f"{major}.{minor}.{patch + 1}"
|
|
23
|
+
raise SystemExit(f"unsupported bump type: {kind}")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def write_output(name: str, value: str) -> None:
|
|
27
|
+
output = os.environ.get("GITHUB_OUTPUT")
|
|
28
|
+
if output:
|
|
29
|
+
with open(output, "a", encoding="utf-8") as handle:
|
|
30
|
+
handle.write(f"{name}={value}\n")
|
|
31
|
+
else:
|
|
32
|
+
print(f"{name}={value}")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def main() -> None:
|
|
36
|
+
parser = argparse.ArgumentParser()
|
|
37
|
+
parser.add_argument("--current", required=True)
|
|
38
|
+
parser.add_argument("--bump", choices=("major", "minor", "patch"), required=True)
|
|
39
|
+
args = parser.parse_args()
|
|
40
|
+
|
|
41
|
+
version = bump(args.current, args.bump)
|
|
42
|
+
write_output("version", version)
|
|
43
|
+
write_output("tag", f"v{version}")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
if __name__ == "__main__":
|
|
47
|
+
main()
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
name: Build release artifacts
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_call:
|
|
5
|
+
inputs:
|
|
6
|
+
ref:
|
|
7
|
+
description: Exact commit or tag to build
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
version:
|
|
11
|
+
description: Release version without the leading v
|
|
12
|
+
required: true
|
|
13
|
+
type: string
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
python-dist:
|
|
20
|
+
name: Python sdist + wheel
|
|
21
|
+
runs-on: ubuntu-24.04
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v7
|
|
24
|
+
with:
|
|
25
|
+
ref: ${{ inputs.ref }}
|
|
26
|
+
fetch-depth: 0
|
|
27
|
+
- uses: actions/setup-python@v7
|
|
28
|
+
with:
|
|
29
|
+
python-version: "3.12"
|
|
30
|
+
- name: Build and verify Python package
|
|
31
|
+
run: |
|
|
32
|
+
python -m pip install --upgrade pip
|
|
33
|
+
python -m pip install build twine
|
|
34
|
+
python -m build
|
|
35
|
+
python -m twine check dist/*
|
|
36
|
+
BUILD_REF="${{ inputs.ref }}" EXPECTED_VERSION="${{ inputs.version }}" python - <<'PY'
|
|
37
|
+
import os
|
|
38
|
+
import re
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
ref = os.environ["BUILD_REF"]
|
|
41
|
+
expected = os.environ["EXPECTED_VERSION"]
|
|
42
|
+
if re.fullmatch(r"v\d+\.\d+\.\d+", ref):
|
|
43
|
+
wheels = list(Path("dist").glob("*.whl"))
|
|
44
|
+
sdists = list(Path("dist").glob("*.tar.gz"))
|
|
45
|
+
if len(wheels) != 1 or len(sdists) != 1:
|
|
46
|
+
raise SystemExit("release build must produce exactly one wheel and one sdist")
|
|
47
|
+
normalized = expected.replace("-", "_")
|
|
48
|
+
if f"-{normalized}-" not in wheels[0].name:
|
|
49
|
+
raise SystemExit(f"wheel version does not match release {expected}: {wheels[0].name}")
|
|
50
|
+
if f"-{normalized}.tar.gz" not in sdists[0].name:
|
|
51
|
+
raise SystemExit(f"sdist version does not match release {expected}: {sdists[0].name}")
|
|
52
|
+
PY
|
|
53
|
+
- uses: actions/upload-artifact@v6
|
|
54
|
+
with:
|
|
55
|
+
name: release-python
|
|
56
|
+
path: dist/*
|
|
57
|
+
if-no-files-found: error
|
|
58
|
+
retention-days: 14
|
|
59
|
+
|
|
60
|
+
windows:
|
|
61
|
+
name: Windows ${{ matrix.label }}
|
|
62
|
+
strategy:
|
|
63
|
+
fail-fast: false
|
|
64
|
+
matrix:
|
|
65
|
+
include:
|
|
66
|
+
- label: x64
|
|
67
|
+
runner: windows-2025
|
|
68
|
+
python_arch: x64
|
|
69
|
+
wix_arch: x64
|
|
70
|
+
inno_arch: x64
|
|
71
|
+
- label: arm64
|
|
72
|
+
runner: windows-11-arm
|
|
73
|
+
python_arch: arm64
|
|
74
|
+
wix_arch: arm64
|
|
75
|
+
inno_arch: arm64
|
|
76
|
+
runs-on: ${{ matrix.runner }}
|
|
77
|
+
steps:
|
|
78
|
+
- uses: actions/checkout@v7
|
|
79
|
+
with:
|
|
80
|
+
ref: ${{ inputs.ref }}
|
|
81
|
+
fetch-depth: 0
|
|
82
|
+
- uses: actions/setup-python@v7
|
|
83
|
+
with:
|
|
84
|
+
python-version: "3.12"
|
|
85
|
+
architecture: ${{ matrix.python_arch }}
|
|
86
|
+
- name: Install build dependencies (x64)
|
|
87
|
+
if: matrix.label == 'x64'
|
|
88
|
+
shell: pwsh
|
|
89
|
+
run: |
|
|
90
|
+
python -m pip install --upgrade pip
|
|
91
|
+
python -m pip install ".[gui,windows,browser,serve,watch]" "pyinstaller==6.22.3" pillow
|
|
92
|
+
- name: Install build dependencies (ARM64)
|
|
93
|
+
if: matrix.label == 'arm64'
|
|
94
|
+
shell: pwsh
|
|
95
|
+
run: |
|
|
96
|
+
python -m pip install --upgrade pip
|
|
97
|
+
python -m pip install ".[gui,windows,browser,serve,watch]" "cryptography==46.0.3" "pyinstaller==6.22.3" pillow
|
|
98
|
+
- name: Generate Windows icon
|
|
99
|
+
shell: pwsh
|
|
100
|
+
run: python packaging/make_icons.py build-assets/argus.ico
|
|
101
|
+
- name: Freeze desktop app and CLI
|
|
102
|
+
shell: pwsh
|
|
103
|
+
run: |
|
|
104
|
+
$icon = (Resolve-Path build-assets/argus.ico).Path
|
|
105
|
+
python -m PyInstaller --noconfirm --clean --windowed --onedir --name Argus --icon "$icon" --collect-data argus.gui --collect-submodules argus --copy-metadata argus-app-testing --distpath build/pyi-dist --workpath build/pyi-work --specpath build/spec argus/gui/__main__.py
|
|
106
|
+
python -m PyInstaller --noconfirm --clean --console --onefile --name argus --icon "$icon" --collect-data argus.gui --collect-submodules argus --copy-metadata argus-app-testing --distpath build/pyi-dist --workpath build/pyi-work-cli --specpath build/spec-cli argus/__main__.py
|
|
107
|
+
- name: Smoke-test frozen CLI
|
|
108
|
+
shell: pwsh
|
|
109
|
+
run: build/pyi-dist/argus.exe --version
|
|
110
|
+
- name: Stage portable application
|
|
111
|
+
shell: pwsh
|
|
112
|
+
run: |
|
|
113
|
+
New-Item -ItemType Directory -Force release/stage | Out-Null
|
|
114
|
+
Copy-Item build/pyi-dist/Argus release/stage/Argus -Recurse
|
|
115
|
+
Copy-Item build/pyi-dist/argus.exe release/stage/argus.exe
|
|
116
|
+
Copy-Item LICENSE release/stage/LICENSE
|
|
117
|
+
Copy-Item README.md release/stage/README.md
|
|
118
|
+
Compress-Archive -Path release/stage/* -DestinationPath "release/Argus-${{ inputs.version }}-windows-${{ matrix.label }}-portable.zip"
|
|
119
|
+
- name: Build MSI with pinned WiX
|
|
120
|
+
shell: pwsh
|
|
121
|
+
run: |
|
|
122
|
+
# WiX 5.0.2 predates the OSMF/EULA mechanism introduced in v6/v7,
|
|
123
|
+
# avoiding unattended acceptance of terms by CI while retaining WiX v4+ authoring support.
|
|
124
|
+
dotnet tool install --global wix --version 5.0.2
|
|
125
|
+
wix build -arch "${{ matrix.wix_arch }}" -d "Version=${{ inputs.version }}" -d "SourceDir=$((Resolve-Path release/stage).Path)" packaging/windows/argus.wxs -o "release/Argus-${{ inputs.version }}-windows-${{ matrix.label }}.msi"
|
|
126
|
+
- name: Ensure Inno Setup 6 compiler
|
|
127
|
+
shell: pwsh
|
|
128
|
+
run: |
|
|
129
|
+
$iscc = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
|
|
130
|
+
if (-not (Test-Path $iscc)) {
|
|
131
|
+
choco install innosetup --version=6.3.3 -y --no-progress
|
|
132
|
+
}
|
|
133
|
+
if (-not (Test-Path $iscc)) { throw "Inno Setup 6 compiler not found at $iscc" }
|
|
134
|
+
# Current Inno Setup 6.x identifies itself as "Inno Setup 6 Command-Line Compiler".
|
|
135
|
+
# /? is only a banner probe and does not guarantee a zero process exit code.
|
|
136
|
+
$banner = (& $iscc /? 2>&1 | Select-Object -First 8) -join "`n"
|
|
137
|
+
if ($banner -notmatch '(?m)^Inno Setup 6(?:\.\d+)* Command-Line Compiler\b') {
|
|
138
|
+
throw "Unsupported Inno Setup compiler:`n$banner"
|
|
139
|
+
}
|
|
140
|
+
Write-Host $banner
|
|
141
|
+
- name: Build installer EXE
|
|
142
|
+
shell: pwsh
|
|
143
|
+
run: |
|
|
144
|
+
$iscc = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
|
|
145
|
+
if (-not (Test-Path $iscc)) { throw "Inno Setup compiler not found at $iscc" }
|
|
146
|
+
$source = (Resolve-Path release/stage).Path
|
|
147
|
+
$output = (Resolve-Path release).Path
|
|
148
|
+
$icon = (Resolve-Path build-assets/argus.ico).Path
|
|
149
|
+
$license = (Resolve-Path LICENSE).Path
|
|
150
|
+
& $iscc "/DAppVersion=${{ inputs.version }}" "/DSourceDir=$source" "/DOutputDir=$output" "/DTargetArch=${{ matrix.inno_arch }}" "/DIconFile=$icon" "/DLicenseFile=$license" packaging/windows/argus.iss
|
|
151
|
+
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
|
|
152
|
+
- name: Verify Windows release files
|
|
153
|
+
shell: pwsh
|
|
154
|
+
run: |
|
|
155
|
+
$required = @("release/Argus-${{ inputs.version }}-windows-${{ matrix.label }}-portable.zip", "release/Argus-${{ inputs.version }}-windows-${{ matrix.label }}.msi", "release/Argus-${{ inputs.version }}-windows-${{ matrix.label }}-setup.exe")
|
|
156
|
+
foreach ($file in $required) { if (-not (Test-Path $file)) { throw "missing $file" } }
|
|
157
|
+
- uses: actions/upload-artifact@v6
|
|
158
|
+
with:
|
|
159
|
+
name: release-windows-${{ matrix.label }}
|
|
160
|
+
path: |
|
|
161
|
+
release/Argus-${{ inputs.version }}-windows-${{ matrix.label }}-portable.zip
|
|
162
|
+
release/Argus-${{ inputs.version }}-windows-${{ matrix.label }}.msi
|
|
163
|
+
release/Argus-${{ inputs.version }}-windows-${{ matrix.label }}-setup.exe
|
|
164
|
+
if-no-files-found: error
|
|
165
|
+
retention-days: 14
|
|
166
|
+
|
|
167
|
+
macos:
|
|
168
|
+
name: macOS universal2
|
|
169
|
+
runs-on: macos-15
|
|
170
|
+
steps:
|
|
171
|
+
- uses: actions/checkout@v7
|
|
172
|
+
with:
|
|
173
|
+
ref: ${{ inputs.ref }}
|
|
174
|
+
fetch-depth: 0
|
|
175
|
+
- uses: actions/setup-python@v7
|
|
176
|
+
with:
|
|
177
|
+
python-version: "3.12"
|
|
178
|
+
- name: Verify universal2 build environment
|
|
179
|
+
run: file "$(python -c 'import sys; print(sys.executable)')"
|
|
180
|
+
- name: Install build dependencies
|
|
181
|
+
run: |
|
|
182
|
+
python -m pip install --upgrade pip
|
|
183
|
+
python -m pip install ".[gui,browser,serve,watch]" "pyinstaller==6.22.3" "delocate==0.13.0"
|
|
184
|
+
python -m pip install --force-reinstall --no-deps "cryptography==46.0.7"
|
|
185
|
+
- name: Make binary dependencies truly universal2
|
|
186
|
+
run: |
|
|
187
|
+
set -euxo pipefail
|
|
188
|
+
PILLOW_VERSION="$(python -c 'import PIL; print(PIL.__version__)')"
|
|
189
|
+
CFFI_VERSION="$(python -c 'import cffi; print(cffi.__version__)')"
|
|
190
|
+
MARKUPSAFE_VERSION="$(python -c 'import importlib.metadata; print(importlib.metadata.version("markupsafe"))')"
|
|
191
|
+
PYYAML_VERSION="$(python -c 'import importlib.metadata; print(importlib.metadata.version("pyyaml"))')"
|
|
192
|
+
WATCHDOG_VERSION="$(python -c 'import importlib.metadata; print(importlib.metadata.version("watchdog"))')"
|
|
193
|
+
PLAYWRIGHT_VERSION="$(python -c 'import importlib.metadata; print(importlib.metadata.version("playwright"))')"
|
|
194
|
+
mkdir -p build/pillow-arm64 build/pillow-x64 build/pillow-universal build/cffi-arm64 build/cffi-x64 build/cffi-universal build/markupsafe-arm64 build/markupsafe-x64 build/markupsafe-universal build/pyyaml-arm64 build/pyyaml-x64 build/pyyaml-universal build/watchdog-universal build/playwright-universal
|
|
195
|
+
python -m pip download --only-binary=:all: --no-deps --platform macosx_11_0_arm64 --python-version 312 --implementation cp --abi cp312 "Pillow==$PILLOW_VERSION" -d build/pillow-arm64
|
|
196
|
+
python -m pip download --only-binary=:all: --no-deps --platform macosx_10_13_x86_64 --python-version 312 --implementation cp --abi cp312 "Pillow==$PILLOW_VERSION" -d build/pillow-x64
|
|
197
|
+
delocate-merge build/pillow-arm64/*.whl build/pillow-x64/*.whl -w build/pillow-universal
|
|
198
|
+
python -m pip install --force-reinstall --no-deps build/pillow-universal/*.whl
|
|
199
|
+
python -m pip download --only-binary=:all: --no-deps --platform macosx_11_0_arm64 --python-version 312 --implementation cp --abi cp312 "cffi==$CFFI_VERSION" -d build/cffi-arm64
|
|
200
|
+
python -m pip download --only-binary=:all: --no-deps --platform macosx_10_15_x86_64 --python-version 312 --implementation cp --abi cp312 "cffi==$CFFI_VERSION" -d build/cffi-x64
|
|
201
|
+
delocate-merge build/cffi-arm64/*.whl build/cffi-x64/*.whl -w build/cffi-universal
|
|
202
|
+
python -m pip install --force-reinstall --no-deps build/cffi-universal/*.whl
|
|
203
|
+
python -m pip download --only-binary=:all: --no-deps --platform macosx_11_0_arm64 --python-version 312 --implementation cp --abi cp312 "MarkupSafe==$MARKUPSAFE_VERSION" -d build/markupsafe-arm64
|
|
204
|
+
python -m pip download --only-binary=:all: --no-deps --platform macosx_10_13_x86_64 --python-version 312 --implementation cp --abi cp312 "MarkupSafe==$MARKUPSAFE_VERSION" -d build/markupsafe-x64
|
|
205
|
+
delocate-merge build/markupsafe-arm64/*.whl build/markupsafe-x64/*.whl -w build/markupsafe-universal
|
|
206
|
+
python -m pip install --force-reinstall --no-deps build/markupsafe-universal/*.whl
|
|
207
|
+
python -m pip download --only-binary=:all: --no-deps --platform macosx_11_0_arm64 --python-version 312 --implementation cp --abi cp312 "PyYAML==$PYYAML_VERSION" -d build/pyyaml-arm64
|
|
208
|
+
python -m pip download --only-binary=:all: --no-deps --platform macosx_10_13_x86_64 --python-version 312 --implementation cp --abi cp312 "PyYAML==$PYYAML_VERSION" -d build/pyyaml-x64
|
|
209
|
+
delocate-merge build/pyyaml-arm64/*.whl build/pyyaml-x64/*.whl -w build/pyyaml-universal
|
|
210
|
+
python -m pip install --force-reinstall --no-deps build/pyyaml-universal/*.whl
|
|
211
|
+
python -m pip download --only-binary=:all: --no-deps --platform macosx_10_13_universal2 --python-version 312 --implementation cp --abi cp312 "watchdog==$WATCHDOG_VERSION" -d build/watchdog-universal
|
|
212
|
+
python -m pip install --force-reinstall --no-deps build/watchdog-universal/*.whl
|
|
213
|
+
python -m pip download --only-binary=:all: --no-deps --platform macosx_11_0_universal2 "playwright==$PLAYWRIGHT_VERSION" -d build/playwright-universal
|
|
214
|
+
python -m pip install --force-reinstall --no-deps build/playwright-universal/*.whl
|
|
215
|
+
python - <<'PY'
|
|
216
|
+
import pathlib, subprocess, sysconfig
|
|
217
|
+
root = pathlib.Path(sysconfig.get_paths()["purelib"])
|
|
218
|
+
bad = []
|
|
219
|
+
for binary in root.rglob("*.so"):
|
|
220
|
+
relative = binary.relative_to(root)
|
|
221
|
+
if relative.parts and relative.parts[0] == "delocate":
|
|
222
|
+
continue
|
|
223
|
+
out = subprocess.check_output(["file", str(binary)], text=True)
|
|
224
|
+
if "x86_64" not in out or "arm64" not in out:
|
|
225
|
+
bad.append(str(binary))
|
|
226
|
+
if bad:
|
|
227
|
+
raise SystemExit("non-universal runtime native extensions remain:\n" + "\n".join(bad))
|
|
228
|
+
PY
|
|
229
|
+
- name: Generate macOS icon
|
|
230
|
+
run: python packaging/make_icons.py build-assets/argus.icns
|
|
231
|
+
- name: Freeze universal desktop app and CLI
|
|
232
|
+
run: |
|
|
233
|
+
ICON="$(pwd)/build-assets/argus.icns"
|
|
234
|
+
python -m PyInstaller --noconfirm --clean --windowed --onedir --name Argus --icon "$ICON" --osx-bundle-identifier in.cascadeai.argus --target-arch universal2 --collect-data argus.gui --collect-submodules argus --copy-metadata argus-app-testing --distpath build/pyi-dist --workpath build/pyi-work --specpath build/spec argus/gui/__main__.py
|
|
235
|
+
python -m PyInstaller --noconfirm --clean --console --onefile --name argus --target-arch universal2 --collect-data argus.gui --collect-submodules argus --copy-metadata argus-app-testing --distpath build/pyi-dist --workpath build/pyi-work-cli --specpath build/spec-cli argus/__main__.py
|
|
236
|
+
- name: Verify both CPU slices and smoke-test CLI
|
|
237
|
+
run: |
|
|
238
|
+
test -d build/pyi-dist/Argus.app
|
|
239
|
+
for binary in build/pyi-dist/Argus.app/Contents/MacOS/Argus build/pyi-dist/argus; do
|
|
240
|
+
ARCHES="$(lipo -archs "$binary")"
|
|
241
|
+
echo "$ARCHES" | grep -q x86_64
|
|
242
|
+
echo "$ARCHES" | grep -q arm64
|
|
243
|
+
done
|
|
244
|
+
build/pyi-dist/argus --version
|
|
245
|
+
codesign --verify --deep --strict build/pyi-dist/Argus.app
|
|
246
|
+
- name: Create DMG and ZIP
|
|
247
|
+
run: |
|
|
248
|
+
mkdir -p release/dmg
|
|
249
|
+
cp -R build/pyi-dist/Argus.app release/dmg/Argus.app
|
|
250
|
+
cp build/pyi-dist/argus release/dmg/argus
|
|
251
|
+
cp LICENSE release/dmg/LICENSE
|
|
252
|
+
ln -s /Applications release/dmg/Applications
|
|
253
|
+
ditto -c -k --sequesterRsrc --keepParent build/pyi-dist/Argus.app "release/Argus-${{ inputs.version }}-macos-universal2.zip"
|
|
254
|
+
hdiutil create -volname Argus -srcfolder release/dmg -ov -format UDZO "release/Argus-${{ inputs.version }}-macos-universal2.dmg"
|
|
255
|
+
- uses: actions/upload-artifact@v6
|
|
256
|
+
with:
|
|
257
|
+
name: release-macos-universal2
|
|
258
|
+
path: |
|
|
259
|
+
release/Argus-${{ inputs.version }}-macos-universal2.zip
|
|
260
|
+
release/Argus-${{ inputs.version }}-macos-universal2.dmg
|
|
261
|
+
if-no-files-found: error
|
|
262
|
+
retention-days: 14
|
|
263
|
+
|
|
264
|
+
linux:
|
|
265
|
+
name: Linux ${{ matrix.label }}
|
|
266
|
+
strategy:
|
|
267
|
+
fail-fast: false
|
|
268
|
+
matrix:
|
|
269
|
+
include:
|
|
270
|
+
- label: x86_64
|
|
271
|
+
runner: ubuntu-24.04
|
|
272
|
+
arch: x86_64
|
|
273
|
+
deb_arch: amd64
|
|
274
|
+
rpm_arch: x86_64
|
|
275
|
+
pacman_arch: x86_64
|
|
276
|
+
appimage_arch: x86_64
|
|
277
|
+
appimagetool_url: https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-x86_64.AppImage
|
|
278
|
+
appimagetool_sha256: ed4ce84f0d9caff66f50bcca6ff6f35aae54ce8135408b3fa33abfc3cb384eb0
|
|
279
|
+
runtime_url: https://github.com/AppImage/type2-runtime/releases/download/20251108/runtime-x86_64
|
|
280
|
+
runtime_sha256: 2fca8b443c92510f1483a883f60061ad09b46b978b2631c807cd873a47ec260d
|
|
281
|
+
- label: aarch64
|
|
282
|
+
runner: ubuntu-24.04-arm
|
|
283
|
+
arch: aarch64
|
|
284
|
+
deb_arch: arm64
|
|
285
|
+
rpm_arch: aarch64
|
|
286
|
+
pacman_arch: aarch64
|
|
287
|
+
appimage_arch: aarch64
|
|
288
|
+
appimagetool_url: https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-aarch64.AppImage
|
|
289
|
+
appimagetool_sha256: f0837e7448a0c1e4e650a93bb3e85802546e60654ef287576f46c71c126a9158
|
|
290
|
+
runtime_url: https://github.com/AppImage/type2-runtime/releases/download/20251108/runtime-aarch64
|
|
291
|
+
runtime_sha256: 00cbdfcf917cc6c0ff6d3347d59e0ca1f7f45a6df1a428a0d6d8a78664d87444
|
|
292
|
+
runs-on: ${{ matrix.runner }}
|
|
293
|
+
steps:
|
|
294
|
+
- uses: actions/checkout@v7
|
|
295
|
+
with:
|
|
296
|
+
ref: ${{ inputs.ref }}
|
|
297
|
+
fetch-depth: 0
|
|
298
|
+
- uses: actions/setup-python@v7
|
|
299
|
+
with:
|
|
300
|
+
python-version: "3.12"
|
|
301
|
+
- uses: ruby/setup-ruby@v1
|
|
302
|
+
with:
|
|
303
|
+
ruby-version: "3.3"
|
|
304
|
+
- name: Install native packaging tools
|
|
305
|
+
run: |
|
|
306
|
+
sudo apt-get update
|
|
307
|
+
sudo apt-get install -y rpm zstd libarchive-tools
|
|
308
|
+
gem install fpm --version 1.17.0 --no-document
|
|
309
|
+
- name: Install Argus build dependencies
|
|
310
|
+
run: |
|
|
311
|
+
python -m pip install --upgrade pip
|
|
312
|
+
python -m pip install ".[gui,browser,serve,watch]" "pyinstaller==6.22.3"
|
|
313
|
+
- name: Freeze desktop app and CLI
|
|
314
|
+
run: |
|
|
315
|
+
python -m PyInstaller --noconfirm --clean --onedir --name Argus --collect-data argus.gui --collect-submodules argus --copy-metadata argus-app-testing --distpath build/pyi-dist --workpath build/pyi-work --specpath build/spec argus/gui/__main__.py
|
|
316
|
+
python -m PyInstaller --noconfirm --clean --onefile --name argus --collect-data argus.gui --collect-submodules argus --copy-metadata argus-app-testing --distpath build/pyi-dist --workpath build/pyi-work-cli --specpath build/spec-cli argus/__main__.py
|
|
317
|
+
- name: Stage Linux filesystem tree
|
|
318
|
+
run: |
|
|
319
|
+
mkdir -p release/AppDir/usr/lib/argus release/AppDir/usr/bin release/AppDir/usr/share/applications release/AppDir/usr/share/icons/hicolor/256x256/apps release/AppDir/usr/share/doc/argus
|
|
320
|
+
cp -a build/pyi-dist/Argus/. release/AppDir/usr/lib/argus/
|
|
321
|
+
cp build/pyi-dist/argus release/AppDir/usr/bin/argus
|
|
322
|
+
cp packaging/linux/argus.desktop release/AppDir/usr/share/applications/argus.desktop
|
|
323
|
+
python packaging/make_icons.py release/AppDir/usr/share/icons/hicolor/256x256/apps/argus.png
|
|
324
|
+
cp LICENSE README.md release/AppDir/usr/share/doc/argus/
|
|
325
|
+
cat > release/AppDir/AppRun <<'EOF'
|
|
326
|
+
#!/bin/sh
|
|
327
|
+
HERE="$(dirname "$(readlink -f "$0")")"
|
|
328
|
+
exec "$HERE/usr/lib/argus/Argus" "$@"
|
|
329
|
+
EOF
|
|
330
|
+
chmod +x release/AppDir/AppRun
|
|
331
|
+
ln -s usr/share/icons/hicolor/256x256/apps/argus.png release/AppDir/argus.png
|
|
332
|
+
ln -s usr/share/applications/argus.desktop release/AppDir/argus.desktop
|
|
333
|
+
- name: Build DEB, RPM, and Arch Linux packages
|
|
334
|
+
run: |
|
|
335
|
+
mkdir -p release/packages
|
|
336
|
+
fpm -s dir -t deb -n argus-app-testing -v "${{ inputs.version }}" -a "${{ matrix.deb_arch }}" --license Apache-2.0 --description "Argus cross-platform application testing framework" -C release/AppDir -p "release/packages/Argus-${{ inputs.version }}-linux-${{ matrix.label }}.deb" usr
|
|
337
|
+
fpm -s dir -t rpm -n argus-app-testing -v "${{ inputs.version }}" -a "${{ matrix.rpm_arch }}" --license Apache-2.0 --description "Argus cross-platform application testing framework" -C release/AppDir -p "release/packages/Argus-${{ inputs.version }}-linux-${{ matrix.label }}.rpm" usr
|
|
338
|
+
fpm -s dir -t pacman -n argus-app-testing -v "${{ inputs.version }}" -a "${{ matrix.pacman_arch }}" --license Apache-2.0 --description "Argus cross-platform application testing framework" -C release/AppDir -p "release/packages/Argus-${{ inputs.version }}-linux-${{ matrix.label }}.pkg.tar.zst" usr
|
|
339
|
+
- name: Download and verify pinned AppImage tooling
|
|
340
|
+
run: |
|
|
341
|
+
curl --fail --location --retry 3 "${{ matrix.appimagetool_url }}" -o build/appimagetool.AppImage
|
|
342
|
+
curl --fail --location --retry 3 "${{ matrix.runtime_url }}" -o build/runtime
|
|
343
|
+
echo "${{ matrix.appimagetool_sha256 }} build/appimagetool.AppImage" | sha256sum -c -
|
|
344
|
+
echo "${{ matrix.runtime_sha256 }} build/runtime" | sha256sum -c -
|
|
345
|
+
chmod +x build/appimagetool.AppImage build/runtime
|
|
346
|
+
- name: Build AppImage
|
|
347
|
+
env:
|
|
348
|
+
ARCH: ${{ matrix.appimage_arch }}
|
|
349
|
+
APPIMAGE_EXTRACT_AND_RUN: "1"
|
|
350
|
+
run: |
|
|
351
|
+
build/appimagetool.AppImage --runtime-file build/runtime release/AppDir "release/Argus-${{ inputs.version }}-linux-${{ matrix.label }}.AppImage"
|
|
352
|
+
- name: Verify Linux release files
|
|
353
|
+
run: |
|
|
354
|
+
test -f "release/Argus-${{ inputs.version }}-linux-${{ matrix.label }}.AppImage"
|
|
355
|
+
test -f "release/packages/Argus-${{ inputs.version }}-linux-${{ matrix.label }}.deb"
|
|
356
|
+
test -f "release/packages/Argus-${{ inputs.version }}-linux-${{ matrix.label }}.rpm"
|
|
357
|
+
test -f "release/packages/Argus-${{ inputs.version }}-linux-${{ matrix.label }}.pkg.tar.zst"
|
|
358
|
+
- uses: actions/upload-artifact@v6
|
|
359
|
+
with:
|
|
360
|
+
name: release-linux-${{ matrix.label }}
|
|
361
|
+
path: |
|
|
362
|
+
release/Argus-${{ inputs.version }}-linux-${{ matrix.label }}.AppImage
|
|
363
|
+
release/packages/*
|
|
364
|
+
if-no-files-found: error
|
|
365
|
+
retention-days: 14
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
name: Dependency review
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
dependency-review:
|
|
12
|
+
runs-on: ubuntu-24.04
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v7
|
|
15
|
+
- uses: actions/dependency-review-action@v5
|
|
16
|
+
with:
|
|
17
|
+
fail-on-severity: high
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
name: Package preview
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
concurrency:
|
|
11
|
+
group: package-preview-${{ github.event.pull_request.number || github.ref }}
|
|
12
|
+
cancel-in-progress: true
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
metadata:
|
|
16
|
+
runs-on: ubuntu-24.04
|
|
17
|
+
outputs:
|
|
18
|
+
version: ${{ steps.version.outputs.value }}
|
|
19
|
+
ref: ${{ steps.ref.outputs.value }}
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v7
|
|
22
|
+
- id: version
|
|
23
|
+
env:
|
|
24
|
+
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
25
|
+
run: echo "value=0.0.$PR_NUMBER" >> "$GITHUB_OUTPUT"
|
|
26
|
+
- id: ref
|
|
27
|
+
env:
|
|
28
|
+
BUILD_REF: ${{ github.event.pull_request.head.sha }}
|
|
29
|
+
run: echo "value=$BUILD_REF" >> "$GITHUB_OUTPUT"
|
|
30
|
+
|
|
31
|
+
build:
|
|
32
|
+
needs: metadata
|
|
33
|
+
uses: ./.github/workflows/build-artifacts.yml
|
|
34
|
+
with:
|
|
35
|
+
ref: ${{ needs.metadata.outputs.ref }}
|
|
36
|
+
version: ${{ needs.metadata.outputs.version }}
|