ghostqa 0.1.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.
- ghostqa-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
- ghostqa-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +51 -0
- ghostqa-0.1.0/.github/pull_request_template.md +25 -0
- ghostqa-0.1.0/.github/workflows/ci.yml +51 -0
- ghostqa-0.1.0/.github/workflows/publish.yml +31 -0
- ghostqa-0.1.0/.gitignore +57 -0
- ghostqa-0.1.0/CONTRIBUTING.md +94 -0
- ghostqa-0.1.0/LICENSE +21 -0
- ghostqa-0.1.0/PKG-INFO +63 -0
- ghostqa-0.1.0/README.md +27 -0
- ghostqa-0.1.0/SECURITY.md +58 -0
- ghostqa-0.1.0/examples/journeys/demo-onboarding.yaml +35 -0
- ghostqa-0.1.0/examples/personas/alex-developer.yaml +18 -0
- ghostqa-0.1.0/examples/products/demo.yaml +12 -0
- ghostqa-0.1.0/pyproject.toml +75 -0
- ghostqa-0.1.0/src/ghostqa/__init__.py +3 -0
- ghostqa-0.1.0/src/ghostqa/__main__.py +5 -0
- ghostqa-0.1.0/src/ghostqa/cli/__init__.py +1 -0
- ghostqa-0.1.0/src/ghostqa/cli/app.py +92 -0
- ghostqa-0.1.0/src/ghostqa/cli/config_cmd.py +242 -0
- ghostqa-0.1.0/src/ghostqa/cli/dashboard.py +121 -0
- ghostqa-0.1.0/src/ghostqa/cli/init_cmd.py +224 -0
- ghostqa-0.1.0/src/ghostqa/cli/install.py +129 -0
- ghostqa-0.1.0/src/ghostqa/cli/report.py +243 -0
- ghostqa-0.1.0/src/ghostqa/cli/run.py +561 -0
- ghostqa-0.1.0/src/ghostqa/config.py +113 -0
- ghostqa-0.1.0/src/ghostqa/credentials.py +89 -0
- ghostqa-0.1.0/src/ghostqa/engine/__init__.py +38 -0
- ghostqa-0.1.0/src/ghostqa/engine/action_executor.py +1622 -0
- ghostqa-0.1.0/src/ghostqa/engine/api_runner.py +541 -0
- ghostqa-0.1.0/src/ghostqa/engine/browser_runner.py +785 -0
- ghostqa-0.1.0/src/ghostqa/engine/cost_tracker.py +408 -0
- ghostqa-0.1.0/src/ghostqa/engine/mock_server.py +480 -0
- ghostqa-0.1.0/src/ghostqa/engine/orchestrator.py +859 -0
- ghostqa-0.1.0/src/ghostqa/engine/persona_agent.py +638 -0
- ghostqa-0.1.0/src/ghostqa/engine/report_generator.py +202 -0
- ghostqa-0.1.0/src/ghostqa/models.py +27 -0
- ghostqa-0.1.0/src/ghostqa/viewer/__init__.py +1 -0
- ghostqa-0.1.0/src/ghostqa/viewer/server.py +432 -0
- ghostqa-0.1.0/src/ghostqa/viewer/static/style.css +908 -0
- ghostqa-0.1.0/src/ghostqa/viewer/templates/base.html +33 -0
- ghostqa-0.1.0/src/ghostqa/viewer/templates/detail.html +284 -0
- ghostqa-0.1.0/src/ghostqa/viewer/templates/index.html +117 -0
- ghostqa-0.1.0/tests/__init__.py +0 -0
- ghostqa-0.1.0/tests/conftest.py +79 -0
- ghostqa-0.1.0/tests/test_cli_init.py +175 -0
- ghostqa-0.1.0/tests/test_config.py +193 -0
- ghostqa-0.1.0/tests/test_cost_tracker.py +310 -0
- ghostqa-0.1.0/tests/test_credentials.py +228 -0
- ghostqa-0.1.0/tests/test_models.py +136 -0
- ghostqa-0.1.0/tests/test_report_generator.py +279 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Report a bug in GhostQA
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: ["bug", "triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for reporting a bug! Please fill out the sections below so we can reproduce and fix the issue.
|
|
10
|
+
|
|
11
|
+
- type: textarea
|
|
12
|
+
id: description
|
|
13
|
+
attributes:
|
|
14
|
+
label: Description
|
|
15
|
+
description: A clear and concise description of what the bug is.
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: steps
|
|
21
|
+
attributes:
|
|
22
|
+
label: Steps to reproduce
|
|
23
|
+
description: How can we reproduce this behavior?
|
|
24
|
+
placeholder: |
|
|
25
|
+
1. Create a persona YAML with ...
|
|
26
|
+
2. Run `ghostqa run ...`
|
|
27
|
+
3. See error ...
|
|
28
|
+
validations:
|
|
29
|
+
required: true
|
|
30
|
+
|
|
31
|
+
- type: textarea
|
|
32
|
+
id: expected
|
|
33
|
+
attributes:
|
|
34
|
+
label: Expected behavior
|
|
35
|
+
description: What did you expect to happen?
|
|
36
|
+
validations:
|
|
37
|
+
required: true
|
|
38
|
+
|
|
39
|
+
- type: textarea
|
|
40
|
+
id: actual
|
|
41
|
+
attributes:
|
|
42
|
+
label: Actual behavior
|
|
43
|
+
description: What actually happened? Include error messages or screenshots if applicable.
|
|
44
|
+
validations:
|
|
45
|
+
required: true
|
|
46
|
+
|
|
47
|
+
- type: input
|
|
48
|
+
id: ghostqa-version
|
|
49
|
+
attributes:
|
|
50
|
+
label: GhostQA version
|
|
51
|
+
description: "Output of `ghostqa --version` or `pip show ghostqa`"
|
|
52
|
+
placeholder: "0.1.0"
|
|
53
|
+
validations:
|
|
54
|
+
required: true
|
|
55
|
+
|
|
56
|
+
- type: input
|
|
57
|
+
id: python-version
|
|
58
|
+
attributes:
|
|
59
|
+
label: Python version
|
|
60
|
+
description: "Output of `python --version`"
|
|
61
|
+
placeholder: "3.12.0"
|
|
62
|
+
validations:
|
|
63
|
+
required: true
|
|
64
|
+
|
|
65
|
+
- type: dropdown
|
|
66
|
+
id: os
|
|
67
|
+
attributes:
|
|
68
|
+
label: Operating system
|
|
69
|
+
options:
|
|
70
|
+
- Linux
|
|
71
|
+
- macOS
|
|
72
|
+
- Windows
|
|
73
|
+
- Other
|
|
74
|
+
validations:
|
|
75
|
+
required: true
|
|
76
|
+
|
|
77
|
+
- type: textarea
|
|
78
|
+
id: additional
|
|
79
|
+
attributes:
|
|
80
|
+
label: Additional context
|
|
81
|
+
description: Any other context, logs, or screenshots about the problem.
|
|
82
|
+
validations:
|
|
83
|
+
required: false
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: Feature Request
|
|
2
|
+
description: Suggest a new feature or improvement for GhostQA
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for suggesting an improvement! Please describe your idea below.
|
|
10
|
+
|
|
11
|
+
- type: textarea
|
|
12
|
+
id: description
|
|
13
|
+
attributes:
|
|
14
|
+
label: Description
|
|
15
|
+
description: A clear and concise description of the feature you'd like.
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: use-case
|
|
21
|
+
attributes:
|
|
22
|
+
label: Use case
|
|
23
|
+
description: What problem does this solve? Who benefits from it?
|
|
24
|
+
placeholder: |
|
|
25
|
+
As a QA engineer, I want to ... so that ...
|
|
26
|
+
validations:
|
|
27
|
+
required: true
|
|
28
|
+
|
|
29
|
+
- type: textarea
|
|
30
|
+
id: proposed-solution
|
|
31
|
+
attributes:
|
|
32
|
+
label: Proposed solution
|
|
33
|
+
description: How do you envision this working? Include API ideas, CLI flags, YAML config examples, etc.
|
|
34
|
+
validations:
|
|
35
|
+
required: false
|
|
36
|
+
|
|
37
|
+
- type: textarea
|
|
38
|
+
id: alternatives
|
|
39
|
+
attributes:
|
|
40
|
+
label: Alternatives considered
|
|
41
|
+
description: Have you considered other approaches? What are the trade-offs?
|
|
42
|
+
validations:
|
|
43
|
+
required: false
|
|
44
|
+
|
|
45
|
+
- type: textarea
|
|
46
|
+
id: additional
|
|
47
|
+
attributes:
|
|
48
|
+
label: Additional context
|
|
49
|
+
description: Any other context, mockups, or references.
|
|
50
|
+
validations:
|
|
51
|
+
required: false
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What does this PR do? Why is it needed? Link related issues with "Closes #123". -->
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
<!-- Bullet list of the key changes in this PR. -->
|
|
8
|
+
|
|
9
|
+
-
|
|
10
|
+
|
|
11
|
+
## Test plan
|
|
12
|
+
|
|
13
|
+
<!-- How did you verify this works? Include commands, screenshots, or test output. -->
|
|
14
|
+
|
|
15
|
+
- [ ] Tests pass locally (`pytest tests/ -v`)
|
|
16
|
+
- [ ] Linting passes (`ruff check src/`)
|
|
17
|
+
- [ ] Formatting passes (`ruff format --check src/`)
|
|
18
|
+
|
|
19
|
+
## Checklist
|
|
20
|
+
|
|
21
|
+
- [ ] I have read the [contributing guide](../CONTRIBUTING.md)
|
|
22
|
+
- [ ] My code follows the project's style (ruff-enforced)
|
|
23
|
+
- [ ] I have added tests for new functionality
|
|
24
|
+
- [ ] I have updated documentation if needed
|
|
25
|
+
- [ ] All new and existing tests pass
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
lint:
|
|
15
|
+
name: Lint
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: "3.12"
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: pip install -e ".[dev]"
|
|
26
|
+
|
|
27
|
+
- name: Ruff check
|
|
28
|
+
run: ruff check src/
|
|
29
|
+
|
|
30
|
+
- name: Ruff format check
|
|
31
|
+
run: ruff format --check src/
|
|
32
|
+
|
|
33
|
+
test:
|
|
34
|
+
name: Test (Python ${{ matrix.python-version }})
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
strategy:
|
|
37
|
+
fail-fast: false
|
|
38
|
+
matrix:
|
|
39
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
40
|
+
steps:
|
|
41
|
+
- uses: actions/checkout@v4
|
|
42
|
+
|
|
43
|
+
- uses: actions/setup-python@v5
|
|
44
|
+
with:
|
|
45
|
+
python-version: ${{ matrix.python-version }}
|
|
46
|
+
|
|
47
|
+
- name: Install dependencies
|
|
48
|
+
run: pip install -e ".[dev]"
|
|
49
|
+
|
|
50
|
+
- name: Run tests
|
|
51
|
+
run: pytest tests/ -v --tb=short
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
id-token: write
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
publish:
|
|
12
|
+
name: Build and publish to PyPI
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
environment:
|
|
15
|
+
name: pypi
|
|
16
|
+
url: https://pypi.org/p/ghostqa
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: "3.12"
|
|
23
|
+
|
|
24
|
+
- name: Install build tools
|
|
25
|
+
run: pip install build
|
|
26
|
+
|
|
27
|
+
- name: Build package
|
|
28
|
+
run: python -m build
|
|
29
|
+
|
|
30
|
+
- name: Publish to PyPI
|
|
31
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
ghostqa-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
|
|
7
|
+
# Distribution / packaging
|
|
8
|
+
.Python
|
|
9
|
+
build/
|
|
10
|
+
develop-eggs/
|
|
11
|
+
dist/
|
|
12
|
+
downloads/
|
|
13
|
+
eggs/
|
|
14
|
+
.eggs/
|
|
15
|
+
lib/
|
|
16
|
+
lib64/
|
|
17
|
+
parts/
|
|
18
|
+
sdist/
|
|
19
|
+
var/
|
|
20
|
+
wheels/
|
|
21
|
+
*.egg-info/
|
|
22
|
+
*.egg
|
|
23
|
+
|
|
24
|
+
# Virtual environments
|
|
25
|
+
.venv/
|
|
26
|
+
env/
|
|
27
|
+
venv/
|
|
28
|
+
ENV/
|
|
29
|
+
|
|
30
|
+
# IDE
|
|
31
|
+
.vscode/
|
|
32
|
+
.idea/
|
|
33
|
+
*.swp
|
|
34
|
+
*.swo
|
|
35
|
+
*~
|
|
36
|
+
|
|
37
|
+
# Testing
|
|
38
|
+
.pytest_cache/
|
|
39
|
+
.coverage
|
|
40
|
+
htmlcov/
|
|
41
|
+
.mypy_cache/
|
|
42
|
+
.ruff_cache/
|
|
43
|
+
|
|
44
|
+
# Environment variables
|
|
45
|
+
.env
|
|
46
|
+
.env.local
|
|
47
|
+
.env.*.local
|
|
48
|
+
|
|
49
|
+
# GhostQA project config and evidence
|
|
50
|
+
.ghostqa/config.yaml
|
|
51
|
+
.ghostqa/evidence/
|
|
52
|
+
evidence/
|
|
53
|
+
**/evidence/**/*.png
|
|
54
|
+
|
|
55
|
+
# OS
|
|
56
|
+
.DS_Store
|
|
57
|
+
Thumbs.db
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Contributing to GhostQA
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in contributing to GhostQA! This guide will help you get started.
|
|
4
|
+
|
|
5
|
+
## Development Setup
|
|
6
|
+
|
|
7
|
+
1. **Clone the repository**
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
git clone https://github.com/SyncTek-LLC/ghostqa.git
|
|
11
|
+
cd ghostqa
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
2. **Create a virtual environment**
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
python -m venv .venv
|
|
18
|
+
source .venv/bin/activate # Linux/macOS
|
|
19
|
+
# .venv\Scripts\activate # Windows
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
3. **Install in development mode**
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pip install -e ".[dev]"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
4. **Install Playwright browsers** (needed for integration tests)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
playwright install chromium
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Running Tests
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Run all unit tests
|
|
38
|
+
pytest tests/ -v
|
|
39
|
+
|
|
40
|
+
# Run with coverage
|
|
41
|
+
pytest tests/ -v --cov=src/ghostqa --cov-report=term-missing
|
|
42
|
+
|
|
43
|
+
# Skip integration tests (which require a running app and API key)
|
|
44
|
+
pytest tests/ -v -m "not integration"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Code Quality
|
|
48
|
+
|
|
49
|
+
We use [Ruff](https://docs.astral.sh/ruff/) for linting and formatting.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Check for lint issues
|
|
53
|
+
ruff check src/
|
|
54
|
+
|
|
55
|
+
# Auto-fix lint issues
|
|
56
|
+
ruff check src/ --fix
|
|
57
|
+
|
|
58
|
+
# Check formatting
|
|
59
|
+
ruff format --check src/
|
|
60
|
+
|
|
61
|
+
# Auto-format
|
|
62
|
+
ruff format src/
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Type checking with mypy:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
mypy src/ghostqa
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Submitting Changes
|
|
72
|
+
|
|
73
|
+
1. **Fork the repository** and create a branch from `main`.
|
|
74
|
+
2. **Make your changes.** Add tests for new functionality.
|
|
75
|
+
3. **Ensure all checks pass:**
|
|
76
|
+
```bash
|
|
77
|
+
ruff check src/
|
|
78
|
+
ruff format --check src/
|
|
79
|
+
pytest tests/ -v
|
|
80
|
+
```
|
|
81
|
+
4. **Open a pull request** against `main`. Fill out the PR template.
|
|
82
|
+
5. A maintainer will review your PR. Address any feedback, then it will be merged.
|
|
83
|
+
|
|
84
|
+
## Reporting Bugs
|
|
85
|
+
|
|
86
|
+
Use the [bug report template](https://github.com/SyncTek-LLC/ghostqa/issues/new?template=bug_report.yml) on GitHub Issues.
|
|
87
|
+
|
|
88
|
+
## Requesting Features
|
|
89
|
+
|
|
90
|
+
Use the [feature request template](https://github.com/SyncTek-LLC/ghostqa/issues/new?template=feature_request.yml) on GitHub Issues.
|
|
91
|
+
|
|
92
|
+
## License
|
|
93
|
+
|
|
94
|
+
By contributing to GhostQA, you agree that your contributions will be licensed under the [MIT License](LICENSE). All contributions are subject to this project's license terms.
|
ghostqa-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 SyncTek LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
ghostqa-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ghostqa
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: AI persona-based behavioral testing for web apps. No test scripts. YAML-configured. Vision-powered.
|
|
5
|
+
Project-URL: Homepage, https://github.com/SyncTek-LLC/ghostqa
|
|
6
|
+
Project-URL: Repository, https://github.com/SyncTek-LLC/ghostqa
|
|
7
|
+
Project-URL: Issues, https://github.com/SyncTek-LLC/ghostqa/issues
|
|
8
|
+
Author: SyncTek LLC
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: ai,behavioral,persona,playwright,qa,testing,vision
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Software Development :: Testing
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Requires-Dist: anthropic>=0.39.0
|
|
22
|
+
Requires-Dist: jinja2>=3.1.0
|
|
23
|
+
Requires-Dist: playwright>=1.48.0
|
|
24
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
25
|
+
Requires-Dist: pyyaml>=6.0
|
|
26
|
+
Requires-Dist: requests>=2.31.0
|
|
27
|
+
Requires-Dist: rich>=13.0.0
|
|
28
|
+
Requires-Dist: typer>=0.12.0
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: build>=1.0.0; extra == 'dev'
|
|
31
|
+
Requires-Dist: mypy>=1.8.0; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-cov>=4.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: ruff>=0.3.0; extra == 'dev'
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
|
|
37
|
+
# GhostQA
|
|
38
|
+
|
|
39
|
+
**AI ghosts walk your app so real users don't trip.**
|
|
40
|
+
|
|
41
|
+
GhostQA sends AI personas through your web app via vision models — they navigate like real humans, find UX bugs your test scripts miss, and generate evidence reports.
|
|
42
|
+
|
|
43
|
+
## Quick Start
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
pip install ghostqa
|
|
47
|
+
ghostqa install # Download browser
|
|
48
|
+
ghostqa init # Scaffold project
|
|
49
|
+
ghostqa run --product demo # Run your first test
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Features
|
|
53
|
+
|
|
54
|
+
- **Persona-based testing** — AI users with different skill levels, patience, and goals
|
|
55
|
+
- **Vision-powered** — Interprets screenshots like a human, catches visual/layout UX issues
|
|
56
|
+
- **YAML-configured** — No test scripts to maintain, PM-readable scenarios
|
|
57
|
+
- **Cost-aware** — Per-run budget enforcement, transparent API cost tracking
|
|
58
|
+
- **CI-ready** — JUnit XML output, exit codes, headless mode
|
|
59
|
+
- **Open source** — MIT license, no telemetry, no data collection
|
|
60
|
+
|
|
61
|
+
## License
|
|
62
|
+
|
|
63
|
+
MIT
|
ghostqa-0.1.0/README.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# GhostQA
|
|
2
|
+
|
|
3
|
+
**AI ghosts walk your app so real users don't trip.**
|
|
4
|
+
|
|
5
|
+
GhostQA sends AI personas through your web app via vision models — they navigate like real humans, find UX bugs your test scripts miss, and generate evidence reports.
|
|
6
|
+
|
|
7
|
+
## Quick Start
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install ghostqa
|
|
11
|
+
ghostqa install # Download browser
|
|
12
|
+
ghostqa init # Scaffold project
|
|
13
|
+
ghostqa run --product demo # Run your first test
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Features
|
|
17
|
+
|
|
18
|
+
- **Persona-based testing** — AI users with different skill levels, patience, and goals
|
|
19
|
+
- **Vision-powered** — Interprets screenshots like a human, catches visual/layout UX issues
|
|
20
|
+
- **YAML-configured** — No test scripts to maintain, PM-readable scenarios
|
|
21
|
+
- **Cost-aware** — Per-run budget enforcement, transparent API cost tracking
|
|
22
|
+
- **CI-ready** — JUnit XML output, exit codes, headless mode
|
|
23
|
+
- **Open source** — MIT license, no telemetry, no data collection
|
|
24
|
+
|
|
25
|
+
## License
|
|
26
|
+
|
|
27
|
+
MIT
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
| Version | Supported |
|
|
6
|
+
|---------|--------------------|
|
|
7
|
+
| 0.1.x | Yes |
|
|
8
|
+
| < 0.1 | No |
|
|
9
|
+
|
|
10
|
+
We provide security updates for the latest minor release. Older versions will not receive patches.
|
|
11
|
+
|
|
12
|
+
## Reporting a Vulnerability
|
|
13
|
+
|
|
14
|
+
**Please do not open a public GitHub issue for security vulnerabilities.**
|
|
15
|
+
|
|
16
|
+
Instead, report vulnerabilities by emailing **security@synctek.dev**. Include:
|
|
17
|
+
|
|
18
|
+
- A description of the vulnerability
|
|
19
|
+
- Steps to reproduce or a proof of concept
|
|
20
|
+
- The impact or severity as you understand it
|
|
21
|
+
- Your name/handle for attribution (optional)
|
|
22
|
+
|
|
23
|
+
## Response Timeline
|
|
24
|
+
|
|
25
|
+
| Action | Target |
|
|
26
|
+
|----------------------------|-------------|
|
|
27
|
+
| Acknowledgment of report | 48 hours |
|
|
28
|
+
| Initial assessment | 5 business days |
|
|
29
|
+
| Fix or mitigation released | 30 days |
|
|
30
|
+
|
|
31
|
+
We will keep you informed of our progress. If the issue is accepted, we will:
|
|
32
|
+
|
|
33
|
+
1. Develop and test a fix privately
|
|
34
|
+
2. Release a patched version
|
|
35
|
+
3. Publish a security advisory on GitHub
|
|
36
|
+
4. Credit the reporter (unless anonymity is requested)
|
|
37
|
+
|
|
38
|
+
## Scope
|
|
39
|
+
|
|
40
|
+
The following are in scope for security reports:
|
|
41
|
+
|
|
42
|
+
- The `ghostqa` Python package (code in `src/`)
|
|
43
|
+
- CLI command injection or path traversal
|
|
44
|
+
- Unsafe handling of API keys or credentials
|
|
45
|
+
- Persona YAML injection leading to unintended behavior
|
|
46
|
+
|
|
47
|
+
The following are out of scope:
|
|
48
|
+
|
|
49
|
+
- Vulnerabilities in third-party dependencies (report those upstream)
|
|
50
|
+
- Issues requiring physical access to the machine
|
|
51
|
+
- Social engineering attacks
|
|
52
|
+
|
|
53
|
+
## Security Best Practices for Users
|
|
54
|
+
|
|
55
|
+
- Never commit your `.env` file or API keys to version control
|
|
56
|
+
- Use environment variables or a secrets manager for `ANTHROPIC_API_KEY`
|
|
57
|
+
- Review persona YAML files from untrusted sources before running them
|
|
58
|
+
- Keep GhostQA and its dependencies updated
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: demo-onboarding
|
|
2
|
+
display_name: "Demo App Onboarding"
|
|
3
|
+
product: demo
|
|
4
|
+
persona: alex_developer
|
|
5
|
+
level: smoke
|
|
6
|
+
tags: [onboarding, critical_path]
|
|
7
|
+
steps:
|
|
8
|
+
- id: visit_homepage
|
|
9
|
+
type: browser
|
|
10
|
+
goal: "Navigate to the homepage and verify it loads"
|
|
11
|
+
url: "/"
|
|
12
|
+
checkpoints:
|
|
13
|
+
- type: text_present
|
|
14
|
+
value: "Welcome"
|
|
15
|
+
|
|
16
|
+
- id: navigate_signup
|
|
17
|
+
type: browser
|
|
18
|
+
goal: "Find and click the signup or register link"
|
|
19
|
+
checkpoints:
|
|
20
|
+
- type: text_present
|
|
21
|
+
value: "Sign"
|
|
22
|
+
|
|
23
|
+
- id: fill_signup_form
|
|
24
|
+
type: browser
|
|
25
|
+
goal: "Fill out the signup form with test credentials"
|
|
26
|
+
checkpoints:
|
|
27
|
+
- type: text_present
|
|
28
|
+
value: "email"
|
|
29
|
+
|
|
30
|
+
- id: verify_success
|
|
31
|
+
type: browser
|
|
32
|
+
goal: "Verify that signup was successful and you are logged in"
|
|
33
|
+
checkpoints:
|
|
34
|
+
- type: text_present
|
|
35
|
+
value: "dashboard"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: alex_developer
|
|
2
|
+
display_name: "Alex Chen"
|
|
3
|
+
role: "Full-Stack Developer"
|
|
4
|
+
age: 28
|
|
5
|
+
tech_comfort: high
|
|
6
|
+
patience: medium
|
|
7
|
+
device_preference: desktop
|
|
8
|
+
viewport:
|
|
9
|
+
width: 1280
|
|
10
|
+
height: 720
|
|
11
|
+
goals:
|
|
12
|
+
- "Evaluate the app from a developer's perspective"
|
|
13
|
+
- "Check for common UX anti-patterns"
|
|
14
|
+
- "Verify forms work correctly"
|
|
15
|
+
frustrations:
|
|
16
|
+
- "Unclear error messages"
|
|
17
|
+
- "Slow page loads"
|
|
18
|
+
- "Missing loading indicators"
|