Loading...
Loading...
This skill should be used when the user asks about the "electrobun kitchen sink", "defineTest", "AUTO_RUN mode", "kitchen sink tests", "electrobun test runner", navigating playground windows, or wants to add new electrobun Kitchen Sink test coverage.
npx skill4agent add dexploarer/plugin-electrobun-dev electrobun-kitchen-sinkkitchen/
├── scripts/
│ ├── generate-manifest.ts # static parser → feature-manifest.json
│ └── validate-manifest.ts # consistency checks
├── src/
│ ├── bun/index.ts # Electrobun bun-side entrypoint
│ ├── generated/
│ │ ├── manifest-types.ts # TypeScript types for the manifest
│ │ └── feature-manifest.json # generated feature index
│ ├── test-framework/ # test executor & result types
│ ├── test-runner/ # test runner UI (views://test-runner/)
│ ├── test-harness/ # webview used by automated tests
│ ├── tests/
│ │ ├── index.ts # aggregates all suites
│ │ ├── *.test.ts # automated test suites
│ │ └── interactive/ # interactive test suites
│ └── playgrounds/ # standalone feature demo windows
└── electrobun.config.tscd kitchen && bun install
# Dev mode — opens test runner window
electrobun dev
# Watch mode — auto-rebuilds on file change
electrobun dev --watch
# Auto-run all automated tests and exit (CI / headless)
AUTO_RUN=1 electrobun dev
# Run a single test by name
AUTO_RUN_TEST_NAME="Window creation with URL" electrobun dev01kitchen/src/generated/feature-manifest.json{
"id": "window-creation-with-url", // stable slug
"title": "Window creation with URL", // human-readable
"category": "BrowserWindow", // API grouping
"description": "Test creating a window with a URL",
"interactive": false, // true = requires human input
"testFile": "src/tests/window.test.ts", // source location
"playgroundRoute": null, // e.g. "playgrounds/clipboard/index.html"
"apiSurface": ["BrowserWindow"], // Electrobun APIs exercised
"uiSelectors": [], // CSS selectors used in playground
"platformCaveats": [] // e.g. ["requires CEF renderer"]
}cd kitchen
npx tsx scripts/generate-manifest.ts # parse defineTest() calls, write manifest
npx tsx scripts/validate-manifest.ts # check all tests have manifest entries, no dups| Suite | Key APIs |
|---|---|
| RPC | BrowserView.defineRPC, Electroview.defineRPC |
| BrowserWindow | new BrowserWindow, all lifecycle methods |
| Navigation | setNavigationRules, will-navigate, did-navigate |
| Utils | clipboard, paths, openFileDialog, showNotification |
| Screen | getPrimaryDisplay, getAllDisplays, getCursorScreenPoint |
| Session | Session.fromPartition, cookies |
| Events | Electrobun.events.on (all global events) |
| Preload | preload script injection |
| Updater | checkForUpdate, downloadUpdate, applyUpdate |
| Sandbox | sandbox: true isolation |
| Tray | new Tray, setMenu, tray-clicked |
| WGPU FFI | WGPUBridge low-level FFI |
| WGPU Adapter | GpuWindow, WGPUView adapter layer |
| Babylon Adapter | BabylonJS WebGPU integration |
| WGPU Adapter Extended | extended WGPU surface coverage |
| Suite | Feature area |
|---|---|
| Dialogs | openFileDialog, showMessageBox |
| Tray | Tray visibility, icon, menu |
| Shortcuts | GlobalShortcut register/unregister |
| Webview Tag | |
| Clipboard | clipboardRead/WriteText/Image |
| Menus | ApplicationMenu, ContextMenu |
| Window Events | move, resize, blur, focus events |
| Chromeless | titleBarStyle: hidden, draggable regions |
| Multiwindow CEF | CEF renderer multi-window |
| Quit test | before-quit lifecycle |
| Webview settings | renderer options, sandbox |
| Webview cleanup | view lifecycle and removal |
| WGPU View | WGPUView interactive |
| WGPU Tag | |
| Fullsize frame repro | window frame edge cases |
views://test-runner/index.html| Selector | Action |
|---|---|
| |
| |
| |
| Fuzzy filter by name/category/description |
| |
| Toggle update status history panel |
| |
| Selector | Shows |
|---|---|
| Total test count |
| Passed |
| Failed |
| Pending/not-run |
| Category groups + test cards |
| Total or filtered count |
| Selector | Purpose |
|---|---|
| Modal container |
| Test name |
| Instructions text |
| |
| |
| |
| |
| Optional notes |
getTests()runTest({ testId })runAllAutomated()runInteractiveTests()submitInteractiveResult({ testId, passed, notes })submitReady({ testId })submitVerification({ testId, action, notes })applyUpdate()getUpdateStatusHistory()clearUpdateStatusHistory()getTestRunnerPreferences()setTestRunnerPreferences({ searchQuery })testStartedtestCompletedtestLogallCompletedinteractiveWaitinginteractiveReadyinteractiveVerifybuildConfigupdateStatusupdateStatusEntry1. User clicks Open on an interactive test
2. Runner shows modal: instructions + #btn-start
3. User reads instructions, clicks Start → submitReady()
4. A secondary playground window opens (bun-side)
5. User performs the described action in that window
6. Modal shows: #btn-pass, #btn-fail, #btn-retest
7. User marks result → submitVerification()
8. Modal closes, result recorded# Read the manifest
cat kitchen/src/generated/feature-manifest.json
# Filter: automated tests only
jq '[.[] | select(.interactive == false)]' feature-manifest.json
# Filter: tests for a specific API
jq '[.[] | select(.apiSurface | contains(["BrowserWindow"]))]' feature-manifest.json
# Map test to source file
jq '.[] | select(.id == "window-creation-with-url") | .testFile' feature-manifest.json| Playground | URL | Key Controls |
|---|---|---|
| File dialog | | |
| App menu | | Sets app menu via RPC |
| Context menu | | Shows context menu via RPC |
| Webview tag | | masks, passthrough, navigation |
| Session/partition | | Compares cross-partition localStorage |
| Window events | | move/resize/blur/focus detection |
| Clipboard | | read/write text and image |
| Tray | | tray icon and menu |
1.0devhttp://localhost:9222