Docs Code Validation

Automatically validate Python code blocks in documentation

Docs Code Validation

The praisonai docs command extracts and validates Python code blocks from your Mintlify documentation, ensuring all examples are runnable and correct.

Quick Start

bash
# List all Python code blocks in docs
praisonai docs list

# Run all runnable Python blocks (dry-run first)
praisonai docs run --dry-run

# Execute with reports
praisonai docs run --report-dir ./reports

Commands

praisonai docs run

Extracts Python code blocks from documentation, classifies them as runnable or partial, executes runnable blocks, and generates reports.

bash
praisonai docs run [OPTIONS]

Options:

OptionDefaultDescription
--docs-path, -pAuto-detectPath to documentation directory
--group, -gNoneRun only specific groups (top-level dirs), repeatable
--include, -i*Include patterns (glob)
--exclude, -eNoneExclude patterns (glob)
--languages, -lpythonLanguages to execute (comma-separated)
--timeout, -t60Per-snippet timeout in seconds
--max-snippetsNoneMaximum snippets to process
--fail-fast, -xFalseStop on first failure
--dry-runFalseDiscover and classify blocks without executing them (safe preview)
--mode, -mlenientlenient or strict
--report-dir, -r./reports/docs/[timestamp]Report output directory
--no-jsonFalseSkip JSON report
--no-mdFalseSkip Markdown report
--no-csvFalseSkip CSV report
--require-envNoneRequired env vars (skip if missing)
--pythonCurrent interpreterPython executable to use
--quiet, -qFalseMinimal output

Examples:

bash
# Run with custom docs path
praisonai docs run --docs-path /path/to/docs

# Run only specific groups (top-level directories)
praisonai docs run --group models --group tools

# Run only quickstart docs
praisonai docs run --include "quickstart*"

# Run with 2-minute timeout per snippet
praisonai docs run --timeout 120

# Strict mode - fail if any blocks can't be run
praisonai docs run --mode strict

# Limit to first 10 snippets for quick check
praisonai docs run --max-snippets 10

# Use specific Python interpreter
praisonai docs run --python /path/to/python

--dry-run preview mode

Use --dry-run to see exactly what docs run would execute — no subprocesses, no API calls, no cost.

bash
praisonai docs run --dry-run
Diagram

docs run –dry-run

Yes

No

📄 Doc File

🔍 Extract Blocks

🧠 Classify

Runnable?

📝 Record ‘not_run’

⏭️ Skip

📊 report.json

Every discovered runnable block is written to the report with:

  • status: not_run
  • skip_reason: "Dry run"
  • The runnable_decision field the classifier assigned (so you can audit which blocks would have run)

When to use --dry-run

Choose between --dry-run, --mode strict, and the default lenient run:

Diagram

Yes

No

Yes

No

🤔 What do you want?

Just check that
blocks are discovered?

✅ Use –dry-run

Want to fail CI if
any blocks are unrunnable?

✅ Use –mode strict

✅ Default lenient run

Contributor opening a docs PR — add an .mdx file with a Python block, run praisonai docs run --dry-run --docs-path ./docs, confirm the new block is classified not_run with skip_reason: "Dry run", then push so CI runs the full suite.

Maintainer auditing a large docs tree — run praisonai docs run --dry-run --report-dir ./audit, then filter report.csv for status=not_run to see the full inventory of runnable blocks — no cost, no LLM waiting.

CI PR-preview job — on PR events, call praisonai docs run --dry-run and upload report.md as an artifact so reviewers see what a real run would attempt without spending API tokens.

Example: preview before a real run

bash
# 1. See what would run
praisonai docs run --dry-run --report-dir ./preview

# 2. Inspect
cat ./preview/report.json | jq '.results[] | select(.skip_reason=="Dry run") | {source_path, block_index, runnable_decision}'

# 3. Real run once satisfied
praisonai docs run --report-dir ./actual

praisonai docs list

Lists all discovered code blocks without executing them.

bash
praisonai docs list [OPTIONS]

Options:

OptionDefaultDescription
--docs-path, -pAuto-detectPath to documentation directory
--group, -gNoneFilter by group (top-level dir)
--include, -iNoneInclude patterns (glob)
--exclude, -eNoneExclude patterns (glob)
--languages, -lpythonLanguages to show
--code, -cFalseShow code preview
--groupsFalseShow available groups only

Examples:

bash
# List available groups
praisonai docs list --groups

# List blocks in specific group
praisonai docs list --group models --code

