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
6 changes: 3 additions & 3 deletions .agents/skills/ropy-gpui/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ Read the official [GPUI Kit skill](../gpui-kit/SKILL.md), and the official [Desi

## Official snapshots

Both official skill directories are unmodified copies of [GPUI Kit v0.8.0](https://github.com/longbridge/gpui-kit/tree/v0.8.0/skills), commit `1676826d9d49b90f4d7b6808b69924f58796f6f1`. Keep all local additions and corrections in this adapter, including changes to links and examples. Do not edit or add files inside either official directory. When upgrading, replace each complete directory from one upstream revision and record the new revision here.
Both official skill directories are unmodified copies of [GPUI Kit v0.8.1](https://github.com/longbridge/gpui-kit/tree/v0.8.1/skills), commit `99576db58ec8103417c41a092e891b4022d24e7e`. Keep all local additions and corrections in this adapter, including changes to links and examples. Do not edit or add files inside either official directory. When upgrading, replace each complete directory from one upstream revision and record the new revision here.

To verify against an extracted upstream checkout, run `diff -qr <upstream>/skills/gpui-kit .agents/skills/gpui-kit` and the equivalent command for `gpui-kit-design-guides`. Both must report no differences.

## Ropy contracts

- Normal and development dependencies use `gpui-kit` 0.8.0, with the default `gpui-pre` 0.3.9 engine. Keep the existing feature set unless the task requires a change. Optional backend entries in Cargo.lock do not imply an active renderer switch.
- Normal and development dependencies use `gpui-kit` 0.8.1, with the default `gpui-pre` 0.3.10 engine. Keep the existing feature set unless the task requires a change. Optional backend entries in Cargo.lock do not imply an active renderer switch.
- Localize visible strings and accessible names with existing translation keys where appropriate. The official design guide's English-only accessibility-label exception does not override Ropy's localization convention.
- The Coding Guides allow deliberately record-like configuration, theme tokens, geometry and serialized schemas to expose fields with `#[non_exhaustive]` and construction APIs. Follow that detailed rule instead of treating the official entrypoint's abbreviated “No pub fields” statement as an instruction to migrate unrelated types.
- `gpui_kit::open_window` installs the window Root and returns the window handle and view entity. Do not mount duplicate dialog, sheet or notification layers. Existing setup is in [window.rs](../../../src/gui/window.rs).
Expand All @@ -25,7 +25,7 @@ To verify against an extracted upstream checkout, run `diff -qr <upstream>/skill
## Task-specific references

- Before copying low-level examples, read [locked API notes](references/locked-api.md) for callback arity, entity return types, focus and Element lifecycle differences.
- For 0.8.0 adoption and prioritized project opportunities, read [integration notes](references/integration.md).
- For 0.8.1 adoption and prioritized project opportunities, read [integration notes](references/integration.md).
- Production-view UI integration tests live in [ui_tests.rs](../../../src/gui/board/ui_tests.rs). Use the official testing reference for the new `TestQueryExt`, `TestEventExt` and `TestInput` APIs, checking signatures in the installed crate.

Official site-relative links and diagrams remain unchanged in the upstream copies. Resolve them against `https://gpui-kit.com`; a missing file in Ropy does not authorize inventing a local counterpart.
10 changes: 8 additions & 2 deletions .agents/skills/ropy-gpui/references/integration.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
# Ropy integration with GPUI Kit 0.8.0
# Ropy integration with GPUI Kit 0.8.1

## Source and refresh policy

Checked against [GPUI Kit v0.8.0](https://github.com/longbridge/gpui-kit/releases/tag/v0.8.0), commit `1676826d9d49b90f4d7b6808b69924f58796f6f1`. The upstream default branch matched this release when checked on 2026-10-19. Normal and development dependencies use 0.8.0; the default engine remains `gpui-pre` 0.3.9. Optional GPUI Fast entries in Cargo.lock do not mean Ropy switched rendering engines.
Checked against [GPUI Kit v0.8.1](https://github.com/longbridge/gpui-kit/releases/tag/v0.8.1), commit `99576db58ec8103417c41a092e891b4022d24e7e`. Normal and development dependencies use 0.8.1; the default engine remains `gpui-pre` 0.3.10. Optional GPUI Fast entries in Cargo.lock do not mean Ropy switched rendering engines.

Use the official `gpui-kit` and `gpui-kit-design-guides` skills alongside the `ropy-gpui` adapter for visible UI work. First read the relevant guide sections, then the component family convention, then verify the exact signature in the installed source. Keep Ropy-specific guidance in `ropy-gpui`; replace the two official skill directories only with an unmodified upstream snapshot. Upstream `script/check-ai` commands do not run in this repository.

This reference adapts [GPUI Kit documentation](https://gpui-kit.com) under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), adding Ropy-specific scope, verification and recommendations. Code examples retain their upstream Apache-2.0 terms.

## 0.8.1 migration

Dynamic shortcut loading uses `KeyBinding::load` with the application context. Parsing and formatting use `cx.platform_info().os`; this keeps shortcut validation, recording and display consistent with the runtime host. Static default bindings use string literals. The input-blocking promotion overlay uses the renamed `on_scroll` handler.

The official skill directories in v0.8.1 are byte-for-byte identical to v0.8.0. Their recorded source revision still advances with the dependency. Existing UI integration tests cover shortcut editing, persistence and focus; host-parameterized binding tests cover `secondary` normalization and conflicts on macOS, Windows and Linux.

## Adopted integration

- `Slider::accessibility_label` names the opacity slider and each RGB channel using existing localized labels. The settings UI integration test queries the opacity label through `TestQueryExt` and checks that it identifies a slider.
Expand Down
16 changes: 10 additions & 6 deletions .agents/skills/ropy-gpui/references/locked-api.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
# Locked API notes

These notes preserve Ropy's verified corrections for `gpui-kit` 0.8.0 and its default `gpui-pre` 0.3.9 engine. Read the installed source before using an upstream example with a conflicting signature. This is a compatibility note, not another framework manual.
These notes preserve Ropy's verified corrections for `gpui-kit` 0.8.1 and its default `gpui-pre` 0.3.10 engine. Read the installed source before using an upstream example with a conflicting signature. This is a compatibility note, not another framework manual.

## Keyboard and scroll APIs

`KeyBinding::new` and `Keystroke::parse` require static strings with explicit modifiers. Use `KeyBinding::load(..., cx)` for configuration strings and `Keystroke::parse_with_os(source, cx.platform_info().os)` for dynamic parsing. `Keystroke::unparse` takes the host operating system; do not infer it from the compilation target. The `secondary` modifier resolves from that runtime host. `InteractiveElement::on_scroll` replaces the deprecated `on_scroll_wheel`.

## Contexts and async work

The [Context source](https://docs.rs/crate/gpui-pre/0.3.9/source/src/app/context.rs) defines these callbacks:
The [Context source](https://docs.rs/crate/gpui-pre/0.3.10/source/src/app/context.rs) defines these callbacks:

| Receiver and operation | Callback arguments |
| --- | --- |
Expand All @@ -20,18 +24,18 @@ The [Context source](https://docs.rs/crate/gpui-pre/0.3.9/source/src/app/context

`Entity::update` returns the closure result directly. `WeakEntity::update` and `update_in` return a synchronous Result; do not await them. `WeakEntity::upgrade` returns Option. Await I/O or background Tasks, then update the owner. There is no `Task::then` continuation API in this engine. Retain cancellable Tasks and Subscriptions on their owner; detach only for an intentional independent lifetime.

`Context::defer_in` already borrows the owner mutably. Use the supplied `&mut T`; accessing the same entity through another handle re-enters its borrow. See the [entity source](https://docs.rs/crate/gpui-pre/0.3.9/source/src/app/entity_map.rs).
`Context::defer_in` already borrows the owner mutably. Use the supplied `&mut T`; accessing the same entity through another handle re-enters its borrow. See the [entity source](https://docs.rs/crate/gpui-pre/0.3.10/source/src/app/entity_map.rs).

## Global state and focus

`set_global`, `global_mut` and completion of `update_global` queue observer notifications; manually broadcasting a second notification is unnecessary. Mutating data behind a shared lock does not invoke those hooks. `Global` does not require Clone. Use `Theme::update` to synchronize theme colors, renderable tokens and the Base projection.

Focus queries take a Window: `handle.is_focused(window)`. Native activation is `window.is_window_active()`. Create retained handles with `cx.focus_handle().tab_stop(true)` when they belong in Tab order; `track_focus` does not add a tab stop by itself. Focus subscriptions (`on_focus`, `on_blur`, `on_focus_in`, `on_focus_out`) are Context methods, not div builders. Bind keys before setting native menus. See the [Window source](https://docs.rs/crate/gpui-pre/0.3.9/source/src/window.rs).
Focus queries take a Window: `handle.is_focused(window)`. Native activation is `window.is_window_active()`. Create retained handles with `cx.focus_handle().tab_stop(true)` when they belong in Tab order; `track_focus` does not add a tab stop by itself. Focus subscriptions (`on_focus`, `on_blur`, `on_focus_in`, `on_focus_out`) are Context methods, not div builders. Bind keys before setting native menus. See the [Window source](https://docs.rs/crate/gpui-pre/0.3.10/source/src/window.rs).

## Elements and component constructors

`Element` has two associated states, `RequestLayoutState` and `PrepaintState`; its trait methods differ from type-erased `AnyElement` helpers. `AnyElement::request_layout(window, cx)` returns a LayoutId, `prepaint(window, cx)` returns an optional FocusHandle, and `paint(window, cx)` returns unit. Do not pass Element trait IDs, bounds or state arguments to those wrapper helpers. See the [Element source](https://docs.rs/crate/gpui-pre/0.3.9/source/src/element.rs).
`Element` has two associated states, `RequestLayoutState` and `PrepaintState`; its trait methods differ from type-erased `AnyElement` helpers. `AnyElement::request_layout(window, cx)` returns a LayoutId, `prepaint(window, cx)` returns an optional FocusHandle, and `paint(window, cx)` returns unit. Do not pass Element trait IDs, bounds or state arguments to those wrapper helpers. See the [Element source](https://docs.rs/crate/gpui-pre/0.3.10/source/src/element.rs).

`Window::with_element_state` receives a GlobalElementId and a closure mapping `Option<S>` to `(result, S)`. Element fields do not establish persistent application state. Register hitboxes in prepaint and input handlers in paint; the latter capture owned data or handles, not a temporary `&mut self`.

`Input::new` and `Select::new` receive retained state entities, not string IDs. `Tab::new()` takes no ID argument. `h_flex()` centers on the cross axis; `v_flex()` retains stretch behavior. Full-height columns inside rows may need explicit height or stretch. Verify constructors in the [0.8.0 component source](https://github.com/longbridge/gpui-kit/tree/1676826d9d49b90f4d7b6808b69924f58796f6f1/crates/component/src).
`Input::new` and `Select::new` receive retained state entities, not string IDs. `Tab::new()` takes no ID argument. `h_flex()` centers on the cross axis; `v_flex()` retains stretch behavior. Full-height columns inside rows may need explicit height or stretch. Verify constructors in the [0.8.1 component source](https://github.com/longbridge/gpui-kit/tree/99576db58ec8103417c41a092e891b4022d24e7e/crates/component/src).
10 changes: 5 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ jobs:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
persist-credentials: false
submodules: recursive
Expand Down Expand Up @@ -116,7 +116,7 @@ jobs:
- name: enable windows longpaths
run: |
git config --global core.longpaths true
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
persist-credentials: false
submodules: recursive
Expand Down Expand Up @@ -195,7 +195,7 @@ jobs:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
persist-credentials: false
submodules: recursive
Expand Down Expand Up @@ -258,7 +258,7 @@ jobs:
outputs:
val: ${{ steps.host.outputs.manifest }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
persist-credentials: false
submodules: recursive
Expand Down Expand Up @@ -323,7 +323,7 @@ jobs:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
persist-credentials: false
submodules: recursive
Loading
Loading