Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 6 additions & 1 deletion .claude/skills/update-gpui/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,12 @@ Update the GPUI git submodule and all related Cargo.toml references to the lates
cargo clippy -- --deny warnings
```

8. **Report summary**: Show old commit, new commit, what changed (list new commits), and whether build/clippy passed.
8. **Version + compatibility bookkeeping** (this skill is the ONLY place a gpui rev changes — see docs/learned/app-platform-plan.md D6):
- Bump `[workspace.package] version` in the root `Cargo.toml` (minor bump for a gpui rev change or breaking API change while pre-1.0; patch otherwise). Keep the `version = "X.Y.Z"` values inside `[workspace.dependencies]` for the path crates (`gpui-component`, `gpui-component-*`) in sync.
- Add a row to `docs/COMPATIBILITY.md` pairing the new workspace version with the new gpui rev.
- After the change lands on `main`, create the annotated tag: `git tag -a v<version> -m "gpui-component v<version> (gpui <shortsha>)"` and push it. Apps pin these tags — never bare revs.
Comment on lines +50 to +53

@coderabbitai coderabbitai Bot Jul 17, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== File list ==\n'
git ls-files '.claude/skills/update-gpui/SKILL.md' 'docs/COMPATIBILITY.md' 'docs/learned/app-platform-plan.md'

printf '\n== update-gpui skill (relevant lines) ==\n'
sed -n '40,70p' .claude/skills/update-gpui/SKILL.md | cat -n

printf '\n== compatibility doc (relevant lines) ==\n'
sed -n '1,60p' docs/COMPATIBILITY.md | cat -n

printf '\n== search for gpui tag workflow ==\n'
rg -n --hidden --no-messages 'gpui-vYYYY\.MM\.DD|annotated tag|create the annotated tag|push it|tag creation|release automation|update-gpui' .claude docs Cargo.toml

Repository: BumpyClock/gpui-component

Length of output: 5187


🏁 Script executed:

#!/bin/bash
set -euo pipefail

ast-grep outline .claude/skills/update-gpui/SKILL.md || true
printf '\n== surrounding lines in skill ==\n'
sed -n '1,120p' .claude/skills/update-gpui/SKILL.md | cat -n

printf '\n== related docs/learned reference ==\n'
sed -n '1,220p' docs/learned/app-platform-plan.md | cat -n

Repository: BumpyClock/gpui-component

Length of output: 18664


🏁 Script executed:

#!/bin/bash
set -euo pipefail
sed -n '40,70p' .claude/skills/update-gpui/SKILL.md | cat -n
printf '\n---\n'
sed -n '1,60p' docs/COMPATIBILITY.md | cat -n
printf '\n---\n'
rg -n 'gpui-vYYYY\.MM\.DD|annotated tag|update-gpui|release automation' .claude docs Cargo.toml

Repository: BumpyClock/gpui-component

Length of output: 4968


Complete the gpui fork tag step in the update flow.
The release discipline expects both the fork tag and the workspace tag, but this procedure only documents the workspace tag.

  • .claude/skills/update-gpui/SKILL.md#L50-L53: add the gpui-vYYYY.MM.DD-<shortsha> tag creation/push step, or point to the release automation that creates it.
  • docs/COMPATIBILITY.md#L24-L27: keep the fork-tag requirement aligned with the executable procedure.
🧰 Tools
🪛 LanguageTool

[grammar] ~50-~50: Ensure spelling is correct
Context: ...eping** (this skill is the ONLY place a gpui rev changes — see docs/learned/app-plat...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~51-~51: Ensure spelling is correct
Context: ...the root Cargo.toml (minor bump for a gpui rev change or breaking API change while...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[grammar] ~52-~52: Ensure spelling is correct
Context: ... the new workspace version with the new gpui rev. - After the change lands on main,...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

📍 Affects 2 files
  • .claude/skills/update-gpui/SKILL.md#L50-L53 (this comment)
  • docs/COMPATIBILITY.md#L24-L27
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.claude/skills/update-gpui/SKILL.md around lines 50 - 53, Update the version
and compatibility bookkeeping procedure in .claude/skills/update-gpui/SKILL.md
to include creating and pushing the annotated gpui-vYYYY.MM.DD-<shortsha> fork
tag alongside the workspace tag, or reference the automation that performs it.
Align the fork-tag requirement in docs/COMPATIBILITY.md with this executable
procedure; update both sites as needed.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Real but out of scope here (release-process docs in the update-gpui skill + COMPATIBILITY.md, not code touched by this PR). Tracking as a follow-up to add the fork-tag step / point at the automation that creates it.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@BumpyClock, acknowledged. This is a valid release-process follow-up, but it does not need to block this App Platform PR. If no follow-up issue exists yet, would you like me to open one for the fork-tag/automation documentation alignment?


9. **Report summary**: Show old commit, new commit, what changed (list new commits), whether build/clippy passed, and the new workspace version + tag.

### Notes

Expand Down
58 changes: 57 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ jobs:
- name: Typo check
if: ${{ matrix.run_on == 'macos-latest' }}
run: |
cargo install typos-cli || echo "typos-cli already installed"
# --locked for reproducibility; no `|| echo` mask — a failed install
# must fail the step, not surface later as `typos: command not found`.
which typos >/dev/null 2>&1 || cargo install typos-cli --locked
typos
- name: Lint (macOS)
if: ${{ matrix.run_on == 'macos-latest' }}
Expand All @@ -60,6 +62,11 @@ jobs:
- name: Lint (Windows)
if: ${{ matrix.run_on == 'windows-latest' }}
run: ./script/clippy.ps1
# Platform crates are pure-Rust (no display server) and their tests are
# MANDATORY on every OS — unlike the rest of the repo, where tests are
# optional. See docs/learned/app-platform-plan.md §5 Phase 0 item 2/3.
- name: Test platform crates
run: cargo test -p gpui-component-storage -p gpui-component-manifest
- name: Test Linux
if: ${{ matrix.run_on == 'ubuntu-latest' }}
run: |
Expand All @@ -73,3 +80,52 @@ jobs:
run: |
cargo test --all
cargo test -p gpui-component --doc

# Native launch smoke test for the app-platform conformance examples
# (examples/app_shell single-window, examples/app_shell_tray tray-first). Each
# example boots the real shell, opens its window(s), then `--smoke` requests a
# clean quit and exits 0. See docs/learned/app-platform-plan.md §5 Phase 1 and
# §6 gate 7. Keep the matrix in sync with the `test` job above.
native-launch-smoke:
name: Native launch smoke
strategy:
fail-fast: false
matrix:
include:
- target: aarch64-apple-darwin
run_on: macos-latest
- target: x86_64-linux-gnu
run_on: ubuntu-latest
- target: x86_64-windows-msvc
run_on: windows-latest
runs-on: ${{ matrix.run_on }}
steps:
- uses: actions/checkout@v4
- uses: actions-rust-lang/setup-rust-toolchain@v1
Comment on lines +103 to +104

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Unpinned actions + no persist-credentials: false + cache-poisoning surface.

zizmor flags actions/checkout@v4 (no persist-credentials: false, unpinned) and actions-rust-lang/setup-rust-toolchain@v1 (unpinned, auto-caching enabled by default → cache-poisoning surface) on these lines. This duplicates the same unpinned pattern already present in the test job above (lines 29-30), so it's a repo-wide gap being extended rather than a new regression, but worth addressing here since it's touched by this PR.

🔒 Suggested hardening
-      - uses: actions/checkout@v4
-      - uses: actions-rust-lang/setup-rust-toolchain@v1
+      - uses: actions/checkout@v4 # pin to a commit SHA
+        with:
+          persist-credentials: false
+      - uses: actions-rust-lang/setup-rust-toolchain@v1 # pin to a commit SHA
+        with:
+          cache: false
🧰 Tools
🪛 zizmor (1.26.1)

[warning] 101-101: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[error] 101-101: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 102-102: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 102-102: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): enables caching by default

(cache-poisoning)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 101 - 102, Harden the CI action usage
in the affected job by pinning both actions/checkout and
actions-rust-lang/setup-rust-toolchain to immutable commit SHAs. Configure
checkout with persist-credentials disabled and disable automatic caching in
setup-rust-toolchain, matching the required security posture and applying the
same fix to the duplicate action usage in the test job.

Source: Linters/SAST tools

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Out of scope for this PR. As noted, this is a repo-wide gap — the same unpinned pattern is in the pre-existing test job. Pinning actions to commit SHAs plus persist-credentials: false should be a dedicated repo-wide CI-hardening change; tracking as a follow-up rather than partially applying it here.

- name: Install system dependencies
if: ${{ matrix.run_on != 'windows-latest' }}
run: script/bootstrap
# Build on every OS: this exercises the full D4 identity chain (build.rs +
# include_identity!) cross-platform, even where we do not launch a
# GPU-backed window below.
- name: Build conformance examples
run: cargo build -p app_shell -p app_shell_tray
# Launch smoke runs on macOS only. Platform parity (CLAUDE.md) requires
# documenting why the other two are gated off rather than silently skipped:
# - macOS: GitHub arm64 runners provide a working Metal device; the
# `--smoke` launch is verified to reach a ready window and exit 0.
# - Linux: GPUI renders via Vulkan. Stock ubuntu runners have no display
# and no Vulkan device, so a native launch needs both xvfb and a
# software driver (lavapipe) that is not guaranteed present. Gated off
# to avoid flaky reds; enable once the runner image ships them:
# xvfb-run -a cargo run -p app_shell -- --smoke
# xvfb-run -a cargo run -p app_shell_tray -- --smoke
# - Windows: GPUI renders via DirectX; headless runners have no reliable
# present surface. Gated off pending a WARP-backed offscreen path:
# cargo run -p app_shell -- --smoke
# cargo run -p app_shell_tray -- --smoke
- name: Native launch smoke (macOS)
if: ${{ matrix.run_on == 'macos-latest' }}
run: |
cargo run -p app_shell -- --smoke
cargo run -p app_shell_tray -- --smoke
59 changes: 58 additions & 1 deletion Cargo.lock

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

12 changes: 12 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
[workspace]
default-members = ["crates/ui", "crates/story", "crates/assets"]
members = [
"crates/app",
"crates/app-manifest",
"crates/app-storage",
"crates/macros",
"crates/story",
"crates/ui",
"crates/assets",
"crates/reqwest_client",
"crates/webview",
"examples/app_assets",
"examples/app_shell",
"examples/app_shell_tray",
"examples/hello_world",
"examples/input",
"examples/window_title",
Expand All @@ -21,9 +26,13 @@ resolver = "2"
[workspace.package]
publish = false
edition = "2024"
version = "0.5.1"

[workspace.dependencies]
gpui-component = { path = "crates/ui", version = "0.5.1" }
gpui-component-app = { path = "crates/app", version = "0.5.1" }
gpui-component-manifest = { path = "crates/app-manifest", version = "0.5.1" }
gpui-component-storage = { path = "crates/app-storage", version = "0.5.1" }
gpui-component-macros = { path = "crates/macros", version = "0.5.1" }
gpui-component-assets = { path = "crates/assets", version = "0.5.1" }
story = { path = "crates/story" }
Expand All @@ -50,6 +59,7 @@ circular-buffer = "1.0"
chrono = { version = "0.4", features = ["serde"] }
ctor = "0.4.0"
derive_more = "0.99.17"
dirs = "6"
env_logger = "0.11"
futures = "0.3"
image = "0.25.1"
Expand Down Expand Up @@ -78,7 +88,9 @@ smallvec = "1.15.1"
smol = "2"
stacksafe = "0.1"
strum = { version = "0.27.2", features = ["derive"] }
tempfile = "3"
thiserror = "2.0.12"
toml = "0.9"
tracing = "0.1.44"
uuid = { version = "1.1.2", features = ["v4", "v5", "v7", "serde"] }
scap = { git = "https://github.com/zed-industries/scap", rev = "4afea48c3b002197176fb19cd0f9b180dd36eaac", default-features = false, package = "zed-scap", version = "0.0.8-zed" }
Expand Down
17 changes: 17 additions & 0 deletions crates/app-manifest/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[package]
name = "gpui-component-manifest"
description = "App identity schema, validation, and build-time codegen for gpui-component apps. No GPUI dependency; usable from build scripts and packaging tools."
version.workspace = true
edition.workspace = true
publish.workspace = true

[dependencies]
serde.workspace = true
thiserror.workspace = true
toml.workspace = true

[dev-dependencies]
tempfile.workspace = true

[lints]
workspace = true
Loading
Loading