cc-visual-walkthrough 0.2.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.
- cc_visual_walkthrough-0.2.0/.env.example +5 -0
- cc_visual_walkthrough-0.2.0/.gitignore +8 -0
- cc_visual_walkthrough-0.2.0/CHANGELOG.md +69 -0
- cc_visual_walkthrough-0.2.0/LICENSE +21 -0
- cc_visual_walkthrough-0.2.0/PKG-INFO +195 -0
- cc_visual_walkthrough-0.2.0/README.md +168 -0
- cc_visual_walkthrough-0.2.0/demo/app.py +222 -0
- cc_visual_walkthrough-0.2.0/demo/ccwalk.yaml +29 -0
- cc_visual_walkthrough-0.2.0/demo/custom_actions.py +19 -0
- cc_visual_walkthrough-0.2.0/demo/static/htmx.min.js +1 -0
- cc_visual_walkthrough-0.2.0/demo/tour.py +129 -0
- cc_visual_walkthrough-0.2.0/pyproject.toml +69 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/__init__.py +22 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/actions.py +241 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/browser.py +38 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/cli.py +388 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/config.py +234 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/doctor.py +183 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/helpers.py +208 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/reporters.py +359 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/runner.py +454 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/serve.py +434 -0
- cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/specs.py +181 -0
- cc_visual_walkthrough-0.2.0/tests/test_actions_runner.py +411 -0
- cc_visual_walkthrough-0.2.0/tests/test_publish_fixes.py +175 -0
- cc_visual_walkthrough-0.2.0/tests/test_reporters.py +221 -0
- cc_visual_walkthrough-0.2.0/tests/test_review_fixes.py +366 -0
- cc_visual_walkthrough-0.2.0/tests/test_serve.py +162 -0
- cc_visual_walkthrough-0.2.0/tests/test_specs_config.py +299 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to cc-visual-walkthrough. Format follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/); versions follow SemVer.
|
|
5
|
+
|
|
6
|
+
## [0.2.0] - 2026-08-30
|
|
7
|
+
|
|
8
|
+
Publish-readiness pass from an independent code review: the daemon
|
|
9
|
+
pid-ownership check works without `/proc` (falls back to `ps`; when
|
|
10
|
+
neither is available a live pid's pidfile is never auto-cleaned, so a
|
|
11
|
+
daemon can't be orphaned on macOS); an occupied port produces a clean
|
|
12
|
+
message naming `serve status`/`serve stop` instead of a traceback;
|
|
13
|
+
`ccwalk report` re-renders no longer destroy a failed step's captured
|
|
14
|
+
traceback (the `log` field survives the round-trip); `--capture-only`
|
|
15
|
+
uses a fresh browser context per viewport x variant so a variant's
|
|
16
|
+
persisted side effects (theme toggles, cookies) can't contaminate later
|
|
17
|
+
captures; Markdown report alt text is escaped; sdist excludes the local
|
|
18
|
+
serve log and dev docs; README links render on PyPI; the setup skill
|
|
19
|
+
installs the CLI from the plugin root first (works before and after
|
|
20
|
+
PyPI publication); version 0.2.0 everywhere with a test pinning
|
|
21
|
+
pyproject/`__init__`/plugin.json agreement.
|
|
22
|
+
|
|
23
|
+
## [0.1.0] - 2026-08-29
|
|
24
|
+
|
|
25
|
+
Live manual-testing round (pre-release): `ccwalk serve` -- a local
|
|
26
|
+
report server with a generated runs index at `/` (one row per run,
|
|
27
|
+
newest first, PASS/WARN/FAIL counts, linked reports; `--daemon` /
|
|
28
|
+
`serve stop` / `serve status`, pidfile-tracked, restart-on-start,
|
|
29
|
+
`Cache-Control: no-store` everywhere). The setup skill now offers to
|
|
30
|
+
start the server after the first verified run, the run skill hands back
|
|
31
|
+
the served index URL when the server is up, and two new skills landed:
|
|
32
|
+
`/ccwalk:serve` (start/restart/stop + link) and `/ccwalk:help` (live
|
|
33
|
+
status + command reference). Skills also gained a stale-build guard:
|
|
34
|
+
`ccwalk --version` is compared against the plugin's own version, with a
|
|
35
|
+
reinstall-from-plugin-source remedy on mismatch.
|
|
36
|
+
|
|
37
|
+
E2E dry-run polish (pre-release): local-checkout install path documented,
|
|
38
|
+
`ccwalk install-browsers` reports success plainly, `doctor` auto-exempts
|
|
39
|
+
the configured login page from auth (plus `--no-auth`), `ccwalk report
|
|
40
|
+
--embed` writes `report_embedded.html` alongside `report.html` (use
|
|
41
|
+
`--in-place` to overwrite), and the setup skill's port probe covers
|
|
42
|
+
8500/8888 and defers to the project's own config first.
|
|
43
|
+
|
|
44
|
+
Initial release, extracted and generalized from a larger private
|
|
45
|
+
project's internal visual-testing system, then hardened by a five-agent
|
|
46
|
+
adversarial review round (code review, real-project field test, release
|
|
47
|
+
audit) before publish.
|
|
48
|
+
|
|
49
|
+
### Added
|
|
50
|
+
- Spec-driven Playwright walkthrough runner: Python `Step` specs,
|
|
51
|
+
per-group browser contexts and video segments, per-step screenshots,
|
|
52
|
+
non-fatal assertions (WARN, never abort), FAIL-with-error-screenshot,
|
|
53
|
+
blocked-step cascade when a group's step fails.
|
|
54
|
+
- Auth strategies via `ccwalk.yaml`: form auto-login, localStorage,
|
|
55
|
+
cookie, header (header injection scoped to the app's origin only).
|
|
56
|
+
- Reports: dark-theme HTML (escaped, video posters, notes callouts),
|
|
57
|
+
Markdown twin, extended `run_meta.json` (the agent triage interface,
|
|
58
|
+
including tracebacks for failed steps); `--embed` single-file mode;
|
|
59
|
+
`--mp4` Safari transcode.
|
|
60
|
+
- `ccwalk` CLI: `init`, `run` (`--start-app` with imposter refusal and
|
|
61
|
+
process-group teardown, `--capture-only` design mode), `doctor`
|
|
62
|
+
(selector finder with interactive-element inventory and quote-safe
|
|
63
|
+
text selectors), `report` (re-render), `install-browsers`.
|
|
64
|
+
- Claude Code plugin (`ccwalk`): `/ccwalk:setup` tailoring skill and
|
|
65
|
+
`/ccwalk:run` run-and-triage skill.
|
|
66
|
+
- Bundled FastAPI + htmx demo app with a committed example report; CI
|
|
67
|
+
runs the real tour on every push and publishes it to GitHub Pages.
|
|
68
|
+
- 99 unit tests (no browser required) plus the demo tour as the
|
|
69
|
+
browser-driving integration test.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Nick Rotundo
|
|
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.
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: cc-visual-walkthrough
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Spec-driven Playwright walkthroughs for Claude Code: records and captures browser tours of your web app into shareable HTML reports with screenshots, video, and non-fatal regression assertions.
|
|
5
|
+
Project-URL: Homepage, https://github.com/nickjrotundo/cc-visual-walkthrough
|
|
6
|
+
Project-URL: Repository, https://github.com/nickjrotundo/cc-visual-walkthrough
|
|
7
|
+
Project-URL: Issues, https://github.com/nickjrotundo/cc-visual-walkthrough/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/nickjrotundo/cc-visual-walkthrough/blob/main/CHANGELOG.md
|
|
9
|
+
Author: Nick Rotundo
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: claude-code,demo,playwright,screenshots,visual-testing,walkthrough
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development :: Testing
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
Requires-Dist: playwright>=1.40
|
|
21
|
+
Requires-Dist: pyyaml>=6.0
|
|
22
|
+
Provides-Extra: demo
|
|
23
|
+
Requires-Dist: fastapi>=0.110; extra == 'demo'
|
|
24
|
+
Requires-Dist: python-multipart>=0.0.9; extra == 'demo'
|
|
25
|
+
Requires-Dist: uvicorn>=0.27; extra == 'demo'
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
|
|
28
|
+
# CC Visual Walkthrough
|
|
29
|
+
|
|
30
|
+
[](https://github.com/nickjrotundo/cc-visual-walkthrough/actions/workflows/ci.yml)
|
|
31
|
+
|
|
32
|
+
Spec-driven visual walkthroughs for [Claude Code](https://claude.com/claude-code):
|
|
33
|
+
records and captures browser tours of your web app into shareable HTML
|
|
34
|
+
reports -- per-step screenshots, per-group video, and non-fatal regression
|
|
35
|
+
assertions -- with Claude Code generating and maintaining the tour spec for
|
|
36
|
+
you.
|
|
37
|
+
|
|
38
|
+
Every visual testing tool on the market exists to *gate merges*: red
|
|
39
|
+
builds, baseline approvals, pixel diffs. This one produces the artifact an
|
|
40
|
+
AI-driven development loop actually needs instead: **evidence that the app
|
|
41
|
+
works end-to-end after this iteration**, in a form both humans (HTML with
|
|
42
|
+
embedded media) and the agent itself (Markdown twin + `run_meta.json`) can
|
|
43
|
+
read. It is deliberately not a test framework -- if you need gating
|
|
44
|
+
regression tests, use Playwright's own runner alongside it.
|
|
45
|
+
|
|
46
|
+
## What a run produces
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
reports/walkthrough/<UTC timestamp>/
|
|
50
|
+
report.html # dark-theme report: screenshots, video, PASS/WARN/FAIL badges
|
|
51
|
+
report.md # same content as Markdown -- agent- and diff-friendly
|
|
52
|
+
run_meta.json # machine-readable per-step results (the triage interface)
|
|
53
|
+
screenshots/*.png
|
|
54
|
+
videos/<group>.webm
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Assertions never abort the tour: a failed assertion marks the step WARN
|
|
58
|
+
and the run continues, because a transient timeout should not destroy an
|
|
59
|
+
evidence-gathering pass. An action that *throws* (selector never appeared)
|
|
60
|
+
marks the step FAIL, captures an error screenshot, and still continues.
|
|
61
|
+
The process exits non-zero only on FAIL.
|
|
62
|
+
|
|
63
|
+
## Install (Claude Code -- the supported path)
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
/plugin marketplace add nickjrotundo/cc-visual-walkthrough
|
|
67
|
+
/plugin install ccwalk@cc-visual-walkthrough
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Then, in the project you want toured:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
/ccwalk:setup
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The setup skill inspects your project, finds the dev server and routes,
|
|
77
|
+
asks which flows matter, writes `ccwalk.yaml` and a tailored spec, runs a
|
|
78
|
+
verification pass, and teaches your project's `CLAUDE.md` to regenerate
|
|
79
|
+
the tour after each feature wave. After that:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
/ccwalk:run
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
runs the tour and triages the results (real regression vs. flaky selector
|
|
86
|
+
vs. environment hiccup).
|
|
87
|
+
|
|
88
|
+
The plugin needs the `ccwalk` CLI on PATH (the setup skill checks and
|
|
89
|
+
offers to do this):
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
uv tool install cc-visual-walkthrough # from PyPI
|
|
93
|
+
# or straight from the repo:
|
|
94
|
+
# uv tool install git+https://github.com/nickjrotundo/cc-visual-walkthrough
|
|
95
|
+
# or from a local checkout, into a venv:
|
|
96
|
+
# uv pip install /path/to/cc-visual-walkthrough
|
|
97
|
+
# one-time browser install (works for pip/uv tool/pipx installs alike):
|
|
98
|
+
ccwalk install-browsers
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
> The `ccwalk` CLI can be driven by hand without Claude Code, but that
|
|
102
|
+
> path is unsupported -- you are on your own.
|
|
103
|
+
|
|
104
|
+
## Supported platforms
|
|
105
|
+
|
|
106
|
+
Linux and WSL2 are tested. macOS should work (Playwright is
|
|
107
|
+
cross-platform) but is untested and has no system-chromium fallback --
|
|
108
|
+
use `ccwalk install-browsers`. Native Windows is unsupported:
|
|
109
|
+
`--start-app` process management is POSIX-only.
|
|
110
|
+
|
|
111
|
+
## Serving reports
|
|
112
|
+
|
|
113
|
+
The built-in server is the browsing story -- especially on WSL2, ssh,
|
|
114
|
+
or any headless box where "just open the HTML file" is not a thing:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
ccwalk serve --daemon # background server; prints the index URL
|
|
118
|
+
ccwalk serve status # running? where?
|
|
119
|
+
ccwalk serve stop
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
It serves the report directory at `http://127.0.0.1:8378/` with a
|
|
123
|
+
generated **runs index** at `/`: one row per run, newest first, with its
|
|
124
|
+
PASS/WARN/FAIL counts, spec, git head, and duration -- click a run to
|
|
125
|
+
open its report. Every response is `Cache-Control: no-store`, so the
|
|
126
|
+
index is always current. `serve` (start) doubles as restart; localhost
|
|
127
|
+
only unless you explicitly `--bind 0.0.0.0`. WSL2: localhost forwarding
|
|
128
|
+
to the Windows browser usually works, but not always - if it doesn't,
|
|
129
|
+
open the URL in a Linux browser (e.g. WSLg-launched Chrome). The setup
|
|
130
|
+
skill offers to start this server after the first verified run, and
|
|
131
|
+
`/ccwalk:serve` manages it any time.
|
|
132
|
+
|
|
133
|
+
Alternatives still work: `report.html` opens fully from `file://` in
|
|
134
|
+
Chromium-family browsers (images and webm play). For Safari/iOS you need
|
|
135
|
+
both `--mp4` (webm does not play there) and a Range-capable server: the
|
|
136
|
+
stdlib server (including `ccwalk serve` and `python3 -m http.server`)
|
|
137
|
+
does NOT support Range requests and will not fix Safari video -- use
|
|
138
|
+
`npx serve`, caddy, or nginx. `--embed` produces a single self-contained
|
|
139
|
+
file you can attach to an email.
|
|
140
|
+
|
|
141
|
+
## The pieces
|
|
142
|
+
|
|
143
|
+
- **Spec** -- a Python module with a `STEPS: list[Step]`. Python, not
|
|
144
|
+
YAML: real tours need real control flow. Each `Step` has a name, a
|
|
145
|
+
`group` (steps in a group share one browser context and one video
|
|
146
|
+
segment), a list of action dicts, and optional non-fatal assertions.
|
|
147
|
+
- **Actions** -- `goto`, `click`, `fill`, `press`, `hover`,
|
|
148
|
+
`select_option`, `upload_file`, `wait_for`, `wait_ms`, `set_viewport`,
|
|
149
|
+
`screenshot`, `scroll_into_view`, `login_form`, `override_session`,
|
|
150
|
+
`mock_route`, and `wait_for_condition` (screenshots a progress state
|
|
151
|
+
while polling -- how slow async work gets captured mid-flight).
|
|
152
|
+
App-specific verbs go in a `custom_actions` module.
|
|
153
|
+
- **Auth** -- configured, not coded: `form` (auto-login per fresh
|
|
154
|
+
context), `localstorage`, `cookie`, `header`, or `none`. Credentials
|
|
155
|
+
are env-var *names* in config; values live in your environment or
|
|
156
|
+
`.env`. Use a disposable test account.
|
|
157
|
+
- **Design capture mode** -- `ccwalk run --capture-only /page
|
|
158
|
+
--viewports 390,768,1440` screenshots one page across viewports (and
|
|
159
|
+
configured `capture_variants`, e.g. a dark-mode toggle) for design
|
|
160
|
+
review.
|
|
161
|
+
- **Doctor** -- `ccwalk doctor /page --find "Submit"` prints stable
|
|
162
|
+
selector candidates (data-testid > id > role > text) for fixing a
|
|
163
|
+
failing step.
|
|
164
|
+
- **Single-file report** -- `ccwalk report <run_dir> --embed` re-renders
|
|
165
|
+
a run into a self-contained `report_embedded.html` (all media inlined,
|
|
166
|
+
email-attachable); `--mp4` transcodes videos for Safari (needs
|
|
167
|
+
ffmpeg). `/ccwalk:help` gives a live status + command reference in a
|
|
168
|
+
Claude Code session.
|
|
169
|
+
|
|
170
|
+
## Try the bundled demo
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
git clone https://github.com/nickjrotundo/cc-visual-walkthrough
|
|
174
|
+
cd cc-visual-walkthrough && uv sync && uv run ccwalk install-browsers
|
|
175
|
+
CCWALK_DEMO_USER=demo CCWALK_DEMO_PASS=demo123 \
|
|
176
|
+
uv run ccwalk run --config demo/ccwalk.yaml --start-app
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
This boots a tiny FastAPI + htmx notes app, tours it (login flow, CRUD,
|
|
180
|
+
a deliberately slow "analyze" operation captured mid-progress, a mobile
|
|
181
|
+
viewport), and writes the report to `reports/walkthrough/`. A committed
|
|
182
|
+
example of the output lives in [`examples/`](https://github.com/nickjrotundo/cc-visual-walkthrough/tree/main/examples).
|
|
183
|
+
|
|
184
|
+
## Documentation
|
|
185
|
+
|
|
186
|
+
- [DESIGN.md](https://github.com/nickjrotundo/cc-visual-walkthrough/blob/main/DESIGN.md) -- positioning, architecture, and the design
|
|
187
|
+
decisions (most of them learned the hard way in the system this was
|
|
188
|
+
extracted from)
|
|
189
|
+
- [ANALYSIS.md](https://github.com/nickjrotundo/cc-visual-walkthrough/blob/main/ANALYSIS.md) -- honest limitations and the v0.2 roadmap
|
|
190
|
+
- [BUILD-LOG.md](https://github.com/nickjrotundo/cc-visual-walkthrough/blob/main/BUILD-LOG.md) -- how this repo was built with Claude
|
|
191
|
+
Code, as a worked example of AI-driven development
|
|
192
|
+
|
|
193
|
+
## Support
|
|
194
|
+
|
|
195
|
+
Questions and bugs: [GitHub Issues](https://github.com/nickjrotundo/cc-visual-walkthrough/issues).
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# CC Visual Walkthrough
|
|
2
|
+
|
|
3
|
+
[](https://github.com/nickjrotundo/cc-visual-walkthrough/actions/workflows/ci.yml)
|
|
4
|
+
|
|
5
|
+
Spec-driven visual walkthroughs for [Claude Code](https://claude.com/claude-code):
|
|
6
|
+
records and captures browser tours of your web app into shareable HTML
|
|
7
|
+
reports -- per-step screenshots, per-group video, and non-fatal regression
|
|
8
|
+
assertions -- with Claude Code generating and maintaining the tour spec for
|
|
9
|
+
you.
|
|
10
|
+
|
|
11
|
+
Every visual testing tool on the market exists to *gate merges*: red
|
|
12
|
+
builds, baseline approvals, pixel diffs. This one produces the artifact an
|
|
13
|
+
AI-driven development loop actually needs instead: **evidence that the app
|
|
14
|
+
works end-to-end after this iteration**, in a form both humans (HTML with
|
|
15
|
+
embedded media) and the agent itself (Markdown twin + `run_meta.json`) can
|
|
16
|
+
read. It is deliberately not a test framework -- if you need gating
|
|
17
|
+
regression tests, use Playwright's own runner alongside it.
|
|
18
|
+
|
|
19
|
+
## What a run produces
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
reports/walkthrough/<UTC timestamp>/
|
|
23
|
+
report.html # dark-theme report: screenshots, video, PASS/WARN/FAIL badges
|
|
24
|
+
report.md # same content as Markdown -- agent- and diff-friendly
|
|
25
|
+
run_meta.json # machine-readable per-step results (the triage interface)
|
|
26
|
+
screenshots/*.png
|
|
27
|
+
videos/<group>.webm
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Assertions never abort the tour: a failed assertion marks the step WARN
|
|
31
|
+
and the run continues, because a transient timeout should not destroy an
|
|
32
|
+
evidence-gathering pass. An action that *throws* (selector never appeared)
|
|
33
|
+
marks the step FAIL, captures an error screenshot, and still continues.
|
|
34
|
+
The process exits non-zero only on FAIL.
|
|
35
|
+
|
|
36
|
+
## Install (Claude Code -- the supported path)
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
/plugin marketplace add nickjrotundo/cc-visual-walkthrough
|
|
40
|
+
/plugin install ccwalk@cc-visual-walkthrough
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Then, in the project you want toured:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
/ccwalk:setup
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The setup skill inspects your project, finds the dev server and routes,
|
|
50
|
+
asks which flows matter, writes `ccwalk.yaml` and a tailored spec, runs a
|
|
51
|
+
verification pass, and teaches your project's `CLAUDE.md` to regenerate
|
|
52
|
+
the tour after each feature wave. After that:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
/ccwalk:run
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
runs the tour and triages the results (real regression vs. flaky selector
|
|
59
|
+
vs. environment hiccup).
|
|
60
|
+
|
|
61
|
+
The plugin needs the `ccwalk` CLI on PATH (the setup skill checks and
|
|
62
|
+
offers to do this):
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
uv tool install cc-visual-walkthrough # from PyPI
|
|
66
|
+
# or straight from the repo:
|
|
67
|
+
# uv tool install git+https://github.com/nickjrotundo/cc-visual-walkthrough
|
|
68
|
+
# or from a local checkout, into a venv:
|
|
69
|
+
# uv pip install /path/to/cc-visual-walkthrough
|
|
70
|
+
# one-time browser install (works for pip/uv tool/pipx installs alike):
|
|
71
|
+
ccwalk install-browsers
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
> The `ccwalk` CLI can be driven by hand without Claude Code, but that
|
|
75
|
+
> path is unsupported -- you are on your own.
|
|
76
|
+
|
|
77
|
+
## Supported platforms
|
|
78
|
+
|
|
79
|
+
Linux and WSL2 are tested. macOS should work (Playwright is
|
|
80
|
+
cross-platform) but is untested and has no system-chromium fallback --
|
|
81
|
+
use `ccwalk install-browsers`. Native Windows is unsupported:
|
|
82
|
+
`--start-app` process management is POSIX-only.
|
|
83
|
+
|
|
84
|
+
## Serving reports
|
|
85
|
+
|
|
86
|
+
The built-in server is the browsing story -- especially on WSL2, ssh,
|
|
87
|
+
or any headless box where "just open the HTML file" is not a thing:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
ccwalk serve --daemon # background server; prints the index URL
|
|
91
|
+
ccwalk serve status # running? where?
|
|
92
|
+
ccwalk serve stop
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
It serves the report directory at `http://127.0.0.1:8378/` with a
|
|
96
|
+
generated **runs index** at `/`: one row per run, newest first, with its
|
|
97
|
+
PASS/WARN/FAIL counts, spec, git head, and duration -- click a run to
|
|
98
|
+
open its report. Every response is `Cache-Control: no-store`, so the
|
|
99
|
+
index is always current. `serve` (start) doubles as restart; localhost
|
|
100
|
+
only unless you explicitly `--bind 0.0.0.0`. WSL2: localhost forwarding
|
|
101
|
+
to the Windows browser usually works, but not always - if it doesn't,
|
|
102
|
+
open the URL in a Linux browser (e.g. WSLg-launched Chrome). The setup
|
|
103
|
+
skill offers to start this server after the first verified run, and
|
|
104
|
+
`/ccwalk:serve` manages it any time.
|
|
105
|
+
|
|
106
|
+
Alternatives still work: `report.html` opens fully from `file://` in
|
|
107
|
+
Chromium-family browsers (images and webm play). For Safari/iOS you need
|
|
108
|
+
both `--mp4` (webm does not play there) and a Range-capable server: the
|
|
109
|
+
stdlib server (including `ccwalk serve` and `python3 -m http.server`)
|
|
110
|
+
does NOT support Range requests and will not fix Safari video -- use
|
|
111
|
+
`npx serve`, caddy, or nginx. `--embed` produces a single self-contained
|
|
112
|
+
file you can attach to an email.
|
|
113
|
+
|
|
114
|
+
## The pieces
|
|
115
|
+
|
|
116
|
+
- **Spec** -- a Python module with a `STEPS: list[Step]`. Python, not
|
|
117
|
+
YAML: real tours need real control flow. Each `Step` has a name, a
|
|
118
|
+
`group` (steps in a group share one browser context and one video
|
|
119
|
+
segment), a list of action dicts, and optional non-fatal assertions.
|
|
120
|
+
- **Actions** -- `goto`, `click`, `fill`, `press`, `hover`,
|
|
121
|
+
`select_option`, `upload_file`, `wait_for`, `wait_ms`, `set_viewport`,
|
|
122
|
+
`screenshot`, `scroll_into_view`, `login_form`, `override_session`,
|
|
123
|
+
`mock_route`, and `wait_for_condition` (screenshots a progress state
|
|
124
|
+
while polling -- how slow async work gets captured mid-flight).
|
|
125
|
+
App-specific verbs go in a `custom_actions` module.
|
|
126
|
+
- **Auth** -- configured, not coded: `form` (auto-login per fresh
|
|
127
|
+
context), `localstorage`, `cookie`, `header`, or `none`. Credentials
|
|
128
|
+
are env-var *names* in config; values live in your environment or
|
|
129
|
+
`.env`. Use a disposable test account.
|
|
130
|
+
- **Design capture mode** -- `ccwalk run --capture-only /page
|
|
131
|
+
--viewports 390,768,1440` screenshots one page across viewports (and
|
|
132
|
+
configured `capture_variants`, e.g. a dark-mode toggle) for design
|
|
133
|
+
review.
|
|
134
|
+
- **Doctor** -- `ccwalk doctor /page --find "Submit"` prints stable
|
|
135
|
+
selector candidates (data-testid > id > role > text) for fixing a
|
|
136
|
+
failing step.
|
|
137
|
+
- **Single-file report** -- `ccwalk report <run_dir> --embed` re-renders
|
|
138
|
+
a run into a self-contained `report_embedded.html` (all media inlined,
|
|
139
|
+
email-attachable); `--mp4` transcodes videos for Safari (needs
|
|
140
|
+
ffmpeg). `/ccwalk:help` gives a live status + command reference in a
|
|
141
|
+
Claude Code session.
|
|
142
|
+
|
|
143
|
+
## Try the bundled demo
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
git clone https://github.com/nickjrotundo/cc-visual-walkthrough
|
|
147
|
+
cd cc-visual-walkthrough && uv sync && uv run ccwalk install-browsers
|
|
148
|
+
CCWALK_DEMO_USER=demo CCWALK_DEMO_PASS=demo123 \
|
|
149
|
+
uv run ccwalk run --config demo/ccwalk.yaml --start-app
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
This boots a tiny FastAPI + htmx notes app, tours it (login flow, CRUD,
|
|
153
|
+
a deliberately slow "analyze" operation captured mid-progress, a mobile
|
|
154
|
+
viewport), and writes the report to `reports/walkthrough/`. A committed
|
|
155
|
+
example of the output lives in [`examples/`](https://github.com/nickjrotundo/cc-visual-walkthrough/tree/main/examples).
|
|
156
|
+
|
|
157
|
+
## Documentation
|
|
158
|
+
|
|
159
|
+
- [DESIGN.md](https://github.com/nickjrotundo/cc-visual-walkthrough/blob/main/DESIGN.md) -- positioning, architecture, and the design
|
|
160
|
+
decisions (most of them learned the hard way in the system this was
|
|
161
|
+
extracted from)
|
|
162
|
+
- [ANALYSIS.md](https://github.com/nickjrotundo/cc-visual-walkthrough/blob/main/ANALYSIS.md) -- honest limitations and the v0.2 roadmap
|
|
163
|
+
- [BUILD-LOG.md](https://github.com/nickjrotundo/cc-visual-walkthrough/blob/main/BUILD-LOG.md) -- how this repo was built with Claude
|
|
164
|
+
Code, as a worked example of AI-driven development
|
|
165
|
+
|
|
166
|
+
## Support
|
|
167
|
+
|
|
168
|
+
Questions and bugs: [GitHub Issues](https://github.com/nickjrotundo/cc-visual-walkthrough/issues).
|