browser4-dev · git:20260815.2913ba8 · 2026-08-15 · sha256 d52325376fceeff5
browser4-dev git:20260815.2913ba8A
Immutable. This exact content never changes and is served at /api/v1/blob/d52325376fceeff5.
---
name: browser4-dev
description: "Develop features inside the Browser4 repository itself: add CLI commands, agent tool domains, REST endpoints, tests, and skills; analyze impact, plan dev tasks, check CDP pitfalls, and verify builds. Use when the user asks to add a new browser4-cli command, new tool domain, REST endpoint, modify Browser4's own Kotlin/Rust code, or check which modules a change affects."
allowed-tools: coding.scaffoldFlow coding.scaffoldFromExample coding.mvnBuild coding.devTask coding.impact coding.moduleGraph coding.trapCheck coding.protect coding.scaffold coding.write coding.read coding.readLines coding.replace coding.replaceRegex coding.editLines coding.insertAfter coding.revert coding.validate coding.shell coding.ktSymbols coding.ktReferences coding.ktInheritance coding.diagnostics coding.references coding.symbols
---
# browser4-dev
Develop features inside the Browser4 repository itself, following the repository's
own conventions (AGENTS.md) — with multi-file skeletons generated from the
repository's real reference implementations, so the output never goes stale.
## When to Use
- User wants to add a new `browser4-cli` command
- User wants to add a new agent tool domain (plugin tool)
- User wants to add a REST endpoint (Controller + Service)
- User wants to add a test class or a skill
- User wants to modify Browser4's own Kotlin/Rust code and verify it compiles
- User wants to know which modules a change affects, or plan a whole dev task
## Workflows
### 0. Before changing anything — know the blast radius
```
coding.moduleGraph(module="browser4-core/browser4-browser")
→ LIVE module graph rebuilt from the real pom.xml files: direct deps,
transitive dependents, and drift warnings vs the static snapshot
coding.impact(path="browser4-core/browser4-browser/src/.../PulsarWebDriver.kt")
→ owning module + affected modules (transitively) + suggested test commands
coding.trapCheck(path=<browser-driver file>)
→ CDP pitfall advisories (mouseWheel race, cursor positioning, insertText racing)
```
### 1. Add a new CLI command
```
coding.scaffoldFlow(type="b4-cli-command", name="extract-prices",
description="Extract product prices from a page", category="Extract")
→ 4 files: commands.rs CommandDef, MCPToolController alias, backend skeleton, test
coding.write(path="cli/browser4-cli/src/commands.rs", content=<CommandDef block>)
coding.write(path="browser4-rest/.../MCPToolController.kt", content=<alias snippet>)
... write each piece ...
# Verify both sides:
coding.shell(command="cargo test --bin browser4-cli") # Rust side
coding.mvnBuild(module="browser4-rest", goals="compile") # Kotlin side
```
### 2. Add a new agent tool domain (plugin)
```
coding.scaffoldFlow(type="agent-tool", name="browser4-weather", domain="weather",
basePackage="ai.platon.pulsar.weather", toolMethod="fetchWeather",
description="Fetch weather for the current page")
→ 2 files: ToolExecutor + ToolMount auto-config
coding.mvnBuild(module="browser4-plugins/browser4-weather", goals="compile")
coding.validate(type="plugin", path="browser4-plugins/browser4-weather")
```
### 3. Add a REST endpoint
```
coding.scaffoldFlow(type="rest-endpoint", name="analysis",
description="Run an analysis task")
→ 3 files: AnalysisController + AnalysisService + AnalysisControllerTest
```
### 4. Add a test class / skill
```
coding.scaffoldFlow(type="test-class", name="my-tool",
basePackage="ai.platon.pulsar.agentic.tools")
coding.scaffoldFlow(type="skill", name="browser4-myflow",
description="A custom Browser4 flow")
```
### 5. Clone an existing implementation (anti-staleness)
```
# Single file:
coding.scaffoldFromExample(path="browser4-plugins/browser4-seo/.../SeoToolExecutor.kt")
→ discovery: shows parameters (basePackage, className, domain, toolMethod)
coding.scaffoldFromExample(path=<same>, basePackage="ai.platon.pulsar.weather",
className="WeatherToolExecutor", domain="weather", toolMethod="fetchWeather")
# Whole plugin directory (cross-file consistent + stem-derived siblings):
coding.scaffoldFromExample(path="browser4-plugins/browser4-seo",
className="WeatherToolExecutor", basePackage="ai.platon.pulsar.weather",
domain="weather", artifactId="browser4-weather")
→ renames the executor AND sibling classes sharing the stem
(SeoAutoConfiguration→WeatherAutoConfiguration, SeoService→WeatherService, ...)
```
### 6. Plan a whole dev task in one call
```
coding.devTask(task="fix the mouseWheel race in PulsarWebDriver.kt under
browser4-core/browser4-browser/src/main/kotlin, add a regression test",
verify=true)
→ AGENTS.md dev-flow plan (read → impact → mvnBuild → tests → trapCheck →
repo-consistency → commit), with the fast checks already RUN:
compile of the inferred module, CDP trap check, repo-consistency.
Add runTests=true to also execute the module's test suite.
```
## Rules
1. **Prefer scaffoldFlow over hand-writing** — multi-file consistency
(same identifier in commands.rs + alias + test) is automatic.
2. **Verify both sides** for CLI changes: `cargo test --bin browser4-cli` for
Rust, `coding.mvnBuild` for Kotlin.
3. **Kotlin diagnostics**: use `coding.mvnBuild` (fast compiler passthrough) —
no JDTLS server is configured.
4. **AGENTS.md is the contract** — when the repo's conventions change, regenerate
skeletons from the updated reference implementations rather than editing
stale output.
5. **Keep changes small**: one command/domain/endpoint per cycle; `coding.revert`
undoes a bad edit.
6. **Governance files are protected**: delete/replace on VERSION, AGENTS.md,
CLAUDE.md, root pom.xml, the BOM, and the CI workflow are blocked by design —
ask the user for explicit intent instead of working around it. Add
session-level protections for any other file with `coding.protect(path, on)`.
7. **Module topology is live**: `coding.moduleGraph`/`coding.impact` rebuild from
the real poms; the static ModuleMap snapshot is guarded by E2E tests against
drift — sync it when adding a module. Use `coding.ktReferences(scope="module")`
and `coding.ktInheritance` before refactoring shared Kotlin symbols.
## Examples
```
User: 给 browser4-cli 加一个 extract-prices 命令
Agent: 1. coding.scaffoldFlow(type="b4-cli-command", name="extract-prices", ...)
2. 写 commands.rs CommandDef、MCPToolController alias、后端骨架、测试
3. coding.shell(command="cargo test --bin browser4-cli")
4. coding.mvnBuild(module="browser4-rest", goals="compile")
5. 报告:6 处触点全部就位,双端编译通过
User: 克隆 browser4-seo 插件成天气插件
Agent: 1. coding.scaffoldFromExample(path="browser4-plugins/browser4-seo",
className="WeatherToolExecutor", basePackage="ai.platon.pulsar.weather",
domain="weather", artifactId="browser4-weather")
2. 逐文件 coding.write
3. coding.mvnBuild(module="browser4-plugins/browser4-weather")
4. coding.validate(type="plugin", path="browser4-plugins/browser4-weather")
```