rewind-debug 0.1.0__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.
- rewind_debug-0.1.0/LICENSE +21 -0
- rewind_debug-0.1.0/PKG-INFO +5 -0
- rewind_debug-0.1.0/README.md +253 -0
- rewind_debug-0.1.0/rewind/__init__.py +9 -0
- rewind_debug-0.1.0/rewind/cli.py +572 -0
- rewind_debug-0.1.0/rewind/diff.py +115 -0
- rewind_debug-0.1.0/rewind/tracer.py +192 -0
- rewind_debug-0.1.0/rewind_debug.egg-info/PKG-INFO +5 -0
- rewind_debug-0.1.0/rewind_debug.egg-info/SOURCES.txt +13 -0
- rewind_debug-0.1.0/rewind_debug.egg-info/dependency_links.txt +1 -0
- rewind_debug-0.1.0/rewind_debug.egg-info/entry_points.txt +2 -0
- rewind_debug-0.1.0/rewind_debug.egg-info/top_level.txt +1 -0
- rewind_debug-0.1.0/setup.cfg +4 -0
- rewind_debug-0.1.0/setup.py +12 -0
- rewind_debug-0.1.0/tests/test_rewind.py +150 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Hrinkar
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# Rewind
|
|
4
|
+
|
|
5
|
+
### **Deterministic Time-Travel Debugger & Live Hot-Code Patcher**
|
|
6
|
+
|
|
7
|
+
*Automated Runtime State Inspection, Sub-Microsecond State Diffing, and In-Memory Hot-Patching for Developers.*
|
|
8
|
+
|
|
9
|
+
<br/>
|
|
10
|
+
|
|
11
|
+
[](https://www.python.org/)
|
|
12
|
+
[](https://github.com/hrinkar01/rewind)
|
|
13
|
+
[-ff6a3d?style=flat-square)](https://github.com/hrinkar01/rewind)
|
|
14
|
+
[](https://opensource.org/licenses/MIT)
|
|
15
|
+
[](https://github.com/hrinkar01/rewind)
|
|
16
|
+
|
|
17
|
+
<br/>
|
|
18
|
+
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## The Problem Rewind Solves
|
|
24
|
+
|
|
25
|
+
When a software pipeline, server, or script crashes, standard debuggers and terminals only show **The Point of Death**:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
|
|
29
|
+
File "billing_engine.py", line 84, in calculate_final_invoice
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
A standard terminal tells you that line 84 crashed because `tax_exempt` was `None`. **It cannot answer:**
|
|
33
|
+
* **WHO** mutated `tax_exempt` to `None`?
|
|
34
|
+
* **WHEN** was it changed? *(Step 2, Step 6, or a helper function called 15 minutes ago?)*
|
|
35
|
+
* **WHAT** did the program memory look like 3 steps *before* the crash?
|
|
36
|
+
|
|
37
|
+
Without Rewind, developers spend **45 minutes to 3 hours** trapped in the repetitive loop of adding `print()` statements and restarting from scratch.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## The Solution: Deterministic Time-Travel Execution
|
|
42
|
+
|
|
43
|
+
> [!IMPORTANT]
|
|
44
|
+
> **Rewind provides complete runtime state observability for your software.** Run your program once. If it crashes, open the visual cockpit, drag the timeline backward in time to inspect the exact memory state at each step, test a multi-line fix in memory in **0.5 ms**, and apply it directly to disk with 1 click.
|
|
45
|
+
|
|
46
|
+
### The 4-Step Hot-Code Workflow
|
|
47
|
+
|
|
48
|
+
1. **Deterministic Recording:** Rewind captures microsecond-level memory snapshots before and after every transition.
|
|
49
|
+
2. **Time-Travel Scrubbing:** Drag the timeline slider **backward in time** to find the exact frame where a variable was corrupted.
|
|
50
|
+
3. **Live Hot-Code Sandbox:** Rewrite broken logic directly in the browser dashboard and verify downstream steps in **0.5 ms** in memory.
|
|
51
|
+
4. **1-Click Atomic Disk Sync:** Click **"Save Fix to Local File"** to apply the fix directly to your source file with automatic `.bak` backups.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Core Features
|
|
56
|
+
|
|
57
|
+
| Capability | What It Does | Performance |
|
|
58
|
+
| :--- | :--- | :--- |
|
|
59
|
+
| **Time-Travel Recording** | Captures before/after memory snapshots across transitions | Microsecond timing |
|
|
60
|
+
| **Sub-Microsecond Diffing** | Recursive $O(N)$ state comparator detecting `+` added, `~` mutated, and `-` removed keys | **$< 0.001$ seconds** |
|
|
61
|
+
| **Hot-Code Sandbox** | In-memory code patcher to test logic without restarting processes or resetting databases | **0.5 ms latency** |
|
|
62
|
+
| **1-Click Disk Patcher** | Writes verified fixes directly to local source files with recursive file discovery & backups | Instant |
|
|
63
|
+
| **Universal Process Runner** | Traces Python scripts and monitors **Next.js, Node, Go, Rust, C++, and Docker** processes | Live I/O stream |
|
|
64
|
+
| **Root-Cause Diagnostics** | Automated heuristic analyzer detecting poisoned variables and unclosed syntax errors | Instant |
|
|
65
|
+
| **Zero External Dependencies** | Built 100% on Python standard libraries and vanilla web technologies | Pure Stdlib |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Architecture
|
|
70
|
+
|
|
71
|
+
```mermaid
|
|
72
|
+
flowchart LR
|
|
73
|
+
subgraph Execution ["1. Execution Layer"]
|
|
74
|
+
A["Python Script / Server"] -->|"rewind run / rewind exec"| B["Tracer Engine"]
|
|
75
|
+
C["sys.settrace() / Subprocess Monitor"] --> B
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
subgraph DiffEngine ["2. State Diff Engine"]
|
|
79
|
+
B --> D["serialize_state()"]
|
|
80
|
+
D --> E["compute_state_diff()"]
|
|
81
|
+
E --> F[("rewind_trace.json")]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
subgraph Dashboard ["3. Web Cockpit"]
|
|
85
|
+
F --> G["HTTP Server"]
|
|
86
|
+
G --> H["Time-Travel Scrubber"]
|
|
87
|
+
H --> I["Hero Crash Banner"]
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
subgraph Sandbox ["4. Hot-Code Patcher"]
|
|
91
|
+
H --> J["In-Memory Sandbox"]
|
|
92
|
+
J -->|"POST /api/replay"| K["Hot Replayer (0.5ms)"]
|
|
93
|
+
K -->|"POST /api/patch"| L["Local File on Disk (.bak)"]
|
|
94
|
+
end
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Quickstart
|
|
100
|
+
|
|
101
|
+
### 1. Installation
|
|
102
|
+
|
|
103
|
+
Clone the repository and install in editable mode:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
git clone https://github.com/hrinkar01/rewind.git
|
|
107
|
+
cd rewind
|
|
108
|
+
pip3 install -e .
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
### 2. Auto-Trace Python Scripts
|
|
114
|
+
|
|
115
|
+
Trace any Python script with **zero code modifications**:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
rewind run tests/broken_pipeline.py
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
* Intercepts `stdout`/`stderr` live in the console.
|
|
122
|
+
* Captures fatal exceptions and traceback stack frames.
|
|
123
|
+
* Automatically launches the interactive web scrubber at `http://localhost:8765`.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### 3. Trace Any Server, Framework, or Command
|
|
128
|
+
|
|
129
|
+
Run any language, framework, or containerized workflow through Rewind:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# Next.js / React / Vite
|
|
133
|
+
rewind exec npm run dev
|
|
134
|
+
|
|
135
|
+
# Node.js Server
|
|
136
|
+
rewind exec node server.js
|
|
137
|
+
|
|
138
|
+
# Go Backend
|
|
139
|
+
rewind exec go run main.go
|
|
140
|
+
|
|
141
|
+
# Rust Binary / Cargo Test
|
|
142
|
+
rewind exec cargo run
|
|
143
|
+
|
|
144
|
+
# Python Frameworks (FastAPI / Django / Flask)
|
|
145
|
+
rewind exec uvicorn main:app --reload
|
|
146
|
+
rewind exec python manage.py runserver
|
|
147
|
+
|
|
148
|
+
# Docker Containers
|
|
149
|
+
rewind exec docker-compose up
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
### 4. Manage the Web Dashboard Server
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Start the web dashboard (auto-hunts free ports if 8765 is busy)
|
|
158
|
+
rewind view
|
|
159
|
+
|
|
160
|
+
# Check server status
|
|
161
|
+
rewind status
|
|
162
|
+
|
|
163
|
+
# Cleanly stop running Rewind servers
|
|
164
|
+
rewind stop
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Programmatic Python SDK
|
|
170
|
+
|
|
171
|
+
You can also instrument critical sections of your Python applications directly:
|
|
172
|
+
|
|
173
|
+
```python
|
|
174
|
+
from rewind import Tracer, step
|
|
175
|
+
|
|
176
|
+
tracer = Tracer(title="Payment Gateway Pipeline")
|
|
177
|
+
|
|
178
|
+
# Step 1: Initialize User State
|
|
179
|
+
with step("1. init_session", user_id="usr_9482") as state:
|
|
180
|
+
state["user"] = "Alice"
|
|
181
|
+
state["cart"] = {"items": ["Keyboard", "Mouse"], "subtotal": 120.00}
|
|
182
|
+
|
|
183
|
+
# Step 2: Apply Discount Code
|
|
184
|
+
with step("2. apply_discount", coupon="SAVE20") as state:
|
|
185
|
+
state["cart"]["subtotal"] = 96.00
|
|
186
|
+
state["cart"]["discount_applied"] = True
|
|
187
|
+
|
|
188
|
+
# Step 3: Export timeline for visual scrubbing
|
|
189
|
+
tracer.export("rewind_trace.json")
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## CLI Reference
|
|
195
|
+
|
|
196
|
+
| Command | Description | Example |
|
|
197
|
+
| :--- | :--- | :--- |
|
|
198
|
+
| **`rewind run <script.py>`** | Auto-traces a Python script with zero code changes | `rewind run tests/broken_pipeline.py` |
|
|
199
|
+
| **`rewind exec <cmd...>`** | Traces any CLI process/server and captures stdout/stderr | `rewind exec npm run dev` |
|
|
200
|
+
| **`rewind view [trace.json]`** | Launches the interactive web dashboard | `rewind view` |
|
|
201
|
+
| **`rewind status`** | Checks if the web dashboard server is active | `rewind status` |
|
|
202
|
+
| **`rewind stop`** | Cleanly shuts down active web dashboard processes | `rewind stop` |
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Unit Test Suite
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
python3 -m unittest discover -s tests -p "test_*.py" -v
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
```text
|
|
213
|
+
test_circular_reference_protection ... ok
|
|
214
|
+
test_custom_class_serialization ... ok
|
|
215
|
+
test_primitive_serialization ... ok
|
|
216
|
+
test_set_deterministic_sorting ... ok
|
|
217
|
+
test_unserializable_property_fallback ... ok
|
|
218
|
+
test_added_keys ... ok
|
|
219
|
+
test_mutated_nested_values ... ok
|
|
220
|
+
test_none_to_dict_diff ... ok
|
|
221
|
+
test_removed_keys ... ok
|
|
222
|
+
test_multithreaded_step_recording ... ok
|
|
223
|
+
test_nested_directory_export ... ok
|
|
224
|
+
test_tracer_crash_capture ... ok
|
|
225
|
+
test_tracer_step_lifecycle ... ok
|
|
226
|
+
|
|
227
|
+
----------------------------------------------------------------------
|
|
228
|
+
Ran 13 tests in 0.002s
|
|
229
|
+
|
|
230
|
+
OK
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Contributing
|
|
236
|
+
|
|
237
|
+
Contributions are welcome! Please feel free to open an issue or submit a pull request:
|
|
238
|
+
|
|
239
|
+
1. Fork the repository (`https://github.com/hrinkar01/rewind`)
|
|
240
|
+
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
|
|
241
|
+
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
242
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
243
|
+
5. Open a Pull Request
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## License
|
|
248
|
+
|
|
249
|
+
Distributed under the **MIT License**. See `LICENSE` for details.
|
|
250
|
+
|
|
251
|
+
<div align="center">
|
|
252
|
+
<sub>Built by <a href="https://github.com/hrinkar01">Hrinkar Bothra</a>.</sub>
|
|
253
|
+
</div>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Rewind - Deterministic Time-Travel Record & Replay Debugger
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from .tracer import Tracer, step, get_global_tracer
|
|
6
|
+
from .diff import compute_state_diff, serialize_state
|
|
7
|
+
|
|
8
|
+
__version__ = "0.1.0"
|
|
9
|
+
__all__ = ["Tracer", "step", "get_global_tracer", "compute_state_diff", "serialize_state"]
|