argus-testing 0.3.0__tar.gz → 0.5.0__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 (83) hide show
  1. argus_testing-0.5.0/.github/workflows/ci.yml +35 -0
  2. argus_testing-0.5.0/.github/workflows/release.yml +124 -0
  3. {argus_testing-0.3.0 → argus_testing-0.5.0}/.gitignore +5 -0
  4. argus_testing-0.5.0/AGENTS.md +192 -0
  5. argus_testing-0.5.0/CHANGELOG.md +32 -0
  6. argus_testing-0.5.0/Dockerfile +9 -0
  7. argus_testing-0.5.0/PKG-INFO +298 -0
  8. argus_testing-0.5.0/README.md +263 -0
  9. argus_testing-0.5.0/argus/__init__.py +33 -0
  10. argus_testing-0.5.0/argus/bench/__init__.py +0 -0
  11. argus_testing-0.5.0/argus/bench/__main__.py +241 -0
  12. argus_testing-0.5.0/argus/bench/agent_runner.py +256 -0
  13. argus_testing-0.5.0/argus/bench/runner.py +317 -0
  14. argus_testing-0.5.0/argus/bench/scenarios_buggytasks.py +629 -0
  15. argus_testing-0.5.0/argus/bench/scenarios_darkshop.py +407 -0
  16. argus_testing-0.5.0/argus/browser.py +2152 -0
  17. argus_testing-0.5.0/argus/cli.py +288 -0
  18. argus_testing-0.5.0/argus/detector.py +159 -0
  19. argus_testing-0.5.0/argus/differ.py +103 -0
  20. {argus_testing-0.3.0 → argus_testing-0.5.0}/argus/explorer.py +34 -33
  21. argus_testing-0.5.0/argus/mcp_server.py +5288 -0
  22. argus_testing-0.5.0/argus/models.py +197 -0
  23. argus_testing-0.5.0/argus/reporter.py +569 -0
  24. argus_testing-0.5.0/argus/resolver.py +700 -0
  25. argus_testing-0.5.0/argus/screen/__init__.py +0 -0
  26. argus_testing-0.5.0/argus/screen/backend.py +963 -0
  27. argus_testing-0.5.0/argus/screen/permissions.py +222 -0
  28. argus_testing-0.5.0/argus/screen/safety.py +199 -0
  29. argus_testing-0.5.0/argus/screen/validate.py +197 -0
  30. argus_testing-0.5.0/bench-results/buggytasks.json +188 -0
  31. argus_testing-0.5.0/bench-results/buggytasks.md +30 -0
  32. argus_testing-0.5.0/bench-results/darkshop.json +108 -0
  33. argus_testing-0.5.0/bench-results/darkshop.md +20 -0
  34. argus_testing-0.5.0/bench-results/matrix.json +305 -0
  35. argus_testing-0.5.0/bench-results/matrix.md +54 -0
  36. argus_testing-0.5.0/bench-results/screen_validation.json +139 -0
  37. argus_testing-0.5.0/human-eye-fixture/app.py +561 -0
  38. {argus_testing-0.3.0 → argus_testing-0.5.0}/pyproject.toml +24 -1
  39. argus_testing-0.5.0/server.json +23 -0
  40. {argus_testing-0.3.0 → argus_testing-0.5.0}/test-site/app.py +68 -0
  41. argus_testing-0.5.0/tests/__init__.py +0 -0
  42. argus_testing-0.5.0/tests/conftest.py +89 -0
  43. argus_testing-0.5.0/tests/test_action_targeting.py +117 -0
  44. argus_testing-0.5.0/tests/test_bench_report.py +78 -0
  45. argus_testing-0.5.0/tests/test_browser_shadow.py +130 -0
  46. argus_testing-0.5.0/tests/test_cross_stack.py +109 -0
  47. argus_testing-0.5.0/tests/test_detector_console.py +58 -0
  48. argus_testing-0.5.0/tests/test_detector_network.py +45 -0
  49. argus_testing-0.5.0/tests/test_expectation_oracle.py +124 -0
  50. argus_testing-0.5.0/tests/test_final_hardening.py +487 -0
  51. argus_testing-0.5.0/tests/test_journal_regression.py +102 -0
  52. argus_testing-0.5.0/tests/test_mcp_contract.py +85 -0
  53. argus_testing-0.5.0/tests/test_regression_cli.py +64 -0
  54. argus_testing-0.5.0/tests/test_release_metadata.py +23 -0
  55. argus_testing-0.5.0/tests/test_replay_minimize.py +107 -0
  56. argus_testing-0.5.0/tests/test_replay_receipt.py +124 -0
  57. argus_testing-0.5.0/tests/test_replay_trace.py +69 -0
  58. argus_testing-0.5.0/tests/test_reporter_badge.py +135 -0
  59. argus_testing-0.5.0/tests/test_reproduction_receipt.py +1075 -0
  60. argus_testing-0.5.0/tests/test_resolver.py +571 -0
  61. argus_testing-0.5.0/tests/test_screen_permissions.py +71 -0
  62. argus_testing-0.5.0/tests/test_screen_safety.py +123 -0
  63. argus_testing-0.5.0/tests/test_session_lifecycle.py +132 -0
  64. argus_testing-0.5.0/tests/test_state_capsules.py +107 -0
  65. argus_testing-0.5.0/tests/test_substrate.py +82 -0
  66. argus_testing-0.5.0/tests/test_visual_inspection.py +45 -0
  67. argus_testing-0.3.0/CLAUDE.md +0 -73
  68. argus_testing-0.3.0/PKG-INFO +0 -136
  69. argus_testing-0.3.0/README.md +0 -110
  70. argus_testing-0.3.0/argus/__init__.py +0 -3
  71. argus_testing-0.3.0/argus/browser.py +0 -434
  72. argus_testing-0.3.0/argus/cli.py +0 -58
  73. argus_testing-0.3.0/argus/detector.py +0 -563
  74. argus_testing-0.3.0/argus/mcp_server.py +0 -719
  75. argus_testing-0.3.0/argus/models.py +0 -125
  76. argus_testing-0.3.0/argus/reporter.py +0 -192
  77. argus_testing-0.3.0/docs/ROADMAP.md +0 -52
  78. argus_testing-0.3.0/docs/STATUS.md +0 -54
  79. argus_testing-0.3.0/docs/TODO.md +0 -14
  80. {argus_testing-0.3.0 → argus_testing-0.5.0}/LICENSE +0 -0
  81. {argus_testing-0.3.0 → argus_testing-0.5.0}/argus/config.py +0 -0
  82. {argus_testing-0.3.0 → argus_testing-0.5.0}/argus/planner.py +0 -0
  83. {argus_testing-0.3.0 → argus_testing-0.5.0}/examples/focus.yaml +0 -0
