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.
Files changed (29) hide show
  1. cc_visual_walkthrough-0.2.0/.env.example +5 -0
  2. cc_visual_walkthrough-0.2.0/.gitignore +8 -0
  3. cc_visual_walkthrough-0.2.0/CHANGELOG.md +69 -0
  4. cc_visual_walkthrough-0.2.0/LICENSE +21 -0
  5. cc_visual_walkthrough-0.2.0/PKG-INFO +195 -0
  6. cc_visual_walkthrough-0.2.0/README.md +168 -0
  7. cc_visual_walkthrough-0.2.0/demo/app.py +222 -0
  8. cc_visual_walkthrough-0.2.0/demo/ccwalk.yaml +29 -0
  9. cc_visual_walkthrough-0.2.0/demo/custom_actions.py +19 -0
  10. cc_visual_walkthrough-0.2.0/demo/static/htmx.min.js +1 -0
  11. cc_visual_walkthrough-0.2.0/demo/tour.py +129 -0
  12. cc_visual_walkthrough-0.2.0/pyproject.toml +69 -0
  13. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/__init__.py +22 -0
  14. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/actions.py +241 -0
  15. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/browser.py +38 -0
  16. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/cli.py +388 -0
  17. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/config.py +234 -0
  18. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/doctor.py +183 -0
  19. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/helpers.py +208 -0
  20. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/reporters.py +359 -0
  21. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/runner.py +454 -0
  22. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/serve.py +434 -0
  23. cc_visual_walkthrough-0.2.0/src/cc_visual_walkthrough/specs.py +181 -0
  24. cc_visual_walkthrough-0.2.0/tests/test_actions_runner.py +411 -0
  25. cc_visual_walkthrough-0.2.0/tests/test_publish_fixes.py +175 -0
  26. cc_visual_walkthrough-0.2.0/tests/test_reporters.py +221 -0
  27. cc_visual_walkthrough-0.2.0/tests/test_review_fixes.py +366 -0
  28. cc_visual_walkthrough-0.2.0/tests/test_serve.py +162 -0
  29. cc_visual_walkthrough-0.2.0/tests/test_specs_config.py +299 -0
@@ -0,0 +1,5 @@
1
+ # Env-var NAMES referenced by ccwalk.yaml live here as examples.
2
+ # Real values go in your environment or an untracked .env.
3
+ # Demo app credentials (throwaway, hardcoded in demo/app.py on purpose):
4
+ CCWALK_DEMO_USER=demo
5
+ CCWALK_DEMO_PASS=demo123
@@ -0,0 +1,8 @@
1
+ .work/
2
+ __pycache__/
3
+ *.pyc
4
+ .venv/
5
+ reports/
6
+ dist/
7
+ .pytest_cache/
8
+ .ruff_cache/
@@ -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
+ [![CI](https://github.com/nickjrotundo/cc-visual-walkthrough/actions/workflows/ci.yml/badge.svg)](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
+ [![CI](https://github.com/nickjrotundo/cc-visual-walkthrough/actions/workflows/ci.yml/badge.svg)](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).