Guide for Claude Code users adopting HLVM's agent system.
HLVM's agent system provides Claude Code-equivalent functionality with additional fine-grained control. This guide maps Claude Code patterns to HLVM equivalents.
| Claude Code | HLVM | Notes |
|---|---|---|
claude ask "query" | hlvm ask "query" | Identical interactive mode |
claude ask -p "query" | hlvm ask -p "query" | Non-interactive mode (defaults to dontAsk) |
claude ask --print "query" | hlvm ask --print "query" | Same long form |
claude ask --permission-mode <mode> | hlvm ask --permission-mode <mode> | Modes: default, acceptEdits, plan, bypassPermissions, dontAsk |
claude ask --dangerously-skip-permissions | hlvm ask --dangerously-skip-permissions | Legacy alias for --permission-mode bypassPermissions |
claude ask --allowedTools <tool> | hlvm ask --allowedTools <tool> | Repeatable flag for fine-grained control |
claude ask --disallowedTools <tool> | hlvm ask --disallowedTools <tool> | Repeatable flag for explicit denials |
| (not available) | hlvm ask --permission-mode acceptEdits | Auto-approve file ops, prompt for destructive |
Claude Code:
claude ask "fix the bug in auth.ts"
HLVM:
hlvm ask "fix the bug in auth.ts"
Behavior: Identical — prompts for mutations, auto-approves read-only.
-p / --print)Claude Code:
# Non-interactive, safe tools only
claude ask -p "analyze code quality"
HLVM:
# Same behavior — defaults to dontAsk permission mode
hlvm ask -p "analyze code quality"
Behavior: Identical — no prompts, mutations denied, read-only approved. The -p/--print flag sets printMode=true and defaults to dontAsk permission mode when no explicit --permission-mode is given.
Use cases:
--permission-mode bypassPermissions)Claude Code:
# Skip ALL prompts (dangerous!)
claude ask --dangerously-skip-permissions "task"
HLVM:
# Preferred: explicit permission mode
hlvm ask --permission-mode bypassPermissions "task"
# Legacy alias (still works)
hlvm ask --dangerously-skip-permissions "task"
Warning: Auto-approves all tools including destructive operations. Use only in fully trusted environments.
HLVM extends Claude Code's permission model with surgical tool control:
# Allow only write_file (everything else denied unless L0)
hlvm ask --allowedTools write_file "generate config"
# Allow multiple tools (repeatable flag)
hlvm ask --allowedTools write_file --allowedTools edit_file "refactor"
Use case: Non-interactive mode with selective mutations.
# Deny shell_exec (everything else follows normal rules)
hlvm ask --disallowedTools shell_exec "refactor code"
# Deny multiple tools (repeatable flag)
hlvm ask --disallowedTools shell_exec --disallowedTools delete_file "task"
Use case: Interactive mode with extra safety guardrails.
# Auto-approve L0+L1 (read + file ops), prompt for L2 (destructive)
hlvm ask --permission-mode acceptEdits "apply linter fixes"
# Legacy alias (still works)
hlvm ask --auto-edit "apply linter fixes"
Use case: Trusted file operations without constant prompts.
Claude Code has similar modes:
| Mode | Behavior |
|---|---|
| Default (interactive) | Prompt for all mutations |
dontAsk (-p) | Deny all mutations |
bypassPermissions (--dangerously-skip-permissions) | Approve all |
HLVM provides six permission modes via --permission-mode plus fine-grained control:
| Mode | L0 (read) | L1 (mutations) | L2 (destructive) | CLI |
|---|---|---|---|---|
default | Auto | Prompt | Prompt | (none) |
plan | Auto | Prompt | Prompt | --permission-mode plan |
acceptEdits | Auto | Auto | Prompt | --permission-mode acceptEdits |
bypassPermissions | Auto | Auto | Auto | --permission-mode bypassPermissions |
dontAsk | Auto | Deny | Deny | --permission-mode dontAsk |
auto | Auto | LLM classify | LLM classify | --permission-mode auto |
Plus explicit --allowedTools / --disallowedTools flags (repeatable).
Note: -p/--print defaults to dontAsk when no explicit --permission-mode is given.
HLVM classifies tools into three safety levels:
Auto-approved in all modes.
Examples:
read_file — Read file contentslist_files — List directoriessearch_code — Search codebasegit_status — Check git statusgit_diff — View changesPrompted in default mode, denied in headless.
Examples:
write_file — Create/overwrite filesedit_file — Modify existing filesshell_exec — Execute safe commandsgit_commit — Create commitsPrompted in default/auto-edit, denied in headless.
Examples:
shell_exec with dangerous commands (e.g., rm -rf)delete_file — Irreversible deletiongit reset --hard)Claude Code:
claude ask -p "analyze code quality"
HLVM:
hlvm ask -p "analyze code quality"
Migration: No changes needed.
Claude Code:
# Not possible without --dangerously-skip-permissions
claude ask --dangerously-skip-permissions "generate docs"
HLVM:
# Safer: non-interactive + selective write permission
hlvm ask -p --allowedTools write_file "generate docs"
Migration: Use fine-grained control instead of blanket unsafe mode.
Claude Code:
# Not possible — must manually reject shell prompts
claude ask "refactor code"
HLVM:
# Block shell access upfront
hlvm ask --disallowedTools shell_exec "refactor code"
Migration: Use explicit denials for extra guardrails.
Claude Code:
# Must use unsafe mode or click prompts
claude ask --dangerously-skip-permissions "apply fixes"
HLVM:
# Auto-approve file ops, prompt for destructive
hlvm ask --permission-mode acceptEdits "apply fixes"
Migration: Use acceptEdits mode instead of bypassing all permissions.
Unlike Claude Code's binary prompt/deny model, HLVM has a priority system:
Priority order (highest to lowest):
--disallowedTools)--allowedTools)dontAsk, acceptEdits, etc.)Example:
hlvm ask -p --allowedTools write_file "task"
-p (dontAsk mode) would normally deny write_file--allowedTools write_file explicitly allows itwrite_file is allowed (explicit allow wins)Both Claude Code and HLVM use standard exit codes:
| Code | Meaning | Example |
|---|---|---|
0 | Success | Query completed without errors |
1 | Error | LLM API failure, timeout, tool blocked, or any other error |
All errors (execution failures, tool blocks, interaction blocks) now use exit code 1.
Usage:
# Claude Code
claude ask -p "query" || echo "Failed"
# HLVM
hlvm ask -p "query" || echo "Failed"
Identical behavior.
# Set default model
claude config --model anthropic/claude-sonnet-4-5
# Override per-query
claude ask --model openai/gpt-4o "query"
# Set default model
hlvm config set model anthropic/claude-sonnet-4-5-20250929
# Override per-query
hlvm ask --model openai/gpt-4o "query"
Migration: Use hlvm config instead of claude config.
Claude Code:
claude ask -p "query" > output.txt
HLVM:
hlvm ask -p "query" > output.txt
Identical.
Claude Code:
claude ask -p --json "query" > output.jsonl
HLVM:
hlvm ask -p --json "query" > output.jsonl
Identical — newline-delimited JSON events.
Claude Code:
claude ask --verbose "query"
HLVM:
hlvm ask --verbose "query"
Identical — detailed trace output.
Goal: Auto-generate documentation files in CI.
Claude Code:
# Must use unsafe mode
claude ask --dangerously-skip-permissions "generate API docs"
HLVM (safer):
# Non-interactive + selective write permission
hlvm ask -p --allowedTools write_file "generate API docs"
Goal: Refactor code interactively, but prevent shell access.
Claude Code:
# Not possible — must manually reject prompts
claude ask "refactor authentication module"
HLVM:
# Explicitly deny shell upfront
hlvm ask --disallowedTools shell_exec "refactor authentication module"
Goal: Search and replace with minimal tool set.
Claude Code:
# Not possible
HLVM:
hlvm ask --allowedTools read_file --allowedTools search_code --allowedTools edit_file \
"replace all instances of oldFunc with newFunc"
claude ask with hlvm ask in scripts-p usage -- now defaults to dontAsk permission mode--dangerously-skip-permissions with --permission-mode bypassPermissions (legacy alias still works)--auto-edit with --permission-mode acceptEdits (legacy alias still works)--disallowedTools for extra safety where needed--allowedTools for selective non-interactive mutations| Feature | Claude Code | HLVM |
|---|---|---|
| Interactive mode | Yes | Yes |
Non-interactive mode (-p) | Yes | Yes (defaults to dontAsk) |
| Permission modes | Yes | Yes (--permission-mode) |
bypassPermissions mode | Yes (--dangerously-skip-permissions) | Yes (same flag as legacy alias) |
| Fine-grained allow | Yes (--allowedTools) | Yes (--allowedTools, repeatable) |
| Fine-grained deny | Yes (--disallowedTools) | Yes (--disallowedTools, repeatable) |
acceptEdits mode | Yes | Yes (--permission-mode acceptEdits) |
| Permission priority | N/A | Yes (deny > allow > mode > default) |
| Safety levels | Binary (safe/unsafe) | Three levels (L0/L1/L2) |