@@ -0,0 +1,35 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: ci-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ test:
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ python-version: ["3.10", "3.12"]
23
+
24
+ steps:
25
+ - uses: actions/checkout@v7
26
+ - uses: actions/setup-python@v6
27
+ with:
28
+ python-version: ${{ matrix.python-version }}
29
+ cache: pip
30
+ - name: Install package
31
+ run: python -m pip install --upgrade pip && python -m pip install -e '.[dev]'
32
+ - name: Install Chromium
33
+ run: python -m playwright install --with-deps chromium
34
+ - name: Run tests
35
+ run: python -m pytest
@@ -0,0 +1,124 @@
1
+ name: Release
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@v7
16
+ with:
17
+ ref: ${{ github.event.release.tag_name }}
18
+ - uses: actions/setup-python@v6
19
+ with:
20
+ python-version: "3.12"
21
+ cache: pip
22
+ - name: Install build and test dependencies
23
+ run: python -m pip install --upgrade pip && python -m pip install build twine -e '.[dev]'
24
+ - name: Install Chromium
25
+ run: python -m playwright install --with-deps chromium
26
+ - name: Verify release metadata
27
+ env:
28
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
29
+ run: |
30
+ python - <<'PY'
31
+ import json
32
+ import os
33
+ import tomllib
34
+ from pathlib import Path
35
+
36
+ version = tomllib.loads(Path("pyproject.toml").read_text())["project"]["version"]
37
+ server = json.loads(Path("server.json").read_text())
38
+ assert os.environ["RELEASE_TAG"] == f"v{version}"
39
+ assert server["version"] == version
40
+ assert server["packages"][0]["version"] == version
41
+ PY
42
+ - name: Run tests
43
+ run: python -m pytest
44
+ - name: Build distributions
45
+ run: python -m build
46
+ - name: Check distributions
47
+ run: python -m twine check dist/*
48
+ - name: Smoke-test wheel
49
+ run: |
50
+ python -m venv /tmp/argus-wheel
51
+ /tmp/argus-wheel/bin/python -m pip install --upgrade pip
52
+ /tmp/argus-wheel/bin/python -m pip install dist/*.whl
53
+ /tmp/argus-wheel/bin/argus-testing --version
54
+ /tmp/argus-wheel/bin/argus-testing --list-tools
55
+ - uses: actions/upload-artifact@v7
56
+ with:
57
+ name: python-package-distributions
58
+ path: dist/
59
+ if-no-files-found: error
60
+
61
+ github-assets:
62
+ needs: build
63
+ runs-on: ubuntu-latest
64
+ permissions:
65
+ contents: write
66
+
67
+ steps:
68
+ - uses: actions/download-artifact@v8
69
+ with:
70
+ name: python-package-distributions
71
+ path: dist
72
+ - name: Attach distributions to the GitHub release
73
+ env:
74
+ GH_TOKEN: ${{ github.token }}
75
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
76
+ run: gh release upload "$RELEASE_TAG" dist/* --repo "$GITHUB_REPOSITORY" --clobber
77
+
78
+ pypi:
79
+ needs: build
80
+ runs-on: ubuntu-latest
81
+ environment:
82
+ name: pypi
83
+ url: https://pypi.org/project/argus-testing/
84
+ permissions:
85
+ id-token: write
86
+
87
+ steps:
88
+ - uses: actions/download-artifact@v8
89
+ with:
90
+ name: python-package-distributions
91
+ path: dist
92
+ - uses: pypa/gh-action-pypi-publish@release/v1
93
+
94
+ mcp-registry:
95
+ needs: pypi
96
+ runs-on: ubuntu-latest
97
+ permissions:
98
+ contents: read
99
+ id-token: write
100
+
101
+ steps:
102
+ - uses: actions/checkout@v7
103
+ with:
104
+ ref: ${{ github.event.release.tag_name }}
105
+ - name: Wait for PyPI indexing
106
+ env:
107
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
108
+ run: |
109
+ VERSION="${RELEASE_TAG#v}"
110
+ for attempt in {1..20}; do
111
+ if curl --fail --silent "https://pypi.org/pypi/argus-testing/$VERSION/json" >/dev/null; then
112
+ exit 0
113
+ fi
114
+ echo "Waiting for PyPI to index $VERSION ($attempt/20)"
115
+ sleep 15
116
+ done
117
+ exit 1
118
+ - name: Install MCP publisher
119
+ run: |
120
+ curl --fail --location "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
121
+ - name: Publish MCP metadata
122
+ run: |
123
+ ./mcp-publisher login github-oidc
124
+ ./mcp-publisher publish
@@ -8,6 +8,11 @@ build/
8
8
  .venv/
9
9
  venv/
10
10
  argus-reports/
11
+ .argus/
12
+ **/.argus/
11
13
  *.png
