stemtrace 0.1.0__tar.gz → 0.2.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.
- {stemtrace-0.1.0 → stemtrace-0.2.0}/.bumpversion.toml +1 -1
- {stemtrace-0.1.0 → stemtrace-0.2.0}/.github/workflows/ci.yml +7 -7
- {stemtrace-0.1.0 → stemtrace-0.2.0}/.github/workflows/e2e.yml +5 -4
- {stemtrace-0.1.0 → stemtrace-0.2.0}/.github/workflows/release.yml +8 -8
- {stemtrace-0.1.0 → stemtrace-0.2.0}/CHANGELOG.md +25 -2
- {stemtrace-0.1.0 → stemtrace-0.2.0}/CONTRIBUTING.md +3 -3
- {stemtrace-0.1.0 → stemtrace-0.2.0}/Makefile +16 -8
- {stemtrace-0.1.0 → stemtrace-0.2.0}/PKG-INFO +149 -111
- {stemtrace-0.1.0 → stemtrace-0.2.0}/README.md +147 -107
- stemtrace-0.2.0/docs/screenshots/task_details.png +0 -0
- stemtrace-0.2.0/docs/screenshots/unregistered.png +0 -0
- stemtrace-0.2.0/docs/screenshots/workflow.png +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/examples/celery_app.py +7 -1
- {stemtrace-0.1.0 → stemtrace-0.2.0}/examples/fastapi_integration.py +18 -18
- {stemtrace-0.1.0 → stemtrace-0.2.0}/examples/with_auth.py +10 -11
- stemtrace-0.2.0/progress.md +5 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/pyproject.toml +2 -6
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/__init__.py +77 -62
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/core/events.py +40 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/core/graph.py +71 -2
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/core/ports.py +3 -3
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/scrubbing.py +1 -1
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/signals.py +144 -4
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/transports/memory.py +6 -4
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/transports/redis.py +51 -7
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/__main__.py +5 -5
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/api/__init__.py +6 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/api/routes.py +201 -7
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/api/schemas.py +43 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/consumer.py +77 -5
- stemtrace-0.2.0/src/stemtrace/server/fastapi/extension.py +170 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/fastapi/router.py +12 -3
- stemtrace-0.2.0/src/stemtrace/server/store.py +514 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/package-lock.json +167 -73
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/package.json +8 -8
- stemtrace-0.2.0/src/stemtrace/server/ui/frontend/playwright.config.ts +63 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/api/client.ts +51 -6
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/api/queries.ts +17 -3
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/hooks/WebSocketContext.tsx +18 -4
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/main.tsx +5 -1
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/routes/__root.tsx +6 -0
- stemtrace-0.2.0/src/stemtrace/server/ui/frontend/src/routes/registry.tsx +411 -0
- stemtrace-0.2.0/src/stemtrace/server/ui/frontend/src/routes/workers.tsx +172 -0
- stemtrace-0.2.0/src/stemtrace/server/ui/frontend/src/vite-env.d.ts +10 -0
- stemtrace-0.2.0/src/stemtrace/server/ui/frontend/tests/fixtures/mock-api.ts +430 -0
- stemtrace-0.2.0/src/stemtrace/server/ui/frontend/tests/fixtures/mock-data.ts +496 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tests/graphs.spec.ts +112 -4
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tests/registry.spec.ts +37 -5
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tests/task-detail.spec.ts +77 -3
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tests/tasks.spec.ts +65 -3
- stemtrace-0.2.0/src/stemtrace/server/ui/frontend/tests/workers.spec.ts +64 -0
- stemtrace-0.2.0/src/stemtrace/server/ui/static.py +122 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/websocket.py +4 -1
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/e2e/conftest.py +1 -1
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/e2e/tasks.py +1 -1
- stemtrace-0.2.0/tests/e2e/test_workers_e2e.py +117 -0
- stemtrace-0.2.0/tests/integration/test_embedded_static.py +464 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/integration/test_fastapi_integration.py +228 -0
- stemtrace-0.2.0/tests/integration/test_static_ui.py +400 -0
- stemtrace-0.2.0/tests/integration/test_workers_refresh.py +83 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_bootsteps.py +47 -0
- stemtrace-0.2.0/tests/unit/test_consumer.py +436 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_events.py +108 -1
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_examples.py +21 -16
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_graph.py +232 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_init.py +46 -33
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_routes.py +174 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_scrubbing.py +36 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_signals.py +396 -1
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_store.py +721 -7
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_transports.py +113 -1
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_websocket.py +24 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/uv.lock +2 -17
- 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/fastapi/extension.py +0 -121
- stemtrace-0.1.0/src/stemtrace/server/store.py +0 -260
- stemtrace-0.1.0/src/stemtrace/server/ui/frontend/playwright.config.ts +0 -40
- stemtrace-0.1.0/src/stemtrace/server/ui/frontend/src/routes/registry.tsx +0 -211
- stemtrace-0.1.0/src/stemtrace/server/ui/static.py +0 -56
- stemtrace-0.1.0/tests/integration/test_static_ui.py +0 -114
- stemtrace-0.1.0/tests/unit/test_consumer.py +0 -167
- {stemtrace-0.1.0 → stemtrace-0.2.0}/.dockerignore +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/.github/dependabot.yml +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/.gitignore +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/.pre-commit-config.yaml +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/.python-version +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/Dockerfile +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/Dockerfile.e2e +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/LICENSE +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/build_ui.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/docker-compose.e2e.yml +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/docker-compose.yml +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/core/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/core/exceptions.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/bootsteps.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/config.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/transports/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/py.typed +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/api/websocket.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/fastapi/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/fastapi/auth.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/biome.json +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/index.html +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/postcss.config.js +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/DateRangePicker.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/Filters.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/TaskGraph.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/TaskList.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/TaskStateBadge.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/TaskTimeline.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/TimelineBar.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/Tooltip.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/hooks/useInfiniteScroll.ts +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/index.css +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/routes/graph.$rootId.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/routes/graphs.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/routes/index.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/routes/tasks.$taskId.tsx +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/utils/format.ts +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tsconfig.json +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tsconfig.tsbuildinfo +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/vite.config.ts +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/conftest.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/e2e/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/e2e/test_api_e2e.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/integration/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/integration/test_redis_transport.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/__init__.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_auth.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_config.py +0 -0
- {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_exceptions.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=
|
|
79
|
+
run: uv run pytest --cov=stemtrace --cov-branch --cov-report=xml --cov-fail-under=95
|
|
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
|
|
|
@@ -126,10 +126,11 @@ jobs:
|
|
|
126
126
|
working-directory: src/stemtrace/server/ui/frontend
|
|
127
127
|
run: npm test
|
|
128
128
|
env:
|
|
129
|
+
E2E_MODE: real
|
|
129
130
|
PLAYWRIGHT_BASE_URL: http://localhost:8000
|
|
130
131
|
|
|
131
132
|
- name: Upload Playwright report
|
|
132
|
-
uses: actions/upload-artifact@
|
|
133
|
+
uses: actions/upload-artifact@v6
|
|
133
134
|
if: always()
|
|
134
135
|
with:
|
|
135
136
|
name: playwright-report
|
|
@@ -137,7 +138,7 @@ jobs:
|
|
|
137
138
|
retention-days: 7
|
|
138
139
|
|
|
139
140
|
- name: Upload test results
|
|
140
|
-
uses: actions/upload-artifact@
|
|
141
|
+
uses: actions/upload-artifact@v6
|
|
141
142
|
if: failure()
|
|
142
143
|
with:
|
|
143
144
|
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,13 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.2.0] - 2026-01-03
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Workers API endpoints: `GET /api/workers` and `GET /api/workers/{hostname}`
|
|
14
|
+
- Worker lifecycle tracking via `worker_ready` / `worker_shutdown` events to maintain a live worker registry
|
|
15
|
+
- Workers UI page for inspecting online/offline workers and their registered tasks
|
|
16
|
+
- Task Registry now shows which workers registered each task (`registered_by`)
|
|
17
|
+
|
|
18
|
+
## [0.1.1] - 2025-12-31
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- Python 3.14 support in CI and project classifiers
|
|
22
|
+
- Mock-based E2E testing mode (no Docker required for local dev)
|
|
23
|
+
- Codecov integration for coverage reporting
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
- Upgraded React and React-DOM to v19
|
|
27
|
+
- Upgraded @tanstack/react-query to latest
|
|
28
|
+
- Updated GitHub Actions to v6 (checkout, setup-python, setup-node, upload/download-artifact)
|
|
29
|
+
- Improved README with clearer Quick Start and FastAPI embedding docs
|
|
30
|
+
|
|
10
31
|
## [0.1.0] - 2025-12-27
|
|
11
32
|
|
|
12
33
|
### Added
|
|
13
34
|
- **Core domain models**: `TaskEvent`, `TaskState`, `TaskNode`, `TaskGraph`
|
|
14
35
|
- **Protocol definitions**: `EventTransport`, `TaskRepository`, `AsyncEventConsumer`
|
|
15
36
|
- **Event transports**: Redis Streams (`RedisTransport`), in-memory (`MemoryTransport`)
|
|
16
|
-
- **Celery signal integration**: Automatic event capture via `stemtrace.
|
|
37
|
+
- **Celery signal integration**: Automatic event capture via `stemtrace.init_worker(app)`
|
|
17
38
|
- **Server components**:
|
|
18
39
|
- `GraphStore` — Thread-safe in-memory graph storage with LRU eviction
|
|
19
40
|
- `EventConsumer` / `AsyncEventConsumer` — Background event processing
|
|
@@ -29,5 +50,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
29
50
|
- **E2E test suite**: Docker API tests + Playwright browser tests
|
|
30
51
|
- **Comprehensive test suite**: 350+ Python tests, 90%+ coverage
|
|
31
52
|
|
|
32
|
-
[unreleased]: https://github.com/iansokolskyi/stemtrace/compare/v0.
|
|
53
|
+
[unreleased]: https://github.com/iansokolskyi/stemtrace/compare/v0.2.0...HEAD
|
|
54
|
+
[0.2.0]: https://github.com/iansokolskyi/stemtrace/compare/v0.1.1...v0.2.0
|
|
55
|
+
[0.1.1]: https://github.com/iansokolskyi/stemtrace/compare/v0.1.0...v0.1.1
|
|
33
56
|
[0.1.0]: https://github.com/iansokolskyi/stemtrace/releases/tag/v0.1.0
|
|
@@ -19,7 +19,7 @@ git clone https://github.com/iansokolskyi/stemtrace.git
|
|
|
19
19
|
cd stemtrace
|
|
20
20
|
|
|
21
21
|
# Install dependencies (creates venv automatically)
|
|
22
|
-
uv sync --
|
|
22
|
+
uv sync --extra dev
|
|
23
23
|
|
|
24
24
|
# Install pre-commit hooks
|
|
25
25
|
uv run pre-commit install
|
|
@@ -79,7 +79,7 @@ uv run pytest
|
|
|
79
79
|
uv run pytest --cov=stemtrace --cov-report=term-missing
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
-
**Coverage requirement:**
|
|
82
|
+
**Coverage requirement:** 95% minimum
|
|
83
83
|
|
|
84
84
|
### Updating Dependencies
|
|
85
85
|
|
|
@@ -132,7 +132,7 @@ uv lock --upgrade
|
|
|
132
132
|
### Code Quality
|
|
133
133
|
|
|
134
134
|
- Google-style docstrings on all public APIs
|
|
135
|
-
-
|
|
135
|
+
- Pydantic models: immutable with `model_config = ConfigDict(frozen=True)`, mutable with `validate_assignment=True`
|
|
136
136
|
- Fire-and-forget pattern for publishers (never block)
|
|
137
137
|
- Fakes over mocks in tests
|
|
138
138
|
|
|
@@ -36,7 +36,7 @@ format:
|
|
|
36
36
|
uv run ruff check --fix src/ tests/
|
|
37
37
|
|
|
38
38
|
test:
|
|
39
|
-
uv run pytest --cov=stemtrace --cov-report=term-missing --cov-fail-under=
|
|
39
|
+
uv run pytest --cov=stemtrace --cov-report=term-missing --cov-fail-under=95
|
|
40
40
|
|
|
41
41
|
# Run tests without coverage (faster iteration)
|
|
42
42
|
test-fast:
|
|
@@ -161,11 +161,16 @@ 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..."
|
|
168
|
-
@timeout 60 bash -c 'until curl -sf http://localhost:8000/stemtrace/api/health -o /dev/null; do sleep 2; done' ||
|
|
173
|
+
@timeout 60 bash -c 'until curl -sf http://localhost:8000/stemtrace/api/health -o /dev/null; do sleep 2; done' || (echo "❌ Service failed to become healthy"; exit 1)
|
|
169
174
|
@echo "✅ E2E environment ready at http://localhost:8000"
|
|
170
175
|
|
|
171
176
|
# Stop E2E test environment
|
|
@@ -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
|