Skip to content

Commit d3b47ba

Browse files
authored
Merge pull request #7 from wavezync/feat/dashboard
feat(dashboard): add durable_dashboard package + engine and tooling overhaul
2 parents 739bec3 + f78c665 commit d3b47ba

310 files changed

Lines changed: 36888 additions & 2708 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 110 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,43 @@ on:
66
pull_request:
77
branches: [main]
88

9+
concurrency:
10+
group: ci-${{ github.workflow }}-${{ github.ref }}
11+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
12+
913
env:
1014
MIX_ENV: test
15+
ELIXIR_VERSION: "1.19"
16+
OTP_VERSION: "28"
1117

1218
jobs:
13-
test:
14-
name: Test (Elixir ${{ matrix.elixir }} / OTP ${{ matrix.otp }})
19+
changes:
20+
name: Detect changes
1521
runs-on: ubuntu-latest
22+
outputs:
23+
durable: ${{ steps.filter.outputs.durable }}
24+
dashboard: ${{ steps.filter.outputs.dashboard }}
25+
ci: ${{ steps.filter.outputs.ci }}
26+
steps:
27+
- uses: actions/checkout@v6
1628

17-
strategy:
18-
matrix:
19-
elixir: ["1.19"]
20-
otp: ["28"]
29+
- uses: dorny/paths-filter@v3
30+
id: filter
31+
with:
32+
filters: |
33+
durable:
34+
- 'durable/**'
35+
dashboard:
36+
- 'durable/**'
37+
- 'durable_dashboard/**'
38+
ci:
39+
- '.github/workflows/**'
40+
41+
durable:
42+
name: Durable
43+
needs: changes
44+
if: needs.changes.outputs.durable == 'true' || needs.changes.outputs.ci == 'true' || github.event_name == 'push'
45+
runs-on: ubuntu-latest
2146

2247
services:
2348
postgres:
@@ -33,28 +58,32 @@ jobs:
3358
--health-timeout=5s
3459
--health-retries=5
3560
61+
defaults:
62+
run:
63+
working-directory: durable
64+
3665
steps:
3766
- uses: actions/checkout@v6
3867

3968
- name: Set up Elixir
4069
uses: erlef/setup-beam@v1
4170
with:
42-
elixir-version: ${{ matrix.elixir }}
43-
otp-version: ${{ matrix.otp }}
71+
elixir-version: ${{ env.ELIXIR_VERSION }}
72+
otp-version: ${{ env.OTP_VERSION }}
4473

4574
- name: Restore dependencies cache
4675
uses: actions/cache@v4
4776
with:
48-
path: deps
49-
key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }}
50-
restore-keys: ${{ runner.os }}-mix-
77+
path: durable/deps
78+
key: ${{ runner.os }}-durable-mix-${{ hashFiles('durable/mix.lock') }}
79+
restore-keys: ${{ runner.os }}-durable-mix-
5180

5281
- name: Restore build cache
53-
uses: actions/cache@v5
82+
uses: actions/cache@v4
5483
with:
55-
path: _build
56-
key: ${{ runner.os }}-build-${{ matrix.otp }}-${{ matrix.elixir }}-${{ hashFiles('**/mix.lock') }}
57-
restore-keys: ${{ runner.os }}-build-${{ matrix.otp }}-${{ matrix.elixir }}-
84+
path: durable/_build
85+
key: ${{ runner.os }}-durable-build-${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-${{ hashFiles('durable/mix.lock') }}
86+
restore-keys: ${{ runner.os }}-durable-build-${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-
5887

5988
- name: Install dependencies
6089
run: mix deps.get
@@ -65,31 +94,86 @@ jobs:
6594
- name: Compile
6695
run: mix compile --warnings-as-errors
6796

97+
- name: Credo
98+
run: mix credo --strict
99+
68100
- name: Run tests
69101
run: mix test
70102

71-
credo:
72-
name: Credo
103+
dashboard:
104+
name: Dashboard
105+
needs: changes
106+
if: needs.changes.outputs.dashboard == 'true' || needs.changes.outputs.ci == 'true' || github.event_name == 'push'
73107
runs-on: ubuntu-latest
74108

109+
defaults:
110+
run:
111+
working-directory: durable_dashboard
112+
75113
steps:
76-
- uses: actions/checkout@v4
114+
- uses: actions/checkout@v6
77115

78116
- name: Set up Elixir
79117
uses: erlef/setup-beam@v1
80118
with:
81-
elixir-version: "1.19"
82-
otp-version: "28"
119+
elixir-version: ${{ env.ELIXIR_VERSION }}
120+
otp-version: ${{ env.OTP_VERSION }}
121+
122+
- name: Set up pnpm
123+
uses: pnpm/action-setup@v4
124+
with:
125+
version: 9
126+
127+
- name: Set up Node
128+
uses: actions/setup-node@v4
129+
with:
130+
node-version: "20"
131+
cache: pnpm
132+
cache-dependency-path: durable_dashboard/assets/pnpm-lock.yaml
83133

84134
- name: Restore dependencies cache
85135
uses: actions/cache@v4
86136
with:
87-
path: deps
88-
key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }}
89-
restore-keys: ${{ runner.os }}-mix-
137+
path: durable_dashboard/deps
138+
key: ${{ runner.os }}-dashboard-mix-${{ hashFiles('durable_dashboard/mix.lock', 'durable/mix.lock') }}
139+
restore-keys: ${{ runner.os }}-dashboard-mix-
90140

