pytorial
A Python library for interactive command-line tutorials.
Install
pipx install pytorial
# or
uv tool install pytorial
To run from a clone instead of an installed copy, see
CONTRIBUTING.md.
Usage
The package ships with three built-in tutorials. The first one is a self-guided tour of the tool itself:
tutorial run using-tutorials
Companion tours: tutorial run shell-basics (shell and editor skills)
and tutorial run writing-tutorials (authoring tutorials of your own).
Discover what's available
tutorial list
Pipe the same command into a script to get tab-separated rows instead of the rich table.
Run or resume
tutorial run <id> # start or resume saved progress
tutorial run --restart <id> # discard saved progress and start over
Review past runs
tutorial review <id>
tutorial review <id> --step 2
tutorial review <id> --run-id <run-id>
Trust author-supplied shell code
tutorial run --allow-shell <id>
A tutorial step may declare pre_command, check_command, or
post_command. Those fields run author-supplied shell code, so they are
opt-in: pass --allow-shell only when you trust the tutorial author.
Writing tutorials
Take the interactive walkthrough first:
tutorial run writing-tutorials
File format
A tutorial is a single Markdown file beginning with YAML front matter:
---
id: my-tutorial
title: My Tutorial
summary: One-line description shown by `tutorial list`.
---
# First step
```tutorial-step
required_patterns:
- some-command
hint: Try running `some-command`.
```
Step body in Markdown.
- Required front-matter fields:
id,title,summary. - Each top-level
# Headingbecomes one step. - A step may begin with a fenced
tutorial-stepYAML block. Recognised fields arerequired_patterns,pre_command,check_command,post_command,hint,edit_file,kind,options, andanswers. - Without
kindoredit_file, a step opens an interactive shell. edit_fileopens a workspace-relative file in$EDITOR, falling back tovim,vi, ornanowhen$EDITORis unset.kind: input,kind: single_select, andkind: multi_selectprompt directly in the CLI instead of opening a shell or editor.inputanswers use the same string-or-{mode, pattern}format asrequired_patterns; select questions use literal option text inoptionsandanswers.pre_command,check_command, andpost_commandonly run when the reader passes--allow-shell.- Use one YAML string for each shell field. Multi-line shell scripts
should use YAML
|so one bash process sees the whole script and keepscd,export, and shell options across lines. - Do not use YAML
>for shell fields: it folds newlines into spaces and can break shell syntax.
Share and install
Install a tutorial Markdown file or URL into the user's tutorial directory:
tutorial install path/to/tutorial.md
tutorial install https://example.com/tutorial.md
tutorial install --force path/to/tutorial.md
Use --force to overwrite an installed tutorial with the same id.
The standalone CLI auto-loads installed tutorials alongside the
built-ins.
Load ad hoc
To use a tutorial without installing it, point at the file or directory on the command line:
tutorial list --tutorial-path some/dir
tutorial run --tutorial-path some/dir <id>
--tutorial-path may be repeated and is appended after the built-ins.
Embedding the CLI
The package can be mounted as a subcommand inside another Typer or
argparse application via add_typer_subcommand and
add_argparse_subcommand in src/pytorial/cli.py. Embedded hosts
prepend the using-tutorials lesson before host-specific tutorials, do
not load the user's installed tutorial directory, and hide the
standalone-only install command.
Contributing
For the literate sources, the make build, and the repo layout, see
CONTRIBUTING.md.
Metadata
Release files for pytorial 0.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pytorial-0.7.tar.gz | 11.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pytorial-0.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 51.7 kB
Release files / pytorial-0.7.tar.gz
| Download URL | pytorial-0.7.tar.gz |
|---|---|
| Size | 11.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b942eb68d7dfe01aeb93112574d98fff2702b6b71960169a8ff75d74e5bee801
|
|
BLAKE2b-256 checksum How to use checksums |
3ae9cadb834b4dba4195989837518f0352bbe6f605ffd4e1159fc5070916efd1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.3.4 CPython/3.13.7 Linux/6.17.0-41-generic
|
Release files / pytorial-0.7-py3-none-any.whl
| Download URL | pytorial-0.7-py3-none-any.whl |
|---|---|
| Size | 40.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
aabe30508b6b6da496370f7b836f6dd6a66dde33d2ea211d35650132a8c346bc
|
|
BLAKE2b-256 checksum How to use checksums |
480928c39dbb8cbbfa31d75c5474dc955d5717c4c181849a7f277de96e258f58
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.3.4 CPython/3.13.7 Linux/6.17.0-41-generic
|