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.
- {stemtrace-0.1.0 → stemtrace-0.1.1}/.bumpversion.toml +1 -1
- {stemtrace-0.1.0 → stemtrace-0.1.1}/.github/workflows/ci.yml +7 -7
- {stemtrace-0.1.0 → stemtrace-0.1.1}/.github/workflows/e2e.yml +4 -4
- {stemtrace-0.1.0 → stemtrace-0.1.1}/.github/workflows/release.yml +8 -8
- {stemtrace-0.1.0 → stemtrace-0.1.1}/CHANGELOG.md +17 -1
- {stemtrace-0.1.0 → stemtrace-0.1.1}/Makefile +14 -6
- {stemtrace-0.1.0 → stemtrace-0.1.1}/PKG-INFO +77 -69
- {stemtrace-0.1.0 → stemtrace-0.1.1}/README.md +75 -68
- {stemtrace-0.1.0 → stemtrace-0.1.1}/pyproject.toml +2 -1
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/__init__.py +1 -1
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/package-lock.json +92 -58
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/package.json +6 -6
- stemtrace-0.1.1/src/stemtrace/server/ui/frontend/playwright.config.ts +63 -0
- stemtrace-0.1.1/src/stemtrace/server/ui/frontend/tests/fixtures/mock-api.ts +362 -0
- stemtrace-0.1.1/src/stemtrace/server/ui/frontend/tests/fixtures/mock-data.ts +429 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tests/graphs.spec.ts +112 -4
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tests/registry.spec.ts +37 -5
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tests/task-detail.spec.ts +77 -3
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tests/tasks.spec.ts +65 -3
- {stemtrace-0.1.0 → stemtrace-0.1.1}/uv.lock +1 -1
- stemtrace-0.1.0/.context/active-context.md +0 -141
- stemtrace-0.1.0/.context/product-context.md +0 -108
- stemtrace-0.1.0/.context/progress.md +0 -383
- stemtrace-0.1.0/.context/project-brief.md +0 -70
- stemtrace-0.1.0/.context/project-structure.md +0 -124
- stemtrace-0.1.0/.context/strategic-analysis.md +0 -174
- stemtrace-0.1.0/.context/system-patterns.md +0 -265
- stemtrace-0.1.0/.context/tech-context.md +0 -223
- stemtrace-0.1.0/.cursor/commands/audit-context.md +0 -110
- stemtrace-0.1.0/.cursor/commands/commit.md +0 -89
- stemtrace-0.1.0/.cursor/commands/pr-review.md +0 -233
- stemtrace-0.1.0/.cursor/commands/pr.md +0 -149
- stemtrace-0.1.0/.cursor/rules/architecture.mdc +0 -111
- stemtrace-0.1.0/.cursor/rules/open-source.mdc +0 -261
- stemtrace-0.1.0/.cursor/rules/project.mdc +0 -79
- stemtrace-0.1.0/.cursor/rules/python.mdc +0 -136
- stemtrace-0.1.0/.cursor/rules/testing.mdc +0 -99
- stemtrace-0.1.0/.cursor/rules/ui-websocket.mdc +0 -278
- stemtrace-0.1.0/.cursor/rules/workflow.mdc +0 -208
- stemtrace-0.1.0/src/stemtrace/server/ui/frontend/playwright.config.ts +0 -40
- {stemtrace-0.1.0 → stemtrace-0.1.1}/.dockerignore +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/.github/dependabot.yml +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/.gitignore +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/.pre-commit-config.yaml +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/.python-version +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/CONTRIBUTING.md +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/Dockerfile +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/Dockerfile.e2e +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/LICENSE +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/build_ui.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/docker-compose.e2e.yml +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/docker-compose.yml +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/examples/celery_app.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/examples/fastapi_integration.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/examples/with_auth.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/core/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/core/events.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/core/exceptions.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/core/graph.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/core/ports.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/bootsteps.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/config.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/scrubbing.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/signals.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/transports/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/transports/memory.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/library/transports/redis.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/py.typed +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/__main__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/api/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/api/routes.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/api/schemas.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/api/websocket.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/consumer.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/fastapi/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/fastapi/auth.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/fastapi/extension.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/fastapi/router.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/store.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/biome.json +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/index.html +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/postcss.config.js +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/api/client.ts +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/api/queries.ts +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/DateRangePicker.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/Filters.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/TaskGraph.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/TaskList.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/TaskStateBadge.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/TaskTimeline.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/TimelineBar.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/components/Tooltip.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/hooks/WebSocketContext.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/hooks/useInfiniteScroll.ts +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/index.css +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/main.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/__root.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/graph.$rootId.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/graphs.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/index.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/registry.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/routes/tasks.$taskId.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/src/utils/format.ts +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tsconfig.json +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/tsconfig.tsbuildinfo +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/frontend/vite.config.ts +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/ui/static.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/src/stemtrace/server/websocket.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/conftest.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/e2e/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/e2e/conftest.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/e2e/tasks.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/e2e/test_api_e2e.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/integration/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/integration/test_fastapi_integration.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/integration/test_redis_transport.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/integration/test_static_ui.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_auth.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_bootsteps.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_config.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_consumer.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_events.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_examples.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_exceptions.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_graph.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_init.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_routes.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_scrubbing.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_signals.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_store.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_transports.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.1.1}/tests/unit/test_websocket.py +0 -0
|
@@ -15,7 +15,7 @@ jobs:
|
|
|
15
15
|
- uses: actions/checkout@v6
|
|
16
16
|
|
|
17
17
|
- name: Set up Python
|
|
18
|
-
uses: actions/setup-python@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
142
|
+
- uses: actions/checkout@v6
|
|
143
143
|
|
|
144
144
|
- name: Download dist artifacts
|
|
145
|
-
uses: actions/download-artifact@
|
|
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.
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
71
|
+
> **Flower shows you what exists. Stemtrace shows you what happened.**
|
|
71
72
|
|
|
72
|
-
|
|
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
|
-
|
|
77
|
-
- **
|
|
78
|
-
- **Execution Timeline** —
|
|
79
|
-
- **
|
|
80
|
-
- **
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
- **
|
|
84
|
-
- **
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
- **
|
|
88
|
-
- **
|
|
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.
|
|
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)
|
|
123
|
+
Open [http://localhost:8000](http://localhost:8000).
|
|
119
124
|
|
|
120
|
-
|
|
125
|
+
**Option B: Embed in your FastAPI app** (no extra container)
|
|
121
126
|
|
|
122
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
###
|
|
380
|
-
|
|
381
|
-
-
|
|
382
|
-
-
|
|
383
|
-
-
|
|
384
|
-
-
|
|
385
|
-
-
|
|
386
|
-
-
|
|
387
|
-
-
|
|
388
|
-
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
-
|
|
393
|
-
-
|
|
394
|
-
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
-
|
|
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!
|
|
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
|
-
#
|
|
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
|
|
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.
|