Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
npx reproshot -- npm test
```

![ReproShot evidence card from an actual failing demo capture](docs/reproshot.svg)

ReproShot runs a command, shows its output as usual, and saves the useful debugging context in a local folder. There are no accounts, uploads, or hosted services.

## Try it
Expand Down Expand Up @@ -44,6 +42,10 @@ SHA256SUMS

The reports combine the command, exit status, runtime versions, Git state, redacted logs, and reproduction helpers. `changes.patch` is included when there are eligible tracked text changes. Source code and dependencies are not copied into the bundle.

Here is the compact summary from the generated demo capture:

![ReproShot evidence summary from an actual failing demo capture](docs/reproshot.svg)

Open `report.html` for the full report or share `reproshot.svg` as a compact summary. To replay the command, restore the recorded source revision, install the project dependencies, and run the appropriate helper from the project directory. Review any patch before applying it.

The Repro Score describes how much useful evidence was captured. It is not a promise that the bug will reproduce.
Expand Down Expand Up @@ -73,6 +75,6 @@ npm run check
npm run demo
```

The SVG above is generated from the committed demo capture. The examples intentionally fail so the full capture path can be tested.
The SVG is generated from the committed demo capture. The examples intentionally fail so the full capture path can be tested.

[Contributing](CONTRIBUTING.md) · [Security](SECURITY.md) · [Release procedure](docs/releasing.md) · [MIT license](LICENSE)
8 changes: 5 additions & 3 deletions README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
npx reproshot -- npm test
```

![Карточка ReproShot из настоящего демонстрационного запуска](docs/reproshot.svg)

ReproShot запускает команду, показывает её вывод в терминале и сохраняет полезный для отладки контекст в локальную папку. Никаких аккаунтов, загрузки данных или внешних сервисов.

## Попробовать
Expand Down Expand Up @@ -44,6 +42,10 @@ SHA256SUMS

В отчёт входят команда, код завершения, версии используемых инструментов, состояние Git, очищенные логи и скрипты для повторного запуска. `changes.patch` добавляется, если есть подходящие отслеживаемые текстовые изменения. Исходный код и зависимости в папку отчёта не копируются.

Ниже — краткая сводка из сгенерированного демонстрационного отчёта:

![Сводка ReproShot из настоящего демонстрационного запуска](docs/reproshot.svg)

Полный отчёт можно открыть в `report.html`, а `reproshot.svg` удобно использовать как краткую сводку. Для повторного запуска восстановите указанную ревизию, установите зависимости проекта и запустите подходящий скрипт из папки проекта. Перед применением патча обязательно просмотрите его.

Repro Score показывает, насколько полно собраны полезные данные. Он не гарантирует, что ошибку удастся воспроизвести.
Expand Down Expand Up @@ -73,6 +75,6 @@ npm run check
npm run demo
```

SVG выше создан из сохранённого демонстрационного запуска ReproShot. Примеры намеренно завершаются с ошибкой, чтобы проверить весь процесс создания отчёта.
SVG создан из сохранённого демонстрационного запуска ReproShot. Примеры намеренно завершаются с ошибкой, чтобы проверить весь процесс создания отчёта.

