debugbrief 1.4.0__tar.gz → 1.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. {debugbrief-1.4.0 → debugbrief-1.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +1 -1
  2. {debugbrief-1.4.0 → debugbrief-1.4.1}/CHANGELOG.md +19 -5
  3. {debugbrief-1.4.0 → debugbrief-1.4.1}/CONTRIBUTING.md +41 -2
  4. debugbrief-1.4.1/PKG-INFO +214 -0
  5. debugbrief-1.4.1/README.md +174 -0
  6. {debugbrief-1.4.0 → debugbrief-1.4.1}/SECURITY.md +46 -19
  7. {debugbrief-1.4.0 → debugbrief-1.4.1}/docs/COMMANDS.md +66 -17
  8. debugbrief-1.4.1/docs/maintainers.md +86 -0
  9. {debugbrief-1.4.0 → debugbrief-1.4.1}/pyproject.toml +1 -1
  10. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/docs.html +4 -4
  11. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/__init__.py +1 -1
  12. debugbrief-1.4.1/src/debugbrief.egg-info/PKG-INFO +214 -0
  13. debugbrief-1.4.0/PKG-INFO +0 -174
  14. debugbrief-1.4.0/README.md +0 -134
  15. debugbrief-1.4.0/docs/maintainers.md +0 -69
  16. debugbrief-1.4.0/src/debugbrief.egg-info/PKG-INFO +0 -174
  17. {debugbrief-1.4.0 → debugbrief-1.4.1}/.github/CODEOWNERS +0 -0
  18. {debugbrief-1.4.0 → debugbrief-1.4.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  19. {debugbrief-1.4.0 → debugbrief-1.4.1}/.github/workflows/ci.yml +0 -0
  20. {debugbrief-1.4.0 → debugbrief-1.4.1}/.github/workflows/pages.yml +0 -0
  21. {debugbrief-1.4.0 → debugbrief-1.4.1}/.github/workflows/release.yml +0 -0
  22. {debugbrief-1.4.0 → debugbrief-1.4.1}/.github/workflows/site.yml +0 -0
  23. {debugbrief-1.4.0 → debugbrief-1.4.1}/LICENSE +0 -0
  24. {debugbrief-1.4.0 → debugbrief-1.4.1}/MANIFEST.in +0 -0
  25. {debugbrief-1.4.0 → debugbrief-1.4.1}/docs/PLATFORM_VERIFICATION.md +0 -0
  26. {debugbrief-1.4.0 → debugbrief-1.4.1}/docs/REAL_PROJECT_VERIFICATION.md +0 -0
  27. {debugbrief-1.4.0 → debugbrief-1.4.1}/docs/SAFARI_ACCESSIBILITY_VERIFICATION.md +0 -0
  28. {debugbrief-1.4.0 → debugbrief-1.4.1}/docs/TRANSFORMATION.md +0 -0
  29. {debugbrief-1.4.0 → debugbrief-1.4.1}/docs/demo.gif +0 -0
  30. {debugbrief-1.4.0 → debugbrief-1.4.1}/docs/demo.tape +0 -0
  31. {debugbrief-1.4.0 → debugbrief-1.4.1}/examples/sample-handoff.md +0 -0
  32. {debugbrief-1.4.0 → debugbrief-1.4.1}/examples/sample-incident.md +0 -0
  33. {debugbrief-1.4.0 → debugbrief-1.4.1}/examples/sample-pr.md +0 -0
  34. {debugbrief-1.4.0 → debugbrief-1.4.1}/scripts/check_site.py +0 -0
  35. {debugbrief-1.4.0 → debugbrief-1.4.1}/scripts/generate_samples.py +0 -0
  36. {debugbrief-1.4.0 → debugbrief-1.4.1}/scripts/serve_site.py +0 -0
  37. {debugbrief-1.4.0 → debugbrief-1.4.1}/scripts/verify_wheel.py +0 -0
  38. {debugbrief-1.4.0 → debugbrief-1.4.1}/setup.cfg +0 -0
  39. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/.nojekyll +0 -0
  40. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/data/sample-handoff.json +0 -0
  41. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/data/sample-handoff.md +0 -0
  42. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/data/sample-incident.json +0 -0
  43. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/data/sample-incident.md +0 -0
  44. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/data/sample-pr.json +0 -0
  45. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/data/sample-pr.md +0 -0
  46. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/explorer.html +0 -0
  47. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/explorer.js +0 -0
  48. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/favicon.svg +0 -0
  49. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/index.html +0 -0
  50. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/sample-handoff.html +0 -0
  51. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/sample-incident.html +0 -0
  52. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/sample-report.html +0 -0
  53. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/site.css +0 -0
  54. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/site.js +0 -0
  55. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/social-preview.png +0 -0
  56. {debugbrief-1.4.0 → debugbrief-1.4.1}/site/stage.js +0 -0
  57. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/__main__.py +0 -0
  58. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/_process_guard.py +0 -0
  59. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/cli.py +0 -0
  60. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/command_runner.py +0 -0
  61. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/config.py +0 -0
  62. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/derive.py +0 -0
  63. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/doctor.py +0 -0
  64. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/filters.py +0 -0
  65. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/git_utils.py +0 -0
  66. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/markdown.py +0 -0
  67. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/models.py +0 -0
  68. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/paths.py +0 -0
  69. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/redaction.py +0 -0
  70. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/redo_safety.py +0 -0
  71. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/reporters/__init__.py +0 -0
  72. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/reporters/base.py +0 -0
  73. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/reporters/handoff.py +0 -0
  74. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/reporters/html.py +0 -0
  75. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/reporters/incident.py +0 -0
  76. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/reporters/pr.py +0 -0
  77. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/reports_index.py +0 -0
  78. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/session_manager.py +0 -0
  79. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/sessions_index.py +0 -0
  80. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief/utils.py +0 -0
  81. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief.egg-info/SOURCES.txt +0 -0
  82. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief.egg-info/dependency_links.txt +0 -0
  83. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief.egg-info/entry_points.txt +0 -0
  84. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief.egg-info/requires.txt +0 -0
  85. {debugbrief-1.4.0 → debugbrief-1.4.1}/src/debugbrief.egg-info/top_level.txt +0 -0
  86. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/conftest.py +0 -0
  87. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/snapshots/failing_incident_report.md +0 -0
  88. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/snapshots/failing_pr_report.md +0 -0
  89. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/snapshots/handoff_report.md +0 -0
  90. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/snapshots/incident_report.md +0 -0
  91. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/snapshots/no_test_pr_report.md +0 -0
  92. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/snapshots/pr_report.md +0 -0
  93. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_autostart.py +0 -0
  94. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_cancel.py +0 -0
  95. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_ci_workflow.py +0 -0
  96. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_cli_ergonomics.py +0 -0
  97. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_command_lease.py +0 -0
  98. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_command_runner.py +0 -0
  99. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_config.py +0 -0
  100. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_derive.py +0 -0
  101. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_doctor.py +0 -0
  102. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_e2e_cli.py +0 -0
  103. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_filters.py +0 -0
  104. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_git_utils.py +0 -0
  105. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_html_report.py +0 -0
  106. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_json_report.py +0 -0
  107. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_last_open.py +0 -0
  108. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_list_show.py +0 -0
  109. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_markdown_safety.py +0 -0
  110. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_paths.py +0 -0
  111. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_process_guard.py +0 -0
  112. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_product_trust.py +0 -0
  113. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_redaction.py +0 -0
  114. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_reporters.py +0 -0
  115. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_run_passthrough.py +0 -0
  116. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_runner_robustness.py +0 -0
  117. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_session_lifecycle.py +0 -0
  118. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_site.py +0 -0
  119. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_snapshots.py +0 -0
  120. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_state_dir_safety.py +0 -0
  121. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_state_file_safety.py +0 -0
  122. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_state_integrity.py +0 -0
  123. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_utils.py +0 -0
  124. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_v12_features.py +0 -0
  125. {debugbrief-1.4.0 → debugbrief-1.4.1}/tests/test_version.py +0 -0
@@ -21,7 +21,7 @@ body:
21
21
  attributes:
22
22
  label: DebugBrief version
23
23
  description: Output of `debugbrief --version`.
24
- placeholder: debugbrief 1.3.0
24
+ placeholder: debugbrief 1.4.1
25
25
  validations:
26
26
  required: true
27
27
  - type: input
@@ -5,6 +5,20 @@ All notable changes to DebugBrief are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.4.1] - 2026-10-16
9
+
10
+ ### Fixed
11
+
12
+ - Corrected the security policy's process-cleanup and local file-access descriptions.
13
+ - Made Git requirements and timestamp validation consistent across the README,
14
+ command reference and website docs. Added the missing recover reference and
15
+ clarified stdout formats and Explorer report imports.
16
+ - Rewrote the README for a shorter introduction and practical examples. Added
17
+ contributor browser checks and documented the actual repository protections
18
+ and token-free PyPI release workflow.
19
+ - Enabled the private vulnerability-reporting form referenced by the security policy.
20
+ - Command capture and report behavior are unchanged from 1.4.0.
21
+
8
22
  ## [1.4.0] - 2026-10-16
9
23
 
10
24
  ### Added
@@ -12,17 +26,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
12
26
  - Reports now expose an explicit `verified` or `unverified` evidence state and
13
27
  preserve the important caveat that DebugBrief does not infer a root cause.
14
28
  - `end --format html` writes a self-contained browser report, and `--format all`
15
- writes Markdown, JSON, and HTML together. HTML mode sections now follow the
16
- selected reader and omit sections with no evidence.
29
+ writes Markdown, JSON, and HTML together. HTML sections follow the
30
+ selected report mode and omit sections with no evidence.
17
31
  - The static product site lives in `site/` and presents the real workflow,
18
32
  report modes, trust boundary, and limitations. Fonts and optional homepage animation libraries load from a CDN.
19
33
  - `end --format html --open` writes and opens a self-contained HTML brief, `open --html` opens
20
34
  the newest HTML report, and `last --open` provides a one-step review path.
21
- - `preview --format html|json` renders machine-readable or browser-ready proofs
35
+ - `preview --format html|json` renders JSON or HTML previews
22
36
  without finalizing the active session.
23
37
  - PR and HTML reports now expose the verification scope and the captured failure
24
38
  excerpt, not only a pass/fail headline.
25
- - The supplied product-site design includes the animated red-to-green field,
39
+ - The product site includes the animated red-to-green field,
26
40
  light and dark themes, report tabs, install copying and a keyboard-accessible
27
41
  documentation section finder.
28
42
  - The Evidence Explorer reads local JSON reports in memory, with command/output
@@ -54,7 +68,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
54
68
  - Reports and JSON output now normalize untrusted legacy text without allowing
55
69
  modified filenames or tainted command/error fields to break Markdown structure.
56
70
  JSON scalar values remain plain, `last` handles malformed report files, and
57
- absolute project paths are a CLI-only opt-in.
71
+ the absolute project-root field is a CLI-only opt-in.
58
72
  - Invalid command end timestamps fall back to validated event or start timestamps,
59
73
  malformed persisted leaves degrade to controlled values, and multiline notes
60
74
  remain intact in storage while being escaped at report-rendering time.
@@ -12,7 +12,8 @@ DebugBrief intentionally does NOT:
12
12
  - make network calls at runtime,
13
13
  - capture shell history,
14
14
  - run a background daemon,
15
- - ship a runtime web UI or TUI (the repository may contain a static product site),
15
+ - run a web server as part of command capture. Self-contained HTML reports and
16
+ the separate static website are supported,
16
17
  - add new runtime dependencies. DebugBrief uses the standard library and native
17
18
  `git`, plus one conditional dependency: the `tomli` TOML parser on Python 3.9
18
19
  and 3.10, where the standard-library `tomllib` is not yet available.
@@ -45,6 +46,44 @@ deliberate):
45
46
  DEBUGBRIEF_UPDATE_SNAPSHOTS=1 pytest tests/test_snapshots.py
