Skip to main content

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

The command is installed both as pytorial and as the alias tutorial. The examples use tutorial because the same spelling also works when the CLI is embedded as a tutorial subcommand inside a host application.

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 # Heading becomes one step.
  • A step may begin with a fenced tutorial-step YAML block. Recognised fields are required_patterns, pre_command, check_command, post_command, hint, edit_file, kind, options, and answers.
  • Without kind or edit_file, a step opens an interactive shell.
  • edit_file opens a workspace-relative file in $EDITOR, falling back to vim, vi, or nano when $EDITOR is unset.
  • kind: input, kind: single_select, and kind: multi_select prompt directly in the CLI instead of opening a shell or editor. input answers use the same string-or-{mode, pattern} format as required_patterns; select questions use literal option text in options and answers.
  • pre_command, check_command, and post_command only 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 keeps cd, 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.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pytorial 0.8
File Size Uploaded
pytorial-0.8.tar.gz 11.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pytorial 0.8
File Interpreter ABI Platform
pytorial-0.8-py3-none-any.whl Python 3 none any Details

Total release size: 52.2 kB

Release files / pytorial-0.8.tar.gz

Download URL pytorial-0.8.tar.gz
Size 11.9 kB
Tags Source
SHA-256 checksum
How to use checksums
8d7cdb3529fc7a376c35e8fd055bec088ad7e4e613da3f0533bbfbb253a55511
BLAKE2b-256 checksum
How to use checksums
79ecfb2526f3fd23b6d2c05fbefed87e31fff08022fde3ac1ff0e3ae1f9acb10
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.8-py3-none-any.whl

Download URL pytorial-0.8-py3-none-any.whl
Size 40.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
35721c398bf371780ea613544c48674fa856947ab7ed3305217277f18b2a1f11
BLAKE2b-256 checksum
How to use checksums
b29ccddbd831bf555b146468179fab8c1d7ad4e6ee5441de6bc2d82f8097e5ec
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 history Release notifications | RSS feed

0.10.1

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.1

2 release files

This release

0.8 This release

2 release files

0.7

2 release files

0.6

2 release files

0.5

2 release files

0.4

2 release files

0.3

2 release files

0.2

2 release files

0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page