Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
c13b58c
feat: add studio link runtime foundation
Yona-Appletree Jun 17, 2026
926d188
docs: describe studio runtime crates
Yona-Appletree Jun 17, 2026
3332390
test: restore fw emulator scene render coverage
Yona-Appletree Jun 17, 2026
83d7ffa
feat: build browser firmware runtime
Yona-Appletree Jun 17, 2026
a9fc782
Improve fw-browser runtime smoke test
Yona-Appletree Jun 17, 2026
9e120b0
Document agent planning workflow
Yona-Appletree Jun 17, 2026
852f7cf
Add basic3 project example
Yona-Appletree Jun 17, 2026
de93ce8
Add firmware crate cargo configs
Yona-Appletree Jun 17, 2026
f39cc06
Update IDE module source roots
Yona-Appletree Jun 17, 2026
e809444
Route CLI local mode through lpa-link
Yona-Appletree Jun 17, 2026
3203ea4
feat: add host serial esp32 link provider
Yona-Appletree Jun 18, 2026
64d174c
docs: refresh link provider naming for studio
Yona-Appletree Jun 18, 2026
c3078a8
feat: add studio foundation slice
Yona-Appletree Jun 18, 2026
6c991d5
feat: add studio storybook workflow
Yona-Appletree Jun 18, 2026
b8d4594
feat: commit studio story image baselines
Yona-Appletree Jun 18, 2026
81efa05
feat: add browser serial studio hardware path
Yona-Appletree Jun 18, 2026
96b8503
chore: improve browser serial diagnostics
Yona-Appletree Jun 18, 2026
dd619e9
refactor: make lpa-client portable
Yona-Appletree Jun 18, 2026
e885120
refactor: harden hardware client deploy flow
Yona-Appletree Jun 18, 2026
827b634
feat: add studio provisioning core model
Yona-Appletree Jun 18, 2026
fe85454
feat: add studio provisioning scenarios
Yona-Appletree Jun 18, 2026
4ad793a
fix: handle canceled device access in studio web
Yona-Appletree Jun 18, 2026
42e0cb7
feat: build studio provisioning journey UI
Yona-Appletree Jun 19, 2026
c37ba78
fix: avoid studio web signal borrow across awaits
Yona-Appletree Jun 19, 2026
70f6fda
fix: harden esp32 serial framing
Yona-Appletree Jun 19, 2026
9b2a88c
chore: parallelize studio story captures
Yona-Appletree Jun 19, 2026
748f512
feat: extend studio fake flash provisioning flow
Yona-Appletree Jun 21, 2026
2550d92
feat: package studio esp32 firmware assets
Yona-Appletree Jun 21, 2026
613746e
feat: add browser esp32 firmware flashing adapter
Yona-Appletree Jun 21, 2026
5b7b011
chore: checkpoint studio provisioning flow
Yona-Appletree Jun 21, 2026
355e327
chore: rename studio crates to lpa prefix
Yona-Appletree Jun 21, 2026
5f79404
chore: cleanup commit
Yona-Appletree Jun 21, 2026
d931727
refactor: introduce studio manager action model
Yona-Appletree Jun 21, 2026
de6c050
refactor: cleaned up lpa-link modules a bit
Yona-Appletree Jun 21, 2026
14bd006
refactor: clean up helper types in lpa-link
Yona-Appletree Jun 21, 2026
065de39
refactor(lpa-link): own provider resources
Yona-Appletree Jun 21, 2026
d06809d
refactor(lpa-link): model providers by kind
Yona-Appletree Jun 21, 2026
5fae505
wip: lpa-studio-ux
Yona-Appletree Jun 22, 2026
a93eee5
wip: checkpoint studio ux registry slice
Yona-Appletree Jun 22, 2026
b6de1ea
wip: realize studio ux vertical slice
Yona-Appletree Jun 22, 2026
903b20b
refactor: introduce studio ux action dispatch
Yona-Appletree Jun 22, 2026
274afe7
feat: support browser serial project attach
Yona-Appletree Jun 22, 2026
734d0d1
feat: add studio disconnect actions
Yona-Appletree Jun 22, 2026
20a1482
refactor: make studio ux view-driven
Yona-Appletree Jun 22, 2026
ceb8e5f
fix: refine studio simulator and reconnect actions
Yona-Appletree Jun 22, 2026
3e26115
feat: add studio link management workflow
Yona-Appletree Jun 22, 2026
0b34395
fix: harden browser serial provisioning flow
Yona-Appletree Jun 22, 2026
7de8661
feat: stream studio ux activity progress
Yona-Appletree Jun 22, 2026
f3dce29
feat: surface browser serial readiness
Yona-Appletree Jun 22, 2026
a87e54d
fix: detect blank browser serial firmware promptly
Yona-Appletree Jun 22, 2026
69bedb3
refactor: rename studio ui model
Yona-Appletree Jun 22, 2026
4b7fe66
refactor: introduce studio device ux
Yona-Appletree Jun 22, 2026
0677918
refactor: move project launch into device ux
Yona-Appletree Jun 22, 2026
785cc00
fix: refine studio device firmware flow
Yona-Appletree Jun 22, 2026
7d3cff5
refactor: centralize browser esp32 serial control
Yona-Appletree Jun 22, 2026
dc0199e
Refine studio device workflow
Yona-Appletree Jun 22, 2026
54f100a
Refine studio inline feedback
Yona-Appletree Jun 22, 2026
c760c69
ci: add GitHub Pages deployment
Yona-Appletree Jun 23, 2026
c281775
Refine Studio device UX
Yona-Appletree Jun 23, 2026
41d329b
refactor(studio): tighten ux update rendering
Yona-Appletree Jun 23, 2026
0720bbc
fix(cli): update link provider lifecycle
Yona-Appletree Jun 23, 2026
6599ffd
fix(tests): use tokio client for emu scene render
Yona-Appletree Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions .github/workflows/deploy-pages-channel.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
name: Deploy Pages Channel

