Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
183 commits
Select commit Hold shift + click to select a range
59a4a6d
chore(repo): add gitignore and gitattributes
JheisonMB Oct 26, 2026
28d08b7
feat(schema): define the graph and node document schemas with a valid…
JheisonMB Oct 26, 2026
1b94171
feat(schema): define the graph and node document schemas with a valid…
JheisonMB Oct 26, 2026
1575337
feat(worker): redirect graph and node installs to GitHub and count them
JheisonMB Oct 26, 2026
a45e093
feat(worker): redirect graph and node installs to GitHub and count th…
JheisonMB Oct 26, 2026
4c88d72
feat(worker): discover official and community graphs through GitHub w…
JheisonMB Oct 26, 2026
90f54a4
feat(worker): discover official and community graphs through GitHub w…
JheisonMB Oct 26, 2026
05b46fb
feat(site): render the catalogue pages in the lab's visual system
JheisonMB Oct 26, 2026
680ff81
feat(site): render the catalogue pages in the lab's visual system (re…
JheisonMB Oct 27, 2026
382da71
feat(registry): publish the first official graphs and nodes
JheisonMB Oct 27, 2026
53d0ce8
fix(lint): lint the TypeScript sources and track eslint.config.js
JheisonMB Oct 27, 2026
4a8697e
refactor(repo): move the catalogue worker to apps/graphs and rename t…
JheisonMB Oct 27, 2026
f0bd632
feat(relay): run a blind signaling relay with GitHub sign-in on remot…
JheisonMB Oct 27, 2026
b3a3839
feat(pairing): pair the browser with canopy and reconnect with its de…
JheisonMB Oct 27, 2026
3e0c6f2
chore(remote): land the relay worker built in the canopy-remote-relay…
JheisonMB Oct 27, 2026
b5d7885
chore(remote): land the web pairing built in the canopy-remote-web sa…
JheisonMB Oct 27, 2026
c1ece0f
feat(relay): run a blind signaling relay with GitHub sign-in on remot…
JheisonMB Oct 27, 2026
8a896ca
feat(pairing): pair the browser with canopy and reconnect with its de…
JheisonMB Oct 27, 2026
27e47af
feat(sessions): show the host's sessions with a live terminal, a key …
JheisonMB Oct 27, 2026
2686681
feat(sessions): show the host's sessions with a live terminal, a key …
JheisonMB Oct 27, 2026
61d3d45
feat(sessions): start new agent sessions and build prompts from the b…
JheisonMB Oct 27, 2026
3fc5d52
feat(sessions): start new agent sessions and build prompts from the b…
JheisonMB Oct 27, 2026
8e99b12
feat(remote): serve the browser app from the relay Worker
JheisonMB Oct 27, 2026
20f082c
feat(remote): serve the browser app from the relay Worker (reviewer 2…
JheisonMB Oct 27, 2026
ebb2ee0
fix(graphs): show an empty catalogue instead of "GitHub is busy", ren…
JheisonMB Oct 27, 2026
0364522
feat(look): add a shared Canopy look kit with the page's surface, fon…
JheisonMB Oct 27, 2026
19c87c6
feat(graphs): draw graph documents as Canopy plates with the page's g…
JheisonMB Oct 27, 2026
bbeb76c
style(graphs): dress the catalogue in the Canopy page look with its h…
JheisonMB Oct 27, 2026
d28fa05
style(graphs): dress the catalogue in the Canopy page look with its h…
JheisonMB Oct 27, 2026
eb397f1
style(remote): fit the terminal to the screen, show every key and dre…
JheisonMB Oct 27, 2026
da25b69
style(remote): fit the terminal to the screen, show every key and dre…
JheisonMB Oct 27, 2026
1b58b0d
fix(remote): label the New button as New agent so it reads as startin…
JheisonMB Oct 27, 2026
dd4e63a
style(graphs): turn the catalogue into a technical index with datashe…
JheisonMB Oct 27, 2026
62cd24b
style(graphs): turn the catalogue into a technical index with datashe…
JheisonMB Oct 27, 2026
c75bdfb
docs(graphs): add a Publish page that explains how to list a graph or…
JheisonMB Oct 27, 2026
1522b2f
docs(graphs): add a Publish page that explains how to list a graph or…
JheisonMB Oct 27, 2026
b53c99e
fix(remote): make the session terminal legible with a full terminal f…
JheisonMB Oct 27, 2026
3fee455
fix(remote): make the session terminal legible with a full terminal f…
JheisonMB Oct 27, 2026
4755dcc
feat(remote): show each session's shelf of files the agent sent, with…
JheisonMB Oct 27, 2026
4e2dd30
feat(remote): show each session's shelf of files the agent sent, with…
JheisonMB Oct 27, 2026
7c39a8a
feat(graphs): serve the catalogue from a scheduled index in KV instea…
JheisonMB Oct 27, 2026
870a10f
feat(graphs): serve the catalogue from a scheduled index in KV instea…
JheisonMB Oct 27, 2026
64bf714
feat(graphs): show every command and agent prompt a shared document r…
JheisonMB Oct 27, 2026
256dd1c
feat(graphs): show every command and agent prompt a shared document r…
JheisonMB Oct 27, 2026
9e44ec0
feat(graphs): let anyone report a graph or node through a GitHub issu…
JheisonMB Oct 27, 2026
d7aa452
feat(graphs): let anyone report a graph or node through a GitHub issu…
JheisonMB Oct 27, 2026
3c266d0
feat(look): link the lab's privacy and terms pages from the catalogue…
JheisonMB Oct 27, 2026
929c760
fix(web): answer agents on graphs and remote with robots, discovery f…
JheisonMB Oct 27, 2026
a21e10f
fix(web): answer agents on graphs and remote with robots, discovery f…
JheisonMB Oct 27, 2026
b5e6948
fix(graphs): wrap the install command in the datasheet instead of cli…
JheisonMB Oct 27, 2026
0471335
fix(graphs): declare the custom domain route at the top level of wran…
JheisonMB Oct 27, 2026
588bdb3
refactor(graphs): read official documents from UniverLab/canopy-graph…
JheisonMB Oct 27, 2026
2dac4fb
refactor(graphs): read official documents from UniverLab/canopy-graph…
JheisonMB Oct 27, 2026
5460503
style(web): stage harness output on black, tint blocks by meaning wit…
JheisonMB Oct 27, 2026
3b7d5cd
feat(remote): open agents or terminals in a directory with a yolo swi…
JheisonMB Oct 28, 2026
7c3d55a
feat(look): draw the catalogue and the remote with Lucide icons that …
JheisonMB Oct 28, 2026
020aba1
feat(look): draw the catalogue and the remote with Lucide icons that …
JheisonMB Oct 28, 2026
9c95a6b
feat(remote): watch running graphs as a live plate with the active no…
JheisonMB Oct 28, 2026
4d1bdae
feat(remote): watch running graphs as a live plate with the active no…
JheisonMB Oct 28, 2026
4f5f714
feat(graphs): share a graph or node as a one-use draft that expires i…
JheisonMB Oct 28, 2026
e0a752f
feat(graphs): share a graph or node as a one-use draft that expires i…
JheisonMB Oct 28, 2026
3336f08
feat(graphs): assemble graphs by hand in a browser editor and share t…
JheisonMB Oct 28, 2026
f2f48b4
feat(graphs): assemble graphs by hand in a browser editor and share t…
JheisonMB Oct 28, 2026
406109e
fix(graphs): draw plates legibly without the look kit and route back …
JheisonMB Oct 28, 2026
7586347
fix(graphs): draw plates legibly without the look kit and route back …
JheisonMB Oct 28, 2026
1de501d
feat(graphs): render the pattern pages from canopy-graphs with links …
JheisonMB Oct 28, 2026
a3625bb
feat(graphs): render the pattern pages from canopy-graphs with links …
JheisonMB Oct 28, 2026
0e665ca
fix(graphs): index the whole catalogue within the 50 subrequests a fr…
JheisonMB Oct 28, 2026
bdf3906
fix(graphs): index the whole catalogue within the 50 subrequests a fr…
JheisonMB Oct 28, 2026
c659324
fix(graphs): fit the catalogue header links on a phone and drop a pat…
JheisonMB Oct 28, 2026
675a957
style(look): put each app's DOS Rebel banner in the header as its hom…
JheisonMB Oct 28, 2026
e48a928
style(look): put each app's DOS Rebel banner in the header as its hom…
JheisonMB Oct 28, 2026
4bc5975
style(graphs): open outside links in a new tab, move the search into …
JheisonMB Oct 28, 2026
259dd5f
style(graphs): open outside links in a new tab, move the search into …
JheisonMB Oct 28, 2026
a2a0a42
fix(graphs): write only the KV keys a scheduled index run changed, so…
JheisonMB Oct 28, 2026
97a5732
fix(graphs): write only the KV keys a scheduled index run changed, so…
JheisonMB Oct 28, 2026
941ab6f
feat(graphs): let the animated spec take a node's fail edge one time …
JheisonMB Oct 28, 2026
0fce010
feat(graphs): let the animated spec take a node's fail edge one time …
JheisonMB Oct 28, 2026
ec1ae94
feat(graphs): give the editor ports, fixed spec and next nodes, node …
JheisonMB Oct 28, 2026
eb072f3
feat(graphs): give the editor ports, fixed spec and next nodes, node …
JheisonMB Oct 28, 2026
522f38b
feat(graphs): index community repositories incrementally, rereading o…
JheisonMB Oct 28, 2026
54fd483
feat(graphs): index community repositories incrementally, rereading o…
JheisonMB Oct 28, 2026
322272d
fix(remote): show a connecting state and flush a snapshot closed by i…
JheisonMB Oct 29, 2026
89b8cc5
fix(look): draw the graphs and remote header banners as SVG at a read…
JheisonMB Oct 29, 2026
570bb7e
fix(look): draw the graphs and remote header banners as SVG at a read…
JheisonMB Oct 29, 2026
eb03e85
style(graphs): give the install command field enough contrast to read…
JheisonMB Oct 29, 2026
4285b47
feat(remote): add a sign-out control and run the colophon edge to edg…
JheisonMB Oct 29, 2026
af7c95b
feat(remote): add a sign-out control and run the colophon edge to edg…
JheisonMB Oct 29, 2026
15196bc
fix(remote): pick prompt builder sections by kind instead of free tit…
JheisonMB Oct 29, 2026
e2abf9c
fix(remote): let the remote terminal apply its styles under the relay…
JheisonMB Oct 29, 2026
6027e62
refactor(graphs): serve the pattern pages from the graphs site instea…
JheisonMB Oct 29, 2026
2f81093
refactor(graphs): serve the pattern pages from the graphs site instea…
JheisonMB Oct 29, 2026
cb429be
feat(agents): raise graphs and remote to univerlab.org's agent-readin…
JheisonMB Oct 29, 2026
5cddbd7
feat(agents): raise graphs and remote to univerlab.org's agent-readin…
JheisonMB Oct 29, 2026
25cb27f
feat(remote): show the host's system metrics
JheisonMB Oct 29, 2026
8df86c7
feat(remote): sign in trusted GitHub guests and scope them to granted…
JheisonMB Oct 30, 2026
ee43a38
feat(remote): sign in trusted GitHub guests and scope them to granted…
JheisonMB Oct 30, 2026
43f6cc3
feat(remote): let trusted guests interact in their granted sessions
JheisonMB Oct 30, 2026
78310ec
feat(remote): let trusted guests interact in their granted sessions (…
JheisonMB Oct 31, 2026
5cd8171
fix(look): draw the SVG banners with terminal-proportioned cells inst…
JheisonMB Oct 31, 2026
ff0965b
feat(graphs): install community refs straight from GitHub when the in…
JheisonMB Oct 31, 2026
cc555e6
feat(graphs): install community refs straight from GitHub when the in…
JheisonMB Oct 31, 2026
be346d3
feat(graphs): scan new catalogue documents for security with Muse and…
JheisonMB Oct 31, 2026
f2ed628
feat(graphs): scan new catalogue documents for security with Muse and…
JheisonMB Oct 31, 2026
eab17a1
fix(graphs): rename the official loops across the pattern pages
JheisonMB Oct 31, 2026
d3d3689
fix(graphs): present the reviewer loop as the adversarial baseline in…
JheisonMB Oct 31, 2026
45e248e
fix(web): stack the header banner centered with icons below on mobile
JheisonMB Oct 31, 2026
978b32f
fix(web): stack the header banner centered with icons below on mobile…
JheisonMB Oct 31, 2026
883ae14
fix(web): give every page a real title and update it per remote view
JheisonMB Oct 31, 2026
18841e0
fix(web): give every page a real title and update it per remote view …
JheisonMB Oct 31, 2026
da454a9
fix(graphs): link the transparency page from the header and footer
JheisonMB Oct 31, 2026
d20aba6
fix(remote): show the footer on every remote view
JheisonMB Oct 31, 2026
3e44adc
fix(remote): drop the connection chip from the header
JheisonMB Oct 31, 2026
ba7bd65
fix(remote): move sign out and disconnect into the header
JheisonMB Oct 31, 2026
a00705f
fix(remote): confine the honeycomb to the header band like graphs
JheisonMB Oct 31, 2026
fe27989
fix(graphs): draw the indexing diagram with activations, replies and …
JheisonMB Oct 31, 2026
81fe133
fix(web): paint both solid backgrounds 011d1c
JheisonMB Oct 31, 2026
a130194
feat(graphs): review documents with the Meta API and prove it locally
JheisonMB Oct 31, 2026
994cb52
feat(graphs): review documents with the Meta API and prove it locally…
JheisonMB Oct 31, 2026
6a88101
fix(web): accept string-form ICE candidates
JheisonMB Oct 31, 2026
380c2ce
fix(web): answer relay pings and keep the browser side alive
JheisonMB Oct 31, 2026
9ade132
fix(web): answer relay pings and keep the browser side alive (reviewe…
JheisonMB Oct 31, 2026
529f765
fix(web): refuse full rooms fast and message close codes
JheisonMB Oct 31, 2026
15a934c
fix(web): refuse full rooms fast and message close codes (reviewer 2 …
JheisonMB Oct 31, 2026
ac51ada
fix(web): build the look kit in the remote deploy
JheisonMB Nov 1, 2026
28f4b34
fix(worker): require a connected host for TURN
JheisonMB Nov 1, 2026
f0e6006
fix(worker): gate guests by allowlist and rate-limit sockets
JheisonMB Nov 1, 2026
a5ece09
fix(worker): validate Origin on device WS, TURN and logout
JheisonMB Nov 1, 2026
a55dd21
fix(worker): validate Origin on device WS, TURN and logout (reviewer …
JheisonMB Nov 1, 2026
35e96e5
fix(worker): revoke sessions server-side on logout
JheisonMB Nov 1, 2026
2a8b6c8
fix(worker): revoke sessions server-side on logout (reviewer 2 fixes)
JheisonMB Nov 1, 2026
4c242a0
fix(worker): decode percent-encoded host labels
JheisonMB Nov 1, 2026
d91e1b7
fix(web): draw directed plate edges with arrowheads and bind the sess…
Nov 1, 2026
9a8f559
fix(worker): accept same-origin GET /turn without an Origin header
JheisonMB Nov 1, 2026
16d0e47
fix(web): keep connecting with backup STUN when /turn fails
JheisonMB Nov 1, 2026
3140d60
fix(worker): persist room state across Durable Object hibernation
JheisonMB Nov 1, 2026
5f264ee
feat(worker): inject relay identity into forwarded frames and gate th…
JheisonMB Nov 1, 2026
8947f76
fix(worker): disconnect guests removed from the allowlist
JheisonMB Nov 1, 2026
203f7f2
fix(web): show the session name, not the UUID, right after creating a…
JheisonMB Nov 1, 2026
ae0cbd5
fix(web): offer only installed harnesses and never leak the host PATH…
JheisonMB Nov 1, 2026
9ccb48a
fix(web): auto-fit the terminal to its panel on open and resize
JheisonMB Nov 2, 2026
294e87c
fix(web): keep terminal glyphs legible at DPR 1
JheisonMB Nov 2, 2026
8e990b9
fix(web): redirect unknown routes home
JheisonMB Nov 2, 2026
0a14f42
fix(web): omit the temperature segment from the metrics strip when un…
JheisonMB Nov 2, 2026
c3c97bc
fix(web): silence the expected landing console errors
JheisonMB Nov 2, 2026
fea6ba3
fix(web): keep footer separators with their links and use palette lin…
JheisonMB Nov 2, 2026
a27e9d4
fix(web): unify primary buttons on the teal style and disable unsuppo…
JheisonMB Nov 2, 2026
e90f8b1
fix(web): meet 44px touch targets and declare dark color-scheme
JheisonMB Nov 2, 2026
8750a53
fix(web): fix the session dialog folder label and tell users how to g…
JheisonMB Nov 2, 2026
6751891
fix(web): align the desktop account chip with the header content
JheisonMB Nov 2, 2026
06ddb81
fix(remote): render footer separators with flex gap instead of middots
JheisonMB Nov 2, 2026
38bd23a
fix(plate): scope SVG marker ids per plate so arrows survive hidden t…
JheisonMB Nov 2, 2026
202fc9d
fix(plate): only walk fail edges that can return to the main flow
JheisonMB Nov 2, 2026
d0650ec
feat(plate): draw handler lane, done terminals and grouped error bus
JheisonMB Nov 3, 2026
6667865
feat(graphs): enable the meta review provider in production
JheisonMB Nov 3, 2026
aa45385
fix(remote): write terminal output to xterm as bytes so split charact…
JheisonMB Nov 3, 2026
064368b
fix(graphs): label the Muse review provider by name on transparency
JheisonMB Nov 3, 2026
50250bc
fix(remote): persist the session hint in a cookie instead of localSto…
JheisonMB Nov 3, 2026
251bb78
fix(remote): frame fullscreen TUIs fully instead of following the bottom
JheisonMB Nov 3, 2026
5f2140a
fix(remote): restyle key-bar latches, remove Fit, add Keys toggle
JheisonMB Nov 3, 2026
0c9086c
fix(remote): type straight into the terminal instead of a separate co…
JheisonMB Nov 3, 2026
7a029db
perf(look): build the header honeycomb's cell sprites on demand inste…
JheisonMB Nov 3, 2026
9cddd8c
fix(graphs): stop treating documented install slots and engine variab…
JheisonMB Nov 3, 2026
87b2c3e
feat(graphs): redesign the verdict badge and show it on catalogue rows
JheisonMB Nov 3, 2026
7b30140
fix(graphs): show the README first and every prompt in full on docume…
JheisonMB Nov 3, 2026
ddd5a94
feat(remote): add a Backspace key and an app-like fullscreen mode
JheisonMB Nov 3, 2026
80fb448
fix(plate): draw the handler lane below the flow in the horizontal plate
JheisonMB Nov 3, 2026
b866854
feat(remote): upload files from remote and preview any type by sniff
JheisonMB Nov 3, 2026
ea4d8a1
feat(graphs): show one horizontal plate in a pan-and-zoom viewport as…
JheisonMB Nov 3, 2026
21bda5c
fix(remote): scroll the terminal history with one finger on touch scr…
JheisonMB Nov 3, 2026
94866bc
feat(graphs): render the transparency sequence in two phases with a m…
JheisonMB Nov 3, 2026
84369b7
feat(remote): group the sessions tab into agents over terminals
JheisonMB Nov 3, 2026
6a7bc4b
style(look): paint the header banners in the wizard greens and center…
JheisonMB Nov 3, 2026
6aef5ac
fix(remote): parse the host's graphs frames on remote
JheisonMB Nov 3, 2026
a721fe6
feat(remote): show one union shelf from every surface
JheisonMB Nov 3, 2026
ebe85e1
ci(release): release both subdomains together from one version
JheisonMB Nov 3, 2026
37e019c
feat(remote): delete shelf files from the Files sheet
JheisonMB Nov 3, 2026
d1b3d8c
feat(remote): attach shelf files to the terminal input without uploading
JheisonMB Nov 3, 2026
c61e4ae
Merge branch 'feature/remote-app' into feature/remote
JheisonMB Nov 3, 2026
48ce82a
fix(deps): lock wrangler's optional peer so npm ci passes on CI's npm
JheisonMB Nov 3, 2026
5cad11e
test(remote): allow for the headroom both merged branches spent
JheisonMB Nov 4, 2026
f77b059
fix(ci): bind the e2e servers to the address Playwright polls
JheisonMB Nov 4, 2026
266ff8e
test(remote): ignore Vite's dev socket in the CSP spec
JheisonMB Nov 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* text=auto eol=lf
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
blank_issues_enabled: true
47 changes: 47 additions & 0 deletions .github/ISSUE_TEMPLATE/report-document.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Report a graph or node
description: Report a harmful, misleading or broken graph or node in the catalogue.
labels: ["report"]
body:
- type: input
id: document
attributes:
label: Catalogue URL
description: The page URL of the graph or node you are reporting.
placeholder: https://graphs.univerlab.org/g/acme/things/flow
validations:
required: true
- type: dropdown
id: kind
attributes:
label: Kind
description: Whether the document is a graph or a node.
options:
- graph
- node
- type: input
id: source
attributes:
label: Source repository
description: The owner/repo that holds the document.
placeholder: acme/things
- type: dropdown
id: reason
attributes:
label: Reason
description: Why the catalogue should remove it.
options:
- Malicious or dangerous command
- Misleading description
- Prompt that steers the agent to do harm
- Broken or invalid
- Copyright or licence
- Other
validations:
required: true
- type: textarea
id: details
attributes:
label: Details
description: What is wrong, where it appears, and what should happen instead.
validations:
required: true
81 changes: 81 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: ci

on:
pull_request:
# release.yml runs CI again on main before it deploys.
workflow_call:

jobs:
install:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci

lint:
runs-on: ubuntu-latest
needs: install
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run lint

typecheck:
runs-on: ubuntu-latest
needs: install
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run typecheck

test:
runs-on: ubuntu-latest
needs: install
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm test

validate:
runs-on: ubuntu-latest
needs: install
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run validate

e2e:
runs-on: ubuntu-latest
needs: install
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npx playwright install --with-deps chromium
- run: npm run test:e2e
env:
# A server that never answers shows its own output in the log.
DEBUG: pw:webserver
42 changes: 42 additions & 0 deletions .github/workflows/deploy-remote.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: deploy-remote

# Manual only: nothing deploys on merge. Publishes apps/remote/worker/ to
# Cloudflare as the `canopy-remote` Worker behind remote.univerlab.org. The
# account id is inlined in apps/remote/worker/wrangler.toml, so the only
# secret is the API token.
on:
workflow_dispatch: {}
# release.yml calls this after CI passes on main.
workflow_call: {}

concurrency:
group: deploy-remote-worker
cancel-in-progress: false

jobs:
deploy:
name: Deploy worker
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
# The Worker serves the browser app from apps/remote/web/dist via the
# [assets] binding, so the web build must exist before wrangler deploy.
# The pages link the shared look kit, which `npm run build:look` copies
# into apps/remote/web/public/look: the kit must exist before the web
# build runs. Same generator both apps use for the look kit, one source
# of truth.
- run: npm run build:look
- run: npm run build:remote-web
- name: Deploy with Wrangler
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
wranglerVersion: 4.153.0
workingDirectory: apps/remote/worker
command: deploy
40 changes: 40 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: deploy

# Manual only: nothing deploys on merge. Publishes apps/graphs/ to Cloudflare as
# the `canopy-graphs` Worker behind graphs.univerlab.org. The account id is
# inlined in apps/graphs/wrangler.toml, so the only secret is the API token.
on:
workflow_dispatch: {}
# release.yml calls this after CI passes on main.
workflow_call: {}

concurrency:
group: deploy-worker
cancel-in-progress: false

jobs:
deploy:
name: Deploy worker
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
# The pages link the shared look kit, which `npm run build:look` copies
# into apps/graphs/public/look, and /editor loads its bundle from
# apps/graphs/public/editor, built by `npm run build:editor`: the
# [assets] directory must exist before wrangler deploys. Same
# generator both apps use for the look kit, one source of truth.
- run: npm run build:look
- run: npm run build:editor
- name: Deploy with Wrangler
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
wranglerVersion: 4.153.0
workingDirectory: apps/graphs
command: deploy
64 changes: 64 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: release

# Run by hand on main. One version for both subdomains: the version in
# package.json names one tag, and graphs.univerlab.org and remote.univerlab.org
# deploy together from it. CI runs again on main, then both Workers deploy, and
# the tag and GitHub release come last, so a tag always names something that
# really shipped. To release again, bump the version in package.json by PR.
on:
workflow_dispatch:

permissions:
contents: write

jobs:
version:
name: Check version
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.version.outputs.tag }}
steps:
- name: Release from main only
run: |
if [ "$GITHUB_REF" != "refs/heads/main" ]; then
echo "::error::Releases run from main, not $GITHUB_REF."
exit 1
fi
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Read the version and refuse a released one
id: version
run: |
tag="v$(node -p "require('./package.json').version")"
if git rev-parse -q --verify "refs/tags/$tag" >/dev/null; then
echo "::error::$tag is already released. Bump the version in package.json first."
exit 1
fi
echo "tag=$tag" >> "$GITHUB_OUTPUT"

ci:
needs: version
uses: ./.github/workflows/ci.yml

deploy-graphs:
needs: ci
uses: ./.github/workflows/deploy.yml
secrets: inherit

deploy-remote:
needs: ci
uses: ./.github/workflows/deploy-remote.yml
secrets: inherit

release:
name: Tag and GitHub release
needs: [version, deploy-graphs, deploy-remote]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Create the tag and the release
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ needs.version.outputs.tag }}
run: gh release create "$TAG" --target "$GITHUB_SHA" --title "$TAG" --generate-notes
Loading
Loading