Skip to content

callumalpass/shell-report

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

shell-report

A local HTTP server that turns an HTML (or Markdown) file into a live, re-executable report. Any element with a data-cmd attribute becomes a cell: the server runs the command in your shell and streams the output back to the browser.

Zero npm dependencies. Node.js 18+. One file.

node sr.mjs report.html

Why

Coding agents build up a picture of a problem by running commands. They produce findings, but the human has no easy way to reproduce the context the agent had. A shell notebook solves this: the agent writes a single HTML file that is both a readable report and a self-re-executing document. Open it, click "Run all", and you have exactly the same view the agent had — verifiable, repeatable, shareable.

The snapshot export turns the live notebook into a static HTML file you can attach to a bug report or share with a colleague.


Install as a skill

shell-report is packaged as a skill for Claude Code and OpenAI Codex. Install it into your agent's skills directory and it will be automatically available in every project.

# Claude Code git clone https://github.com/callumalpass/shell-report ~/.claude/skills/shell-report # OpenAI Codex git clone https://github.com/callumalpass/shell-report ~/.codex/skills/shell-report

Once installed, the agent will suggest using shell-report when you ask it to document findings, generate a reproducible report, or validate a hypothesis. Run sr.mjs from the skill directory:

node ~/.claude/skills/shell-report/sr.mjs report.html node ~/.codex/skills/shell-report/sr.mjs report.html

Or clone anywhere and run directly — no install required.


Quick start

# Serve an HTML notebook node sr.mjs report.html # Serve a Markdown notebook node sr.mjs report.md # Fixed port, skip browser open node sr.mjs report.html --port 8080 --no-open # Override working directory (all commands run here) node sr.mjs report.html --cwd /path/to/project # Override shell node sr.mjs report.html --shell /bin/zsh

The server binds to 127.0.0.1 only and prints the URL on startup. Edit the source file and the browser reloads automatically.


HTML format

Add data-cmd to any element. The attribute value is the shell command. <pre> is recommended because it preserves whitespace.

<!DOCTYPE html> <html> <body> <h1>System report</h1> <h2>Node</h2> <pre data-cmd="node --version"></pre> <h2>Disk</h2> <pre data-cmd="df -h"></pre> <h2>Git log</h2> <pre data-cmd="git log --oneline -10"></pre> </body> </html>

Markdown format

Files with a .md extension are converted to HTML on each request. Fenced code blocks with cmd, sh, bash, zsh, or shell as the language tag become cells.

# Build diagnosis ## TypeScript errors ```bash pnpm tsc --noEmit 2>&1 | head -40 ``` ## Recent changes ```sh git log --oneline -5 ```

Inline command (single-line blocks)

Put the command on the same line as the fence:

```sh git log --oneline -10 ```

Extended attributes

Add attributes after a | separator:

```sh git log --oneline -10 | autorun timeout=30 var=log ```

Cell attributes

Attribute Description
data-cmd="command" Shell command to run. Required.
data-cmd-autorun Run automatically on page load (boolean, no value).
data-cmd-timeout="N" Per-cell timeout in seconds. Default: 30.
data-cmd-var="name" Capture trimmed stdout into window._vars.name on success.
data-cmd-transform="fn" Call window.fn(el, {stdout, stderr, exitCode}) instead of default rendering.
data-cmd-shell="bash" Per-cell shell override. Enables polyglot notebooks.

Variables

Pass one cell's output into another cell's command with {{name}}.

<!-- capture the current git SHA --> <pre data-cmd="git rev-parse HEAD" data-cmd-var="sha"></pre> <!-- use it in the next command --> <pre data-cmd="gh run list --commit {{sha}} --limit 5"></pre>

Variables are interpolated just before the command is sent to the server. If a placeholder can't be resolved, the cell enters the error state and lists which variables are currently available.


Transforms

data-cmd-transform names a window function that receives the element and the full result object. The function owns the element — it can render a chart, build a table, or do anything else.

<canvas data-cmd="cat metrics.json" data-cmd-transform="renderChart"></canvas> <script> function renderChart(el, { stdout }) { const data = JSON.parse(stdout); // render with Chart.js, D3, or the raw canvas API } </script>

Because transforms are plain JavaScript in the same document, an agent can generate both the command and its visualisation in one file.


Polyglot cells

data-cmd-shell runs a specific cell under a different interpreter:

<pre data-cmd="import json, sys; print(json.dumps({'x': 42}))" data-cmd-shell="python3"></pre> <pre data-cmd=". ~/.jq; echo '[1,2,3]' | jq 'add'" data-cmd-shell="bash"></pre>

Snapshot export

Click Save snapshot to download a static HTML file. The snapshot captures all current cell output, removes the runtime and play buttons, and produces a standalone document that opens in any browser with no server.


Execution model

  • Commands run as child processes: spawn($SHELL, ['-c', cmd])
  • Environment: full process.env is inherited — credentials, $PATH, shell functions, everything
  • Working directory: defaults to the directory you ran node sr.mjs from (override with --cwd)
  • Commands are serialised — one at a time — so output never interleaves
  • Streaming: stdout/stderr chunks arrive in the browser in real time via SSE
  • Timeout: each cell has a configurable timeout (default 30s); on expiry the process receives SIGTERM and the cell enters the error state

This is a single-user local tool. There is no sandboxing. The document author owns the commands and the credentials.


Examples

node sr.mjs examples/system.html node sr.mjs examples/git-report.md

About

AI agent skill for a zero-dependency shell report server: HTML/Markdown files with data-cmd attributes become re-executable reports in the browser

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors