urlparse(...).hostname strips the [] from IPv6 hosts, so building
ws://{host}:{port}{path} produced ws://::1:9333/... which is malformed.
Restore the brackets when the resolved host contains ':'.
- Move from top-level domain-skills/tasksquad.ai/ to the canonical
agent-workspace/domain-skills/tasksquad-ai/ location, switching to
kebab-case to match sibling dirs (booking-com, dev-to, archive-org).
- Replace find_text_coords(...) with self-contained inline Python
helpers (_coords_by_text, _coords_by_selector) that wrap querySelector
+ getBoundingClientRect. find_text_coords does not exist in the
harness or agent_helpers — every call site was a NameError waiting to
happen.
- Fix the compose-task snippet: drop the dead subject_input = js(...)
line, focus the subject input via _coords_by_selector before typing,
and add a placeholder click for the agent dropdown item.
- Fix the polling-interval contradiction: the inbox section now defers
to the gotchas, and the gotchas list the Free (5s) / Pro (2s) cadence
in one place.
- Move agent-workspace/domain-skills/x.com/ to .../x/ to match repo
convention (siblings use bare platform names like 'tiktok' / 'youtube'
or kebab-case like 'booking-com'; nothing else uses a literal dot in
a dir name).
- Guard the compose-textarea and post-button querySelector lookups so
the snippet raises a clear RuntimeError if the elements aren't there
yet, instead of throwing a confusing JS TypeError on
el.getBoundingClientRect().
Add Chrome Canary paths to PROFILES list so the daemon can discover
DevToolsActivePort from Canary installations:
- macOS: ~/Library/Application Support/Google/Chrome Canary
- Windows: ~/AppData/Local/Google/Chrome SxS/User Data
Stable profiles are listed before Canary to avoid stale Canary port
files blocking discovery (get_ws_url raises after 30s timeout).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
PROFILES already covers Brave on macOS (Library/Application Support/
BraveSoftware/Brave-Browser) and Linux Flatpak (.var/app/com.brave.Browser/...)
but is missing the standard Windows install path. As a result, "Way 1"
(chrome://inspect/#remote-debugging) discovery fails on Windows + Brave with
"DevToolsActivePort not found" even when remote debugging is enabled.
Add Path.home() / "AppData/Local/BraveSoftware/Brave-Browser/User Data" to
match the macOS/Linux Brave entries already present.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adds auth, task inbox, and agent management playbooks for tasksquad.ai —
field-tested against the live site and source code of the React SPA.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cross-checked AGENTS.md, README.md, SKILL.md, install.md, and profile-sync.md for accuracy. Tightened the sync_local_profile docstring and the chrome://inspect stderr message to match. Cloud-bootstrap test updated to set BU_AUTOSPAWN. All unit tests pass.
If an agent runs the interceptor snippet before GTM has initialized,
window.dataLayer is undefined and .push.bind throws. Seeding with [] is
safe — GTM picks up a pre-existing array on init.
Dia is a Chromium-based browser by The Browser Company (same makers as
Arc). It ships with CDP enabled by default on its standard user-data-dir
at ~/Library/Application Support/Dia/User Data, so adding the path is
all that's needed for browser-harness to attach without any per-profile
opt-in.
Placed next to Arc since both are Browser Company products. Existing
browser priority (Chrome first) is preserved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
press_key emits a Input.dispatchKeyEvent('char', text='a') after every
single-character keyDown. With Cmd/Ctrl held, that char event makes Chrome
treat the input as a printable letter "a" rather than firing the
select-all shortcut, so the field never gets cleared (Backspace would
then delete the literal "a" and leave the original value untouched).
Dispatch the rawKeyDown/keyUp pair directly with the modifier set and no
text/char event. Tightened the test to assert (a) the modifier is on the
'a' event with the platform-correct value and (b) no char event with
text='a' is emitted.
The computed-style check measures the element itself, so an element nested
inside a display:none or visibility:hidden ancestor is reported as visible
(getComputedStyle returns the descendant's own non-none value, not the
inherited "is rendered" state). checkVisibility walks the ancestor chain
and is the right primitive on modern Chrome. Kept the per-element CSS
check as a fallback for older Chrome that lacks checkVisibility.
- ly-com: read Vue ref via stable .value with _rawValue fallback
rather than the brittle internal _rawValue path.
- wehotel: ancestor walk now identifies the hotel-name anchor by
identity/innerText instead of an href-based negation against text
(查看详情 lives on the link body, not in href), which previously
let the loop stop on the detail anchor itself.
- ctrip: raise an explicit error when the destination input or 搜索
button isn't found, instead of dereferencing None and crashing
with a confusing TypeError.
- write_text calls now pin encoding="utf-8" so non-ASCII transcripts
don't depend on the locale default.
- share-export.md schema now lists source_url, matching what the script
actually emits.
* domain-skills: add bilibili navigation and structure skill
Covers site architecture, URL patterns, content channels, video
interaction features (三连/投币/弹幕), and navigation quirks for
the Chinese video platform.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* domain-skills: fix PR review — correct history URL and ranking tab count
- Fix history URL from bilibili.com/history to https://www.bilibili.com/account/history
- Remove incorrect "also contains 稍后再看 tab" note (watch later is a separate SPA)
- Fix ranking category tab count from 23 to 24
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>