文件历史

提交图

5 次代码提交

作者 SHA1 备注 提交日期
MAX0MAX de55c38e90 domain-skills: add BOSS直聘 (zhipin.com) navigation, job search, and chat skills (#271)
* domain-skills: add BOSS直聘 (zhipin.com) navigation and job search skills

Verified content only — navigation structure and job card extraction
confirmed via browser CDP.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* domain-skills: verify zhipin job search with API-first approach

Browser-verified: the /wapi/zpgeek/pc/recommend/job/list.json API
returns real salary numbers ("18-22K") unlike the DOM which uses
font-encoded PUA characters. Added full API reference for job list,
job detail, and filter conditions endpoints.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* domain-skills: verify zhipin chat with WebSocket + REST API

Browser-verified: conversation list loads via WebSocket (ws6.zhipin.com),
message history via /wapi/zpchat/geek/historyMsg API. Documented message
body types (text=1, job card=8, system=16), DOM selectors, pagination,
and bossId extraction.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* domain-skills: add zhipin chat filter tabs with clickable UI control

Browser-verified: 全部/未读/新招呼/更多/有交换/有面试/不感兴趣/AI筛选
filters with click_filter() and click_more_filter() functions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* domain-skills: browser-verify job-search.md and fix API field names

Verified all functions against live zhipin.com. Fixed brandInfo→brandComInfo
with correct sub-fields (brandName/logo/industryName), corrected city codes
(101280100=Guangzhou not Shenzhen), documented page-based pagination as
unreliable, added encryptExpectId default params, and noted anti-bot timing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* domain-skills: fix PR review — add API response validation, narrow bossId extraction, clarify city slug

- Guard all d.zpData accesses with d.code !== 0 checks across job-search.md and chat.md
- Filter bossId extraction to /wapi/zpchat/geek/historyMsg URLs only
- Correct "Chinese" to "pinyin" for city slug and add API code cross-reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-02 11:28:54 -07:00
Magnus Müller 56b89c0770 Clean up install bootstrap flow (#25) 2026-04-17 21:34:26 -07:00
MagMueller 0753428783 remove python version and uv lock 2026-04-17 17:22:45 -07:00
Gregor Žunič 5ab5a958bb add remote browser support (Browser Use cloud) + multi-daemon + rename to bu (#1)
* add remote browser support via Browser Use cloud + multi-daemon

HARNESLESS_NAME suffixes socket/pid/log — daemons are independent, no
supervisor. start_remote_daemon() creates a Browser Use cloud browser and
launches a daemon attached to it; kill_daemon() stops both. Local Chrome
path is unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* rename env vars to BU_ prefix (shorter, less noisy in tool calls)

HARNESLESS_NAME → BU_NAME
HARNESLESS_CDP_WS → BU_CDP_WS
HARNESLESS_REMOTE_BROWSER_ID → BU_BROWSER_ID

Socket/pid/log files keep the harnesless- prefix on disk so they're
recognizable in /tmp. BROWSER_USE_API_KEY unchanged (external convention).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* rename project from harnesless to bu

Socket/pid/log paths now /tmp/bu-<name>.{sock,pid,log}. pyproject package
name updated, uv.lock regenerated. Slash command now /bu.

Note: the repo directory itself is still named harnesless on disk. Rename
manually (mv harnesless bu) so the absolute paths in docs line up.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 00:28:02 -07:00
Gregor Žunič 2b8be642e0 initial commit: harnesless — LLM-first browser control via CDP
Three-process architecture: daemon.py holds one persistent CDP WebSocket
to the user's running Chrome (via chrome://inspect), short-lived run.py
processes talk to it over a Unix socket, helpers.py is the transparent
layer the LLM reads and edits at will.

Philosophy: no CLI, no fixed API surface. The LLM writes Python blocks
against ~13 tiny helpers (cdp, click, type_text, screenshot, get_dom,
etc.) and edits helpers.py on the fly when a pattern repeats. Coordinate
clicks default because they pass through iframes/shadow DOM/cross-origin
at the compositor level.

Uses cdp-use internally for send_raw only (ignores its 36k lines of
typed wrappers — raw CDP strings tokenize better than typed calls).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 17:51:31 -07:00