Code Block Classification

The system classifies each Python code block as:

StatusDescription
RunnableHas imports AND terminal action (.start(), print(), etc.)
PartialMissing imports or incomplete – not executed
SkippedMarked with skip directive or contains input()

Terminal Actions Detected

  • agents.start() / agent.start()
  • print()
  • asyncio.run()
  • if __name__ == "__main__":

Directives

Control execution behavior with HTML comments above code blocks:

markdown
<!-- praisonai: runnable=true timeout=120 require_env=OPENAI_API_KEY -->
```python
from praisonaiagents import Agent
agent = Agent(instructions="test")
agent.start()
### Available Directives

| Directive | Values | Description |
|-----------|--------|-------------|
| `runnable` | `true/false` | Force block to be runnable or skipped |
| `skip` | `true/false` | Skip this block entirely |
| `timeout` | seconds | Custom timeout for this block |
| `require_env` | `KEY1,KEY2` | Required environment variables |

## Reports

Reports are generated in the specified directory:

reports/docs/[timestamp]/ ├── report.json # Machine-readable results ├── report.md # Human-readable summary ├── report.csv # CSV for quick scanning/filtering └── logs/ ├── quickstart__0.stdout.log └── quickstart__0.stderr.log

### CSV Report

The CSV report contains one row per item for easy filtering:

| Column | Description |
|--------|-------------|
| `suite` | "docs" |
| `group` | Top-level directory (e.g., "models", "tools") |
| `item_id` | Unique identifier |
| `source_path` | Path to doc file |
| `block_index` | Code block index in file |
| `status` | passed/failed/skipped/timeout/not_run |
| `duration_seconds` | Execution time |
| `error_message` | Error details if failed |
| `code_hash` | Content hash for change tracking |

### JSON Report Schema

```json
{
  "metadata": {
    "timestamp": "2026-01-09T11:30:00Z",
    "platform": "Darwin-23.0.0-arm64",
    "python_version": "3.11.0",
    "praisonai_version": "2.0.0",
    "docs_path": "/path/to/docs",
    "totals": {
      "passed": 10,
      "failed": 2,
      "skipped": 5,
      "timeout": 0,
      "not_run": 15
    }
  },
  "results": [
    {
      "item_id": "docs/quickstart.mdx::0",
      "source_path": "docs/quickstart.mdx",
      "block_index": 0,
      "language": "python",
      "line_start": 30,
      "line_end": 39,
      "runnable_decision": "heuristic_standalone",
      "status": "not_run",
      "skip_reason": "Dry run",
      "code_hash": "sha256:…"
    }
  ]
}

skip_reason: "Dry run" identifies items that were only previewed. Other not_run items come from runnable=false directives or lenient-mode classification.

CI/CD Integration

Add to your GitHub Actions workflow:

yaml
name: Docs Validation

on: [push, pull_request]

jobs:
  validate-docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install dependencies
        run: pip install praisonai

      - name: Validate docs code blocks
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        run: |
          praisonai docs run \
            --docs-path ./docs \
            --report-dir ./reports \
            --no-stream

      - name: Upload reports
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: docs-validation-report
          path: ./reports/

Pull-request preview (no API keys required):

yaml
- name: Preview docs code blocks (no execution)
  run: |
    praisonai docs run \
      --docs-path ./docs \
      --dry-run \
      --report-dir ./preview

- name: Comment discovery summary
  # Post the report.md as a PR comment so reviewers see what a full run would attempt

praisonai docs run-all

Runs all documentation code blocks group-by-group with parallel execution by default.

bash
praisonai docs run-all [OPTIONS]

Options:

OptionDefaultDescription
--docs-path, -pAuto-detectPath to documentation directory
--timeout, -t60Per-snippet timeout in seconds
--report-dir, -r~/Downloads/reports/docs/[timestamp]Report output directory
--parallel/--sequentialparallelRun groups in parallel or sequential
--workers, -w4Max parallel workers
--quiet, -qFalseMinimal output
--ciFalseCI-friendly output (no colors, proper exit codes)

Examples:

bash
# Run all groups in parallel (default)
praisonai docs run-all

# Run sequentially for debugging
praisonai docs run-all --sequential

# Run with more workers for faster execution
praisonai docs run-all --workers 8

# CI-friendly output
praisonai docs run-all --ci

praisonai docs stats

Shows statistics for documentation code blocks by group.

bash
praisonai docs stats [OPTIONS]

Options:

