ghostlab 0.2.0__tar.gz → 0.3.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.
- {ghostlab-0.2.0 → ghostlab-0.3.0}/.gitignore +5 -4
- ghostlab-0.3.0/CONTRIBUTING.md +114 -0
- ghostlab-0.3.0/PKG-INFO +817 -0
- ghostlab-0.3.0/README.md +775 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/docs/cli.md +205 -16
- ghostlab-0.3.0/docs/concepts.md +143 -0
- ghostlab-0.3.0/docs/configured-agent-lab.md +238 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/docs/datasets-evaluation.md +11 -6
- ghostlab-0.3.0/docs/getting-started.md +350 -0
- ghostlab-0.3.0/docs/ghostlab-vision-gap-and-roadmap.md +181 -0
- ghostlab-0.3.0/docs/index.md +36 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/docs/publishing.md +5 -3
- ghostlab-0.3.0/examples/README.md +75 -0
- ghostlab-0.3.0/examples/agent-lab/AGENTS.md +4 -0
- ghostlab-0.3.0/examples/agent-lab/agent.json +22 -0
- ghostlab-0.3.0/examples/agent-lab/mcp.json +5 -0
- ghostlab-0.3.0/examples/agent-lab/repo/CHANGELOG.md +4 -0
- ghostlab-0.3.0/examples/agent-lab/repo/README.md +3 -0
- ghostlab-0.3.0/examples/agent-lab/repo/src/app.py +2 -0
- ghostlab-0.3.0/examples/agent-lab/skills/release-notes/SKILL.md +7 -0
- ghostlab-0.3.0/examples/agent-lab/tiny-mcp.js +62 -0
- ghostlab-0.3.0/examples/agent.json +50 -0
- ghostlab-0.3.0/examples/demo-skill/SKILL.md +9 -0
- ghostlab-0.3.0/examples/mcp-config.json +7 -0
- ghostlab-0.2.0/scenarios/basic-discovery.json → ghostlab-0.3.0/examples/scenario.json +0 -1
- ghostlab-0.2.0/targets/cortex-local.json → ghostlab-0.3.0/examples/target.json +2 -2
- ghostlab-0.3.0/llms.txt +71 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/mkdocs.yml +5 -4
- {ghostlab-0.2.0 → ghostlab-0.3.0}/pyproject.toml +12 -11
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/__init__.py +1 -1
- ghostlab-0.3.0/rehearsal/agent_profile.py +290 -0
- ghostlab-0.3.0/rehearsal/agent_sandbox.py +324 -0
- ghostlab-0.3.0/rehearsal/agents.py +251 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/cli.py +1344 -144
- ghostlab-0.3.0/rehearsal/cli_ui.py +118 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/codex_backend.py +50 -1
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/config.py +15 -2
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/dashboard.py +90 -26
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/dataset.py +5 -1
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/evaluate.py +26 -7
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/generate.py +6 -4
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/hosts/__init__.py +24 -3
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/hosts/base.py +1 -1
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/hosts/direct.py +17 -2
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/hosts/runner.py +39 -14
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/inspect.py +3 -2
- ghostlab-0.3.0/rehearsal/jobs.py +530 -0
- ghostlab-0.3.0/rehearsal/lab.py +296 -0
- ghostlab-0.3.0/rehearsal/llm_backend.py +90 -0
- ghostlab-0.3.0/rehearsal/opencode_backend.py +201 -0
- ghostlab-0.3.0/rehearsal/opencode_config.py +223 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/orchestrator.py +108 -8
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/personas.py +3 -3
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/plan.py +21 -13
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/plan_generate.py +24 -4
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/profile.py +12 -4
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/prompts.py +111 -3
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/report.py +8 -4
- ghostlab-0.3.0/rehearsal/resolved_config.py +131 -0
- ghostlab-0.3.0/rehearsal/rollout_report.py +327 -0
- ghostlab-0.3.0/rehearsal/runner_presets.py +246 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/runners.py +115 -0
- ghostlab-0.3.0/rehearsal/sandbox.py +527 -0
- ghostlab-0.3.0/rehearsal/skills.py +47 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/spec.py +136 -1
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/testrun.py +66 -5
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/tool_capture.py +144 -1
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/ui/app.py +305 -59
- ghostlab-0.3.0/tests/test_agents.py +83 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_cli_spec_flow.py +159 -22
- ghostlab-0.3.0/tests/test_codex_backend_sandbox.py +47 -0
- ghostlab-0.3.0/tests/test_configured_agent.py +383 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_hosts_runner.py +2 -2
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_jobs.py +49 -0
- ghostlab-0.3.0/tests/test_opencode_backend.py +286 -0
- ghostlab-0.3.0/tests/test_prompts.py +32 -0
- ghostlab-0.3.0/tests/test_sandbox.py +132 -0
- ghostlab-0.3.0/tests/test_sandbox_stdio.py +213 -0
- ghostlab-0.3.0/tests/test_skills.py +39 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_testrun.py +36 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_tool_capture.py +9 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_widgets_and_dashboard.py +5 -0
- ghostlab-0.2.0/CONTRIBUTING.md +0 -56
- ghostlab-0.2.0/PKG-INFO +0 -506
- ghostlab-0.2.0/README.md +0 -466
- ghostlab-0.2.0/docs/concepts.md +0 -56
- ghostlab-0.2.0/docs/getting-started.md +0 -126
- ghostlab-0.2.0/docs/ghostlab-vision-gap-and-roadmap.md +0 -963
- ghostlab-0.2.0/docs/index.md +0 -26
- ghostlab-0.2.0/llms.txt +0 -61
- ghostlab-0.2.0/personas/careful-celpip-beginner.json +0 -21
- ghostlab-0.2.0/personas/general-learning-edge-case.json +0 -23
- ghostlab-0.2.0/personas/ielts-power-user.json +0 -23
- ghostlab-0.2.0/personas/skeptical-toefl-retaker.json +0 -22
- ghostlab-0.2.0/rehearsal/jobs.py +0 -245
- ghostlab-0.2.0/rehearsal/runner_presets.py +0 -113
- ghostlab-0.2.0/scenarios/cortex-onboarding-status.json +0 -19
- ghostlab-0.2.0/scenarios/cortex-practice-generation.json +0 -19
- ghostlab-0.2.0/scenarios/error-recovery.json +0 -19
- ghostlab-0.2.0/targets/cortex-ngrok.json +0 -29
- ghostlab-0.2.0/targets/example-http.json +0 -16
- ghostlab-0.2.0/targets/example-stdio.json +0 -18
- {ghostlab-0.2.0 → ghostlab-0.3.0}/LICENSE +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/ghostlab/__init__.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/ghostlab/__main__.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/ghostlab/cli.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/__main__.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/apps_host/__init__.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/apps_host/assertions.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/apps_host/executor.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/apps_host/live.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/apps_host/protocol.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/apps_host/renderer.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/apps_host/report.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/compare.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/contract.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/critique.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/logging.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/mcp_apps.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/mcp_client.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/mcp_config.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/mcp_targets.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/readiness.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/review.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/sampling.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/scorecard.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/setup_runtime.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/storage/__init__.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/storage/db.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/storage/hashing.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/storage/ids.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/storage/migrations/0001_initial.sql +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/storage/redact.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/storage/repository.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/termcolor.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/types.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/rehearsal/ui/__init__.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/runners/claude-process.example.json +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/runners/codex-cortex-aut.json +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/runners/codex-cortex-local-aut.json +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/runners/codex-cortex-local-session.json +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/runners/codex-process.example.json +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/runners/codex-user-emulator.json +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/runners/mock-aut.json +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/runners/mock-user.json +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_apps_host.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_apps_live.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_compare.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_config.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_contract.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_critique.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_dataset.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_evaluate.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_generate.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_inspect_lint.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_mcp_apps.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_mcp_client.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_mcp_targets.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_orchestrator.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_personas.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_plan.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_plan_generate.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_profile.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_readiness.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_review.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_runner_presets.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_sampling.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_scorecard.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_session_runner.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_setup_runtime.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_spec.py +0 -0
- {ghostlab-0.2.0 → ghostlab-0.3.0}/tests/test_storage.py +0 -0
|
@@ -227,7 +227,8 @@ ghostlab_workspace/
|
|
|
227
227
|
.ghostlab/
|
|
228
228
|
ghostlab.sqlite3
|
|
229
229
|
|
|
230
|
-
# ghostlab jobs —
|
|
231
|
-
jobs
|
|
232
|
-
|
|
233
|
-
|
|
230
|
+
# ghostlab jobs — runtime output (created by `ghostlab create`), not tracked
|
|
231
|
+
jobs/
|
|
232
|
+
|
|
233
|
+
# macOS
|
|
234
|
+
.DS_Store
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Contributing to Ghostlab
|
|
2
|
+
|
|
3
|
+
Thanks for helping improve Ghostlab! This guide is written to be friendly to both
|
|
4
|
+
humans and coding agents. For a machine-readable map of the project, see
|
|
5
|
+
[`llms.txt`](llms.txt).
|
|
6
|
+
|
|
7
|
+
## Project shape
|
|
8
|
+
|
|
9
|
+
- Python package: `rehearsal` · installed CLI: `ghostlab` (alias `rehearsal`).
|
|
10
|
+
- Pipeline: **understand → generate → run → evaluate**, plus optional SQLite
|
|
11
|
+
persistence, a Streamlit UI, and an MCP Apps render layer.
|
|
12
|
+
- The MCP client uses only the standard library; coding-agent CLIs (Codex /
|
|
13
|
+
Claude) are the agent backends.
|
|
14
|
+
- NVIDIA OpenShell is the default execution backend for real runner sessions
|
|
15
|
+
and local stdio MCPs; `--sandbox local` is the explicit trusted-host opt-out.
|
|
16
|
+
|
|
17
|
+
## Setup
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
python3 -m venv .venv # Python 3.10+
|
|
21
|
+
.venv/bin/pip install -e '.[dev]' # add ',ui' and/or ',apps' for those features
|
|
22
|
+
.venv/bin/pytest # run the test suite
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Optional extras:
|
|
26
|
+
|
|
27
|
+
- `.[ui]` — the Streamlit pipeline UI (`ghostlab ui`).
|
|
28
|
+
- `.[apps]` — Playwright, for rendering MCP Apps `ui://` widgets
|
|
29
|
+
(`ghostlab apps-render`). After install: `playwright install chrome`.
|
|
30
|
+
|
|
31
|
+
OpenShell integration work also needs a supported compute driver (Docker
|
|
32
|
+
Desktop is the simplest local option) and a connected gateway:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
openshell status
|
|
36
|
+
ghostlab doctor
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
For documentation work:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
.venv/bin/mkdocs serve # live-preview the wiki locally
|
|
43
|
+
.venv/bin/mkdocs build --strict # what CI enforces
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Conventions
|
|
47
|
+
|
|
48
|
+
- **Support Python 3.10–3.13.** Keep syntax and dependencies compatible with
|
|
49
|
+
the declared `requires-python` range and CI matrix.
|
|
50
|
+
- **Test your change.** Most logic is pure and unit-tested with `unittest` under
|
|
51
|
+
`tests/`. Browser/network-dependent paths should degrade gracefully and be
|
|
52
|
+
guarded so the suite passes without them.
|
|
53
|
+
- **Keep artifacts hybrid.** Commands write human-readable `.md` + machine
|
|
54
|
+
`.json`; SQLite is the system of record but never required for a run to work.
|
|
55
|
+
- **Keep commits focused** on one logical change, with tests or docs alongside
|
|
56
|
+
behavior changes. Don't commit generated output (`jobs/`, `runs/`, `datasets/`,
|
|
57
|
+
`dist/`, `site/`), caches, or `.venv` — they're gitignored.
|
|
58
|
+
- Match the surrounding style: small modules, docstrings that explain *why*, and
|
|
59
|
+
no new heavyweight dependencies in the core (use an optional extra instead).
|
|
60
|
+
|
|
61
|
+
## Making a change
|
|
62
|
+
|
|
63
|
+
1. Branch off `main` (e.g. `feat/…`, `fix/…`, `docs/…`).
|
|
64
|
+
2. Make the change with tests.
|
|
65
|
+
3. Open a PR against `main` with a clear description of what and why. Reference
|
|
66
|
+
the issue it addresses (`Closes #NN`).
|
|
67
|
+
|
|
68
|
+
When you **add or change a CLI command**, update all of:
|
|
69
|
+
|
|
70
|
+
- `rehearsal/cli.py` (the command)
|
|
71
|
+
- `tests/` (coverage)
|
|
72
|
+
- `README.md` (the command reference)
|
|
73
|
+
- `docs/cli.md` (the wiki page)
|
|
74
|
+
|
|
75
|
+
Use `ghostlab` (not `rehearsal`) in public examples.
|
|
76
|
+
|
|
77
|
+
## Pull request checklist
|
|
78
|
+
|
|
79
|
+
Run the checks that match your change:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
.venv/bin/pytest # always
|
|
83
|
+
.venv/bin/mkdocs build --strict # if you touched docs/ or mkdocs.yml
|
|
84
|
+
.venv/bin/python -m build # if you touched packaging
|
|
85
|
+
.venv/bin/twine check dist/* # "
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Run the full set for release, packaging, workflow, or public-CLI changes.
|
|
89
|
+
|
|
90
|
+
## Documentation site
|
|
91
|
+
|
|
92
|
+
The wiki lives in `docs/` and is built with MkDocs. The **Pages** workflow
|
|
93
|
+
(`.github/workflows/pages.yml`) deploys it to GitHub Pages on pushes to `main`,
|
|
94
|
+
release tags, and manual runs. Public docs: <https://sajjadgg.github.io/Ghostlab/>.
|
|
95
|
+
|
|
96
|
+
## Releases
|
|
97
|
+
|
|
98
|
+
Publishing to PyPI is automated by `.github/workflows/publish.yml` via
|
|
99
|
+
[PyPI Trusted Publishing](https://docs.pypi.org/trusted-publishers/) (no tokens).
|
|
100
|
+
It runs when you **publish a GitHub Release** (or dispatch the workflow manually).
|
|
101
|
+
Version tags use `v*.*.*`.
|
|
102
|
+
|
|
103
|
+
To cut a release:
|
|
104
|
+
|
|
105
|
+
1. Bump `__version__` in `rehearsal/__init__.py`.
|
|
106
|
+
2. Validate locally: `.venv/bin/pytest && .venv/bin/python -m build && .venv/bin/twine check dist/*`.
|
|
107
|
+
3. `gh release create v<x.y.z> --generate-notes` — this triggers `publish.yml`.
|
|
108
|
+
|
|
109
|
+
## Where to start
|
|
110
|
+
|
|
111
|
+
Browse the [open issues](https://github.com/sajjadGG/Ghostlab/issues) — they are
|
|
112
|
+
labeled by pipeline stage (`pipeline:understand`, `pipeline:run`,
|
|
113
|
+
`pipeline:evaluate`, …). Good first contributions: a new target/scenario/runner
|
|
114
|
+
preset, an additional lint or assertion, or a per-widget MCP Apps assertion.
|