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.
Files changed (238) hide show
  1. argus_app_testing-0.1.1/.github/CODEOWNERS +1 -0
  2. argus_app_testing-0.1.1/.github/ISSUE_TEMPLATE/bug.yml +62 -0
  3. argus_app_testing-0.1.1/.github/ISSUE_TEMPLATE/config.yml +5 -0
  4. argus_app_testing-0.1.1/.github/ISSUE_TEMPLATE/feature.yml +31 -0
  5. argus_app_testing-0.1.1/.github/PULL_REQUEST_TEMPLATE.md +29 -0
  6. argus_app_testing-0.1.1/.github/dependabot.yml +29 -0
  7. argus_app_testing-0.1.1/.github/scripts/next_release.py +47 -0
  8. argus_app_testing-0.1.1/.github/workflows/build-artifacts.yml +365 -0
  9. argus_app_testing-0.1.1/.github/workflows/dependency-review.yml +17 -0
  10. argus_app_testing-0.1.1/.github/workflows/package-preview.yml +36 -0
  11. argus_app_testing-0.1.1/.github/workflows/release-on-merge.yml +201 -0
  12. argus_app_testing-0.1.1/.github/workflows/release.yml +131 -0
  13. argus_app_testing-0.1.1/.github/workflows/static.yml +47 -0
  14. argus_app_testing-0.1.1/.github/workflows/tests.yml +97 -0
  15. argus_app_testing-0.1.1/.gitignore +12 -0
  16. argus_app_testing-0.1.1/CHANGELOG.md +44 -0
  17. argus_app_testing-0.1.1/CONTRIBUTING.md +51 -0
  18. argus_app_testing-0.1.1/LICENSE +21 -0
  19. argus_app_testing-0.1.1/PKG-INFO +484 -0
  20. argus_app_testing-0.1.1/README.md +427 -0
  21. argus_app_testing-0.1.1/SECURITY.md +41 -0
  22. argus_app_testing-0.1.1/argus/__init__.py +17 -0
  23. argus_app_testing-0.1.1/argus/__main__.py +4 -0
  24. argus_app_testing-0.1.1/argus/actions.py +222 -0
  25. argus_app_testing-0.1.1/argus/adapters/__init__.py +19 -0
  26. argus_app_testing-0.1.1/argus/adapters/base.py +291 -0
  27. argus_app_testing-0.1.1/argus/adapters/browser_adapter.py +209 -0
  28. argus_app_testing-0.1.1/argus/adapters/cli_adapter.py +112 -0
  29. argus_app_testing-0.1.1/argus/adapters/linux_gui.py +252 -0
  30. argus_app_testing-0.1.1/argus/adapters/windows_gui.py +411 -0
  31. argus_app_testing-0.1.1/argus/adapters/windows_safe.py +589 -0
  32. argus_app_testing-0.1.1/argus/ates/__init__.py +124 -0
  33. argus_app_testing-0.1.1/argus/ates/artifacts.py +917 -0
  34. argus_app_testing-0.1.1/argus/ates/audit.py +1675 -0
  35. argus_app_testing-0.1.1/argus/ates/authority_guards.py +777 -0
  36. argus_app_testing-0.1.1/argus/ates/core.py +1238 -0
  37. argus_app_testing-0.1.1/argus/ates/evidence_validation.py +2006 -0
  38. argus_app_testing-0.1.1/argus/ates/finalization.py +618 -0
  39. argus_app_testing-0.1.1/argus/ates/finalization_io.py +504 -0
  40. argus_app_testing-0.1.1/argus/ates/finalization_types.py +42 -0
  41. argus_app_testing-0.1.1/argus/ates/ids.py +47 -0
  42. argus_app_testing-0.1.1/argus/ates/package.py +65 -0
  43. argus_app_testing-0.1.1/argus/ates/privacy.py +469 -0
  44. argus_app_testing-0.1.1/argus/ates/recovery_policy.py +64 -0
  45. argus_app_testing-0.1.1/argus/ates/reports.py +1360 -0
  46. argus_app_testing-0.1.1/argus/ates/status.py +160 -0
  47. argus_app_testing-0.1.1/argus/ates/store.py +1310 -0
  48. argus_app_testing-0.1.1/argus/ates/transaction_guards.py +578 -0
  49. argus_app_testing-0.1.1/argus/ates/trust_guards.py +822 -0
  50. argus_app_testing-0.1.1/argus/capsule/__init__.py +27 -0
  51. argus_app_testing-0.1.1/argus/capsule/base.py +218 -0
  52. argus_app_testing-0.1.1/argus/capsule/files.py +162 -0
  53. argus_app_testing-0.1.1/argus/capsule/guest.py +502 -0
  54. argus_app_testing-0.1.1/argus/capsule/guest_agent.py +719 -0
  55. argus_app_testing-0.1.1/argus/capsule/host_collect.py +102 -0
  56. argus_app_testing-0.1.1/argus/capsule/hyperv.py +369 -0
  57. argus_app_testing-0.1.1/argus/capsule/hyperv_isolated.py +314 -0
  58. argus_app_testing-0.1.1/argus/capsule/libvirt.py +1122 -0
  59. argus_app_testing-0.1.1/argus/capsule/safe_open.py +333 -0
  60. argus_app_testing-0.1.1/argus/capsule/safe_output.py +418 -0
  61. argus_app_testing-0.1.1/argus/capsule/secure_client.py +97 -0
  62. argus_app_testing-0.1.1/argus/capsule/secure_guest_agent.py +217 -0
  63. argus_app_testing-0.1.1/argus/cli.py +568 -0
  64. argus_app_testing-0.1.1/argus/config.py +509 -0
  65. argus_app_testing-0.1.1/argus/engine/__init__.py +0 -0
  66. argus_app_testing-0.1.1/argus/engine/agent.py +303 -0
  67. argus_app_testing-0.1.1/argus/engine/ates_artifacts.py +315 -0
  68. argus_app_testing-0.1.1/argus/engine/ates_runtime.py +1094 -0
  69. argus_app_testing-0.1.1/argus/engine/results.py +266 -0
  70. argus_app_testing-0.1.1/argus/engine/roam.py +86 -0
  71. argus_app_testing-0.1.1/argus/engine/roam_ates_impl.py +253 -0
  72. argus_app_testing-0.1.1/argus/engine/roam_impl.py +534 -0
  73. argus_app_testing-0.1.1/argus/engine/runner.py +66 -0
  74. argus_app_testing-0.1.1/argus/engine/runner_impl.py +788 -0
  75. argus_app_testing-0.1.1/argus/engine/spec.py +285 -0
  76. argus_app_testing-0.1.1/argus/execution/__init__.py +21 -0
  77. argus_app_testing-0.1.1/argus/execution/ates_collection.py +198 -0
  78. argus_app_testing-0.1.1/argus/execution/base.py +237 -0
  79. argus_app_testing-0.1.1/argus/execution/capsule.py +583 -0
  80. argus_app_testing-0.1.1/argus/execution/secure_capsule.py +291 -0
  81. argus_app_testing-0.1.1/argus/fleet/__init__.py +123 -0
  82. argus_app_testing-0.1.1/argus/fleet/ates_transport.py +704 -0
  83. argus_app_testing-0.1.1/argus/fleet/enrollment.py +594 -0
  84. argus_app_testing-0.1.1/argus/fleet/execution.py +326 -0
  85. argus_app_testing-0.1.1/argus/fleet/heartbeat.py +296 -0
  86. argus_app_testing-0.1.1/argus/fleet/heartbeat_impl.py +960 -0
  87. argus_app_testing-0.1.1/argus/fleet/identity.py +207 -0
  88. argus_app_testing-0.1.1/argus/fleet/placement.py +1308 -0
  89. argus_app_testing-0.1.1/argus/gui/__init__.py +0 -0
  90. argus_app_testing-0.1.1/argus/gui/__main__.py +4 -0
  91. argus_app_testing-0.1.1/argus/gui/app.py +308 -0
  92. argus_app_testing-0.1.1/argus/gui/web/app.js +295 -0
  93. argus_app_testing-0.1.1/argus/gui/web/index.html +402 -0
  94. argus_app_testing-0.1.1/argus/knowledge/__init__.py +177 -0
  95. argus_app_testing-0.1.1/argus/knowledge/base.py +128 -0
  96. argus_app_testing-0.1.1/argus/knowledge/docker_manager.py +162 -0
  97. argus_app_testing-0.1.1/argus/knowledge/embeddings.py +41 -0
  98. argus_app_testing-0.1.1/argus/knowledge/fingerprint.py +58 -0
  99. argus_app_testing-0.1.1/argus/knowledge/json_store.py +319 -0
  100. argus_app_testing-0.1.1/argus/knowledge/remote.py +353 -0
  101. argus_app_testing-0.1.1/argus/knowledge/store.py +359 -0
  102. argus_app_testing-0.1.1/argus/policy.py +44 -0
  103. argus_app_testing-0.1.1/argus/providers/__init__.py +10 -0
  104. argus_app_testing-0.1.1/argus/providers/anthropic_provider.py +109 -0
  105. argus_app_testing-0.1.1/argus/providers/base.py +77 -0
  106. argus_app_testing-0.1.1/argus/providers/ollama.py +147 -0
  107. argus_app_testing-0.1.1/argus/providers/openai_provider.py +175 -0
  108. argus_app_testing-0.1.1/argus/providers/registry.py +69 -0
  109. argus_app_testing-0.1.1/argus/serve/__init__.py +0 -0
  110. argus_app_testing-0.1.1/argus/serve/app.py +463 -0
  111. argus_app_testing-0.1.1/argus/tokens.py +177 -0
  112. argus_app_testing-0.1.1/argus_app_testing.egg-info/PKG-INFO +484 -0
  113. argus_app_testing-0.1.1/argus_app_testing.egg-info/SOURCES.txt +236 -0
  114. argus_app_testing-0.1.1/argus_app_testing.egg-info/dependency_links.txt +1 -0
  115. argus_app_testing-0.1.1/argus_app_testing.egg-info/entry_points.txt +3 -0
  116. argus_app_testing-0.1.1/argus_app_testing.egg-info/requires.txt +43 -0
  117. argus_app_testing-0.1.1/argus_app_testing.egg-info/scm_file_list.json +232 -0
  118. argus_app_testing-0.1.1/argus_app_testing.egg-info/scm_version.json +8 -0
  119. argus_app_testing-0.1.1/argus_app_testing.egg-info/top_level.txt +1 -0
  120. argus_app_testing-0.1.1/docs/README.md +122 -0
  121. argus_app_testing-0.1.1/docs/ates-action-dispatch.md +45 -0
  122. argus_app_testing-0.1.1/docs/ates-artifacts.md +115 -0
  123. argus_app_testing-0.1.1/docs/ates-core.md +142 -0
  124. argus_app_testing-0.1.1/docs/ates-event-store.md +160 -0
  125. argus_app_testing-0.1.1/docs/ates-privacy.md +200 -0
  126. argus_app_testing-0.1.1/docs/ates-runtime.md +56 -0
  127. argus_app_testing-0.1.1/docs/ates.md +1109 -0
  128. argus_app_testing-0.1.1/docs/capsules-hyperv.md +180 -0
  129. argus_app_testing-0.1.1/docs/capsules-multi-os.md +311 -0
  130. argus_app_testing-0.1.1/docs/consolidated-roadmap.md +189 -0
  131. argus_app_testing-0.1.1/docs/fleet.md +732 -0
  132. argus_app_testing-0.1.1/docs/releasing.md +120 -0
  133. argus_app_testing-0.1.1/index.html +160 -0
  134. argus_app_testing-0.1.1/packaging/linux/AppRun +5 -0
  135. argus_app_testing-0.1.1/packaging/linux/argus-cli +3 -0
  136. argus_app_testing-0.1.1/packaging/linux/argus-gui +4 -0
  137. argus_app_testing-0.1.1/packaging/linux/argus.desktop +9 -0
  138. argus_app_testing-0.1.1/packaging/make_icons.py +64 -0
  139. argus_app_testing-0.1.1/packaging/windows/argus.iss +58 -0
  140. argus_app_testing-0.1.1/packaging/windows/argus.wxs +41 -0
  141. argus_app_testing-0.1.1/packaging/windows/make_wix.py +189 -0
  142. argus_app_testing-0.1.1/pyproject.toml +105 -0
  143. argus_app_testing-0.1.1/setup.cfg +4 -0
  144. argus_app_testing-0.1.1/tests/__init__.py +0 -0
  145. argus_app_testing-0.1.1/tests/ates_test_support.py +830 -0
  146. argus_app_testing-0.1.1/tests/conftest.py +138 -0
  147. argus_app_testing-0.1.1/tests/fixtures/windows_uia_launcher.py +16 -0
  148. argus_app_testing-0.1.1/tests/fixtures/windows_uia_spawn_child_target.py +119 -0
  149. argus_app_testing-0.1.1/tests/fixtures/windows_uia_target.py +96 -0
  150. argus_app_testing-0.1.1/tests/test_agent.py +39 -0
  151. argus_app_testing-0.1.1/tests/test_ates_action_dispatch.py +303 -0
  152. argus_app_testing-0.1.1/tests/test_ates_approvals.py +777 -0
  153. argus_app_testing-0.1.1/tests/test_ates_artifact_durability.py +114 -0
  154. argus_app_testing-0.1.1/tests/test_ates_artifact_hardening.py +102 -0
  155. argus_app_testing-0.1.1/tests/test_ates_artifact_metadata.py +77 -0
  156. argus_app_testing-0.1.1/tests/test_ates_artifact_runtime.py +289 -0
  157. argus_app_testing-0.1.1/tests/test_ates_artifact_short_writes.py +44 -0
  158. argus_app_testing-0.1.1/tests/test_ates_artifacts.py +290 -0
  159. argus_app_testing-0.1.1/tests/test_ates_audit_storage.py +292 -0
  160. argus_app_testing-0.1.1/tests/test_ates_authority_guards.py +310 -0
  161. argus_app_testing-0.1.1/tests/test_ates_capture_validation.py +360 -0
  162. argus_app_testing-0.1.1/tests/test_ates_core.py +929 -0
  163. argus_app_testing-0.1.1/tests/test_ates_core_relationship_regressions.py +182 -0
  164. argus_app_testing-0.1.1/tests/test_ates_core_review_regressions_round7.py +155 -0
  165. argus_app_testing-0.1.1/tests/test_ates_core_review_regressions_round8.py +257 -0
  166. argus_app_testing-0.1.1/tests/test_ates_event_store.py +344 -0
  167. argus_app_testing-0.1.1/tests/test_ates_event_store_review_regressions.py +232 -0
  168. argus_app_testing-0.1.1/tests/test_ates_event_store_review_regressions_round2.py +273 -0
  169. argus_app_testing-0.1.1/tests/test_ates_event_store_review_regressions_round3.py +122 -0
  170. argus_app_testing-0.1.1/tests/test_ates_event_store_review_regressions_round4.py +256 -0
  171. argus_app_testing-0.1.1/tests/test_ates_event_store_review_regressions_round5.py +430 -0
  172. argus_app_testing-0.1.1/tests/test_ates_evidence_validation.py +458 -0
  173. argus_app_testing-0.1.1/tests/test_ates_finalization.py +239 -0
  174. argus_app_testing-0.1.1/tests/test_ates_finalization_recovery.py +418 -0
  175. argus_app_testing-0.1.1/tests/test_ates_incomplete_reports.py +157 -0
  176. argus_app_testing-0.1.1/tests/test_ates_integrity_contract.py +309 -0
  177. argus_app_testing-0.1.1/tests/test_ates_lifecycle_validation.py +382 -0
  178. argus_app_testing-0.1.1/tests/test_ates_package_integration.py +198 -0
  179. argus_app_testing-0.1.1/tests/test_ates_privacy.py +361 -0
  180. argus_app_testing-0.1.1/tests/test_ates_privacy_hardening.py +66 -0
  181. argus_app_testing-0.1.1/tests/test_ates_report_publication.py +204 -0
  182. argus_app_testing-0.1.1/tests/test_ates_reports.py +385 -0
  183. argus_app_testing-0.1.1/tests/test_ates_runtime_integration.py +468 -0
  184. argus_app_testing-0.1.1/tests/test_ates_trust_boundary_regressions.py +587 -0
  185. argus_app_testing-0.1.1/tests/test_capsule.py +344 -0
  186. argus_app_testing-0.1.1/tests/test_capsule_isolation_pr6.py +446 -0
  187. argus_app_testing-0.1.1/tests/test_capsule_isolation_pr6_policy.py +26 -0
  188. argus_app_testing-0.1.1/tests/test_capsule_multi_os_pr7.py +242 -0
  189. argus_app_testing-0.1.1/tests/test_capsule_provider_capabilities_pr7.py +33 -0
  190. argus_app_testing-0.1.1/tests/test_capsule_retained_recovery_pr6.py +161 -0
  191. argus_app_testing-0.1.1/tests/test_capsule_security.py +266 -0
  192. argus_app_testing-0.1.1/tests/test_capsule_transfer_security.py +139 -0
  193. argus_app_testing-0.1.1/tests/test_capsule_transfers.py +383 -0
  194. argus_app_testing-0.1.1/tests/test_cli_adapter.py +59 -0
  195. argus_app_testing-0.1.1/tests/test_codex_pr12_regressions.py +263 -0
  196. argus_app_testing-0.1.1/tests/test_codex_pr12_round2.py +166 -0
  197. argus_app_testing-0.1.1/tests/test_codex_pr12_round3.py +224 -0
  198. argus_app_testing-0.1.1/tests/test_codex_pr14_regressions.py +239 -0
  199. argus_app_testing-0.1.1/tests/test_codex_pr14_round2.py +242 -0
  200. argus_app_testing-0.1.1/tests/test_codex_pr14_round3.py +169 -0
  201. argus_app_testing-0.1.1/tests/test_codex_pr14_round4.py +347 -0
  202. argus_app_testing-0.1.1/tests/test_codex_pr14_round5.py +146 -0
  203. argus_app_testing-0.1.1/tests/test_codex_pr14_round6.py +120 -0
  204. argus_app_testing-0.1.1/tests/test_config.py +60 -0
  205. argus_app_testing-0.1.1/tests/test_execution_environment.py +162 -0
  206. argus_app_testing-0.1.1/tests/test_execution_safety.py +250 -0
  207. argus_app_testing-0.1.1/tests/test_failure_capsule_error_results.py +150 -0
  208. argus_app_testing-0.1.1/tests/test_failure_capsule_teardown.py +111 -0
  209. argus_app_testing-0.1.1/tests/test_failure_capsules.py +465 -0
  210. argus_app_testing-0.1.1/tests/test_fleet_ates_transport.py +259 -0
  211. argus_app_testing-0.1.1/tests/test_fleet_enrollment.py +221 -0
  212. argus_app_testing-0.1.1/tests/test_fleet_execution.py +435 -0
  213. argus_app_testing-0.1.1/tests/test_fleet_execution_reconciliation.py +221 -0
  214. argus_app_testing-0.1.1/tests/test_fleet_heartbeat.py +261 -0
  215. argus_app_testing-0.1.1/tests/test_fleet_heartbeat_boot_order.py +194 -0
  216. argus_app_testing-0.1.1/tests/test_fleet_placement.py +316 -0
  217. argus_app_testing-0.1.1/tests/test_key_policy_regressions.py +160 -0
  218. argus_app_testing-0.1.1/tests/test_knowledge.py +340 -0
  219. argus_app_testing-0.1.1/tests/test_pr14_posix_artifact_pinning.py +128 -0
  220. argus_app_testing-0.1.1/tests/test_pr19_review_regressions.py +261 -0
  221. argus_app_testing-0.1.1/tests/test_pr19_round2_review_regressions.py +168 -0
  222. argus_app_testing-0.1.1/tests/test_pr20_review_regressions.py +224 -0
  223. argus_app_testing-0.1.1/tests/test_pr20_round2_review_regressions.py +303 -0
  224. argus_app_testing-0.1.1/tests/test_pr20_round3_review_regressions.py +177 -0
  225. argus_app_testing-0.1.1/tests/test_pr20_round4_review_regressions.py +227 -0
  226. argus_app_testing-0.1.1/tests/test_pr20_round5_review_regressions.py +116 -0
  227. argus_app_testing-0.1.1/tests/test_pr21_review_regressions.py +204 -0
  228. argus_app_testing-0.1.1/tests/test_pr21_round2_review_regressions.py +345 -0
  229. argus_app_testing-0.1.1/tests/test_pr21_round3_review_regressions.py +284 -0
  230. argus_app_testing-0.1.1/tests/test_pr21_round4_review_regressions.py +219 -0
  231. argus_app_testing-0.1.1/tests/test_providers.py +96 -0
  232. argus_app_testing-0.1.1/tests/test_roam.py +97 -0
  233. argus_app_testing-0.1.1/tests/test_runner.py +106 -0
  234. argus_app_testing-0.1.1/tests/test_runner_extras.py +124 -0
  235. argus_app_testing-0.1.1/tests/test_spec.py +75 -0
  236. argus_app_testing-0.1.1/tests/test_spec_extras.py +59 -0
  237. argus_app_testing-0.1.1/tests/test_tokens.py +53 -0
  238. 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,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Security policy
4
+ url: https://github.com/Varun-SV/Argus/blob/main/SECURITY.md
5
+ about: Read this before reporting a vulnerability.
@@ -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 }}