on:
workflow_dispatch:
inputs:
channel:
description: Static site channel to deploy
required: true
type: choice
options:
- beta
- demo
ref:
description: Git ref to build
required: true
default: main
dry_run:
description: Build and smoke-check without pushing to the Pages repo
required: true
type: boolean
default: false

concurrency:
group: pages-channel-${{ inputs.channel }}
cancel-in-progress: false

permissions:
contents: read

env:
RUST_BACKTRACE: 1
RISC_V_TARGET: riscv32imac-unknown-none-elf
RUSTUP_PERMIT_COPY_RENAME: 1

jobs:
deploy:
name: Build and deploy ${{ inputs.channel }}
runs-on: ubuntu-latest
steps:
- name: Install system deps
run: sudo apt-get update && sudo apt-get install -y libudev-dev pkg-config

- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ inputs.ref }}
fetch-depth: 0

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: nightly-2026-04-27
components: rust-src

- name: Install Rust targets
run: |
rustup target add wasm32-unknown-unknown
rustup target add ${{ env.RISC_V_TARGET }}

- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-${{ runner.arch }}-pages-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-pages-cargo-

- name: Install just
uses: extractions/setup-just@v3

- name: Install wasm-bindgen-cli
run: cargo install wasm-bindgen-cli --version 0.2.114 --locked

- name: Install espflash
if: inputs.channel == 'beta'
run: cargo install espflash --version 3.3.0 --locked

- name: Build beta artifact
if: inputs.channel == 'beta'
run: just studio-web-deploy-dir beta target/pages/channel beta.lightplayer.app

- name: Smoke-check beta artifact
if: inputs.channel == 'beta'
run: just studio-web-smoke target/pages/channel

- name: Build demo artifact
if: inputs.channel == 'demo'
run: just web-demo-deploy-dir demo target/pages/channel demo.lightplayer.app

- name: Smoke-check demo artifact
if: inputs.channel == 'demo'
run: just web-demo-smoke target/pages/channel

- name: Create Pages App token
if: ${{ inputs.dry_run == false }}
id: pages-app-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.LIGHTPLAYER_PAGES_APP_ID }}
private-key: ${{ secrets.LIGHTPLAYER_PAGES_PRIVATE_KEY }}
owner: light-player
repositories: |
lightplayer-beta-pages
lightplayer-demo-pages
permission-contents: write

- name: Publish channel artifact
env:
LIGHTPLAYER_PAGES_TOKEN: ${{ steps.pages-app-token.outputs.token }}
CHANNEL: ${{ inputs.channel }}
DRY_RUN: ${{ inputs.dry_run }}
run: |
set -euo pipefail
target_repo=""
case "$CHANNEL" in
beta) target_repo="light-player/lightplayer-beta-pages" ;;
demo) target_repo="light-player/lightplayer-demo-pages" ;;
*) echo "unknown channel: $CHANNEL" >&2; exit 2 ;;
esac

args=(--repo "$target_repo" --dir target/pages/channel --message "deploy: ${CHANNEL} ${GITHUB_SHA::12}")
if [[ "$DRY_RUN" == "true" ]]; then
args+=(--dry-run)
fi
scripts/pages/publish-static-repo.sh "${args[@]}"
88 changes: 88 additions & 0 deletions .github/workflows/deploy-studio-pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
name: Deploy Studio Pages

