stemtrace 0.1.0__tar.gz → 0.1.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 (137) hide show
  1. {stemtrace-0.1.0 → stemtrace-0.1.1}/.bumpversion.toml +1 -1
  2. {stemtrace-0.1.0 → stemtrace-0.1.1}/.github/workflows/ci.yml +7 -7
  3. {stemtrace-0.1.0 → stemtrace-0.1.1}/.github/workflows/e2e.yml +4 -4
  4. {stemtrace-0.1.0 → stemtrace-0.1.1}/.github/workflows/release.yml +8 -8
  5. {stemtrace-0.1.0 → stemtrace-0.1.1}/CHANGELOG.md +17 -1
  6. {stemtrace-0.1.0 → stemtrace-0.1.1}/Makefile +14 -6
  7. {stemtrace-0.1.0 → stemtrace-0.1.1}/PKG-INFO +77 -69
  8. {stemtrace-0.1.0 → stemtrace-0.1.1}/README.md +75 -68
  9. {stemtrace-0.1.0 → stemtrace-0.1.1}/pyproject.toml +2 -1
  10. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/__init__.py +1 -1
  11. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/package-lock.json +92 -58
  12. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/package.json +6 -6
  13. stemtrace-0.1.1/src/stemtrace/server/ui/frontend/playwright.config.ts +63 -0
  14. stemtrace-0.1.1/src/stemtrace/server/ui/frontend/tests/fixtures/mock-api.ts +362 -0
  15. stemtrace-0.1.1/src/stemtrace/server/ui/frontend/tests/fixtures/mock-data.ts +429 -0
  16. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tests/graphs.spec.ts +112 -4
  17. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tests/registry.spec.ts +37 -5
  18. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tests/task-detail.spec.ts +77 -3
  19. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tests/tasks.spec.ts +65 -3
  20. {stemtrace-0.1.0 → stemtrace-0.1.1}/uv.lock +1 -1
  21. stemtrace-0.1.0/.context/active-context.md +0 -141
  22. stemtrace-0.1.0/.context/product-context.md +0 -108
  23. stemtrace-0.1.0/.context/progress.md +0 -383
  24. stemtrace-0.1.0/.context/project-brief.md +0 -70
  25. stemtrace-0.1.0/.context/project-structure.md +0 -124
  26. stemtrace-0.1.0/.context/strategic-analysis.md +0 -174
  27. stemtrace-0.1.0/.context/system-patterns.md +0 -265
  28. stemtrace-0.1.0/.context/tech-context.md +0 -223
  29. stemtrace-0.1.0/.cursor/commands/audit-context.md +0 -110
  30. stemtrace-0.1.0/.cursor/commands/commit.md +0 -89
  31. stemtrace-0.1.0/.cursor/commands/pr-review.md +0 -233
  32. stemtrace-0.1.0/.cursor/commands/pr.md +0 -149
  33. stemtrace-0.1.0/.cursor/rules/architecture.mdc +0 -111
  34. stemtrace-0.1.0/.cursor/rules/open-source.mdc +0 -261
  35. stemtrace-0.1.0/.cursor/rules/project.mdc +0 -79
  36. stemtrace-0.1.0/.cursor/rules/python.mdc +0 -136
  37. stemtrace-0.1.0/.cursor/rules/testing.mdc +0 -99
  38. stemtrace-0.1.0/.cursor/rules/ui-websocket.mdc +0 -278
  39. stemtrace-0.1.0/.cursor/rules/workflow.mdc +0 -208
  40. stemtrace-0.1.0/src/stemtrace/server/ui/frontend/playwright.config.ts +0 -40
  41. {stemtrace-0.1.0 → stemtrace-0.1.1}/.dockerignore +0 -0
  42. {stemtrace-0.1.0 → stemtrace-0.1.1}/.github/dependabot.yml +0 -0
  43. {stemtrace-0.1.0 → stemtrace-0.1.1}/.gitignore +0 -0
  44. {stemtrace-0.1.0 → stemtrace-0.1.1}/.pre-commit-config.yaml +0 -0
  45. {stemtrace-0.1.0 → stemtrace-0.1.1}/.python-version +0 -0
  46. {stemtrace-0.1.0 → stemtrace-0.1.1}/CONTRIBUTING.md +0 -0
  47. {stemtrace-0.1.0 → stemtrace-0.1.1}/Dockerfile +0 -0
  48. {stemtrace-0.1.0 → stemtrace-0.1.1}/Dockerfile.e2e +0 -0
  49. {stemtrace-0.1.0 → stemtrace-0.1.1}/LICENSE +0 -0
  50. {stemtrace-0.1.0 → stemtrace-0.1.1}/build_ui.py +0 -0
  51. {stemtrace-0.1.0 → stemtrace-0.1.1}/docker-compose.e2e.yml +0 -0
  52. {stemtrace-0.1.0 → stemtrace-0.1.1}/docker-compose.yml +0 -0
  53. {stemtrace-0.1.0 → stemtrace-0.1.1}/examples/celery_app.py +0 -0
  54. {stemtrace-0.1.0 → stemtrace-0.1.1}/examples/fastapi_integration.py +0 -0
  55. {stemtrace-0.1.0 → stemtrace-0.1.1}/examples/with_auth.py +0 -0
  56. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/core/__init__.py +0 -0
  57. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/core/events.py +0 -0
  58. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/core/exceptions.py +0 -0
  59. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/core/graph.py +0 -0
  60. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/core/ports.py +0 -0
  61. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/__init__.py +0 -0
  62. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/bootsteps.py +0 -0
  63. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/config.py +0 -0
  64. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/scrubbing.py +0 -0
  65. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/signals.py +0 -0
  66. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/transports/__init__.py +0 -0
  67. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/transports/memory.py +0 -0
  68. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/transports/redis.py +0 -0
  69. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/py.typed +0 -0
  70. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/__init__.py +0 -0
  71. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/__main__.py +0 -0
  72. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/api/__init__.py +0 -0
  73. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/api/routes.py +0 -0
  74. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/api/schemas.py +0 -0
  75. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/api/websocket.py +0 -0
  76. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/consumer.py +0 -0
  77. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/fastapi/__init__.py +0 -0
  78. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/fastapi/auth.py +0 -0
  79. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/fastapi/extension.py +0 -0
  80. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/fastapi/router.py +0 -0
  81. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/store.py +0 -0
  82. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/__init__.py +0 -0
  83. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/biome.json +0 -0
  84. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/index.html +0 -0
  85. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/postcss.config.js +0 -0
  86. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/api/client.ts +0 -0
  87. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/api/queries.ts +0 -0
  88. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/DateRangePicker.tsx +0 -0
  89. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/Filters.tsx +0 -0
  90. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/TaskGraph.tsx +0 -0
  91. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/TaskList.tsx +0 -0
  92. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/TaskStateBadge.tsx +0 -0
  93. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/TaskTimeline.tsx +0 -0
  94. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/TimelineBar.tsx +0 -0
  95. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/Tooltip.tsx +0 -0
  96. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/hooks/WebSocketContext.tsx +0 -0
  97. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/hooks/useInfiniteScroll.ts +0 -0
  98. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/index.css +0 -0
  99. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/main.tsx +0 -0
  100. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/__root.tsx +0 -0
  101. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/graph.$rootId.tsx +0 -0
  102. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/graphs.tsx +0 -0
  103. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/index.tsx +0 -0
  104. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/registry.tsx +0 -0
  105. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/tasks.$taskId.tsx +0 -0
  106. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/utils/format.ts +0 -0
  107. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tsconfig.json +0 -0
  108. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tsconfig.tsbuildinfo +0 -0
  109. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/vite.config.ts +0 -0
  110. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/static.py +0 -0
  111. {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/websocket.py +0 -0
  112. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/__init__.py +0 -0
  113. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/conftest.py +0 -0
  114. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/e2e/__init__.py +0 -0
  115. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/e2e/conftest.py +0 -0
  116. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/e2e/tasks.py +0 -0
  117. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/e2e/test_api_e2e.py +0 -0
  118. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/integration/__init__.py +0 -0
  119. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/integration/test_fastapi_integration.py +0 -0
  120. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/integration/test_redis_transport.py +0 -0
  121. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/integration/test_static_ui.py +0 -0
  122. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/__init__.py +0 -0
  123. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_auth.py +0 -0
  124. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_bootsteps.py +0 -0
  125. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_config.py +0 -0
  126. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_consumer.py +0 -0
  127. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_events.py +0 -0
  128. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_examples.py +0 -0
  129. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_exceptions.py +0 -0
  130. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_graph.py +0 -0
  131. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_init.py +0 -0
  132. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_routes.py +0 -0
  133. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_scrubbing.py +0 -0
  134. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_signals.py +0 -0
  135. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_store.py +0 -0
  136. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_transports.py +0 -0
  137. {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_websocket.py +0 -0
@@ -1,5 +1,5 @@
1
1
  [tool.bumpversion]
2
- current_version = "0.1.0"
2
+ current_version = "0.1.1"
3
3
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
4
4
  serialize = ["{major}.{minor}.{patch}"]
5
5
  commit = true
@@ -15,7 +15,7 @@ jobs:
15
15
  - uses: actions/checkout@v6
16
16
 
17
17
  - name: Set up Python
18
- uses: actions/setup-python@v5
18
+ uses: actions/setup-python@v6
19
19
  with:
20
20
  python-version: "3.12"
21
21
 
@@ -39,7 +39,7 @@ jobs:
39
39
  - uses: actions/checkout@v6
40
40
 
41
41
  - name: Set up Python
42
- uses: actions/setup-python@v5
42
+ uses: actions/setup-python@v6
43
43
  with:
44
44
  python-version: "3.12"
45
45
 
@@ -58,12 +58,12 @@ jobs:
58
58
  runs-on: ubuntu-latest
59
59
  strategy:
60
60
  matrix:
61
- python-version: ["3.10", "3.11", "3.12", "3.13"]
61
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
62
62
  steps:
63
63
  - uses: actions/checkout@v6
64
64
 
65
65
  - name: Set up Python ${{ matrix.python-version }}
66
- uses: actions/setup-python@v5
66
+ uses: actions/setup-python@v6
67
67
  with:
68
68
  python-version: ${{ matrix.python-version }}
69
69
 
@@ -76,7 +76,7 @@ jobs:
76
76
  run: uv sync --all-extras
77
77
 
78
78
  - name: Run tests
79
- run: uv run pytest --cov=stemtrace --cov-report=xml --cov-fail-under=80
79
+ run: uv run pytest --cov=stemtrace --cov-branch --cov-report=xml --cov-fail-under=80
80
80
 
81
81
  - name: Upload coverage
82
82
  uses: codecov/codecov-action@v5
@@ -117,7 +117,7 @@ jobs:
117
117
  - uses: actions/checkout@v6
118
118
 
119
119
  - name: Set up Python
120
- uses: actions/setup-python@v5
120
+ uses: actions/setup-python@v6
121
121
  with:
122
122
  python-version: "3.12"
123
123
 
@@ -144,7 +144,7 @@ jobs:
144
144
  run: uvx twine check dist/*
145
145
 
146
146
  - name: Upload dist artifacts
147
- uses: actions/upload-artifact@v4
147
+ uses: actions/upload-artifact@v6
148
148
  with:
149
149
  name: dist
150
150
  path: dist/
@@ -33,7 +33,7 @@ jobs:
33
33
  echo "Services ready!"
34
34
 
35
35
  - name: Set up Python
36
- uses: actions/setup-python@v5
36
+ uses: actions/setup-python@v6
37
37
  with:
38
38
  python-version: "3.12"
39
39
 
@@ -80,7 +80,7 @@ jobs:
80
80
  echo "Services ready!"
81
81
 
82
82
  - name: Set up Python
83
- uses: actions/setup-python@v5
83
+ uses: actions/setup-python@v6
84
84
  with:
85
85
  python-version: "3.12"
86
86
 
@@ -129,7 +129,7 @@ jobs:
129
129
  PLAYWRIGHT_BASE_URL: http://localhost:8000
130
130
 
131
131
  - name: Upload Playwright report
132
- uses: actions/upload-artifact@v4
132
+ uses: actions/upload-artifact@v6
133
133
  if: always()
134
134
  with:
135
135
  name: playwright-report
@@ -137,7 +137,7 @@ jobs:
137
137
  retention-days: 7
138
138
 
139
139
  - name: Upload test results
140
- uses: actions/upload-artifact@v4
140
+ uses: actions/upload-artifact@v6
141
141
  if: failure()
142
142
  with:
143
143
  name: playwright-test-results
@@ -22,7 +22,7 @@ jobs:
22
22
  version: ${{ steps.version.outputs.version }}
23
23
  tag: ${{ steps.version.outputs.tag }}
24
24
  steps:
25
- - uses: actions/checkout@v4
25
+ - uses: actions/checkout@v6
26
26
 
27
27
  - name: Determine version
28
28
  id: version
@@ -49,12 +49,12 @@ jobs:
49
49
  echo "✅ Version $PYPROJECT_VERSION matches"
50
50
 
51
51
  - name: Set up Python
52
- uses: actions/setup-python@v5
52
+ uses: actions/setup-python@v6
53
53
  with:
54
54
  python-version: "3.12"
55
55
 
56
56
  - name: Set up Node.js
57
- uses: actions/setup-node@v4
57
+ uses: actions/setup-node@v6
58
58
  with:
59
59
  node-version: "20"
60
60
  cache: "npm"
@@ -74,7 +74,7 @@ jobs:
74
74
  run: twine check dist/*
75
75
 
76
76
  - name: Upload dist artifacts
77
- uses: actions/upload-artifact@v4
77
+ uses: actions/upload-artifact@v6
78
78
  with:
79
79
  name: dist
80
80
  path: dist/
@@ -87,7 +87,7 @@ jobs:
87
87
  id-token: write
88
88
  steps:
89
89
  - name: Download dist artifacts
90
- uses: actions/download-artifact@v4
90
+ uses: actions/download-artifact@v7
91
91
  with:
92
92
  name: dist
93
93
  path: dist/
@@ -102,7 +102,7 @@ jobs:
102
102
  contents: read
103
103
  packages: write
104
104
  steps:
105
- - uses: actions/checkout@v4
105
+ - uses: actions/checkout@v6
106
106
 
107
107
  - name: Set up Docker Buildx
108
108
  uses: docker/setup-buildx-action@v3
@@ -139,10 +139,10 @@ jobs:
139
139
  permissions:
140
140
  contents: write
141
141
  steps:
142
- - uses: actions/checkout@v4
142
+ - uses: actions/checkout@v6
143
143
 
144
144
  - name: Download dist artifacts
145
- uses: actions/download-artifact@v4
145
+ uses: actions/download-artifact@v7
146
146
  with:
147
147
  name: dist
148
148
  path: dist/
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.1] - 2025-12-31
11
+
12
+ ## [0.1.1] - 2025-12-31
13
+
14
+ ### Added
15
+ - Python 3.14 support in CI and project classifiers
16
+ - Mock-based E2E testing mode (no Docker required for local dev)
17
+ - Codecov integration for coverage reporting
18
+
19
+ ### Changed
20
+ - Upgraded React and React-DOM to v19
21
+ - Upgraded @tanstack/react-query to latest
22
+ - Updated GitHub Actions to v6 (checkout, setup-python, setup-node, upload/download-artifact)
23
+ - Improved README with clearer Quick Start and FastAPI embedding docs
24
+
10
25
  ## [0.1.0] - 2025-12-27
11
26
 
12
27
  ### Added
@@ -29,5 +44,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
29
44
  - **E2E test suite**: Docker API tests + Playwright browser tests
30
45
  - **Comprehensive test suite**: 350+ Python tests, 90%+ coverage
31
46
 
32
- [unreleased]: https://github.com/iansokolskyi/stemtrace/compare/v0.1.0...HEAD
47
+ [unreleased]: https://github.com/iansokolskyi/stemtrace/compare/v0.1.1...HEAD
48
+ [0.1.1]: https://github.com/iansokolskyi/stemtrace/compare/v0.1.0...v0.1.1
33
49
  [0.1.0]: https://github.com/iansokolskyi/stemtrace/releases/tag/v0.1.0
@@ -161,7 +161,12 @@ release:
161
161
  # E2E Testing
162
162
  # =============================================================================
163
163
 
164
- # Start E2E test environment
164
+ # Run Playwright E2E tests in mock mode (no Docker required)
165
+ # This is the default and recommended way to run E2E tests locally
166
+ e2e-mock:
167
+ cd $(FRONTEND_DIR) && npm test
168
+
169
+ # Start E2E test environment (Docker)
165
170
  e2e-up:
166
171
  docker compose -f docker-compose.e2e.yml up -d --wait
167
172
  @echo "Waiting for services..."
@@ -176,14 +181,17 @@ e2e-down:
176
181
  e2e-api:
177
182
  uv run pytest tests/e2e/ -m e2e -v
178
183
 
179
- # Run Playwright E2E tests (requires e2e-up first)
180
- e2e-playwright:
181
- cd $(FRONTEND_DIR) && npm test
184
+ # Run Playwright E2E tests against real Docker backend
185
+ e2e-playwright-real:
186
+ cd $(FRONTEND_DIR) && E2E_MODE=real PLAYWRIGHT_BASE_URL=http://localhost:8000 npm test
182
187
 
183
- # Run all E2E tests (ensures cleanup on failure)
188
+ # Run all E2E tests against Docker (full integration)
184
189
  e2e:
185
190
  $(MAKE) e2e-up
186
- $(MAKE) e2e-api && $(MAKE) e2e-playwright; \
191
+ $(MAKE) e2e-api && $(MAKE) e2e-playwright-real; \
187
192
  status=$$?; \
188
193
  $(MAKE) e2e-down; \
189
194
  exit $$status
195
+
196
+ # Quick E2E alias (mock mode, no Docker)
197
+ e2e-quick: e2e-mock
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stemtrace
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: A lightweight Celery task flow visualizer
5
5
  Project-URL: Homepage, https://github.com/iansokolskyi/stemtrace
6
6
  Project-URL: Documentation, https://github.com/iansokolskyi/stemtrace#readme
@@ -23,6 +23,7 @@ Classifier: Programming Language :: Python :: 3.10
23
23
  Classifier: Programming Language :: Python :: 3.11
24
24
  Classifier: Programming Language :: Python :: 3.12
25
25
  Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Programming Language :: Python :: 3.14
26
27
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
27
28
  Classifier: Topic :: System :: Monitoring
28
29
  Classifier: Typing :: Typed
@@ -67,27 +68,29 @@ Description-Content-Type: text/markdown
67
68
 
68
69
  ---
69
70
 
70
- > **Flower answers "what exists". stemtrace answers "what happened".**
71
+ > **Flower shows you what exists. Stemtrace shows you what happened.**
71
72
 
72
- `stemtrace` models Celery as a graph of executions derived from events. Visualize task flows, timelines, retries, and parent-child relationships — using your existing broker with zero new infrastructure.
73
+ Ever stared at a failed Celery task wondering "what called this?" or "why did it retry 5 times?"
74
+
75
+ Stemtrace captures your task executions as a graph — visualize parent→child flows, see retry chains, track groups and chords, all without adding any new infrastructure. Just your existing Redis broker.
73
76
 
74
77
  ## ✨ Features
75
78
 
76
- - **Task Flow Graphs** — Visualize parent → child chains, groups, and chords as DAGs
77
- - **Canvas Awareness** — Synthetic GROUP nodes for `group()` and `chord()` visualization
78
- - **Execution Timeline** — See queued → received → started → retried → finished states
79
- - **Full Lifecycle Capture** — PENDING, RECEIVED, STARTED, RETRY, SUCCESS, FAILURE states
80
- - **Arguments & Results** — View task inputs and outputs with sensitive data scrubbing
81
- - **Exception Capture** — Full traceback visibility on retries and failures
82
- - **Task Registry** — Browse all discovered task definitions
83
- - **Timing Visibility** — Start time and duration shown directly in graph nodes
84
- - **Correlation Tracking** — Trace requests across multiple tasks via `trace_id`
85
- - **Retry Visibility** — Know exactly which retries happened and why
86
- - **Zero Infrastructure** — Uses your existing broker; no database required
87
- - **Broker-Agnostic** — Works with Redis, RabbitMQ, and other Celery brokers
88
- - **FastAPI Pluggable** — Mount directly into your existing FastAPI app
89
- - **Zero Config** — Auto-detects your Celery broker configuration
79
+ **See What Happened**
80
+ - **Task Flow Graphs** — Visualize chains, groups, and chords as interactive DAGs
81
+ - **Execution Timeline** — Track queued → started → retried → finished states
82
+ - **Arguments & Results** — Inspect inputs, outputs, and exceptions
83
+ - **Retry Chains** — Understand exactly when and why retries happened
84
+
85
+ **Canvas Support**
86
+ - **Groups & Chords** — Automatic visualization of `group()` and `chord()` patterns
87
+ - **Parent-Child Tracking** — See which task spawned which
88
+
89
+ **Production Ready**
90
+ - **Zero Infrastructure** — Uses your existing Redis broker, no database needed
91
+ - **Sensitive Data Scrubbing** — Passwords and API keys filtered automatically
90
92
  - **Read-Only** — Safe for production; never modifies your task queue
93
+ - **FastAPI Integration** — Mount into your existing app with one line
91
94
 
92
95
  ## 🚀 Quick Start
93
96
 
@@ -109,17 +112,30 @@ app = Celery("myapp", broker="redis://localhost:6379/0")
109
112
  stemtrace.init(app)
110
113
  ```
111
114
 
112
- ### 3. Run the visualizer
115
+ ### 3. View the dashboard
116
+
117
+ **Option A: Standalone server** (new container/process)
113
118
 
114
119
  ```bash
115
120
  stemtrace server
116
121
  ```
117
122
 
118
- Open [http://localhost:8000](http://localhost:8000) and watch your task flows come alive.
123
+ Open [http://localhost:8000](http://localhost:8000).
119
124
 
120
- > By default, connects to `redis://localhost:6379/0`. Override with `--broker-url` or `STEMTRACE_BROKER_URL` env var.
125
+ **Option B: Embed in your FastAPI app** (no extra container)
121
126
 
122
- See [Deployment Options](#️-deployment-options) for FastAPI integration and production setups.
127
+ ```python
128
+ from fastapi import FastAPI
129
+ from stemtrace.server import StemtraceExtension
130
+
131
+ flow = StemtraceExtension(broker_url="redis://localhost:6379/0")
132
+ app = FastAPI(lifespan=flow.lifespan)
133
+ app.include_router(flow.router, prefix="/stemtrace")
134
+ ```
135
+
136
+ Access at `/stemtrace/` in your existing app — no new services to deploy.
137
+
138
+ See [Deployment Options](#️-deployment-options) for auth, scaling, and more.
123
139
 
124
140
  ## 📦 Architecture
125
141
 
@@ -188,6 +204,9 @@ stemtrace.init(
188
204
  safe_keys=frozenset({"public_key"}), # Never scrub these keys
189
205
  )
190
206
 
207
+ # Configuration also available via StemtraceConfig model:
208
+ # - max_data_size: Maximum serialized data size (default: 10KB)
209
+
191
210
  # Introspection (after init)
192
211
  stemtrace.is_initialized() # -> True
193
212
  stemtrace.get_config() # -> StemtraceConfig
@@ -257,15 +276,9 @@ batch_processor
257
276
  ## 🐳 Docker
258
277
 
259
278
  ```bash
260
- # With Redis
261
279
  docker run -p 8000:8000 \
262
280
  -e STEMTRACE_BROKER_URL=redis://host.docker.internal:6379/0 \
263
- ghcr.io/stemtrace/server
264
-
265
- # With RabbitMQ
266
- docker run -p 8000:8000 \
267
- -e STEMTRACE_BROKER_URL=amqp://guest:guest@host.docker.internal:5672/ \
268
- ghcr.io/stemtrace/server
281
+ ghcr.io/iansokolskyi/stemtrace
269
282
  ```
270
283
 
271
284
  Or with Docker Compose:
@@ -273,7 +286,7 @@ Or with Docker Compose:
273
286
  ```yaml
274
287
  services:
275
288
  stemtrace:
276
- image: ghcr.io/stemtrace/server
289
+ image: ghcr.io/iansokolskyi/stemtrace
277
290
  ports:
278
291
  - "8000:8000"
279
292
  environment:
@@ -330,7 +343,15 @@ Mount stemtrace directly into your existing FastAPI application:
330
343
  from fastapi import FastAPI
331
344
  from stemtrace.server import StemtraceExtension
332
345
 
333
- flow = StemtraceExtension(broker_url="redis://localhost:6379/0")
346
+ flow = StemtraceExtension(
347
+ broker_url="redis://localhost:6379/0",
348
+ # Optional configuration:
349
+ # embedded_consumer=True, # Run consumer in FastAPI process (default)
350
+ # serve_ui=True, # Serve React UI (default)
351
+ # prefix="stemtrace", # Redis key prefix
352
+ # ttl=86400, # Event TTL in seconds
353
+ # max_nodes=10000, # Max nodes to keep in memory
354
+ )
334
355
  app = FastAPI(lifespan=flow.lifespan)
335
356
  app.include_router(flow.router, prefix="/stemtrace")
336
357
  ```
@@ -376,53 +397,40 @@ app.include_router(flow.router, prefix="/stemtrace")
376
397
 
377
398
  ## 🗺️ Roadmap
378
399
 
379
- ### Completed
380
-
381
- - [x] Task lifecycle tracking via signals
382
- - [x] Broker-agnostic event transport (Redis Streams)
383
- - [x] FastAPI pluggable integration
384
- - [x] React SPA dashboard with real-time WebSocket updates
385
- - [x] Task flow graph visualization
386
- - [x] Execution timeline view
387
- - [x] Task args/kwargs capture with sensitive data scrubbing
388
- - [x] Exception and traceback capture
389
- - [x] Task registry (browse all discovered tasks)
390
- - [x] PENDING/RECEIVED state capture
391
- - [x] E2E test suite (Docker API tests + Playwright browser tests)
392
- - [x] Canvas graph reconstruction (`group_id` capture, synthetic GROUP/CHORD nodes)
393
- - [x] Chord callback linking (CHORD node → callback edge)
394
- - [x] Timing display in graph nodes (start time, duration)
395
-
396
- ### Planned
397
-
398
- - [ ] Worker/queue tracking in events
399
- - [ ] Monitoring APIs (workers, stats, orphan detection)
400
- - [ ] UI reorganization (Dashboard, unified Executions, enhanced Registry)
401
- - [ ] RabbitMQ transport
402
- - [ ] OpenTelemetry export
403
- - [ ] Webhook event export
404
- - [ ] JSON export API
400
+ ### What's Working Now
401
+
402
+ - ✅ **Task flow graphs** — Visualize chains, groups, and chords as DAGs
403
+ - ✅ **Full lifecycle tracking** — PENDING → RECEIVED → STARTED → SUCCESS/FAILURE
404
+ - ✅ **Canvas awareness** — Automatic GROUP/CHORD node visualization
405
+ - ✅ **Arguments & results** — View inputs, outputs, and exceptions
406
+ - ✅ **Sensitive data scrubbing** — Passwords and API keys filtered automatically
407
+ - ✅ **Real-time updates** — WebSocket-powered live dashboard
408
+ - ✅ **FastAPI integration** — Mount into your existing app
409
+ - ✅ **Task registry** — Browse all discovered task definitions
410
+
411
+ ### Coming Soon
412
+
413
+ - 🔜 **RabbitMQ support** — Use your existing RabbitMQ broker
414
+ - 🔜 **Worker monitoring** — See which worker processed each task
415
+ - 🔜 **Anomaly detection** — Spot stuck, orphaned, or failed tasks
416
+ - 🔜 **Dashboard with stats** — Success rates, durations, failure trends
417
+ - 🔜 **OpenTelemetry export** — Send traces to Jaeger, Tempo, Datadog
418
+ - 🔜 **Webhook notifications** — Push events to your systems
419
+ - 🔜 **Data export** — Download execution history as JSON
405
420
 
406
421
  ## 🤝 Contributing
407
422
 
408
- Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) first.
423
+ Contributions, bug reports, and feature requests are welcome! This is a community project — if stemtrace helps you debug Celery, consider helping make it better.
424
+
425
+ See our [Contributing Guide](CONTRIBUTING.md) to get started.
409
426
 
410
427
  ```bash
411
- # Clone the repo
412
428
  git clone https://github.com/iansokolskyi/stemtrace.git
413
429
  cd stemtrace
414
-
415
- # Install dependencies (requires uv)
416
- uv sync --all-extras
417
-
418
- # Run checks
419
- make check
430
+ uv sync --all-extras # Install dependencies
431
+ make check # Run tests
420
432
  ```
421
433
 
422
434
  ## 📄 License
423
435
 
424
- MIT License — see [LICENSE](LICENSE) for details.
425
-
426
- ---
427
-
428
- **stemtrace** is not affiliated with the Celery project. Celery is a trademark of Ask Solem.
436
+ MIT — use it however you like.