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.
Files changed (153) hide show
  1. {stemtrace-0.1.0 → stemtrace-0.2.0}/.bumpversion.toml +1 -1
  2. {stemtrace-0.1.0 → stemtrace-0.2.0}/.github/workflows/ci.yml +7 -7
  3. {stemtrace-0.1.0 → stemtrace-0.2.0}/.github/workflows/e2e.yml +5 -4
  4. {stemtrace-0.1.0 → stemtrace-0.2.0}/.github/workflows/release.yml +8 -8
  5. {stemtrace-0.1.0 → stemtrace-0.2.0}/CHANGELOG.md +25 -2
  6. {stemtrace-0.1.0 → stemtrace-0.2.0}/CONTRIBUTING.md +3 -3
  7. {stemtrace-0.1.0 → stemtrace-0.2.0}/Makefile +16 -8
  8. {stemtrace-0.1.0 → stemtrace-0.2.0}/PKG-INFO +149 -111
  9. {stemtrace-0.1.0 → stemtrace-0.2.0}/README.md +147 -107
  10. stemtrace-0.2.0/docs/screenshots/task_details.png +0 -0
  11. stemtrace-0.2.0/docs/screenshots/unregistered.png +0 -0
  12. stemtrace-0.2.0/docs/screenshots/workflow.png +0 -0
  13. {stemtrace-0.1.0 → stemtrace-0.2.0}/examples/celery_app.py +7 -1
  14. {stemtrace-0.1.0 → stemtrace-0.2.0}/examples/fastapi_integration.py +18 -18
  15. {stemtrace-0.1.0 → stemtrace-0.2.0}/examples/with_auth.py +10 -11
  16. stemtrace-0.2.0/progress.md +5 -0
  17. {stemtrace-0.1.0 → stemtrace-0.2.0}/pyproject.toml +2 -6
  18. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/__init__.py +77 -62
  19. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/core/events.py +40 -0
  20. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/core/graph.py +71 -2
  21. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/core/ports.py +3 -3
  22. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/scrubbing.py +1 -1
  23. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/signals.py +144 -4
  24. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/transports/memory.py +6 -4
  25. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/transports/redis.py +51 -7
  26. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/__main__.py +5 -5
  27. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/api/__init__.py +6 -0
  28. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/api/routes.py +201 -7
  29. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/api/schemas.py +43 -0
  30. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/consumer.py +77 -5
  31. stemtrace-0.2.0/src/stemtrace/server/fastapi/extension.py +170 -0
  32. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/fastapi/router.py +12 -3
  33. stemtrace-0.2.0/src/stemtrace/server/store.py +514 -0
  34. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/package-lock.json +167 -73
  35. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/package.json +8 -8
  36. stemtrace-0.2.0/src/stemtrace/server/ui/frontend/playwright.config.ts +63 -0
  37. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/api/client.ts +51 -6
  38. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/api/queries.ts +17 -3
  39. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/hooks/WebSocketContext.tsx +18 -4
  40. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/main.tsx +5 -1
  41. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/routes/__root.tsx +6 -0
  42. stemtrace-0.2.0/src/stemtrace/server/ui/frontend/src/routes/registry.tsx +411 -0
  43. stemtrace-0.2.0/src/stemtrace/server/ui/frontend/src/routes/workers.tsx +172 -0
  44. stemtrace-0.2.0/src/stemtrace/server/ui/frontend/src/vite-env.d.ts +10 -0
  45. stemtrace-0.2.0/src/stemtrace/server/ui/frontend/tests/fixtures/mock-api.ts +430 -0
  46. stemtrace-0.2.0/src/stemtrace/server/ui/frontend/tests/fixtures/mock-data.ts +496 -0
  47. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tests/graphs.spec.ts +112 -4
  48. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tests/registry.spec.ts +37 -5
  49. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tests/task-detail.spec.ts +77 -3
  50. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tests/tasks.spec.ts +65 -3
  51. stemtrace-0.2.0/src/stemtrace/server/ui/frontend/tests/workers.spec.ts +64 -0
  52. stemtrace-0.2.0/src/stemtrace/server/ui/static.py +122 -0
  53. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/websocket.py +4 -1
  54. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/e2e/conftest.py +1 -1
  55. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/e2e/tasks.py +1 -1
  56. stemtrace-0.2.0/tests/e2e/test_workers_e2e.py +117 -0
  57. stemtrace-0.2.0/tests/integration/test_embedded_static.py +464 -0
  58. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/integration/test_fastapi_integration.py +228 -0
  59. stemtrace-0.2.0/tests/integration/test_static_ui.py +400 -0
  60. stemtrace-0.2.0/tests/integration/test_workers_refresh.py +83 -0
  61. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_bootsteps.py +47 -0
  62. stemtrace-0.2.0/tests/unit/test_consumer.py +436 -0
  63. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_events.py +108 -1
  64. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_examples.py +21 -16
  65. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_graph.py +232 -0
  66. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_init.py +46 -33
  67. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_routes.py +174 -0
  68. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_scrubbing.py +36 -0
  69. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_signals.py +396 -1
  70. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_store.py +721 -7
  71. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_transports.py +113 -1
  72. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_websocket.py +24 -0
  73. {stemtrace-0.1.0 → stemtrace-0.2.0}/uv.lock +2 -17
  74. stemtrace-0.1.0/.context/active-context.md +0 -141
  75. stemtrace-0.1.0/.context/product-context.md +0 -108
  76. stemtrace-0.1.0/.context/progress.md +0 -383
  77. stemtrace-0.1.0/.context/project-brief.md +0 -70
  78. stemtrace-0.1.0/.context/project-structure.md +0 -124
  79. stemtrace-0.1.0/.context/strategic-analysis.md +0 -174
  80. stemtrace-0.1.0/.context/system-patterns.md +0 -265
  81. stemtrace-0.1.0/.context/tech-context.md +0 -223
  82. stemtrace-0.1.0/.cursor/commands/audit-context.md +0 -110
  83. stemtrace-0.1.0/.cursor/commands/commit.md +0 -89
  84. stemtrace-0.1.0/.cursor/commands/pr-review.md +0 -233
  85. stemtrace-0.1.0/.cursor/commands/pr.md +0 -149
  86. stemtrace-0.1.0/.cursor/rules/architecture.mdc +0 -111
  87. stemtrace-0.1.0/.cursor/rules/open-source.mdc +0 -261
  88. stemtrace-0.1.0/.cursor/rules/project.mdc +0 -79
  89. stemtrace-0.1.0/.cursor/rules/python.mdc +0 -136
  90. stemtrace-0.1.0/.cursor/rules/testing.mdc +0 -99
  91. stemtrace-0.1.0/.cursor/rules/ui-websocket.mdc +0 -278
  92. stemtrace-0.1.0/.cursor/rules/workflow.mdc +0 -208
  93. stemtrace-0.1.0/src/stemtrace/server/fastapi/extension.py +0 -121
  94. stemtrace-0.1.0/src/stemtrace/server/store.py +0 -260
  95. stemtrace-0.1.0/src/stemtrace/server/ui/frontend/playwright.config.ts +0 -40
  96. stemtrace-0.1.0/src/stemtrace/server/ui/frontend/src/routes/registry.tsx +0 -211
  97. stemtrace-0.1.0/src/stemtrace/server/ui/static.py +0 -56
  98. stemtrace-0.1.0/tests/integration/test_static_ui.py +0 -114
  99. stemtrace-0.1.0/tests/unit/test_consumer.py +0 -167
  100. {stemtrace-0.1.0 → stemtrace-0.2.0}/.dockerignore +0 -0
  101. {stemtrace-0.1.0 → stemtrace-0.2.0}/.github/dependabot.yml +0 -0
  102. {stemtrace-0.1.0 → stemtrace-0.2.0}/.gitignore +0 -0
  103. {stemtrace-0.1.0 → stemtrace-0.2.0}/.pre-commit-config.yaml +0 -0
  104. {stemtrace-0.1.0 → stemtrace-0.2.0}/.python-version +0 -0
  105. {stemtrace-0.1.0 → stemtrace-0.2.0}/Dockerfile +0 -0
  106. {stemtrace-0.1.0 → stemtrace-0.2.0}/Dockerfile.e2e +0 -0
  107. {stemtrace-0.1.0 → stemtrace-0.2.0}/LICENSE +0 -0
  108. {stemtrace-0.1.0 → stemtrace-0.2.0}/build_ui.py +0 -0
  109. {stemtrace-0.1.0 → stemtrace-0.2.0}/docker-compose.e2e.yml +0 -0
  110. {stemtrace-0.1.0 → stemtrace-0.2.0}/docker-compose.yml +0 -0
  111. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/core/__init__.py +0 -0
  112. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/core/exceptions.py +0 -0
  113. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/__init__.py +0 -0
  114. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/bootsteps.py +0 -0
  115. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/config.py +0 -0
  116. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/library/transports/__init__.py +0 -0
  117. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/py.typed +0 -0
  118. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/__init__.py +0 -0
  119. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/api/websocket.py +0 -0
  120. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/fastapi/__init__.py +0 -0
  121. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/fastapi/auth.py +0 -0
  122. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/__init__.py +0 -0
  123. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/biome.json +0 -0
  124. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/index.html +0 -0
  125. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/postcss.config.js +0 -0
  126. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/DateRangePicker.tsx +0 -0
  127. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/Filters.tsx +0 -0
  128. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/TaskGraph.tsx +0 -0
  129. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/TaskList.tsx +0 -0
  130. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/TaskStateBadge.tsx +0 -0
  131. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/TaskTimeline.tsx +0 -0
  132. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/TimelineBar.tsx +0 -0
  133. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/components/Tooltip.tsx +0 -0
  134. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/hooks/useInfiniteScroll.ts +0 -0
  135. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/index.css +0 -0
  136. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/routes/graph.$rootId.tsx +0 -0
  137. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/routes/graphs.tsx +0 -0
  138. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/routes/index.tsx +0 -0
  139. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/routes/tasks.$taskId.tsx +0 -0
  140. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/src/utils/format.ts +0 -0
  141. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tsconfig.json +0 -0
  142. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/tsconfig.tsbuildinfo +0 -0
  143. {stemtrace-0.1.0 → stemtrace-0.2.0}/src/stemtrace/server/ui/frontend/vite.config.ts +0 -0
  144. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/__init__.py +0 -0
  145. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/conftest.py +0 -0
  146. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/e2e/__init__.py +0 -0
  147. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/e2e/test_api_e2e.py +0 -0
  148. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/integration/__init__.py +0 -0
  149. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/integration/test_redis_transport.py +0 -0
  150. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/__init__.py +0 -0
  151. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_auth.py +0 -0
  152. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_config.py +0 -0
  153. {stemtrace-0.1.0 → stemtrace-0.2.0}/tests/unit/test_exceptions.py +0 -0
@@ -1,5 +1,5 @@
1
1
  [tool.bumpversion]
2
- current_version = "0.1.0"
2
+ current_version = "0.2.0"
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=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@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
 
@@ -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@v4
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@v4
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@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,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.init(app)`
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.1.0...HEAD
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 --all-extras
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:** 80% minimum
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
- - Immutable dataclasses with `frozen=True, slots=True`
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=80
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
- # 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..."
168
- @timeout 60 bash -c 'until curl -sf http://localhost:8000/stemtrace/api/health -o /dev/null; do sleep 2; done' || true
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 (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