sentry-test 2.2.0__tar.gz → 2.2.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.
- {sentry_test-2.2.0/src/sentry_test.egg-info → sentry_test-2.2.1}/PKG-INFO +3 -1
- {sentry_test-2.2.0 → sentry_test-2.2.1}/README.md +284 -283
- {sentry_test-2.2.0 → sentry_test-2.2.1}/pyproject.toml +2 -1
- {sentry_test-2.2.0 → sentry_test-2.2.1/src/sentry_test.egg-info}/PKG-INFO +3 -1
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentry_test.egg-info/SOURCES.txt +3 -0
- sentry_test-2.2.1/src/sentry_test.egg-info/requires.txt +1 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/__init__.py +1 -1
- sentry_test-2.2.1/src/sentrytest/application/manual.py +367 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/cli.py +21 -1
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/skills.py +11 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_cli.py +1 -1
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_sem_repeticao_dos_videos.py +81 -81
- sentry_test-2.2.1/tests/test_manual.py +463 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/LICENSE +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/setup.cfg +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentry_test.egg-info/dependency_links.txt +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentry_test.egg-info/entry_points.txt +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentry_test.egg-info/top_level.txt +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/adapters/__init__.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/adapters/case_specs.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/adapters/local_tools.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/adapters/terminal.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/adapters/toml_config.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/__init__.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/analyze.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/archive.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/cases.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/context.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/coverage_context.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/dimensions.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/error_paths.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/formatting.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/frontend_evidence.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/impact.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/promo.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/reporting.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/reuse.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/traceability.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/training.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/application/watch.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/domain/__init__.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/domain/catalog.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/domain/models.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/domain/rules.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/init_project.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/ports/__init__.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/src/sentrytest/ports/inputs.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_analyze.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_archive.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_arquivo_visual_por_rota.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_autoanalise_workflow.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_cache.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_case_specs.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_cases_application.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_changed_coverage.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_context.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_contextual_reporting.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_custo.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_dimensions.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_aba_de_videos.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_agente_configuravel.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_arvore_sentry.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_bem_vindo_videos.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_card_comandos.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_consistency.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_refazer_video.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_ressalva_ia.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_skill_pasta.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_docs_tokens_videos.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_domain_models.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_error_paths.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_execution_evidence.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_formato_brasileiro.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_frontend_evidence.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_git_context.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_history_cli.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_impact.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_init_brag_output.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_init_project.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_init_skill_pasta.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_input_adapters.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_modo_instantaneo.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_promo.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_relatorio_nome_com_data.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_reporting.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_review_cli.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_rules.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_sem_spec.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_status.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_terminal_color.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_terminal_ui.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_toml_config.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_traceability.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_training.py +0 -0
- {sentry_test-2.2.0 → sentry_test-2.2.1}/tests/test_watch.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sentry-test
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.1
|
|
4
4
|
Summary: Test quality intelligence for change-oriented reviews
|
|
5
5
|
Author: Lucas Nicolau Ferreira
|
|
6
6
|
License: MIT License
|
|
@@ -28,6 +28,7 @@ License: MIT License
|
|
|
28
28
|
Requires-Python: >=3.11
|
|
29
29
|
Description-Content-Type: text/markdown
|
|
30
30
|
License-File: LICENSE
|
|
31
|
+
Requires-Dist: fpdf2>=2.8
|
|
31
32
|
Dynamic: license-file
|
|
32
33
|
|
|
33
34
|
# Sentry
|
|
@@ -120,6 +121,7 @@ Exit code `0` on success; see the exit code table further down.
|
|
|
120
121
|
| `sentry archive <module> --version X.Y.Z [--specs A,B,C] [--image] [--video]` | Two modes, chosen by how the module is declared in `sentry.toml`. **By specs** (`[modules] <module> = [...]`): runs the module's e2e suite and, once approved, archives its media under `.sentry/storage/<module>-<version>/` with a self-contained `README.md`. Refuses a rejected verdict. The composition is declared once, with `--specs`, on version 1.0.0. **By route** (`[modules.<module>] rotas = [...]`): photographs each declared route with Playwright (desktop + mobile, optional navigation video), one folder per route — even for a module the Sentry has never tested. `login = true` plus `[archive.login]` logs in once before photographing, with credentials only from `SENTRY_LOGIN_USUARIO`/`SENTRY_LOGIN_SENHA`, never in `sentry.toml`. An optional `specs` list inside the module certifies the result the same way; without it, the `README.md` states it's a visual record, not a certification. A route that fails to load doesn't stop the others — the command exits with the warning code and the `README.md` names which route failed. Without `--image`/`--video`, everything produced is archived; with either, only that media type is kept, and `--video` also turns on Playwright's video recording for that run. |
|
|
121
122
|
| `sentry promo [--lang pt\|en]` | Generates the project's promo video with the brag skill, run by the agent declared in `[video] agente` in `sentry.toml` (Claude by default, run as `claude -p "/brag ..."`). Needs that agent and `ffmpeg`; if either is missing, or the agent fails or leaves no `.mp4`, it stops with a clear error and a non-zero exit code — never a silent fallback. Saves `.sentry/video/promo-<lang>.mp4` (moved from `brag-output/`, brag's working folder, together with the rest of its output: composition and share copy; `init` adds `brag-output/` to `.gitignore`). With the default agent, if only the brag skill is missing, the Sentry installs it (`claude plugin marketplace add latent-spaces/brag` and `claude plugin install brag@brag`) and carries on; with a declared agent the skill is that agent's business: the Sentry asks for it by name and installs nothing. `--lang en` runs brag again in English; Portuguese is the default. It runs the agent, so it spends tokens, only when you ask. To change the video you don't need to run the command again: ask the agent to change the script (the brag project in `.sentry/video/`) until you get the result you want. |
|
|
122
123
|
| `sentry training <module> [--lang pt\|en]` | Records a module's training video. Reads the declarative script `.sentry/training/<module>.json` (`base`, `titulo` and `passos`; each step has `titulo`, `fala` and an `acao` that is data, never code: `ir`, `digitar`, `clicar` or `apontar`), records it with Python Playwright (bundled in the Sentry, so it works in any project) timing every step, and has the brag skill (through the configured agent, as in `promo`) assemble the video with captions. It certifies nothing: it only records and issues no verdict — only the verdict certifies. Saves `.sentry/video/training-<module>-<lang>.mp4`. Stops with a clear error and a non-zero exit code if the module name is unsafe, the script is missing or invalid (`sentry check` validates every script too), the app in `base` doesn't answer, or the agent or `ffmpeg` is missing; no silent fallback. Whatever is missing of brag and Playwright is installed automatically: brag as in `promo`, and Playwright with the same Python that runs the Sentry (`python -m pip install playwright`, then `python -m playwright install chromium`, about 150 MB). If that installation fails, it stops and shows the manual commands (`pip install playwright && playwright install chromium`). `--lang en` runs brag again in English. It runs the agent, so it spends tokens, only when you ask. To change the video you don't need to run the command again: ask the agent to change the script (`.sentry/training/<module>.json`) until you get the result you want. |
|
|
124
|
+
| `sentry manual <module> [--lang pt\|en]` | Generates a module's PDF manual, text only: no video, no screenshots and no agent, so it spends no tokens. It uses the same script as `training` (`.sentry/training/<module>.json`) and writes `.sentry/manual/<module>-<lang>.pdf` with `fpdf2` (installed with the Sentry). The PDF opens with the big title "USER MANUAL" ("MANUAL DO USUÁRIO" in Portuguese) centered in a band in the app's color, with the app's logo as a watermark and the script title below, and goes on with "Step by step": each step is a card on a timeline, with a numbered badge, the title and the caption. Every page has a header (logo and app name) and a footer (page on the left, app name on the right). Name, color and logo come from the `base` page, read in Playwright: the name from `application-name`, `og:site_name` or `<title>`; the color from `theme-color` or from the background of the first colored button; the logo from the page icon (PNG or JPEG only; without it the header carries just the name). That is why the app in `base` must be running; the script's flow is not executed. Stops with a clear error and a non-zero exit code if the module name is unsafe, the script is missing or invalid, the language is unknown or the app doesn't answer. `--lang en` translates only the fixed texts; the captions stay as in the script. |
|
|
123
125
|
|
|
124
126
|
## Two modes, by design
|
|
125
127
|
|