12
14
  .env
15
+ .codex/
13
16
  test-reports/
17
+ CLAUDE.md
18
+ docs/
@@ -0,0 +1,192 @@
1
+ # Argus — Agent Guide
2
+
3
+ This file is the short version of the README, aimed at an agent using
4
+ Argus through MCP. Argus is a QA capability inside the host's current
5
+ task; it does not replace the host agent's identity or authority.
6
+
7
+ ## Setup
8
+
9
+ ```bash
10
+ # Web mode (works everywhere)
11
+ pip install argus-testing
12
+ playwright install chromium
13
+
14
+ # Screen mode (macOS only — to test native apps + browser chrome)
15
+ pip install 'argus-testing[mac]'
16
+ brew install cliclick
17
+
18
+ # Wire it into the MCP host
19
+ claude mcp add argus -- argus-mcp
20
+ argus-mcp --version # confirm host loaded the version you expect
21
+ argus-mcp --list-tools # show the selected profile and public tools
22
+ argus-mcp --doctor # macOS Screen Recording + Accessibility check
23
+ ```
24
+
25
+ The default profile is `core`. Use `--tool-profile screen` for native
26
+ macOS review and `--tool-profile full` only when the broader network,
27
+ storage, tabs, crawl, and coordinate surface is needed. The
28
+ `ARGUS_TOOL_PROFILE` environment variable provides the same setting.
29
+
30
+ After `pip install -U argus-testing`, restart your MCP host so it picks
31
+ up the new tool table.
32
+
33
+ ## Using Argus within the host task
34
+
35
+ Use an evidence-first QA mindset while reviewing, but continue to follow
36
+ the user's broader task. The short version:
37
+
38
+ - **GOAL**: Find bugs the dev team would be embarrassed to ship. Tight
39
+ five-bug reports beat noisy fifty-bug ones.
40
+ - **BOUNDARY**: Do not infer permission for purchases, publication, or
41
+ other irreversible external effects. Argus does not prevent in-scope
42
+ diagnosis or implementation work the user requested.
43
+ - **THE RITUAL** (return to it on every tool call):
44
+ Map → **Use it** (walk each goal end-to-end, carrying real state) →
45
+ Hypothesize → Act → Observe → Verify → Record → Cover.
46
+
47
+ ## Tools you'll use most
48
+
49
+ ### Web mode
50
+
51
+ | Tool | Purpose |
52
+ |------|---------|
53
+ | `start_session(url, review_mode=...)` | Launch Playwright in `exploratory`, `visual`, or `regression` mode and return the initial observation. |
54
+ | `observe()` | URL + interactive elements (description-keyed) + visible feedback + counts + ARIA + viewport state. Read this first, after every action. |
55
+ | `click_what(description)` | Click the element matching `description`. Returns the top candidates if ambiguous — rephrase rather than guess. |
56
+ | `type_into(description, text)` / `select_into(description, value)` | Inputs and dropdowns by description. |
57
+ | `test_action(target, expect=...)` | Click + before/after diff in one call. Pass `expect` to PREDICT the outcome ({"count":{"label":"tasks","delta":1}}, {"gains":"Buy milk"}, {"removes":...}, {"text_present":...}, {"toast":...}, {"url_changed":true}) and Argus reports MATCH / SURPRISE — a surprise is a bug lead. Also shows CROSS-STACK: which requests the click fired (methods/statuses) and a CHECK nudge when a message appeared without a matching write. |
58
+ | `verify_persistence(expect, target_text, after_url)` | Forces a fresh GET; reports whether `target_text` is `present` / `absent`. The "Saved!" toast is not proof — this is. |
59
+ | `capsule_save(name, liveness_marker)` / `capsule_restore(name)` | Snapshot the logged-in/seeded state (cookies+storage) after minting it through the UI, then restore it later (with a mandatory live/stale re-check). Restore is a CLEAN replace, so save→branch A→restore→branch B runs two journeys from a byte-identical state for differential testing. |
60
+ | `regression_check()` | Re-test the findings journaled in prior runs against the CURRENT build: STILL-PRESENT / NO-LONGER-REPRODUCES / INCONCLUSIVE. "Did my fix land, did anything come back?" |
61
+ | `inspect_element(description)` | Computed styles + ARIA + outerHTML + truncation flag for interactive or visible non-interactive content. |
62
+ | `check_layout()` | Bounded viewport signals for horizontal overflow, clipped text, small targets, and fixed/sticky overlays. |
63
+ | `screenshot(name, element="", full_page=False)` | Full viewport, full page, or a tight crop; waits for finite CSS transitions, then returns the image plus its absolute evidence path. |
64
+ | `screenshot_diff(before, after)` | Pillow diff with red-tint overlay; returns the image plus its absolute evidence path. |
65
+ | `eval_js(code)` | Arbitrary JS in the page context. Off by default (`argus-mcp --unsafe` to enable). |
66
+ | `record_bug(title, severity, evidence, verify=...)` | Call this once you've **confirmed** a real bug. Verify text with (`expect`, `target_text`, `at_url`), or an HTTP failure with (`expect_status`, `at_url`); `absent` checks need the URL where the item should be. For a MULTI-STEP text bug add `"replay": true` to re-drive the recorded journey from a cold start. Severity: `critical / high / medium / low / info`. |
67
+ | `record_observation(title, evidence, category)` | Preserve qualitative visual, usability, content, responsive, or accessibility evidence without inflating it into a bug. |
68
+ | `get_errors()` | Drain captured console + network events. Events retain the page where they occurred; matching console/network symptoms attach to an existing root cause, while new causes are tagged "auto-captured / not independently verified". |
69
+ | `check_links()` / `check_performance()` | Probe-style helpers — return raw data, no auto-bug. |
70
+ | `crawl_site()` | Page discovery: crawls internal links, auto-capturing only console/network events (tagged). Walk the surfaced pages and record_bug what you confirm. |
71
+ | `end_session()` | Close session; write HTML, JSON, JUnit, and SARIF reports with separate tool-call and recorded-step counts. |
72
+
73
+ ### Screen mode (macOS)
74
+
75
+ | Tool | Purpose |
76
+ |------|---------|
77
+ | `start_screen_session(target_app="")` | Bind to the foreground app or a named running app. Refuses cleanly if Screen Recording / Accessibility grants are missing. |
78
+ | `screen_observe()` | App + window title + AX-tree elements with screen coordinates + screenshot. |
79
+ | `screen_click_what(description)` | AX `kAXPressAction` first; falls back to coordinate click via `cliclick`. |
80
+ | `screen_type_into(description, text)` | AX `kAXValue` set first; falls back to focus + cliclick keystrokes. |
81
+ | `screen_press_key(key)` | `cliclick kp:<key>` for `return`, `esc`, `cmd-s`, etc. |
82
+ | `screen_session_status()` | Elapsed / cap / abort-file state / last 30 trail entries. |
83
+
84
+ ### Recommended flow
85
+
86
+ ```
87
+ start_session(url)
88
+ # initial result already MAPS the page
89
+ # USE IT — pick a real goal, walk it
90
+ # end-to-end, carrying state across pages
91
+ # HYPOTHESIZE — what could go wrong
92
+ click_what(...) / type_into(...) / # ACT — one probe per call
93
+ test_form({...})
94
+ observe() # OBSERVE — what changed?
95
+ verify_persistence(...) # VERIFY (delete / save / submit / toggle)
96
+ record_bug(..., verify={...}) # RECORD — verify clause attaches a receipt
97
+ ... repeat ...
98
+ end_session() # writes the HTML report
99
+ ```
100
+
101
+ Reports preserve original screenshot evidence and normally reference
102
+ compact WebP previews under `report-assets/`. Set
103
+ `ARGUS_PORTABLE_REPORT=1` only when a single base64-embedded HTML file is
104
+ needed. Machine-readable JSON also contains complete reproduction receipts,
105
+ review mode, observations, tool-call counts, step counts, and screenshot metadata.
106
+
107
+ ## When `record_bug` is appropriate
108
+
109
+ The bug bar:
110
+
111
+ - **Reproducible** — someone following your steps will see it too.
112
+ - **User-affecting** — data loss, security, blocked flow, real
113
+ confusion, or trust damage.
114
+ - **Persistent** — not a one-off page-load race unless you can
115
+ re-trigger.
116
+
117
+ Don't record speculation, polish nits, or static a11y / SEO that
118
+ `axe-core` / Lighthouse already cover.
119
+
120
+ ## Things humans notice that machines miss — your hunting ground
121
+
122
+ - The success toast is a lie — the action didn't actually persist.
123
+ - Same datum displayed differently across pages (cart-count badge vs
124
+ cart contents; profile name in form vs nav greeting).
125
+ - Empty states aren't designed (says "Loading..." forever, or blank).
126
+ - Long values silently truncated with no indicator.
127
+ - Validation messages in engineer-speak (`Field 'foo' invalid`).
128
+ - A workflow has no back / cancel / recover path.
129
+ - Visual hierarchy inverted — the destructive button is the prominent
130
+ one; the primary CTA is dim.
131
+ - Dark patterns: fake urgency, hidden costs, hard-to-cancel,
132
+ pre-checked consent.
133
+ - After auth, navigation/UI doesn't reflect logged-in state.
134
+ - Form errors clear the user's input.
135
+ - Inputs accept what should be rejected (auth bypass, validation
136
+ bypassed server-side, accepted out-of-range numbers, accepted
137
+ whitespace where content is required).
138
+
139
+ ## Severity calibration
140
+
141
+ - **HIGH** data loss, security, payment, blocked primary flow.
142
+ - **MEDIUM** workflow friction, confusing UX, deceptive feedback,
143
+ cross-page inconsistency.
144
+ - **LOW** polish, copy, suggestion-grade.
145
+
146
+ ## Diagnostics
147
+
148
+ - `argus-mcp --version` — what version your MCP host actually loaded.
149
+ - `argus-mcp --doctor` — macOS permission probes for screen mode.
150
+ - `argus-mcp --list-tools` — selected tool profile and exported names.
151
+ - `argus-mcp --tool-profile core|screen|full` — control discovery size.
152
+ - `argus-mcp --unsafe` — turn on `eval_js` (off by default).
153
+ - `python -m argus.bench --target all` — reproduce the 34 / 34 matrix.
154
+ - `python -m argus.screen.validate <app names...>` — read-only AX walk
155
+ over running apps, JSON output.
156
+
157
+ ## Safety (screen mode)
158
+
159
+ - Per-call timeout: 15 s default
160
+ (`ARGUS_SCREEN_PER_CALL_TIMEOUT_S` to override).
161
+ - Session cap: 30 min default
162
+ (`ARGUS_SCREEN_SESSION_MAX_SECONDS`).
163
+ - Panic button: `touch ~/.argus/abort` blocks every subsequent screen
164
+ action in the current session
165
+ (`ARGUS_SCREEN_ABORT_FILE` to relocate).
166
+ - Every `screen_click_what` / `screen_type_into` writes a
167
+ before-and-after screenshot pair to the action trail.
168
+
169
+ ## What changed in 0.5 (if you knew 0.4)
170
+
171
+ - `get_page_state` → `observe` (no integer indices).
172
+ - `click(index)` / `type_text(index, text)` / `select_option(index, value)`
173
+ removed → `click_what(desc)` / `type_into(desc, text)` /
174
+ `select_into(desc, value)`.
175
+ - `verify_action(action_type, target_text, ...)` →
176
+ `verify_persistence(expect, target_text, after_url)` —
177
+ semantic argument (`present`/`absent`) instead of action-typed
178
+ (`delete`/`edit`/`toggle`).
179
+ - `test_action(element_index, ...)` →
180
+ `test_action(target, expectation)` — description-keyed.
181
+ - `test_form(form_fields, expected_result, ...)` →
182
+ `test_form(form_fields, submit)` — no auto-judgement; the agent
183
+ reads the result and decides.
184
+ - `test_crud(...)` removed — compose it from observe / click_what /
185
+ test_form / verify_persistence yourself.
186
+ - `record_bug(title, severity, evidence)` is new and required.
187
+ Argus does not auto-promote outcomes to Bug objects; the agent
188
+ decides what's a bug and records it explicitly.
189
+ - Detector layer stripped to event capture only (console + network).
190
+ Everything else — content quality, count consistency, visual
191
+ hierarchy, validation behaviour — is the agent's call from
192
+ `observe()`.
@@ -0,0 +1,32 @@
1
+ # Changelog
2
+
3
+ ## 0.5.0 - 2026-07-14
4
+
5
+ Argus 0.5 replaces the index-keyed MCP interface with a smaller,
6
+ description-keyed workflow and makes evidence preservation part of the
7
+ public contract.
8
+
9
+ - Add focused `core`, `screen`, and `full` MCP tool profiles.
10
+ - Replace integer-index actions with `observe`, `click_what`, `type_into`,
11
+ `select_into`, and description-keyed inspection tools.
12
+ - Add independently verified reproduction receipts for text and HTTP-status
13
+ findings, including cold replay for multi-step journeys.
14
+ - Preserve complete evidence in JSON, HTML, JUnit, and SARIF reports while
15
+ keeping HTML screenshot previews compact.
16
+ - Correlate console and network symptoms without duplicating root causes.
17
+ - Add native macOS screen-mode permission checks, action limits, abort control,
18
+ and before/after evidence capture.
19
+ - Improve visual inspection with element crops, screenshot diffs, bounded
20
+ layout checks, and finite CSS-transition waits.
21
+ - Add packaging, CI, PyPI Trusted Publishing, and official MCP Registry
22
+ metadata for repeatable releases.
23
+
24
+ ### Breaking changes from 0.4
25
+
26
+ - `get_page_state` is now `observe`.
27
+ - `click`, `type_text`, and `select_option` are replaced by description-keyed
28
+ actions.
29
+ - `verify_action` is now `verify_persistence`.
30
+ - `test_crud` is removed; compose journeys from the focused tools instead.
31
+ - Findings must be explicitly recorded with `record_bug` or
32
+ `record_observation`.
@@ -0,0 +1,9 @@
1
+ FROM python:3.12-slim
2
+
3
+ WORKDIR /app
4
+
5
+ COPY . .
6
+
7
+ RUN pip install --no-cache-dir -e . && playwright install chromium && playwright install-deps
8
+
9
+ ENTRYPOINT ["argus-mcp"]