E2E Agent Browser
jh941213/my-cc-harness
E2E test automation using agent-browser CLI. An agent skill from jh941213/my-cc-harness.
Spawn, probe, and stop Mini Diarium's live Windows Tauri dev app with WebView2 CDP enabled, then hand control to agent-browser for real UI inspection.
$ npx skills add fjrevoredo/mini-diarium --skill tauri-agent-dev -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install fjrevoredo/mini-diarium tauri-agent-dev --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/fjrevoredo/mini-diarium.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/tauri-agent-dev .claude/skills/tauri-agent-dev && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "tauri-agent-dev" agent skill from https://github.com/fjrevoredo/mini-diarium/tree/master/.agents/skills/tauri-agent-dev into .claude/skills/tauri-agent-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tauri-agent-dev", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/fjrevoredo/mini-diarium/tree/master/.agents/skills/tauri-agent-devType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add fjrevoredo/mini-diarium --skill tauri-agent-dev -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install fjrevoredo/mini-diarium tauri-agent-dev --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fjrevoredo/mini-diarium.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/tauri-agent-dev .agents/skills/tauri-agent-dev && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "tauri-agent-dev" agent skill from https://github.com/fjrevoredo/mini-diarium/tree/master/.agents/skills/tauri-agent-dev into .agents/skills/tauri-agent-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tauri-agent-dev", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add fjrevoredo/mini-diarium --skill tauri-agent-dev -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install fjrevoredo/mini-diarium tauri-agent-dev --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fjrevoredo/mini-diarium.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/tauri-agent-dev .cursor/skills/tauri-agent-dev && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "tauri-agent-dev" agent skill from https://github.com/fjrevoredo/mini-diarium/tree/master/.agents/skills/tauri-agent-dev into .cursor/skills/tauri-agent-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tauri-agent-dev", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/fjrevoredo/mini-diarium.git --path .agents/skills/tauri-agent-dev--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add fjrevoredo/mini-diarium --skill tauri-agent-dev -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install fjrevoredo/mini-diarium tauri-agent-dev --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fjrevoredo/mini-diarium.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/tauri-agent-dev .gemini/skills/tauri-agent-dev && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "tauri-agent-dev" agent skill from https://github.com/fjrevoredo/mini-diarium/tree/master/.agents/skills/tauri-agent-dev into .gemini/skills/tauri-agent-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tauri-agent-dev", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install fjrevoredo/mini-diarium tauri-agent-devInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add fjrevoredo/mini-diarium --skill tauri-agent-dev -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/fjrevoredo/mini-diarium.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/tauri-agent-dev .github/skills/tauri-agent-dev && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "tauri-agent-dev" agent skill from https://github.com/fjrevoredo/mini-diarium/tree/master/.agents/skills/tauri-agent-dev into .github/skills/tauri-agent-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tauri-agent-dev", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add fjrevoredo/mini-diarium --skill tauri-agent-dev -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install fjrevoredo/mini-diarium tauri-agent-dev --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/fjrevoredo/mini-diarium.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/tauri-agent-dev .opencode/skills/tauri-agent-dev && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "tauri-agent-dev" agent skill from https://github.com/fjrevoredo/mini-diarium/tree/master/.agents/skills/tauri-agent-dev into .opencode/skills/tauri-agent-dev/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "tauri-agent-dev", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
tauri-agent-devSpawn, probe, and stop Mini Diarium's live Windows Tauri dev app with WebView2 CDP enabled, then hand control to agent-browser for real UI inspection.
Tauri Agent Dev is an agent skill from fjrevoredo/mini-diarium. Spawn, probe, and stop Mini Diarium's live Windows Tauri dev app with WebView2 CDP enabled, then hand control to agent-browser for real UI inspection. Use this whenever the user wants to manually test the real desktop UI, drive the dev app, verify a bug or preference in the actual window, inspect localStorage, take a real screenshot, or "actually try it in the app" instead of relying only on unit tests or WDIO. Triggers: manually test the UI, drive the dev app, verify in the real UI, agent dev mode, spawn the dev…
Its SKILL.md is about 5.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).
It sits in Productivity & Automation, covering Browser automation and Unit testing. It works with Tauri. The repository describes itself as: A local-only journal with serious encryption. Free, open source, and never touches the internet. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 3ddc537. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bunFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Tauri Agent Dev loads about 5.2k tokens when it runs. Until then it costs about 151 tokens; SKILL.md has 2,365 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from fjrevoredo/mini-diarium at commit 3ddc537, republished under its MIT licence (© fjrevoredo). 2,365 words, ~5,150 tokens.
.claude/skills/tauri-agent-dev/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Run everything from the repo root with the Windows toolchain.
Use the PowerShell tool, not Bash + cmd.exe, for every command in this skill. agent:dev:start,
agent:dev:probe, agent:dev:stop, and agent-browser connect are exactly the kind of
background-spawning / long-running commands where Bash piped through cmd.exe reliably returns
only the cmd.exe banner with no real output — the same failure mode root CLAUDE.md calls out
for website:build-static, but it is not specific to that one script. If a command run this way
returns nothing but the banner, that is the signature of this issue, not a sign the command failed
— retry it through the PowerShell tool before concluding anything is wrong.
agent:dev:start does not return to you — always launch it with run_in_background: true.
The script itself is written to exit once CDP is up (it spawns tauri dev, polls, prints
Tauri dev running., and falls off the end of main()), but through this tool chain the call stays
attached to the live process tree and is only reported as complete when you later run
agent:dev:stop. Waiting on it in the foreground burns the entire tool timeout and teaches you
nothing: a foreground call with a 400 s timeout will be force-backgrounded at 400 s even though the
app window opened ~60 s in. Launch it backgrounded and use probe as the readiness signal:
# 1. Launch — run_in_background: true, do NOT wait on this call
bun run agent:dev:start
# 2. Readiness — this one DOES return, in well under a second
bun run agent:dev:probeThe same applies to agent-browser connect <port>: it does not return either. Launch it
backgrounded (or simply issue it and move on) and treat the first successful
agent-browser snapshot as proof the connection is live — snapshot returns normally.
Useful flags:
bun run agent:dev:start -- --port 9223
bun run agent:dev:start -- --timeout 180
bun run agent:dev:start -- --use-real-configWhat start does:
tauri dev.agent-dev/sandbox/.agent-dev/sandbox/app/config.json on first run so the frontend auto-selects the sandbox journal.agent-dev/sandbox/webview/ so localStorage does not leak across runs.agent-dev/state.json.agent-dev/dev.logDetecting readiness: don't grep the raw start output for guessed keywords ("ready", "listening",
etc.) — per the note above, start never hands its output back, so its stdout is not a readiness
signal at all through this tool chain. agent:dev:probe is the purpose-built readiness check and
returns structured JSON ({"running":true,...}) the moment the CDP target is live. Poll it directly
instead of building an ad hoc log-watcher:
# Poll probe every few seconds until it reports running, instead of waiting on a fixed
# timer or grepping dev.log for inferred markers.
until bun run agent:dev:probe 2>&1 | grep -q '"running":true'; do sleep 3; doneCold builds take 30-90 seconds; pass --timeout 180 if a Rust rebuild is expected. If the app window
is already visibly open (the user can see it), trust that over a probe/log timeout — the window
appearing means the session is up even if a polling loop hasn't caught up yet.
After start succeeds, connect the separate browser-driving layer:
agent-browser connect 9222If you changed the port, connect to that port instead.
After agent-browser connect, use the normal browser-driving loop:
agent-browser snapshotlocalStorage readsPowerShell notes:
Quote @eNNN refs. Use agent-browser click '@e5', not agent-browser click @e5.
Pass every non-trivial eval script as a single-quoted here-string, never as an inline
double-quoted argument. PowerShell eats backslash-escaped quotes inside a "…" argument, so JS
containing quoted selectors arrives at the browser mangled. This call:
agent-browser eval "(function(){ document.querySelectorAll('a[aria-label^=\"Open entry\"]') })()"fails with 'a[aria-label^= Open entry]' is not a valid selector — the inner quotes were stripped,
not escaped. The failure looks like a bad selector, so it sends you rewriting correct JS. Use:
$js = @'
(function(){
const rows = Array.from(document.querySelectorAll('li button'))
.filter(b => (b.getAttribute('aria-label') || '').startsWith('Open entry'));
return { count: rows.length };
})()
'@
agent-browser eval $jsThe @'…'@ form is literal — no $, backtick, or quote interpretation — so the JS reaches the
browser byte-for-byte. The closing '@ must be at column 0 on its own line. As a bonus,
startsWith/includes filtering in JS avoids CSS attribute-selector quoting entirely.
Stale ref warning: @eNNN refs are assigned at snapshot time. Any DOM mutation (tab switch,
scroll, dialog open/close) can reassign refs so an old ref silently targets a different element.
For controls inside scrollable panels or dialogs, prefer CSS selectors or JS eval with label-text
matching over bare @eNNN refs. Always re-snapshot after a meaningful transition before clicking
a ref from a previous snapshot.
type requires the selector and text in the same call: agent-browser type <sel> <text> takes
both arguments together — e.g. agent-browser type '@e15' 'some text'. Calling click '@e15' and
then type with only the text string (no selector) is a silent no-op: it returns success but
nothing is typed, and there is no error to signal the mistake. If eval'd editor/input content comes
back empty after a type call, check this first before assuming a focus or timing problem.
Don't burn a full wakeup/turn-cycle on a sub-second wait: known short timers (e.g. the 500ms
autosave debounce) don't need ScheduleWakeup or a minute-long pause — that wastes a conversation
turn per check. Use a short shell-level wait (sleep 1-2 inline before the next command, or a tight
Monitor poll loop) so the verification stays in the same turn.
Prefer the app's documented data-testid hooks where they exist. Do not invent new ones.
The canonical list is the data-testid table in src/CLAUDE.md — read it
there rather than trusting a copy. It is maintained as E2E contract and grows whenever a new
testid ships; a duplicated list here goes stale silently and sends you hunting by text for controls
that already have a stable hook. The ones you reach for most in this workflow:
| Purpose | testid |
|---|---|
| Journal creation | password-create-input, password-repeat-input, create-journal-button |
| Journal unlock | password-unlock-input, unlock-journal-button |
| Header | toggle-sidebar-button, lock-journal-button, search-button, timeline-toggle-button, header-date-title, header-prev-day-button, header-next-day-button |
| Overflow menu | header-more-menu-trigger, then header-more-menu-{preferences,statistics,import,export}-item |
| Overlays (assert open) | preferences-overlay, stats-overlay, import-overlay, export-overlay, search-overlay |
| Onboarding | onboarding-next-btn |
| Editor | title-input, entry-nav-bar, entry-{prev,next,add,delete,lock}-button, entry-number-button-{N} |
| Calendar | calendar-day-YYYY-MM-DD |
Preferences has no data-testids, but it does have stable id attributes — use those, not visible
text (text matching breaks under a non-English language preference):
#pref-tab-general, #pref-tab-writing, #pref-tab-security, #pref-tab-data,
#pref-tab-advanced. Note writing and security render only while unlocked
(PreferencesOverlay.tsx), so unlock before reaching for them.#pref-first-day, #pref-timeline-date-format, #show-timeline-preview,
#hide-titles, #allow-future, #enable-spellcheck, #editor-font-size.For a fresh sandbox:
password-create-inputpassword-repeat-inputcreate-journal-buttonFor an existing sandbox journal:
password-unlock-inputunlock-journal-buttonA fresh sandbox always lands in the onboarding tour, and its overlay swallows clicks aimed at the
header. This is not an occasional annoyance — it fires on every first run, and the symptom is
misleading: agent-browser click '[data-testid=header-more-menu-trigger]' reports ✓ Done, the menu
never opens, and the follow-up click on a menu item fails with Element not found. It reads like a
broken menu or a stale ref. Check for onboarding-next-btn in the DOM before believing that.
Don't step through the tour by hand and don't try to pre-seed its localStorage key — the key is
onboarding-shown-{activeJournalId} (src/state/onboarding.ts), and the journal id does not exist
until after creation. Click through to the end in one eval instead; the loop is id-agnostic and
survives the tour gaining or losing steps:
$js = @'
(function(){
let clicks = 0;
for (let i = 0; i < 12; i++) {
const b = document.querySelector('[data-testid=onboarding-next-btn]');
if (!b) break;
b.click(); clicks++;
}
return { clicks, stillThere: !!document.querySelector('[data-testid=onboarding-next-btn]') };
})()
'@
agent-browser eval $jsExpect stillThere: false. The final click calls dismissOnboarding(), which persists the key, so
the tour stays gone for the rest of the sandbox's life — including across reloads.
Open Preferences via header-more-menu-trigger → header-more-menu-preferences-item (dismiss the
onboarding tour first — see above, or the trigger click silently does nothing), then click the tab
by id (#pref-tab-writing, etc.).
To inspect saved preferences directly:
JSON.parse(localStorage.getItem('preferences') ?? '{}');Typical checks:
autoLockEnabledautoLockTimeoutlanguageeditorFontFamilyAuto-lock timer interference: If autoLockTimeout is short (< 30 s), the journal will lock
between CDP roundtrips — eval calls do not dispatch DOM activity events and therefore do not
reset the idle timer.
A bare localStorage.setItem('preferences', ...) write does not fix this — confirmed empirically,
not just by reading the source. preferences (src/state/preferences.ts) is a Solid signal created
once at module load (createSignal(loadPreferences())); the running app never re-reads localStorage
on its own, so writing to it directly changes only what a future page load will pick up, not the
live in-memory value the idle timer effect (App.tsx) actually reads. A session that patches
localStorage this way and keeps driving the UI will still hit the original timeout and lock
mid-session, which looks like a flaky app rather than a stale-write bug.
Two ways to actually change the live value:
#pref-tab-security, toggle the "Lock after inactivity" checkbox and/or set the timeout
input via the native-setter + input/blur-event pattern (see "Compound Eval for Atomic UI
Chains"). This calls the app's own setPreferences(), so the live signal updates immediately.localStorage then reload the page (agent-browser reload or eval location.reload()):
the fresh module load re-reads the patched value. Necessary when the app is on the lock screen
and the Security tab isn't reachable yet.// Extend timeout so the journal stays unlocked during the session — pairs with either method above
(function() {
const p = JSON.parse(localStorage.getItem('preferences') ?? '{}');
p.autoLockTimeout = 600;
localStorage.setItem('preferences', JSON.stringify(p));
})();Run this eval immediately after unlocking, before taking the first snapshot, and reload afterward if you used method 2. Restore the original value when done if needed.
The Preferences dialog clips its content with a scrollable container — not the [role="tabpanel"]
element itself (which has overflow: visible). The actual scroller has class .flex-1.overflow-y-auto.
Correct approach — scroll a specific element into view:
// Works: scrolls a target element into the visible area
document.querySelector('#some-element-id').scrollIntoView({behavior: 'instant', block: 'center'});
// Or find by label text:
Array.from(document.querySelectorAll('input[type="checkbox"]'))
.find(el => el.labels?.[0]?.textContent?.trim() === 'Lock after inactivity')
?.scrollIntoView({behavior: 'instant', block: 'center'});Wrong approach — setting scrollTop on the tabpanel:
// Does NOT work: the tabpanel has overflow:visible
document.querySelector('[role="tabpanel"]').scrollTop = 400;After scrollIntoView, take a screenshot to confirm the element is visible before clicking.
When multiple UI interactions must happen without a roundtrip gap (e.g., to avoid the auto-lock
timer or avoid stale refs), chain them in a single eval call:
(function() {
// 1. Open a dialog
const openBtn = document.querySelector('[data-testid=header-more-menu-preferences-item]');
if (!openBtn) return {error: 'menu item not found — is the overflow menu open?'};
openBtn.click();
// 2. Navigate to a tab (by id — text matching breaks under a non-English language pref)
const tab = document.querySelector('#pref-tab-security');
if (!tab) return {error: 'tab not found — unlocked?'};
tab.click();
// 3. Read a UI control state
const cb = Array.from(document.querySelectorAll('input[type="checkbox"]'))
.find(el => el.labels?.[0]?.textContent?.trim() === 'Lock after inactivity');
if (!cb) return {error: 'checkbox not found'};
cb.scrollIntoView({block: 'center'});
return {checkboxChecked: cb.checked};
})()Use this pattern when:
Use agent-browser's screenshot flow after the app is in the exact state the user cares about. Prefer this over describing the UI from memory.
Always stop the dev session before finishing the task (PowerShell tool, see note in "Start A Session"):
bun run agent:dev:stopOptional:
bun run agent:dev:stop -- --keep-sandboxStopping is not optional cleanup. It kills both long-lived Windows process roots and removes sandbox state unless told otherwise.
If agent:dev:stop fails during sandbox deletion with a transient WebView file lock (EBUSY on a file under .agent-dev/sandbox/webview/EBWebView/...), immediately retry with --keep-sandbox. Treat that as the normal fallback: the important part is stopping the managed processes and closing the CDP port, not forcing one last WebView cache file to be deleted in the same step.
.agent-dev/sandbox/.config.json with a single sandbox journal on first run, so the app does not fall back to the journal picker.MINI_DIARIUM_DATA_DIR points directly at the sandbox diary dir, while the seeded app config gives the frontend an active journal selection.localStorage state start clean on a fresh sandbox.--use-real-config only when the bug depends on the user's actual app state.--timeout 180 if Rust rebuilds are expected.agent:dev:start or agent-browser connect "times out" / gets force-backgrounded: expected — neither returns through this tool chain. Launch both with run_in_background: true and poll bun run agent:dev:probe for readiness. See "Start A Session".✓ Done but nothing happens, then the next selector is Element not found: on a fresh sandbox this is the onboarding tour overlay intercepting the click, not a broken control. Check for [data-testid=onboarding-next-btn] and dismiss it — see "Dismiss The Onboarding Tour".eval fails with '…' is not a valid selector on JS you know is correct: PowerShell stripped the escaped inner quotes. Re-send the script as a @'…'@ here-string — see the PowerShell notes under "Drive The UI".9222 is already taken, restart with --port 9223 and connect agent-browser to that port.bun run agent:dev:probe (poll it — see "Detecting readiness" above). Probe resolves the current page target from the live /json list.cdp unreachable, inspect .agent-dev/dev.log..agent-dev/state.json by hand until you understand which root is still alive.agent:dev:stop fails with EBUSY while deleting a WebView cache file, rerun bun run agent:dev:stop -- --keep-sandbox. Verify that the reported port is closed; if it is, the session shutdown is good enough for task cleanup.autoLockTimeout (< 30 s), the idle timer fires between CDP roundtrips. eval calls do not count as user activity. A bare localStorage patch does not fix this on its own — it only changes what a future page load reads, not the live in-memory value the idle timer effect actually uses. Drive the real Preferences → Security UI to change it live, or patch localStorage and then reload — see "Auto-lock timer interference" under "Read Or Verify Preferences" above.ready but the page never loads past "Loading Mini Diarium..." / agent-browser snapshot returns (empty page) forever: seen twice — Vite's dependency optimizer can wedge itself into a state where it logs ready in NNN ms and accepts the TCP connection (Get-NetTCPConnection -LocalPort 1420 shows Listen/Established), but never actually completes an HTTP response for /src/index.tsx or any other module — curl/Invoke-WebRequest to http://localhost:1420/ hang and time out even though the port is open. This is a stale node_modules/.vite optimizer cache, not a CDP/agent-browser problem or an app bug — confirm with a direct request to the dev server port before assuming the browser side is at fault. Fix: bun run agent:dev:stop, delete node_modules/.vite, then bun run agent:dev:start again. The next start takes longer (full dependency re-bundle) but comes up clean.agent-browser capability after startup.© fjrevoredo, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .agents/skills/tauri-agent-dev of fjrevoredo/mini-diarium.
Open the folder on GitHubat commit 3ddc537
Tauri Agent Dev next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Tauri Agent Dev this skillfjrevoredo/mini-diarium | 308 | — | ~5.2k | Automated safety check: Pass | MIT | |
| E2E Agent Browserjh941213/my-cc-harness | 126 | — | ~3.1k | Automated safety check: Notes | None | |
| E2E Agent Browserjh941213/my-cc-harness | 126 | — | ~2.7k | Automated safety check: Notes | None | |
| Add UI Stringopenfootmanager/openfootmanager | 1.1k | — | ~2.6k | Automated safety check: Pass | GPL-3.0 | |
| Rust SQL Testshencangsheng/easydb_app | 590 | — | ~1.2k | Automated safety check: Pass | MIT | |
| Fastbrowseagent-labs-dev/fastbrowse | 113 | — | ~1.6k | Automated safety check: Notes | MIT |
jh941213/my-cc-harness
E2E test automation using agent-browser CLI. An agent skill from jh941213/my-cc-harness.
jh941213/my-cc-harness
agent-browser CLI를 활용한 E2E 테스트 자동화. An agent skill from jh941213/my-cc-harness.
openfootmanager/openfootmanager
Add or change any text a player can see, in every locale the game ships in.
shencangsheng/easydb_app
Enforces unit test requirements for the Rust data-processing modules in src-tauri/src/sql/ (generator.rs, parse.rs) and src-tauri/src/reader/ (excel.rs and other readers).
agent-labs-dev/fastbrowse
Use fastbrowse to complete browser tasks described in natural language, including website research with citations, navigating interactive pages, and filling forms.
chongdashu/vibejam-starter-pack
Plan, implement, and debug frontend tests: unit/integration/E2E/visual/a11y.
fjrevoredo/mini-diarium
Create, update, review, and execute manual Markdown implementation plans when harness planning mode is not being used.
fjrevoredo/mini-diarium
CRITICAL: Use for performance optimization. An agent skill from fjrevoredo/mini-diarium.
fjrevoredo/mini-diarium
SolidJS framework development skill for building reactive web applications with fine-grained reactivity.
fjrevoredo/mini-diarium
Analyze Rust project structure using LSP symbols. An agent skill from fjrevoredo/mini-diarium.
fjrevoredo/mini-diarium
Tauri v2 cross-platform app development with Rust backend. An agent skill from fjrevoredo/mini-diarium.
fjrevoredo/mini-diarium
Enter exploration mode: a thinking partner for researching and thinking through ideas and problems before implementation.
Works with
Categories
Spawn, probe, and stop Mini Diarium's live Windows Tauri dev app with WebView2 CDP enabled, then hand control to agent-browser for real UI inspection. Tauri Agent Dev is an agent skill from fjrevoredo/mini-diarium. Spawn, probe, and stop Mini Diarium's live Windows Tauri dev app with WebView2 CDP enabled, then hand control to agent-browser for real UI inspection.
Tauri Agent Dev fits situations like: wants to manually test the real desktop UI; drive the dev app; preference in the actual window; inspect localStorage.
Run `npx skills add fjrevoredo/mini-diarium --skill tauri-agent-dev -a claude-code`. Or copy the skill folder (.agents/skills/tauri-agent-dev in fjrevoredo/mini-diarium) into .claude/skills/tauri-agent-dev in your project. Claude Code loads it when a task matches its description.
Run `npx skills add fjrevoredo/mini-diarium --skill tauri-agent-dev -a codex`. Or copy the skill folder (.agents/skills/tauri-agent-dev in fjrevoredo/mini-diarium) into .agents/skills/tauri-agent-dev in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add fjrevoredo/mini-diarium --skill tauri-agent-dev -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tauri-agent-dev, .gemini/skills/tauri-agent-dev, .github/skills/tauri-agent-dev and .opencode/skills/tauri-agent-dev in your project.
Going by SKILL.md and its folder, Tauri Agent Dev needs the command-line tools its instructions call (bun).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Tauri Agent Dev is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.2k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Tauri Agent Dev: E2E Agent Browser (jh941213/my-cc-harness, 126 stars), E2E Agent Browser (jh941213/my-cc-harness, 126 stars), Add UI String (openfootmanager/openfootmanager, 1.1k stars) and Rust SQL Test (shencangsheng/easydb_app, 590 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
fjrevoredo (a GitHub user) maintains it in fjrevoredo/mini-diarium, which has 308 GitHub stars. The repository holds 41 skills in this directory. The repository was last updated on October 7, 2026.
Source: fjrevoredo/mini-diarium on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.