Chrome Extension (Manifest V3) for bulk operations on Jules tasks via batchexecute API.
manifest.json-- Extension config: permissions, content_scripts, actionbackground.js-- Service worker: batchexecute client, response parser, orchestrator, suggestionscontent.js-- Content script: WIZ_global_data token extraction + fetch observer (MAIN world)popup.html/js/css-- Popup UI: settings, operation mode, controls, progress displayicons/-- Extension icons (16/48/128px)tests/-- Unit tests (node:test + vm sandbox)
popup.js (UI) <-> background.js (batchexecute client) <-> content.js (token extractor)
| |
fetch() to jules.google.com MAIN world injection
/_/Swebot/data/batchexecute reads WIZ_global_data
|
chrome.storage.session (state)
chrome.storage.sync (settings)
Two operation modes:
- Archive Tasks -- ListTasks (p1Takd) -> check GitHub PRs -> ArchiveTask (Tjmm5c)
- Start Suggestions -- ListSources (YqkSHd) filtered to Suggestions-enabled repos -> ListSuggestions (hQP40d) per repo -> cap to remaining daily quota (KQOO7) -> StartSuggestion (Rja83d). Only repos whose per-repo Suggestions toggle is ON are touched; the daily session limit is never exceeded.
Content script extracts auth tokens (SNlM0e, cfb2h, FdrFJe) from WIZ_global_data via MAIN world script injection. Also observes fetch() for Rja83d calls to capture model config and experiment IDs.
Background service worker makes all API calls. No DOM automation.
p1Takd-- ListTasks (filter, state)Tjmm5c-- ArchiveTask (taskId, action)tqq5v-- PauseTask / stop a running session (taskId)YqkSHd-- ListSources (connected repos); row[5][2][0] === 2=> Suggestions toggle ONhQP40d-- ListSuggestions (repo); returns the raw pool, does NOT respect the togglee4motb-- SetSuggestionsToggle (repo, [2]=enable / [1]=disable)Rja83d-- StartSuggestion (prompt, model config, repo, experiment IDs)UTrvy-- Suggestions-repo counter[max, enabled, free](e.g.[5,3,2]= 3/5 repos enabled)KQOO7-- Daily session quota[usedToday, [windowSeconds], dailyLimit, ...]
# Lint + format
npx @biomejs/biome check .
npx @biomejs/biome check --write .
# Run tests
node --test
# Load extension
# chrome://extensions -> Developer mode -> Load unpacked -> select this folderConventional Commits enforced by pre-commit hook.
Tag format: v{version}. PSR config: semantic-release.toml.
workflow_dispatch (beta/stable) -> PSR v10 -> zip extension files -> upload to GitHub Release. No Docker, no npm/pypi, no MCP registry.
- Zero dependencies -- vanilla JS, no build step
- Biome for linting (biome.json config): single quotes, no semicolons, 120 line width
- batchexecute responses have XSS prefix
)]}'and may contain raw control chars in JSON strings - Service worker keepAlive:
setIntervalcallingchrome.runtime.getPlatformInfo()every 25s - State persisted in
chrome.storage.session-- survives SW restart - Tests use
vm.createContextsandbox to mock Chrome APIs