Generate daily CI dashboards for any QE repo on LooperPro (Karate, Playwright, Monocart)
Project description
looper-dashboard
Generate daily CI dashboards for any QE repository on the LooperPro CI platform.
Supports three test suite types:
| Suite | Report format | Default history |
|---|---|---|
karate |
karate-summary-json.txt + per-feature detail |
14 days |
playwright |
pw-summary-report.json |
14 days |
playwright-monocart |
monocart-report/index.html (zlib-compressed) |
30 days |
Requirements
| Requirement | Why |
|---|---|
| Python 3.11+ | Runtime |
mcp-cli (optional) |
Auto-refreshes LooperPro auth tokens |
code-puppy (optional) |
Powers the AI failure analysis step |
Authentication is read from ~/.mcp-cli/tokens.json or ~/.code_puppy/puppy.cfg automatically — no extra config needed.
Installation
pip install looper-dashboard
Or from the repo:
pip install ./looper-dashboard
Quick Start
1. Scaffold a config
# Creates daily_flows.yml in the current directory
looper-dashboard --init karate
looper-dashboard --init playwright
looper-dashboard --init playwright-monocart
Edit the generated file to add your LooperPro job names and flow names.
2. Generate the dashboard
looper-dashboard --suite karate --config daily_flows.yml --open
looper-dashboard --suite playwright --config daily_flows.yml --open
looper-dashboard --suite playwright-monocart --config daily_flows.yml --open
3. Override the repo SCM URL
looper-dashboard --suite karate \
--config daily_flows.yml \
--scm-url https://gecgithub01.walmart.com/my-org/my-repo.git \
--open
daily_flows.yml format
Karate / Playwright
# SCM URL of the repository being monitored
scm_url: https://gecgithub01.walmart.com/my-org/my-repo.git
jobs:
# LooperPro job name → list of flow names to monitor
my-org/my-repo-tests:
- my-flow-dev
- my-flow-stage
- my-flow-prod
my-org/my-repo-health-checks:
- health-dev
- health-stage
Playwright-Monocart (with explicit job_ids)
Some repos' jobs cannot be discovered by SCM URL in LooperPro. Add a job_ids section with the UUIDs from the LooperPro UI:
scm_url: https://gecgithub01.walmart.com/my-org/my-repo.git
# Explicit job IDs (look these up in the LooperPro UI)
job_ids:
my-monocart-job: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
jobs:
my-monocart-job:
- e2e-flow-dev
- e2e-flow-stage
CLI Reference
looper-dashboard [OPTIONS]
Options:
--suite SUITE Test suite type: karate, playwright, playwright-monocart [required]
--config PATH Path to daily_flows.yml [required]
--scm-url URL Override scm_url from daily_flows.yml
--output PATH Output HTML file path (default varies by suite)
--days N Days of build history to fetch (default: 14 or 30)
--open Auto-open dashboard in browser when done
--no-ai Skip the AI failure analysis step
--no-details Skip fetching test summary details (faster, status only)
--save-failures PATH Path to save failures JSON
--analysis-json PATH Use a pre-computed AI analysis JSON instead of running live AI
--init SUITE Scaffold a starter daily_flows.yml and exit
-h, --help Show help and exit
AI Analysis
When --no-ai is not set, the orchestrator:
- Saves a
*-failures.jsonsummary of all failing flows - Invokes
code-puppyto classify each failure as one of:service_regression— likely a code regression in the appenvironment_issue— infra/network/auth failuretest_issue— stale selector or bad test dataflaky— intermittent, no clear pattern
- Regenerates the dashboard HTML with an AI analysis panel embedded
If code-puppy is not installed, the AI step is skipped gracefully.
Publishing a new version
1. Bump the version
Edit pyproject.toml:
[project]
version = "0.1.2" # increment as needed
2. Build the wheel
cd looper-dashboard
# Clean any previous build artifacts
rm -rf dist/ build/ looper_dashboard.egg-info/
# Build (requires setuptools + wheel in the active Python env)
pip install setuptools wheel build # one-time setup
python -m build --wheel --no-isolation
This produces dist/looper_dashboard-<version>-py3-none-any.whl.
3. Upload to PyPI
Prerequisite: You must be off the corporate VPN (or on a personal hotspot) for
upload.pypi.orgto be reachable.
pip install twine
# Upload only the new version's wheel (never re-upload an existing filename)
twine upload dist/looper_dashboard-<version>-py3-none-any.whl
When prompted:
- Username:
__token__ - Password: your PyPI API token from pypi.org/manage/account/token/
Or pass credentials inline to skip the prompt entirely:
.venv/bin/twine upload \
-u __token__ \
-p pypi-<your-token-here> \
dist/looper_dashboard-<version>-py3-none-any.whl \
--verbose
Skip the prompt with ~/.pypirc
[pypi]
username = __token__
password = pypi-xxxxxxxxxxxxxxxxxxxx
Then just run:
twine upload dist/looper_dashboard-<version>-py3-none-any.whl
4. Verify
pip install --upgrade looper-dashboard
looper-dashboard --version
Or check pypi.org/project/looper-dashboard/ directly.
5. Reinstall locally from the new wheel
# In the project venv
.venv/bin/pip install --force-reinstall dist/looper_dashboard-<version>-py3-none-any.whl
Note: PyPI does not allow re-uploading a file with the same name as an existing release. Always increment the version in
pyproject.tomlbefore building.
Onboarding a new repo
- Create a
daily_flows.ymlfor the target repo (use--initto scaffold) - Add job and flow names (find them in LooperPro or via
mcp-cli) - Run
looper-dashboard --suite <type> --config daily_flows.yml --open
No code changes required — the package is entirely configuration-driven.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file looper_dashboard-0.1.3-py3-none-any.whl.
File metadata
- Download URL: looper_dashboard-0.1.3-py3-none-any.whl
- Upload date:
- Size: 67.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ecd09a975be945dbcc78630ef9a0f4ababe180baf153df082aa1af2a903e1ab2
|
|
| MD5 |
00d5d608801a2b6b069c942b49165098
|
|
| BLAKE2b-256 |
af238cacd0d9607f56dc40fca10304dc27b28fd4bc2630b48f2fe90e621f4c2b
|