46
47
  ```
47
48
 
49
+ Run the same lint and type checks as CI:
50
+
51
+ ```bash
52
+ python -m ruff check src tests
53
+ python -m mypy src/debugbrief
54
+ ```
55
+
56
+ ## Website changes
57
+
58
+ The site is plain HTML, CSS and JavaScript; there is no build step. From the
59
+ repository root, `python3 scripts/serve_site.py` starts an uncached preview at
60
+ `http://127.0.0.1:8765`. Stop it when you finish.
61
+
62
+ Check local links and the generated report fixtures:
63
+
64
+ ```bash
65
+ python scripts/check_site.py
66
+ python scripts/generate_samples.py --check
67
+ ```
68
+
69
+ For browser tests, install Node.js and the pinned tools in `package-lock.json`:
70
+
71
+ ```bash
72
+ npm ci
73
+ npx playwright install --with-deps chromium
74
+ npm run test:site
75
+ ```
76
+
77
+ The browser suite checks imports, keyboard interaction, accessibility, reflow and
78
+ report privacy. Firefox and WebKit checks are available through
79
+ `npm run test:site:firefox` and `npm run test:site:webkit` after installing those
80
+ Playwright engines. Engine tests do not replace physical-device or screen-reader
81
+ checks.
82
+
83
+ When report rendering changes, regenerate the nine illustrative site fixtures
84
+ with `python scripts/generate_samples.py`, review the output, then run the check
85
+ again. Do not edit generated reports by hand or pass them off as real executions.
86
+
48
87
  ## Build the wheel