on:
push:
branches:
- main
workflow_dispatch:

concurrency:
group: pages-production
cancel-in-progress: false

permissions:
contents: read
pages: write
id-token: write

env:
RUST_BACKTRACE: 1
RISC_V_TARGET: riscv32imac-unknown-none-elf
RUSTUP_PERMIT_COPY_RENAME: 1

jobs:
deploy:
name: Build and deploy Studio
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Install system deps
run: sudo apt-get update && sudo apt-get install -y libudev-dev pkg-config

- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: nightly-2026-04-27
components: rust-src

- name: Install Rust targets
run: |
rustup target add wasm32-unknown-unknown
rustup target add ${{ env.RISC_V_TARGET }}

- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-${{ runner.arch }}-pages-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-pages-cargo-

- name: Install just
uses: extractions/setup-just@v3

- name: Install wasm-bindgen-cli
run: cargo install wasm-bindgen-cli --version 0.2.114 --locked

- name: Install espflash
run: cargo install espflash --version 3.3.0 --locked

- name: Build Pages artifact
run: just studio-web-deploy-dir production target/pages/studio lightplayer.app

- name: Smoke-check Pages artifact
run: just studio-web-smoke target/pages/studio

- name: Configure Pages
uses: actions/configure-pages@v5

- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v3
with:
path: target/pages/studio

- name: Deploy Pages
id: deployment
uses: actions/deploy-pages@v4
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,10 @@ perf.data*
.DS_Store
.builtins-source-hash
traces/
profiles/
profiles/
lp-app/lpa-studio-web/public/pkg/
lp-app/lpa-studio-web/public/fw-browser-worker.js
lp-app/lpa-studio-web/public/firmware/
lp-app/lpa-studio-web/dist/
lp-app/lpa-studio-web/story-images/.new/
lp-app/lpa-studio-web/story-images/.scratch/
7 changes: 7 additions & 0 deletions .idea/lp2025.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

52 changes: 52 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,58 @@ deprecated. Do not adopt it in new code. If a plan file you are executing
asks for "tests at the top", treat that as a stale instruction and put the
test module at the bottom anyway.

## Personal planning workflow

New agent planning work uses the Photomancer personal planning workspace, not
new repo-local plan or roadmap directories.

- Use `pm-plan` for new planning, roadmap, and investigation artifacts.
- Use `pm-implement` to execute an existing shared `plan.md`.
- Use `pm-review` for durable review artifacts.
- Resolve context from `agent-context.toml`; the repo slug is `lightplayer`.
- Resolve the workspace from `PHOTOMANCER_PLANNING_ROOT`, or from the default
`~/.photomancer/planning` link.
- Store new active artifacts under
`<planning-root>/lightplayer/<YYYY-MM-DD>-<name>/`.
- Store completed artifacts under `<planning-root>/lightplayer/_archive/`.
- Store review artifacts under `<planning-root>/lightplayer/_reviews/`.

Durable decisions belong in repo ADRs under `docs/adr/`. Intermediate plans,
phase prompts, review notes, scratch reports, and implementation logs belong in
the shared planning workspace. Existing `docs/plans`, `docs/plans-old`,
`docs/roadmaps`, and `docs/roadmaps-old` content is historical and should not
be migrated unless a separate migration plan asks for it.

## Studio UI visual baselines

When a change touches non-generated files under `lp-app/lp-studio-web/`, run the
Studio story baseline helper before committing:

```bash
just studio-story-baselines-if-needed
```

If it updates files under `lp-app/lp-studio-web/story-images/`, include those
PNG changes in the same commit and mention the affected story baselines in the
final summary. The helper intentionally ignores generated web artifacts,
scratch PNGs, fresh check PNGs, and the baseline PNGs themselves.

Useful related commands:

```bash
just studio-story-pngs # ignored scratch PNGs for quick local review
just studio-story-baselines # update committed story baselines
just studio-story-check # compare fresh PNGs to committed baselines
```

`studio-story-baselines` and `studio-story-check` require `oxipng`; run
`scripts/dev-init.sh` or install it with `cargo install oxipng` /
`brew install oxipng`.

Do not add an auto-mutating Git hook for this workflow unless the user asks for
one explicitly. Hooks that rewrite the working tree during commit are annoying
during rebases, merges, and partial commits.

## Validation Commands

These commands must pass for any change touching the shader pipeline:
Expand Down
Loading
Loading