91-
- name: Install dependencies
141+
- name: Restore build cache
142+
uses: actions/cache@v4
143+
with:
144+
path: durable_dashboard/_build
145+
key: ${{ runner.os }}-dashboard-build-${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-${{ hashFiles('durable_dashboard/mix.lock', 'durable/mix.lock') }}
146+
restore-keys: ${{ runner.os }}-dashboard-build-${{ env.OTP_VERSION }}-${{ env.ELIXIR_VERSION }}-
147+
148+
- name: Install Elixir dependencies
92149
run: mix deps.get
93150

94-
- name: Run Credo
95-
run: mix credo --strict
151+
- name: Install JS dependencies
152+
working-directory: durable_dashboard/assets
153+
run: pnpm install --frozen-lockfile
154+
155+
- name: Check formatting
156+
run: mix format --check-formatted
157+
158+
- name: Build assets
159+
working-directory: durable_dashboard/assets
160+
run: pnpm build
161+
162+
- name: Compile
163+
run: mix compile --warnings-as-errors
164+
165+
- name: Run tests
166+
run: mix test
167+
168+
ci-status:
169+
name: CI status
170+
needs: [changes, durable, dashboard]
171+
if: always()
172+
runs-on: ubuntu-latest
173+
steps:
174+
- name: Verify all required jobs passed
175+
run: |
176+
set -e
177+
[[ "${{ needs.changes.result }}" == "success" ]] || exit 1
178+
[[ "${{ needs.durable.result }}" =~ ^(success|skipped)$ ]] || exit 1
179+
[[ "${{ needs.dashboard.result }}" =~ ^(success|skipped)$ ]] || exit 1

.gitignore

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,10 @@
1-
# The directory Mix will write compiled artifacts to.
2-
/_build/
3-
4-
# If you run "mix test --cover", coverage assets end up here.
5-
/cover/
6-
7-
# The directory Mix downloads your dependencies sources to.
8-
/deps/
9-
10-
# Where third-party dependencies like ExDoc output generated docs.
11-
/doc/
1+
# Editor / IDE
2+
.elixir_ls/
123

13-
# Temporary files, for example, from tests.
14-
/tmp/
15-
16-
# If the VM crashes, it generates a dump, let's ignore it too.
4+
# Crash dumps
175
erl_crash.dump
186

19-
# Also ignore archive artifacts (built via "mix archive.build").
20-
*.ez
21-
22-
# Ignore package tarball (built via "mix hex.build").
23-
durable-*.tar
24-
7+
# Workspace-level generated docs (per-project ignores live in each subdir)
8+
/doc/
9+
/_build/
10+
/deps/

CLAUDE.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ Durable workflow engine for Elixir - provides resumable, reliable workflows with
44

55
Durable is an **embeddable library** - users add it to their supervision tree and provide their own Ecto repo.
66

7+
## Dashboard UI work
8+
9+
Before touching any file under `durable_dashboard/`, read
10+
`durable_dashboard/DESIGN.md`. It codifies the design language (tokens,
11+
typography, spacing, motion, status semantics, component primitives,
12+
composition patterns). New visual decisions are made there first, then
13+
applied in code.
14+
715
## Quick Reference
816

917
```bash

0 commit comments

Comments
 (0)