49
88
 
50
89
  ```bash
@@ -76,7 +115,7 @@ python -m debugbrief --help
76
115
  runtime dependencies. If one is truly unavoidable, justify it clearly in the
77
116
  pull request and README.
78
117
  - Add or update tests for any behavior you change. Core logic must stay tested.
79
- - Keep CLI output plain and human-readable.
118
+ - Keep CLI output plain and readable.
80
119
  - Be honest in code and docs. Do not fabricate report content, root causes,
81
120
  test results, or verification, and do not claim a command was run unless it
82
121
  was actually run. Do not include AI-generated fake summaries or fabricated
@@ -0,0 +1,214 @@
1
+ Metadata-Version: 2.4
2
+ Name: debugbrief
3
+ Version: 1.4.1
4
+ Summary: Records debugging commands, outcomes, notes, and Git changes, then generates evidence-backed reports for pull requests, handoffs, and incidents.
5
+ Author: Hari Krishna Kancharla
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/hari-kancharla/Debug-Brief
8
+ Project-URL: Repository, https://github.com/hari-kancharla/Debug-Brief
9
+ Project-URL: Documentation, https://github.com/hari-kancharla/Debug-Brief/tree/main/docs
10
+ Project-URL: Changelog, https://github.com/hari-kancharla/Debug-Brief/blob/main/CHANGELOG.md
11
+ Project-URL: Issues, https://github.com/hari-kancharla/Debug-Brief/issues
12
+ Project-URL: Security, https://github.com/hari-kancharla/Debug-Brief/security/policy
13
+ Keywords: cli,debugging,developer-tools,git,testing,pull-request,handoff,incident,report,terminal
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Environment :: Console
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Operating System :: POSIX
18
+ Classifier: Operating System :: MacOS
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.9
21
+ Classifier: Programming Language :: Python :: 3.10
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
26
+ Classifier: Topic :: Software Development
27
+ Requires-Python: >=3.9
28
+ Description-Content-Type: text/markdown
29
+ License-File: LICENSE
30
+ Requires-Dist: tomli>=2.0.1; python_version < "3.11"
31
+ Provides-Extra: dev
32
+ Requires-Dist: pytest>=7.0; extra == "dev"
33
+ Requires-Dist: ruff>=0.6; extra == "dev"
34
+ Requires-Dist: mypy>=1.8; extra == "dev"
35
+ Requires-Dist: build>=1.0; extra == "dev"
36
+ Provides-Extra: release
37
+ Requires-Dist: build>=1.0; extra == "release"
38
+ Requires-Dist: twine>=5.0; extra == "release"
39
+ Dynamic: license-file
40
+
41
+ # DebugBrief
42
+
43
+ [![CI](https://github.com/hari-kancharla/Debug-Brief/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/hari-kancharla/Debug-Brief/actions/workflows/ci.yml) [![PyPI](https://img.shields.io/pypi/v/debugbrief?cacheSeconds=3600)](https://pypi.org/project/debugbrief/)
44
+
45
+ Record commands and notes while you debug, then turn them into a report for a
46
+ pull request, a handoff, or an incident review.
47
+
48
+ DebugBrief keeps the actual commands, exit codes, output previews and Git changes.
49
+ It does not use AI or infer a root cause. You decide what to run and what to share.
50
+
51
+ ![A failing test, a fix, a passing rerun and the generated report](https://raw.githubusercontent.com/hari-kancharla/Debug-Brief/main/docs/demo.gif)
52
+
53
+ ## Install
54
+
55
+ Python 3.9 or newer on Linux or macOS. The project you debug can use any language.
56
+
57
+ ```bash
58
+ pipx install debugbrief
59
+ # or
60
+ uv tool install debugbrief
61
+ ```
62
+
63
+ Upgrade an existing installation with `pipx upgrade debugbrief` or
64
+ `uv tool upgrade debugbrief`. Inside an activated Python environment, use
65
+ `python -m pip install --upgrade debugbrief`.
66
+
67
+ The HTML and Explorer workflows below require DebugBrief 1.4.0 or newer.
68
+ Check your installed version with `debugbrief --version`. Install your project's
69
+ test tools and dependencies separately; DebugBrief does not install them for you.
70
+
71
+ ## Quickstart
72
+
73
+ Run this from your project, replacing the pytest command with your usual check:
74
+
75
+ ```bash
76
+ debugbrief run -- python -m pytest -q
77
+ # If it fails, edit the files and run the same command again:
78
+ debugbrief redo
79
+ debugbrief end --format html --open
80
+ ```
81
+
82
+ The first `run` starts a session automatically. A title and notes are optional:
83
+
84
+ ```bash
85
+ debugbrief start "Handle an expired cache entry"
86
+ debugbrief note "Expired entries still reach the read path."
87
+ ```
88
+
89
+ Use `start` before your first captured command if you want to set the title.
90
+ Put DebugBrief flags before `--`; everything after it is the command to capture.
91
+ An optional alias saves some typing:
92
+
93
+ ```bash
94
+ alias db="debugbrief run --"
95
+ db pytest -q
96
+ ```
97
+
98
+ ## Reports
99
+
100
+ | Mode | What it contains |
101
+ | --- | --- |
102
+ | `pr` | Reproduce and verify commands, changed files, failed attempts and a red-to-green window when available. |
103
+ | `handoff` | Current status, notes, command history and next steps drawn from your notes. |
104
+ | `incident` | A timeline, the recorded error, current outcome and follow-up notes. |
105
+
106
+ `end` defaults to a compact PR report in Markdown. Use `--detail full` for the
107
+ complete Markdown record. JSON and HTML always retain the complete evidence.
108
+
109
+ ```bash
110
+ debugbrief end --format all # Markdown, JSON and HTML
111
+ debugbrief open --html # open the newest HTML report
112
+ ```
113
+
114
+ The other formats are `md`, `json`, `both` (Markdown and JSON), and `html`.
115
+ Use `preview --format html` or `preview --format json` to inspect an active
116
+ session without ending it.
117
+
118
+ Current illustrative reports, generated by the report code:
119
+ [PR](https://github.com/hari-kancharla/Debug-Brief/blob/main/site/data/sample-pr.md),
120
+ [handoff](https://github.com/hari-kancharla/Debug-Brief/blob/main/site/data/sample-handoff.md),
121
+ [incident](https://github.com/hari-kancharla/Debug-Brief/blob/main/site/data/sample-incident.md).
122
+ The incident example deliberately retains a later failure and incomplete capture.
123
+
124
+ Review a report before sharing it. To post a reviewed Markdown brief with the
125
+ optional GitHub CLI:
126
+
127
+ ```bash
128
+ debugbrief end --stdout | gh pr comment --body-file -
129
+ ```
130
+
131
+ ## What the evidence means
132
+
133
+ - Verification needs an eligible passing check, valid recorded timestamps for all
134
+ verification candidates, and no currently failing check. A previous failure is
135
+ not required. Help, version and collection/list commands do not count, even
136
+ with `--verify`. Use that flag to declare a custom check.
137
+ - A red-to-green window requires Git and the same command failing and then passing
138
+ in the same directory. Files changed during that window are a correlation,
139
+ not a proven cause. A later failure keeps the report unverified.
140
+ - `redo` runs the stored command in its recorded directory using the current
141
+ files, environment and dependencies. It does not recreate an old environment.
142
+ `redo --dry-run` shows what would run; potentially destructive reruns ask for
143
+ confirmation. `--yes` skips that prompt.
144
+ - Reports retain project-relative command directories. Missing directory data in
145
+ older reports stays unknown. The project-root field uses the repository name
146
+ by default; absolute paths inside commands, notes and output can still appear.
147
+ - Stored text goes through best-effort secret redaction. Live command output is
148
+ shown as the command prints it. Redaction can miss secrets, and `--no-redact`
149
+ disables it for a captured command. Review reports before sharing.
150
+
151
+ Verification covers the recorded checks, not the whole issue. Full capture and
152
+ privacy details are in [SECURITY.md](https://github.com/hari-kancharla/Debug-Brief/blob/main/SECURITY.md).
153
+
154
+ ## Commands
155
+
156
+ | Command | Purpose |
157
+ | --- | --- |
158
+ | `init` | Set up local state and show the workflow. |
159
+ | `start "<title>"` | Start a named session. |
160
+ | `note <text>` | Record an observation. |
161
+ | `run -- <command>` | Run and capture a command. |
162
+ | `redo` | Run the last captured command again. |
163
+ | `preview` | Print a report without ending the session. |
164
+ | `end` | Finish the session and write reports. |
165
+ | `cancel` | Abandon the session, keeping its local record. |
166
+ | `status` | Inspect the active session and command. |
167
+ | `doctor` | Check the project and local state. |
168
+ | `recover` | Repair stale state after an interruption. |
169
+ | `last` / `open` | Find or open a saved report. |
170
+ | `list` / `show <id>` | Inspect earlier sessions. |
171
+
172
+ See [the command reference](https://github.com/hari-kancharla/Debug-Brief/blob/main/docs/COMMANDS.md)
173
+ for flags, configuration, recognized runners and recovery behavior.
174
+
175
+ ## Dependencies and limits
176
+
177
+ The CLI uses the Python standard library and native Git. Python 3.9 and 3.10 also
178
+ need `tomli`, installed automatically to read optional TOML configuration.
179
+ DebugBrief itself sends no telemetry and makes no network requests. Commands you
180
+ run can still use the network.
181
+
182
+ Linux and macOS are tested in CI on Python 3.9–3.14. Native Windows and PowerShell
183
+ are not supported. Capture is explicit through `run`; it does not read shell
184
+ history or meaningfully capture full-screen programs such as vim or htop. Output
185
+ previews are bounded, so reports are not complete terminal transcripts.
186
+
187
+ Ordinary background descendants are stopped during command cleanup. Deliberately
188
+ detached processes can survive; run long-lived servers outside DebugBrief.
189
+ Outside a Git repository, command and note capture still work, but Git state,
190
+ changed-file correlation and red-to-green windows are unavailable.
191
+
192
+ ## Website and development
193
+
194
+ The static site includes a command reference and a JSON Evidence Explorer.
195
+ Imported reports stay in memory in the browser; they are never uploaded or stored.
196
+ An explicitly chosen color theme is saved. Fonts and optional homepage animations
197
+ load from a CDN. Generated HTML reports are self-contained and need no CDN.
198
+
199
+ From a source checkout, preview the site with `python3 scripts/serve_site.py`.
200
+ The site is included in the source archive, not the installed wheel.
201
+
202
+ For Python development:
203
+
204
+ ```bash
205
+ python -m pip install -e ".[dev]"
206
+ python -m pytest
207
+ ```
208
+
209
+ [CONTRIBUTING.md](https://github.com/hari-kancharla/Debug-Brief/blob/main/CONTRIBUTING.md)
210
+ covers setup, linting, types, browser checks and builds.
211
+
212
+ ## License
213
+
214
+ MIT. See [LICENSE](https://github.com/hari-kancharla/Debug-Brief/blob/main/LICENSE).
@@ -0,0 +1,174 @@
1
+ # DebugBrief
2
+
3
+ [![CI](https://github.com/hari-kancharla/Debug-Brief/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/hari-kancharla/Debug-Brief/actions/workflows/ci.yml) [![PyPI](https://img.shields.io/pypi/v/debugbrief?cacheSeconds=3600)](https://pypi.org/project/debugbrief/)
4
+
5
+ Record commands and notes while you debug, then turn them into a report for a
6
+ pull request, a handoff, or an incident review.
7
+
8
+ DebugBrief keeps the actual commands, exit codes, output previews and Git changes.
9
+ It does not use AI or infer a root cause. You decide what to run and what to share.
10
+
11
+ ![A failing test, a fix, a passing rerun and the generated report](https://raw.githubusercontent.com/hari-kancharla/Debug-Brief/main/docs/demo.gif)
12
+
13
+ ## Install
14
+
15
+ Python 3.9 or newer on Linux or macOS. The project you debug can use any language.
16
+
17
+ ```bash
18
+ pipx install debugbrief
19
+ # or
20
+ uv tool install debugbrief
21
+ ```
22
+
23
+ Upgrade an existing installation with `pipx upgrade debugbrief` or
24
+ `uv tool upgrade debugbrief`. Inside an activated Python environment, use
25
+ `python -m pip install --upgrade debugbrief`.
26
+
27
+ The HTML and Explorer workflows below require DebugBrief 1.4.0 or newer.
28
+ Check your installed version with `debugbrief --version`. Install your project's
29
+ test tools and dependencies separately; DebugBrief does not install them for you.
30
+
31
+ ## Quickstart
32
+
33
+ Run this from your project, replacing the pytest command with your usual check:
34
+
35
+ ```bash
36
+ debugbrief run -- python -m pytest -q
37
+ # If it fails, edit the files and run the same command again:
38
+ debugbrief redo
39
+ debugbrief end --format html --open
40
+ ```
41
+
42
+ The first `run` starts a session automatically. A title and notes are optional:
43
+
44
+ ```bash
45
+ debugbrief start "Handle an expired cache entry"
46
+ debugbrief note "Expired entries still reach the read path."
47
+ ```
48
+
49
+ Use `start` before your first captured command if you want to set the title.
50
+ Put DebugBrief flags before `--`; everything after it is the command to capture.
51
+ An optional alias saves some typing:
52
+
53
+ ```bash
54
+ alias db="debugbrief run --"
55
+ db pytest -q
56
+ ```
57
+
58
+ ## Reports
59
+
60
+ | Mode | What it contains |
61
+ | --- | --- |
62
+ | `pr` | Reproduce and verify commands, changed files, failed attempts and a red-to-green window when available. |
63
+ | `handoff` | Current status, notes, command history and next steps drawn from your notes. |
64
+ | `incident` | A timeline, the recorded error, current outcome and follow-up notes. |
65
+
66
+ `end` defaults to a compact PR report in Markdown. Use `--detail full` for the
67
+ complete Markdown record. JSON and HTML always retain the complete evidence.
68
+
69
+ ```bash
70
+ debugbrief end --format all # Markdown, JSON and HTML
71
+ debugbrief open --html # open the newest HTML report
72
+ ```
73
+
74
+ The other formats are `md`, `json`, `both` (Markdown and JSON), and `html`.
75
+ Use `preview --format html` or `preview --format json` to inspect an active
76
+ session without ending it.
77
+
78
+ Current illustrative reports, generated by the report code:
79
+ [PR](https://github.com/hari-kancharla/Debug-Brief/blob/main/site/data/sample-pr.md),
80
+ [handoff](https://github.com/hari-kancharla/Debug-Brief/blob/main/site/data/sample-handoff.md),
81
+ [incident](https://github.com/hari-kancharla/Debug-Brief/blob/main/site/data/sample-incident.md).
82
+ The incident example deliberately retains a later failure and incomplete capture.
83
+
84
+ Review a report before sharing it. To post a reviewed Markdown brief with the
85
+ optional GitHub CLI:
86
+
87
+ ```bash
88
+ debugbrief end --stdout | gh pr comment --body-file -
89
+ ```
90
+
91
+ ## What the evidence means
92
+
93
+ - Verification needs an eligible passing check, valid recorded timestamps for all
94
+ verification candidates, and no currently failing check. A previous failure is
95
+ not required. Help, version and collection/list commands do not count, even
96
+ with `--verify`. Use that flag to declare a custom check.
97
+ - A red-to-green window requires Git and the same command failing and then passing
98
+ in the same directory. Files changed during that window are a correlation,
99
+ not a proven cause. A later failure keeps the report unverified.
100
+ - `redo` runs the stored command in its recorded directory using the current
101
+ files, environment and dependencies. It does not recreate an old environment.
102
+ `redo --dry-run` shows what would run; potentially destructive reruns ask for
103
+ confirmation. `--yes` skips that prompt.
104
+ - Reports retain project-relative command directories. Missing directory data in
105
+ older reports stays unknown. The project-root field uses the repository name
106
+ by default; absolute paths inside commands, notes and output can still appear.
107
+ - Stored text goes through best-effort secret redaction. Live command output is
108
+ shown as the command prints it. Redaction can miss secrets, and `--no-redact`
109
+ disables it for a captured command. Review reports before sharing.
110
+
111
+ Verification covers the recorded checks, not the whole issue. Full capture and
112
+ privacy details are in [SECURITY.md](https://github.com/hari-kancharla/Debug-Brief/blob/main/SECURITY.md).
113
+
114
+ ## Commands
115
+
116
+ | Command | Purpose |
117
+ | --- | --- |
118
+ | `init` | Set up local state and show the workflow. |
119
+ | `start "<title>"` | Start a named session. |
120
+ | `note <text>` | Record an observation. |
121
+ | `run -- <command>` | Run and capture a command. |
122
+ | `redo` | Run the last captured command again. |
123
+ | `preview` | Print a report without ending the session. |
124
+ | `end` | Finish the session and write reports. |
125
+ | `cancel` | Abandon the session, keeping its local record. |
126
+ | `status` | Inspect the active session and command. |
127
+ | `doctor` | Check the project and local state. |
128
+ | `recover` | Repair stale state after an interruption. |
129
+ | `last` / `open` | Find or open a saved report. |
130
+ | `list` / `show <id>` | Inspect earlier sessions. |
131
+
132
+ See [the command reference](https://github.com/hari-kancharla/Debug-Brief/blob/main/docs/COMMANDS.md)
133
+ for flags, configuration, recognized runners and recovery behavior.
134
+
135
+ ## Dependencies and limits
136
+
137
+ The CLI uses the Python standard library and native Git. Python 3.9 and 3.10 also
138
+ need `tomli`, installed automatically to read optional TOML configuration.
139
+ DebugBrief itself sends no telemetry and makes no network requests. Commands you
140
+ run can still use the network.
141
+
142
+ Linux and macOS are tested in CI on Python 3.9–3.14. Native Windows and PowerShell
143
+ are not supported. Capture is explicit through `run`; it does not read shell
144
+ history or meaningfully capture full-screen programs such as vim or htop. Output
145
+ previews are bounded, so reports are not complete terminal transcripts.
146
+
147
+ Ordinary background descendants are stopped during command cleanup. Deliberately
148
+ detached processes can survive; run long-lived servers outside DebugBrief.
149
+ Outside a Git repository, command and note capture still work, but Git state,
150
+ changed-file correlation and red-to-green windows are unavailable.
151
+
152
+ ## Website and development
153
+
154
+ The static site includes a command reference and a JSON Evidence Explorer.
155
+ Imported reports stay in memory in the browser; they are never uploaded or stored.
156
+ An explicitly chosen color theme is saved. Fonts and optional homepage animations
157
+ load from a CDN. Generated HTML reports are self-contained and need no CDN.
158
+
159
+ From a source checkout, preview the site with `python3 scripts/serve_site.py`.
160
+ The site is included in the source archive, not the installed wheel.
161
+
162
+ For Python development:
163
+
164
+ ```bash
165
+ python -m pip install -e ".[dev]"
166
+ python -m pytest
167
+ ```
168
+
169
+ [CONTRIBUTING.md](https://github.com/hari-kancharla/Debug-Brief/blob/main/CONTRIBUTING.md)
170
+ covers setup, linting, types, browser checks and builds.
171
+
172
+ ## License
173
+
174
+ MIT. See [LICENSE](https://github.com/hari-kancharla/Debug-Brief/blob/main/LICENSE).
@@ -6,9 +6,10 @@ and makes no network requests of its own.
6
6
  ## What data leaves your machine
7
7
 
8
8
  DebugBrief itself sends nothing. It has no network code: no telemetry, no
9
- accounts, no cloud sync, no update checks. It reads and writes only under your
10
- project's `.debugbrief/` directory and shells out to local `git` and to the
11
- commands you ask it to run.
9
+ accounts, no cloud sync, no update checks. It stores session state and reports under your project's `.debugbrief/`
10
+ directory. It also reads project configuration, Git metadata and changed-file
11
+ contents for comparison, and can add a local ignore entry in `.git/info/exclude`.
12
+ It runs local Git and the commands you ask it to capture.
12
13
 
13
14
  Commands you run through DebugBrief keep their normal behavior. A command can
14
15
  access the network exactly as it would if you ran it directly, so what such a
@@ -36,8 +37,11 @@ hazards rather than a remote attacker:
36
37
  that do not support Unix permissions.
37
38
  - **Crash safety.** Session and report writes are atomic (write to a temp file,
38
39
  then rename). A running command holds an OS lock for its whole lifetime; if the
39
- process dies, the lock is released by the OS and `debugbrief recover` reports
40
- the unfinished command without losing the session.
40
+ recorder dies, an independent supervisor stops the owned command process
41
+ group, including after SIGKILL. Cleanup releases the lock after its holders
42
+ exit. `recover` preserves saved events and reports the lost result as unknown;
43
+ it never turns an incomplete capture into a pass. Recovery can still report a
44
+ held lock during cleanup, and deliberately detached processes can outlive it.
41
45
  - **Repository-supplied state.** `.debugbrief/` lives inside the project, so a
42
46
  cloned repository could ship a pre-seeded session. DebugBrief does not trust
43
47
  that state to drive execution: `debugbrief redo` refuses to re-run a command
@@ -55,16 +59,38 @@ hazards rather than a remote attacker:
55
59
  It does **not** defend against a local attacker who already has write access to
56
60
  your `.debugbrief/` directory or who can modify the commands you run.
57
61
 
58
- ## Command capture is foreground-only
62
+ ## Foreground commands and cleanup
59
63
 
60
- DebugBrief captures a single foreground command and holds the active-command
61
- lease until that command's process tree exits. If a captured command backgrounds
62
- a long-lived process (for example `debugbrief run --shell "my-server &"`), that
63
- descendant keeps the lease held until it exits, so a later `run` may report that
64
- a command is still running. When that happens, `debugbrief status` and
65
- `debugbrief recover` detect and explain the held lock rather than reporting the
66
- project as idle. Capture, and the lease, are designed for foreground commands;
67
- start long-running daemons outside DebugBrief.
64
+ Capture is intended for commands that finish, not for managing long-lived servers.
65
+ On normal completion, timeout, interruption or recorder death, the supervisor
66
+ stops ordinary descendants in its process group. It escalates from SIGTERM to
67
+ SIGKILL when needed. A program that deliberately creates another session or
68
+ process group can survive. If it also closes its captured streams, its continued
69
+ execution may be undetectable to the recorder.
70
+
71
+ A surviving process can retain the command lock. `status` and `recover` report
72
+ that the lock is still held; recovery will not clear it to pretend the project
73
+ is idle. After cleanup finishes, retry recovery. Saved events remain available,
74
+ but a crash can lose the command result that had not yet been recorded.
75
+
76
+ ## Reports and the browser Explorer
77
+
78
+ The project-root field shows the repository name by default. The
79
+ `--include-full-path` flag exposes the full root intentionally. This setting does
80
+ not remove absolute paths inside command text, output or notes.
81
+
82
+ Generated HTML reports escape recorded text, include their own styles and use a
83
+ restrictive Content Security Policy. They contain no executable application
84
+ scripts or external assets.
85
+
86
+ The static website is separate from the CLI. It loads fonts and optional homepage
87
+ animation libraries from a CDN. Its Explorer reads one JSON report in memory,
88
+ without uploading it or saving report contents to browser storage. Only an
89
+ explicitly chosen theme is saved. File size, structure and list lengths are
90
+ bounded; the current limits include 5 MiB per file and 2,000 entries per list.
91
+ Imported text is rendered as text, not HTML or executable commands. A fixed
92
+ allowlist supplies the bundled examples. The Explorer displays the report's
93
+ claims; it does not authenticate or rerun the recorded checks.
68
94
 
69
95
  ## Redaction is best effort
70
96
 
@@ -73,7 +99,9 @@ command text, captured output, notes, titles, warnings, the session pointer, and
73
99
  the lease: sensitive `name=value` and quoted/JSON `"name": "value"` pairs,
74
100
  `Authorization`/`Bearer` headers, OpenAI/AWS/GitHub-style keys,
75
101
  connection-string passwords, and PEM private-key blocks, each replaced with
76
- `[redacted]`. Pass `--no-redact` to store a command's output verbatim.
102
+ `[redacted]`. Pass `--no-redact` to store raw command text and captured output
103
+ for that command. Redaction applies to stored text, not to the command's live
104
+ terminal output.
77
105
 
78
106
  This is **best effort and conservative; it is not a guarantee.** It recognizes
79
107
  known shapes and will miss secrets that do not match one. Known limitations
@@ -91,7 +119,6 @@ Native Windows and PowerShell are not supported.
91
119
  ## Reporting a vulnerability
92
120
 
93
121
  Please report security issues privately rather than opening a public issue. Use
94
- GitHub's "Report a vulnerability" (Security advisories) for this repository, or
95
- contact the maintainer through the address on their GitHub profile. Include
96
- steps to reproduce and the affected version; you will get an acknowledgement and
97
- a fix timeline.
122
+ the repository's [private vulnerability report form](https://github.com/hari-kancharla/Debug-Brief/security/advisories/new).
123
+ Include the affected version, steps to reproduce and the impact. Remove unrelated
124
+ secrets and personal data from logs. The maintainer can follow up privately.