OptionDefaultDescription
--docs-path, -pAuto-detectPath to documentation directory
--group, -gNoneFilter by group (top-level dir)
--languages, -lpythonLanguages to show

Exit Codes

CodeMeaning
0All runnable blocks passed
1One or more blocks failed or timed out
2Invalid path or configuration error

In strict mode (--mode strict), exit code 1 is also returned if any blocks are marked as not_run.


CLI Command Validation

The praisonai docs cli subcommand group validates CLI commands found in bash code blocks within documentation. It discovers praisonai commands and validates them by running with --help to ensure they exist and work correctly.

Quick Start

bash
# Show CLI command statistics
praisonai docs cli stats

# List all discovered CLI commands
praisonai docs cli list

# Validate all CLI commands from docs
praisonai docs cli run-all

# Validate with limited scope
praisonai docs cli run-all --max-items 10 --timeout 5

praisonai docs cli run-all

Validates all CLI commands from documentation by running each with --help.

bash
praisonai docs cli run-all [OPTIONS]

Options:

OptionDefaultDescription
--docs-path, -p~/PraisonAIDocs/docs/cliPath to CLI documentation directory
--timeout, -t10Per-command timeout in seconds
--report-dir, -r~/Downloads/reports/docs-cli/<timestamp>Report output directory
--parallel/--sequentialparallelRun commands in parallel or sequential
--workers, -w4Max parallel workers
--max-itemsNoneMaximum commands to run
--group, -gNoneRun only specific groups (repeatable)
--quiet, -qFalseMinimal output
--ciFalseCI-friendly output (no colors, proper exit codes)

Examples:

bash
# Run all CLI commands in parallel (default)
praisonai docs cli run-all

# Validate first 10 commands for quick check
praisonai docs cli run-all --max-items 10

# Run with more workers for faster execution
praisonai docs cli run-all --workers 8

# CI-friendly output with proper exit codes
praisonai docs cli run-all --ci --timeout 5

# Run sequentially for debugging
praisonai docs cli run-all --sequential

praisonai docs cli list

Lists all discovered CLI commands from documentation without executing them.

bash
praisonai docs cli list [OPTIONS]

Options:

OptionDefaultDescription
--docs-path, -pAuto-detectPath to documentation directory
--group, -gNoneFilter by group (repeatable)
--runnableFalseShow only runnable commands
--groupsFalseShow available groups only

Examples:

bash
# List all CLI commands
praisonai docs cli list

# List available groups
praisonai docs cli list --groups

# List only runnable commands
praisonai docs cli list --runnable

praisonai docs cli stats

Shows statistics for CLI commands found in documentation.

bash
praisonai docs cli stats [OPTIONS]

Options:

OptionDefaultDescription
--docs-path, -pAuto-detectPath to documentation directory

Example Output:

CLI Commands Statistics
========================================
Total commands:    1463
Runnable:          933
Skipped:           530

By Group:
----------------------------------------
  databases              31/37   runnable
  monitoring              8/9    runnable
  root                  894/1417 runnable

praisonai docs cli report

View CLI validation report with failures and error grouping.

bash
praisonai docs cli report [REPORT_DIR] [OPTIONS]

Options:

OptionDefaultDescription
--base-dir, -b~/Downloads/reports/docs-cliBase directory for auto-detection
--limit, -n20Max items to show (0 = unlimited)
--format, -ftableOutput format: table or json

Examples:

bash
# View latest report
praisonai docs cli report

# View specific report directory
praisonai docs cli report ./my-report

# JSON output for parsing
praisonai docs cli report --format json

Command Classification

CLI commands are classified as:

StatusDescription
RunnableValid praisonai command without placeholders
SkippedContains placeholders like <file>, [OPTIONS], or path/to/

Placeholder Detection

Commands are automatically skipped if they contain:

  • [OPTIONS] or [...]
  • <file>, <name>, <path> style placeholders
  • path/to/, /my/project/ style example paths
  • your_, example_ prefixed values

CI/CD Integration for CLI Validation

Add to your GitHub Actions workflow:

yaml
name: CLI Docs Validation

on: [push, pull_request]

jobs:
  validate-cli-docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install dependencies
        run: pip install praisonai

      - name: Validate CLI commands in docs
        run: |
          praisonai docs cli run-all \
            --docs-path ./docs/cli \
            --ci \
            --timeout 10

      - name: Upload reports
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: cli-validation-report
          path: ~/Downloads/reports/docs-cli/