[Как внести вклад](CONTRIBUTING.md) · [Безопасность](SECURITY.md) · [Процедура релиза](docs/releasing.md) · [Лицензия MIT](LICENSE)
2 changes: 1 addition & 1 deletion docs/reproshot.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 6 additions & 6 deletions examples/generated/SHA256SUMS
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
26fabe5d4a147b92878332536bbcffd4dfae94d83ed56d79c008cb0e3b735146 reproduce.ps1
4d79b81c86d78d1ddcab4ec23206424c995376df7f5f5e2d8f4b7233fe4ecc91 report.html
576122ffa150f97223e22dd559ceb4c8fa3f3139e868f09a5daf4c6f88412142 report.md
06c5c16c797b0d8e75b8ca4ec88fef67efeb543924344c8c106d3009f2032004 reproduce.ps1
2672549216e32aaf7a54a4a53f7eb9025257afedbce168ded690cbe6a5103473 stderr.log
29a415cbc780b0b2b81c4490fefb104057911e8f1bcf0815707c43230ec52e2c report.html
60580f03221e1e294ad4caff4859b1dec74e759b2508c8037ff4040e7cc2d09d reproduce.sh
7dc4e183eb6eb9b1818bfc897c744bd408f2161964dc515f4c8d9094319b95af reproshot.svg
aadcf480c8e6a4b589ddef44a269127bdb439ee9de6c5d0c4ff9b9bdbbb3ca74 reproshot.svg
d27559dcd15a97fcee4a58493b88233a334e6f6c15c86a3ae280574eb9081326 stdout.log
eafd8fcfdc540fde17396f91e0da00be034fdb8e1883d767e5ee337e0b43ced6 manifest.json
ff8a569c89e7dad8a27d97bdd17b6915341dbd0c782576dfae0c2009360a8411 stderr.log
d9177d0ce3c9163d1494bced39780bd2099b2a02abca2ca6482555fbb0bc1249 report.md
fb9ab03fc1b6046a575ef08b6a476390209fbe7e887031bc7fc65325ce8262da manifest.json
4 changes: 2 additions & 2 deletions examples/generated/report.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; img-src 'self' data:; base-uri 'none'; form-action 'none'"><title>ReproShot · failure</title><style>
:root{color-scheme:dark light;--bg:#0c111b;--panel:#141d2b;--line:#293448;--text:#eaf0fa;--muted:#a8b5ca;--accent:#8ce0c3;--red:#ffa2ac}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:16px/1.6 system-ui,sans-serif}main{max-width:1024px;margin:0 auto;padding:48px 24px}header{display:flex;justify-content:space-between;gap:24px;align-items:center}.brand{letter-spacing:.2em;font-size:13px;color:var(--accent);font-weight:750}h1{font-size:clamp(28px,5vw,42px);letter-spacing:-.04em;line-height:1.15;margin:18px 0}h2{font-size:19px;margin:28px 0 14px}.muted,small{color:var(--muted)}.score{flex-shrink:0;text-align:right}.score b{font-size:50px;line-height:1.1;font-weight:650;color:var(--accent)}.score span{display:block;font-size:12px;letter-spacing:.08em}.command,pre{white-space:pre-wrap;overflow-wrap:anywhere;background:var(--panel);border:1px solid var(--line);padding:20px;border-radius:12px;font:13px/1.65 ui-monospace,SFMono-Regular,Consolas,monospace}.command{font-size:17px;border-left:3px solid var(--red);margin:28px 0}.facts{display:grid;grid-template-columns:repeat(4,1fr);border:1px solid var(--line);border-radius:12px;overflow:hidden}.fact{padding:18px;border-right:1px solid var(--line)}.fact:last-child{border:0}.fact small{display:block}.fact strong{font-weight:550}.grid{display:grid;grid-template-columns:1fr 1fr;gap:32px}dl{display:grid;grid-template-columns:105px minmax(0,1fr);gap:8px 14px;font-size:14px}dt{color:var(--muted)}dd{margin:0;overflow-wrap:anywhere}a{color:var(--accent)}ul{padding-left:20px}.files{display:flex;flex-wrap:wrap;gap:8px;padding:0;list-style:none}.files a{display:block;padding:7px 12px;border:1px solid var(--line);border-radius:7px;text-decoration:none;font:12px ui-monospace,monospace}footer{border-top:1px solid var(--line);margin-top:30px;padding-top:20px;font-size:12px;color:var(--muted)}summary{cursor:pointer;font-weight:600}details{margin-top:22px}pre{max-height:520px;overflow:auto}.notice{color:var(--muted);font-size:13px}@media(max-width:650px){main{padding:28px 18px}.grid{grid-template-columns:1fr;gap:0}.facts{grid-template-columns:1fr 1fr}.score b{font-size:36px}.fact{border-bottom:1px solid var(--line)}}@media(prefers-color-scheme:light){:root{--bg:#f6f8fc;--panel:#fff;--line:#d5dce8;--text:#142039;--muted:#516078;--accent:#0b7056;--red:#c33951}}
</style></head><body><main><header><div><div class="brand">REPROSHOT / LOCAL CAPTURE</div><h1>Failure, with context.</h1><div class="muted">One command. A report you can share.</div></div><div class="score"><b>100</b> / 100<span>REPRO SCORE</span></div></header><div class="command">npm test</div><section class="facts"><div class="fact"><small>Exit</small><strong>1</strong></div><div class="fact"><small>Duration</small><strong>0.28s</strong></div><div class="fact"><small>Commit</small><strong>ab9e455</strong></div><div class="fact"><small>Secrets</small><strong>2 redacted</strong></div></section><div class="grid"><section><h2>Environment</h2><dl><dt>System</dt><dd>linux 6.18.44 / x64</dd><dt>Directory</dt><dd>/tmp/reproshot-demo-GezJVt</dd><dt>node</dt><dd>24.19.0</dd><dt>npm</dt><dd>11.9.0</dd><dt>pnpm</dt><dd>11.19.0</dd><dt>python</dt><dd>3.12.14</dd><dt>pip</dt><dd>26.2.1</dd><dt>java</dt><dd>17.0.20</dd></dl></section><section><h2>Source state</h2><dl><dt>Commit</dt><dd>ab9e455f17d3754be6f3d65a26e7b5683358b801</dd><dt>Branch</dt><dd>main</dd><dt>Working tree</dt><dd>Clean</dd><dt>Patch</dt><dd>none</dd><dt>Captured</dt><dd>2026-09-13T13:20:27.722Z</dd><dt>Signal</dt><dd>None</dd></dl></section></div><h2>Reproduce</h2><p class="notice">Captured on linux x64. Versions: node 24.19.0, npm 11.9.0, pnpm 11.19.0, python 3.12.14, pip 26.2.1, java 17.0.20.
:root{color-scheme:dark light;--bg:#0d1117;--panel:#161b22;--line:#30363d;--text:#e6edf3;--muted:#8b949e;--accent:#58a6ff;--red:#f85149;--green:#3fb950;--amber:#d29922}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:15px/1.6 system-ui,sans-serif}main{max-width:960px;margin:0 auto;padding:36px 24px}header{border-bottom:1px solid var(--line);padding-bottom:18px}.brand{font:600 14px ui-monospace,SFMono-Regular,Consolas,monospace;color:var(--muted);letter-spacing:.08em;text-transform:uppercase}h1{font-size:28px;line-height:1.25;margin:6px 0 0}.status-failure,.status-spawn-error{color:var(--red)}.status-success{color:var(--green)}.status-interrupted{color:var(--amber)}h2{font-size:18px;margin:28px 0 12px}.muted,small{color:var(--muted)}.command,pre{white-space:pre-wrap;overflow-wrap:anywhere;background:var(--panel);border:1px solid var(--line);padding:16px;border-radius:5px;font:13px/1.65 ui-monospace,SFMono-Regular,Consolas,monospace}.command{font-size:16px;border-left:3px solid var(--accent);margin:22px 0}.command::before{content:'$ ';color:var(--accent)}.facts{display:grid;grid-template-columns:repeat(5,1fr);border-block:1px solid var(--line)}.fact{padding:13px 14px;border-right:1px solid var(--line)}.fact:first-child{padding-left:0}.fact:last-child{border:0}.fact small{display:block}.fact strong{font:500 13px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace}.grid{display:grid;grid-template-columns:1fr 1fr;gap:32px}dl{display:grid;grid-template-columns:105px minmax(0,1fr);gap:8px 14px;font-size:14px}dt{color:var(--muted)}dd{margin:0;overflow-wrap:anywhere}a{color:var(--accent)}ul{padding-left:20px}.files{display:flex;flex-wrap:wrap;gap:8px;padding:0;list-style:none}.files a{display:block;padding:6px 10px;border:1px solid var(--line);border-radius:4px;text-decoration:none;font:12px ui-monospace,SFMono-Regular,Consolas,monospace}footer{border-top:1px solid var(--line);margin-top:30px;padding-top:18px;font-size:12px;color:var(--muted)}summary{cursor:pointer;font-weight:600}details{margin-top:22px}pre{max-height:520px;overflow:auto}.notice{color:var(--muted);font-size:13px}@media(max-width:720px){main{padding:28px 18px}.grid{grid-template-columns:1fr;gap:0}.facts{grid-template-columns:1fr 1fr}.fact,.fact:first-child{padding:12px;border-bottom:1px solid var(--line)}}@media(prefers-color-scheme:light){:root{--bg:#f6f8fa;--panel:#fff;--line:#d0d7de;--text:#1f2328;--muted:#59636e;--accent:#0969da;--red:#cf222e;--green:#1a7f37;--amber:#9a6700}}
</style></head><body><main><header><div class="brand">ReproShot</div><h1 class="status-failure">Capture failed</h1></header><div class="command">npm test</div><section class="facts"><div class="fact"><small>Exit</small><strong>1</strong></div><div class="fact"><small>Duration</small><strong>0.28s</strong></div><div class="fact"><small>Commit</small><strong>ab9e455</strong></div><div class="fact"><small>Secrets</small><strong>2 redacted</strong></div><div class="fact"><small>Repro Score</small><strong>100/100</strong></div></section><div class="grid"><section><h2>Environment</h2><dl><dt>System</dt><dd>linux 6.18.44 / x64</dd><dt>Directory</dt><dd>/tmp/reproshot-demo-GezJVt</dd><dt>node</dt><dd>24.19.0</dd><dt>npm</dt><dd>11.9.0</dd><dt>pnpm</dt><dd>11.19.0</dd><dt>python</dt><dd>3.12.14</dd><dt>pip</dt><dd>26.2.1</dd><dt>java</dt><dd>17.0.20</dd></dl></section><section><h2>Source state</h2><dl><dt>Commit</dt><dd>ab9e455f17d3754be6f3d65a26e7b5683358b801</dd><dt>Branch</dt><dd>main</dd><dt>Working tree</dt><dd>Clean</dd><dt>Patch</dt><dd>none</dd><dt>Captured</dt><dd>2026-09-13T13:20:27.722Z</dd><dt>Signal</dt><dd>None</dd></dl></section></div><h2>Reproduce</h2><p class="notice">Captured on linux x64. Versions: node 24.19.0, npm 11.9.0, pnpm 11.19.0, python 3.12.14, pip 26.2.1, java 17.0.20.
Use the project working directory (/tmp/reproshot-demo-GezJVt). Restore source revision ab9e455f17d3754be6f3d65a26e7b5683358b801, review any patch, and prepare dependencies yourself.
Environment variable values were not collected. Review the command before running.</p><pre>&#39;npm&#39; &#39;test&#39;

Expand Down
Loading