neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
Dragon Head is an AI-native headless browser runtime that turns the web into semantic state for reliable, low-cost AI agents.
Developer toolsRust · PythonGitHub @takurotOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
AI-native headless browser runtime that converts web pages into semantic state for reliable LLM/VLM web automation.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Dragon Head is an AI-native headless browser runtime for LLM and VLM agents.
It exposes a browser session as a structured Semantic State and provides an
MCP server that agents use to inspect pages, act on elements, verify outcomes,
request human approval, and run declarative skills.Read the full README ↗Last updated: 2026-10-25
Dragon Head is a policy-enforced, auditable execution runtime for AI browser agents.
Its Policy Engine can block risky actions or require human approval, while
structured, PII-redacted audit logs make action attempts and policy decisions
traceable. The MCP server exposes a browser session as Semantic State so
agents can inspect pages, act on elements, verify outcomes, and run declarative
skills; stable_key and delta delivery support multi-step workflows.
| Playwright | Dragon Head | |
|---|---|---|
| Selector stability | CSS/XPath breaks on UI refactors | stable_key (SHA-256) survives re-renders |
| Incremental state | Full page re-fetch every call | RFC 6902 delta on subsequent get_state calls |
| Safety guardrails | None | Policy Engine blocks or escalates risky actions |
| Human-in-the-loop | Manual | Built-in ask_human with outcome projection |
| Prompt injection | Undetected | security_flags on suspicious page content |
| Audit trail | None | Structured, PII-redacted action log |
On token count: Benchmark data shows dragon-head's first-call payload is larger than a hand-rolled Playwright custom extract (3–4× on element-dense pages) because each
SemanticNodecarries astable_keyand metadata that enable the features above. The token advantage materialises on the second call onward via delta delivery, and in multi-step workflows where selector stability eliminates retries. Full benchmark:docs/bench-playwright-comparison.md.
Prompt-injection sanitization and security_flags are defense-in-depth signals,
not a complete defense. An absence of flags does not establish that page content
is safe; policy enforcement and human review remain separate safeguards.
The user-facing entry point is the stdio MCP server binary:
dragon-head-mcp
Try the high-risk action demo to see a $900 expense stopped for approval, resolved through the embedded HITL bridge, and recorded in PII-redacted audit trails. It runs the real MCP binary and Chrome; Slack's hosted API and the reviewer are replaced by local test doubles.
The fastest path for Claude Desktop / Claude Code / MCP users. Requires Node.js 18 or later and works with npm, pnpm, and yarn.
npm install -g dragon-head-mcp
dragon-head-mcp --doctor
The correct prebuilt binary for your platform is selected automatically via
optionalDependencies. No postinstall script runs, so it works in corporate
and CI environments where --ignore-scripts is set.
Don't want a global install? You can also run it on-demand without installing:
npx dragon-head-mcp --doctorUsing
npxin MCP client config is covered in the MCP Client Setup section.
Download the binary for your platform from the GitHub Releases page:
| Platform | File |
|---|---|
| macOS (Apple Silicon) | dragon-head-mcp-macos-arm64 |
| macOS (Intel) | dragon-head-mcp-macos-x64 |
| Linux x86-64 | dragon-head-mcp-linux-x64 |
| Linux arm64 | dragon-head-mcp-linux-arm64 |
| Windows x86-64 | dragon-head-mcp-windows-x64.exe |
| Windows ARM64 | dragon-head-mcp-windows-arm64.exe |
Each release includes a .sha256 checksum file. Verify before running:
# macOS arm64 example
curl -LO https://github.com/takurot/dragon-head/releases/latest/download/dragon-head-mcp-macos-arm64
curl -LO https://github.com/takurot/dragon-head/releases/latest/download/dragon-head-mcp-macos-arm64.sha256
shasum -a 256 -c dragon-head-mcp-macos-arm64.sha256
chmod +x dragon-head-mcp-macos-arm64
sudo mv dragon-head-mcp-macos-arm64 /usr/local/bin/dragon-head-mcp
curl -fsSL https://raw.githubusercontent.com/takurot/dragon-head/main/scripts/install.sh | bash
The script detects your platform, downloads the matching binary from the latest
release, verifies the checksum, and installs to /usr/local/bin. Set
INSTALL_DIR to install elsewhere.
Requires Rust stable and Chrome or Chromium 116 or later (tested against Chrome 116–134).
git clone https://github.com/takurot/dragon-head.git
cd dragon-head
cargo build -p mcp-server --bin dragon-head-mcp --release
sudo cp target/release/dragon-head-mcp /usr/local/bin/
After installing, confirm Chrome is detected and the binary works:
dragon-head-mcp --doctor
Expected output when Chrome is found:
dragon-head-mcp doctor
✓ Chrome/Chromium: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
✓ Config file: /Users/you/.config/dragon-head/config.toml (not found — defaults will be used)
All checks passed.
If a config.toml is present and valid, the "Config file" line instead shows a
summary of the resolved settings, e.g.:
ℹ Config file: /Users/you/.config/dragon-head/config.toml (chrome_path=<unset>, prompt_injection.mode=ReportOnly, policy.file=<unset>)
A malformed file or an invalid prompt_injection.mode makes this check fail
(✗), and --doctor exits non-zero.
--self-test goes one step further than --doctor: it runs the same checks, starts
the real server (config, plugins, Chrome, policy, skills), and drives its JSON-RPC
handler through initialize, tools/list and get_usage_report, so you do not
have to hand-craft stdin lines. Use it after installing or upgrading, in release
checks, and when a client reports that the server will not start.
dragon-head-mcp --self-test
dragon-head-mcp self-test
✓ Chrome/Chromium: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
ℹ Config file: /Users/you/.config/dragon-head/config.toml (not found — defaults will be used)
✓ MCP server startup: server started
✓ initialize: server dragon-head-mcp 0.4.0, protocol 2025-11-25
✓ tools/list: 9 tools (navigate, get_state, act, ...)
✓ get_usage_report: plan tier enterprise
Self-test: PASS
It exits non-zero (Self-test: FAIL) on any Chrome, config, startup or protocol
failure. It launches a throwaway browser, loads configured plugins and skills, and may
create the configured audit log directory; it does not navigate, and it skips the
embedded HITL bridge so it is safe to run next to a live server. Server logs go to stderr, the report to stdout.
If Chrome is not found, install it or set CHROME_PATH:
export CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
Supported Chrome/Chromium versions: 116 or later. Tested against Chrome 116–134 on macOS and Linux. Earlier versions may lack CDP methods required for visual capture and cookie management.
--init prints copy-paste JSON snippets for supported MCP clients:
# Print config for all supported clients
dragon-head-mcp --init
# Print config for a specific client
dragon-head-mcp --init claude-desktop
dragon-head-mcp --init claude-code
dragon-head-mcp --init codex
dragon-head-mcp --init generic
config.toml)dragon-head-mcp optionally reads $XDG_CONFIG_HOME/dragon-head/config.toml
(falling back to $HOME/.config/dragon-head/config.toml). All settings are
optional — omit the file entirely to use defaults. Where an equivalent
environment variable exists, the environment variable always wins.
# Path to the Chrome/Chromium binary. Overridden by CHROME_PATH.
chrome_path = "/usr/bin/chromium"
[prompt_injection]
# "off" | "report_only" (default) | "redact". Overridden by PROMPT_INJECTION_MODE.
mode = "report_only"
# Extra literal phrases to flag after the built-in prompt-injection patterns. Overridden by
# PROMPT_INJECTION_ADDITIONAL_PHRASES (a JSON string array).
additional_phrases = ["reveal developer message"]
[policy]
# Path to a PolicyRule JSON file (see examples/policies/). Overridden by POLICY_FILE.
file = "/etc/dragon-head/policy.json"
[navigation]
# Trusted local deployments only. Overridden by NAVIGATION_ALLOW_PRIVATE_NETWORK.
allow_private_network = false
[audit]
# Mirrors AUDIT_LOG_DIR / AUDIT_LOG_MAX_BYTES / AUDIT_DURABILITY.
log_dir = "/var/log/dragon-head"
max_bytes = 10485760
durability = "flush" # "flush" (default) or "sync"
[skills]
# JSON files containing one SkillDefinition each. Relative paths resolve from
# the directory containing this config.toml; absolute paths remain absolute.
files = ["skills/checkout.json", "/opt/dragon-head/skills/search.json"]
# Locally configured, signed Wasm plugins — see docs/plugins.md for the full contract
# (signature verification, operational limits, and why config.toml write access is
# equivalent to plugin-code-execution access).
[[plugin_trust_keys]]
id = "vendor-key-1"
public_key_hex = "5f2c...64-hex-char-ed25519-public-key"
[[plugins]]
manifest = "plugins/example/manifest.json"
wasm = "plugins/example/plugin.wasm"
enabled = true
| Setting | Env var (wins) | config.toml key |
|---|---|---|
| Chrome path | CHROME_PATH | chrome_path |
| Prompt-injection mode | PROMPT_INJECTION_MODE | prompt_injection.mode |
| Prompt-injection additional phrases | PROMPT_INJECTION_ADDITIONAL_PHRASES | prompt_injection.additional_phrases |
| Policy file | POLICY_FILE | policy.file |
| Navigation private-network opt-in | NAVIGATION_ALLOW_PRIVATE_NETWORK | navigation.allow_private_network |
| Audit log directory | AUDIT_LOG_DIR | audit.log_dir |
| Audit max bytes | AUDIT_LOG_MAX_BYTES | audit.max_bytes |
| Audit durability | AUDIT_DURABILITY | audit.durability |
| Audit stdout mirroring | AUDIT_LOG_STDOUT | none |
| Embedded HITL bridge enabled | HITL_BRIDGE_ENABLED | hitl_bridge.enabled |
| Embedded HITL bridge bind address | HITL_BRIDGE_BIND_ADDR | hitl_bridge.bind_addr |
| Embedded HITL bridge audit log | HITL_BRIDGE_AUDIT_LOG | hitl_bridge.audit_log |
| Embedded HITL bridge poll interval (ms) | HITL_BRIDGE_POLL_INTERVAL_MS | hitl_bridge.poll_interval_ms |
| Slack signing secret | SLACK_SIGNING_SECRET | none (secret; env only) |
| Slack bot token | SLACK_BOT_TOKEN | none (secret; env only) |
| Slack channel | SLACK_CHANNEL | none (env only) |
Who can approve a held action. With the embedded HITL bridge enabled
(hitl_bridge.enabled), ask_human never grants approval: it returns
approved: false, pending: true and only the bridge's signed Slack/Teams callback can
resolve the request, so the agent cannot approve its own held action. Without a
bridge, ask_human grants the pending request itself, so require_human_approval is
only as strong as your MCP client's tool-permission prompt for ask_human. The
bridge's webhook port is part of the trust boundary; keep it on loopback or behind
authentication.
PROMPT_INJECTION_ADDITIONAL_PHRASES must be a JSON array of strings, for
example ["reveal developer message","ignore prior instructions"]. It replaces
the file value; use [] to clear it. Empty phrases and exact duplicates are
removed after trimming. The same normalization and limits apply to the env value
and config.toml: the effective set is limited to 64 phrases, 512 UTF-8 bytes
per phrase, and 8 KiB total, while preserving first-seen order.
AUDIT_LOG_STDOUT (if set, any value) mirrors audit events to stderr, never
stdout — dragon-head-mcp uses stdout for JSON-RPC framing, so writing there
would corrupt the protocol stream.
NAVIGATION_ALLOW_PRIVATE_NETWORK accepts exactly true or false; invalid
values fail configuration without echoing their contents. The default blocks
loopback, private, link-local, and other non-global navigation destinations.
Enable it only for trusted local deployments and tests. This application-level
switch does not replace OS/container network isolation or deployment egress controls.
Setting HITL_BRIDGE_ENABLED=true starts the reference Slack HITL bridge inside this
process, sharing its PageSession (see docs/hitl-slack-bridge.md
for the supported deployment topology). SLACK_SIGNING_SECRET, SLACK_BOT_TOKEN, and
SLACK_CHANNEL are required in that case and are only ever read from the environment —
never from config.toml — so Slack credentials never land in a checked-in file.
Run dragon-head-mcp --doctor to validate the config file and list every
supported configuration environment variable. A malformed file or invalid env
override makes the "Config file" check fail. The summary reports only the
effective additional-phrase and loaded-skill counts, never their contents.
Configured skills are loaded before the server reports readiness. At most 64
regular files are accepted, each limited to 1 MiB. Every file must contain
exactly one JSON SkillDefinition; schema and semantic validation, including
duplicate-name rejection, completes for the full set before any definition is
registered.
Startup and --doctor fail with the affected path and reason when validation
fails, without printing the definition body.
Setting prompt_injection.mode to redact or off changes the default
security posture — see Security: Prompt Injection
Sanitization. The server prints a
[SECURITY][WARN] message to stderr on startup when the resolved mode is not
report_only.
dragon-head-mcp logs via tracing, written exclusively to
stderr — never stdout, which is reserved for JSON-RPC framing. Control verbosity with
RUST_LOG using standard tracing_subscriber::EnvFilter syntax:
RUST_LOG=debug dragon-head-mcp # everything at debug and above
RUST_LOG=core_runtime=trace,mcp_server=info dragon-head-mcp # per-module levels
Defaults to info when RUST_LOG is unset or fails to parse, matching prior behavior (the
startup/shutdown lines and [SECURITY][WARN]/[PLUGIN][WARN]-style messages you already see).
Audit, policy, and plugin-hook events emitted by core-runtime (previously ad-hoc eprintln!
calls tagged [AUDIT]/[PLUGIN][POLICY]/etc.) now flow through tracing with structured
fields, so they respect the same filter and can be routed/parsed like any other tracing event.
Dragon Head runs as a stdio MCP server. Your MCP client starts the command, passes JSON-RPC messages on stdin, and reads responses from stdout.
Edit ~/Library/Application Support/Claude/claude_desktop_config.json.
If installed globally via npm or prebuilt binary (binary is in PATH):
{
"mcpServers": {
"dragon-head": {
"command": "dragon-head-mcp",
"env": {
"CHROME_PATH": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
}
}
}
}
If you prefer not to install globally (uses npx, requires Node.js 18+):
{
"mcpServers": {
"dragon-head": {
"command": "npx",
"args": ["dragon-head-mcp"],
"env": {
"CHROME_PATH": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
}
}
}
}
Run dragon-head-mcp --init claude-desktop to print the correct snippet for
your current installation.
If installed globally — add to your project's .mcp.json:
claude mcp add dragon-head -- dragon-head-mcp
Or edit .mcp.json directly:
{
"mcpServers": {
"dragon-head": {
"command": "dragon-head-mcp",
"env": {
"CHROME_PATH": "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
}
}
}
}
If you prefer not to install globally (uses npx):
claude mcp add dragon-head -- npx dragon-head-mcp
Or in .mcp.json:
{
"mcpServers": {
"dragon-head": {
"command": "npx",
"args": ["dragon-head-mcp"]
}
}
}
Run dragon-head-mcp --init claude-code to print the correct snippet for
your current installation.
Globally installed binary:
{
"mcpServers": {
"dragon-head": {
"command": "dragon-head-mcp"
}
}
}
Via npx (no global install required):
{
"mcpServers": {
"dragon-head": {
"command": "npx",
"args": ["dragon-head-mcp"]
}
}
}
If Chrome is installed in a standard location, CHROME_PATH can be omitted.
Set it explicitly when the server cannot find Chrome or when you want to use a
specific Chromium build.
command in GUI clients. GUI apps do
not source shell startup files, so PATH may not include the directory
where npm install -g placed the binary.
/Users/<you>/.npm-global/bin/dragon-head-mcp/opt/homebrew/bin/dragon-head-mcp~/.npm-global/bin/dragon-head-mcp or /usr/local/bin/dragon-head-mcpwhich dragon-head-mcp in a terminal to find the exact path.npx form avoids PATH issues entirely and is the recommended approach
for GUI MCP clients.env object — do not rely on shell
startup files.dragon-head-mcp --doctor to check Chrome detection before configuring
the MCP client.dragon-head-mcp directly in a terminal exits immediately (no stdin);
the server is designed to be managed by an MCP client.dragon-head-mcp currently exposes 9 tools. The source of truth is
McpServer::tools() in mcp-server/src/server.rs:
| Tool | Purpose |
|---|---|
get_state | Retrieve the semantic page state. |
navigate | Load an HTTP(S) URL through destination and redirect policy checks. |
act | Execute an interaction action. |
verify | Verify precondition text before acting. |
get_visual | Capture PNG visual context as an MCP image block with hash and optional marks metadata. |
ask_human | Resolve a pending human-in-the-loop request. |
run_skill | Execute a declarative skill workflow. |
get_usage_report | Retrieve usage meters and plan tier summary. |
extract | Extract structured data using a Deep Lens DSL rule. |
extract applies prompt-injection sanitization and PII redaction before returning
structured page data. It is read-only and does not emit an action audit event.
See docs/AGENTS_EXTRACT.md for the rule modes, selector
discovery workflow, error diagnostics and the built-in rules.
get_usage_report is also read-only: it reports the plan tier, usage meters, and
the audit-retention snapshot, but does not meter itself or emit an action audit event.
navigate accepts absolute HTTP(S) URLs without embedded credentials, strips
fragments, evaluates the requested destination and each top-level redirect before
network access, and logs only a sanitized destination projection without query data.
The MCP session keeps this main-frame protection active after the tool returns:
link clicks, form submissions, script navigation, and meta refresh receive the same
network and navigation-policy checks before the destination request is sent.
A directly observed rejection is returned by act; delayed timer/meta navigation
is still blocked and is reported once by the next tool call, before another action
can execute. New document observations invalidate cached full/delta/speculative
state. The trusted private-network opt-in applies to these paths as well.
Iframe/subresource traffic remains outside this main-frame boundary, and these
application checks do not eliminate DNS rebinding or replace network isolation.
These examples do not require Chrome:
# Core concepts: SemanticState, Fast State, PolicyEngine, MCP-style payload
cargo run --example quickstart
# Policy rule cookbook
cargo run --example policy_cookbook
See examples/README.md for sample policies, sample skills, and MCP request/response fixtures.
Measured across four page types (3-run average, macOS Apple Silicon, Chrome 130):
| Scenario | PW page.content() | PW custom extract | DH first call | DH delta (2nd+) |
|---|---|---|---|---|
| Static site | 2,796 tok | 860 tok | 3,465 tok | ~20–50 tok |
| Checkout form | 3,465 tok | 630 tok | 2,841 tok | ~20–50 tok |
| SPA-like feed | 21,165 tok | 5,945 tok | 22,993 tok | ~20–50 tok |
| example.com | 139 tok | 19 tok | 55 tok | ~5–15 tok |
Reading the numbers:
stable_key, alias, and metadata needed for delta
delivery, self-healing, and policy checks.For full methodology, raw numbers, and improvement recommendations see
docs/bench-playwright-comparison.md.
Run the full workspace test suite:
cargo test --workspace
Run formatting and lint checks:
cargo fmt --all -- --check
cargo clippy --workspace -- -D warnings
Dragon Head uses Codex as an engineering execution environment, with GPT models providing reasoning inside that environment. The acceleration comes from keeping issue triage, repository research, implementation, review, CI follow-through, and operational learning in one evidence-backed loop. It does not replace the project's specification, tests, or merge gates.
The following snapshot uses a token-event cutoff of
2026-07-19T10:50:00.650Z, before this README update, and was captured from the
local Codex session history. It includes the main checkout, its earlier location,
and worktrees whose Git metadata identifies github:takurot/dragon-head.git.
| Metric | Recorded value |
|---|---|
| Unique repository sessions | 99 |
| Sessions with token records | 88 |
| Sessions without token records | 11 |
| Total tokens | 1,848,585,477 |
| Input tokens | 1,845,514,739 |
| Cached input tokens | 1,805,426,432 |
| Uncached input tokens | 40,088,307 |
| Output tokens | 3,070,738 |
| Reasoning output tokens | 1,177,568 |
Current-path-only total (/Volumes/SSD2TB_DATA/src/dragon-head) | 1,258,529,496 |
| Recorded period | 2026-02-14 to 2026-07-19 |
The aggregation scans ~/.codex/sessions/**/*.jsonl and
~/.codex/archived_sessions/**/*.jsonl, filters session_meta by Git repository
URL and the cutoff, takes each session's final cumulative token_count at or
before the cutoff, and deduplicates by session ID. Cached input is part of input,
and reasoning output is part of output, so those rows must not be added to the
total again. Because 11 sessions have no token record and the active session
continued after the snapshot, the result is a lower bound. It is an
engineering-activity measure, not a billing or rate-limit figure.
The repository's execution contract in docs/PROMPT.md turns
development into a closed loop:
live Issues + SPEC/PLAN
-> plan and boundary review
-> isolated worktree
-> test-first implementation
-> format, lint, test, security, and QA gates
-> PR and Codex review
-> CI monitoring and merge
-> reusable learning
origin/main,
trace the relevant contract into code and tests, implement the change, prepare
the PR, and monitor CI. PRs #231
and #232 were taken through
that complete loop with 27 green CI checks each.| Gate | Decision | Example and evidence |
|---|---|---|
| Scope gate | Select work only after comparing live Issues with the latest origin/main and the approved SPEC/PLAN. | Prevents work on stale reports and ties every change to explicit exit criteria. |
| Data boundary | Decide which values remain raw for internal control flow and which values may cross the agent-facing boundary. | #231 kept raw DOM attributes for filtering and geometry, while labels, aliases, stable keys, and exposed attributes use redacted values. |
| Protocol boundary | Reject malformed input before plan gates, backend calls, or usage metering. | #232 made tools/list and tools/call share schemas and added strict bounds and negative tests. |
| Control-flow boundary | Evaluate safety over executable edges, not source-array adjacency. | #228 covered success, failure, fallthrough, retry, loop, and backward edges before authorizing act. |
| Landing gate | Merge only after required tests, formatting, linting, security checks, review, QA, and GitHub CI are green. | The checklist and escalation rules live in docs/PROMPT.md; PR evidence records the commands and results. |
These decisions were not delegated to model preference alone. The durable
authority is the repository contract (SPEC, PLAN, PROMPT), public API and
trust boundaries, executable tests, review findings, and the merge gate.
GPT-5.6 and Codex play different roles:
gpt-5.6-sol and 3
tagged gpt-5.6-terra.The total-token snapshot covers all recorded Codex sessions for this repository, including sessions that used earlier GPT model versions. It must not be read as a GPT-5.6-only token total.
Dragon Head applies a prompt-injection sanitizer to every SemanticNode in the
page state before the LLM sees it. This is a defense-in-depth measure (SPEC
SEC-03) — it reduces exposure but does not guarantee complete
prevention of indirect prompt injection.
| Mode | Behaviour |
|---|---|
ReportOnly (default, MCP binary) | Page text is unchanged. Nodes containing known injection patterns receive security_flags: ["possible_prompt_injection"] so the LLM can reason about risk without content being altered. |
Redact | Matched phrases are replaced with [REDACTED_SECURITY]. The same security_flags flag is also set on the node. |
Off | No detection or modification is performed. |
The dragon-head-mcp binary defaults to ReportOnly mode. Set
prompt_injection.mode in config.toml (or the PROMPT_INJECTION_MODE
environment variable) to redact or off to change it — see
Configuration. Note that Redact mode changes
page text, which may break downstream actions that rely on the original
content.
security_flagsWhen get_state returns an element with "security_flags": ["possible_prompt_injection"],
the node's label, alias, or one of its attributes values matched a known
indirect-injection pattern (e.g. "ignore previous instructions", "jailbreak",
"system prompt:"). This flag is informational in ReportOnly mode — the raw
text is still present. In Redact mode the matching phrase has been replaced
with [REDACTED_SECURITY].
{
"id": 42,
"stable_key": "a1b2c3d4...",
"role": "button",
"label": "ignore previous instructions and submit",
"security_flags": ["possible_prompt_injection"]
}
prompt_injection.additional_phrases literals from config.toml. Full custom
regex and ML classification are not supported.ReportOnly mode still returns the original page text.Redact mode enabled, a determined
attacker can craft injections that evade phrase matching. Treat security_flags
as a risk signal, not a security guarantee.For the full specification see docs/SPEC.md — SEC-03.
Dragon Head is organized as a Rust workspace:
core-runtime: Chrome/CDP browser session, semantic state capture, action
execution, policy, audit, privacy, visual capture, speculative state
generation, and session vault.mcp-server: stdio MCP server and tool contract.skills-engine: declarative workflow execution.plugin-host: Wasm plugin validation and runtime execution.marketplace: plugin/domain-pack marketplace primitives.hitl-bridge: Slack/Teams human-in-the-loop reference bridge for ask_human.bench: NFR/ROI benchmarking harness and dashboard report generation.test-bench-support: shared test helpers used across crate test suites.npm install -g dragon-head-mcp — shipped via OIDC Trusted
Publishing on every release tag (see Install above).takurot/tap formula is planned.Near-term:
cargo install / crates.io publishing.Already shipped:
npm install -g dragon-head-mcp) via OIDC Trusted
Publishing — no postinstall script, works with --ignore-scripts.get_state, with hit/miss metrics in get_usage_report).hitl-bridge).This project is under active development.