- Fix staged files being silently cleared when commit uses inline files - Refactor step navigation to use direct go_to_step instead of fragile delta math - Change step numbers from i32 to u32 (reject negative values at parse time) - Add tour rm command to mark files for removal during carry-forward - Add tour reset command to clear session and remove tracked files - Consolidate duplicate recursive copy functions into shared copy_tree in utils - Validate step directories are sequential (detect corruption) - Detect binary files in diffs instead of showing garbage - Use /// doc comments on enum variants so clap generates proper help text - Remove custom Help subcommand in favor of clap's built-in --help - Add CorruptedTour error variant for integrity checks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.2 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Commands
cargo build # build the project
cargo run -- <cmd> # run a subcommand (e.g. cargo run -- init)
cargo test # run all tests
cargo test <name> # run a single test by name
cargo clippy # lint
What This Project Is
tour is a CLI tool for creating and navigating code tutorials as a series of snapshots. Authors create tours by committing file snapshots with explanations; readers step through them with next/prev.
Author workflow: tour init → tour add <files> → tour commit -m <msg> (repeat) → tour end -m <msg>
Reader workflow: tour start → tour next [n] / tour prev [n] / tour step <n> / tour reset
Architecture
Entry point is main.rs, which uses clap's derive macro to parse subcommands and dispatch to per-command modules.
On-disk format (stored in .tour/ in the project being toured):
.tour/steps/<N>/— one numbered directory per step (each step is a complete file snapshot).tour/steps/<N>/message— the commit message for that step.tour/session— tracks current reader position asSTEP=<n>.tour/staged— list of files staged for the next commit.tour/info— tour metadata (author, description, language, dates).tour/removed— list of files marked for removal in the next commit.tour/ended— marker file indicating the tour is finalized
Module layout:
init.rs— creates.tour/structure, collects tour metadata, updates.gitignoreadd.rs— stages files for the next commit;get_staged()reads the staged file listunstage.rs— removes files from stagingcommit.rs— commits staged files as a new step with carry-forward from previous step; only clears staging when staging was usedrm.rs— marks files for removal in the next commit (skipped during carry-forward)end.rs— finalizes the tour (writes.tour/endedmarker)step.rs— navigation:next,prev,step_n; handles file replacement, diff display, binary detectionreset.rs— resets tour session and removes tracked files from working directorystatus.rs— shows current step position and staged fileslist.rs— lists all steps with their messagesinfo.rs— tour metadata (author, description, language, dates)utils.rs— shared helpers:require_tour,get_current_step,get_tour_step,copy_tree, path validationerror.rs— unifiedTourErrorenum withDisplayimpl for user-facing messages; includesCorruptedTourfor integrity checks
Key design decisions:
- Each step is a complete snapshot —
commit.rscarries forward files from the previous step before overlaying new ones TourErroris the unified error type across all modules, withFrom<io::Error>for automatic conversionmain()catches errors and prints them withDisplayformat (notDebug) for user-friendly messages- Constants
TOUR_DIRandSESSION_PATHare defined inmain.rsand imported viacrate::
Testing: Integration tests in tests/integration.rs use tempfile crate to create isolated tour directories and test via Command-based process spawning.