{"id":49916915,"url":"https://github.com/askalf/arnie","last_synced_at":"2026-05-16T17:25:47.944Z","repository":{"id":354532134,"uuid":"1223048741","full_name":"askalf/arnie","owner":"askalf","description":"Portable IT troubleshooting companion powered by Claude — networking, AD, Windows Update, package managers, log triage, hardware checks, dev environments. Routes through dario for subscription billing.","archived":false,"fork":false,"pushed_at":"2026-05-07T19:34:42.000Z","size":468,"stargazers_count":1,"open_issues_count":7,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-07T19:40:43.321Z","etag":null,"topics":["agent","ai","anthropic","claude","cli","developer-tools","it","linux","macos","sysadmin","tool-use","troubleshooting","windows"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/arnie-cli","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/askalf.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"askalf"}},"created_at":"2026-04-28T00:52:19.000Z","updated_at":"2026-05-07T19:33:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/askalf/arnie","commit_stats":null,"previous_names":["askalf/arnie"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/askalf/arnie","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askalf%2Farnie","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askalf%2Farnie/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askalf%2Farnie/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askalf%2Farnie/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/askalf","download_url":"https://codeload.github.com/askalf/arnie/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askalf%2Farnie/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33111510,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent","ai","anthropic","claude","cli","developer-tools","it","linux","macos","sysadmin","tool-use","troubleshooting","windows"],"created_at":"2026-05-16T17:25:47.280Z","updated_at":"2026-05-16T17:25:47.930Z","avatar_url":"https://github.com/askalf.png","language":"TypeScript","funding_links":["https://github.com/sponsors/askalf"],"categories":[],"sub_categories":[],"readme":"# arnie\n\nA portable IT troubleshooting *companion* for the terminal. Like Claude Code, but specialized for diagnosing and fixing technical issues — networking, AD, Windows Update, package managers, log triage, hardware checks, dev environments — with a tool surface tuned for that work.\n\nBuilt on the Anthropic SDK with `claude-opus-4-7`, adaptive thinking, server-side compaction, and prompt caching.\n\n## Install\n\nRequires Node.js 20+.\n\nFrom npm:\n\n```sh\nnpm install -g arnie-cli    # exposes `arnie` globally\n```\n\nFrom source:\n\n```sh\ngit clone \u003cthis repo\u003e arnie\ncd arnie\nnpm install\nnpm run build\nnpm link    # exposes `arnie` globally\n```\n\nOr run from the source tree without linking:\n\n```sh\nnpm start\n```\n\n## Configure\n\nSet your Anthropic API key:\n\n```sh\n# Windows (PowerShell)\n$env:ANTHROPIC_API_KEY = \"sk-ant-...\"\n\n# macOS / Linux\nexport ANTHROPIC_API_KEY=sk-ant-...\n```\n\n## Use\n\n```sh\narnie\n```\n\nTalk to it like a colleague. It will use its tools to investigate the actual machine before guessing.\n\n```\nyou\u003e the printer queue is jammed and i can't restart spooler\narnie\u003e [investigates with shell + Get-Service, finds stuck job, proposes the fix]\n```\n\nSee [docs/EXAMPLES.md](docs/EXAMPLES.md) for five worked troubleshooting flows — printer spooler hung, \"disk full but du disagrees\", AD trust break, mis-routed TCP, CrashLoopBackOff with empty logs.\n\n### Multi-line input\n\nTriple-quote (`\"\"\"`) on its own line starts and ends a multi-line block. Use this for pasting logs or stack traces:\n\n```\nyou\u003e \"\"\"\n[2026-04-27T18:42:01] ERROR: socket connect ECONNREFUSED 10.0.0.5:445\n[2026-04-27T18:42:02] ERROR: tree connect failed: STATUS_BAD_NETWORK_NAME\n\"\"\"\narnie\u003e [reads the SMB error, investigates...]\n```\n\n### Slash commands\n\n| Command | Purpose |\n| --- | --- |\n| `/help` | Show REPL help |\n| `/usage` | Session token totals + estimated cost. `/usage tools` for per-tool call counts and durations. |\n| `/clear` | Reset the conversation. `/clear --summary` replaces history with a model-written summary instead of wiping it. |\n| `/tools` | List registered tools |\n| `/jobs` | List background shell jobs. `/jobs --watch` blocks until they all finish. |\n| `/skills` | List discovered skills |\n| `/memory` | Show loaded memory files |\n| `/remember \u003cfact\u003e` | Append a dated line to `.arnie/memory.md` |\n| `/cd \u003cpath\u003e` | Change cwd mid-session |\n| `/save \u003cname\u003e` | Save the current conversation |\n| `/load \u003cname\u003e` | Replace the current conversation with a saved one |\n| `/list` | List saved sessions |\n| `/find \u003cquery\u003e` | Search across saved sessions for a substring; shows session, message index, snippet |\n| `/export \u003cname\u003e` | Export the current conversation as Markdown to `~/.arnie/exports/\u003cname\u003e.md` |\n| `/replay \u003ctranscript.jsonl\u003e` | Reconstruct the conversation from a transcript file |\n| `/init` | Bootstrap a `.arnie/memory.md` for this machine — model probes the box and proposes one |\n| `/settings` | Show effective settings. `/settings \u003ckey\u003e \u003cvalue\u003e` sets and persists to `~/.arnie/settings.json`. |\n| `/profile` | Show effective model + thinking/effort/budget profile |\n| `/feedback \"note\"` | Append a dated note to `~/.arnie/feedback.md` (loaded into the system prompt next session). `/feedback --clear` empties it. |\n| `/plan` | Toggle plan mode — model proposes a plan first and awaits approval before mutating tools |\n| `/exit` (or `/quit`) | Quit (or Ctrl+C twice) |\n\n### Tools the model can use\n\n| Tool | Purpose |\n| --- | --- |\n| `shell` | Foreground shell command (PowerShell on Windows, `/bin/sh` elsewhere). Destructive commands require confirmation; commands matching `.arnie/permissions.json` allow rules can skip the prompt. |\n| `shell_background` | Start a long-running command in the background; returns a `job_id` immediately. Use for `chkdsk`, `sfc /scannow`, package builds, log tails. |\n| `shell_status` | Poll a background job's state and recent output. |\n| `shell_kill` | Force-kill a background job. |\n| `read_file` | Read a file (with optional line range, 200KB cap). |\n| `write_file` | Write a file (always confirms; shows a content preview). |\n| `edit_file` | String-replacement edit (always confirms; shows a diff preview). Prefer over write_file for partial changes. |\n| `list_dir` | List directory contents with type + size. |\n| `grep` | Regex search across files (skips node_modules/.git/dist; supports glob, context lines, literal mode). |\n| `network_check` | Ping + optional TCP port probe. Cross-platform wrapper. |\n| `service_check` | List Windows services / Linux systemd units with status. |\n| `tail_log` | Last N lines of a file with optional regex filter — cheaper than `read_file` for large logs. |\n| `process_check` | Cross-platform process listing (PID, name, CPU, memory) with name/pid filter and sort. |\n| `disk_check` | Per-drive total/used/free GB and percent used (`Get-PSDrive` / `df`). |\n| `apply_patch` | Apply a unified-diff patch (with `@@` hunk headers) to a file. Better than `edit_file` for 4+ changes in one file. Confirms with colored preview. |\n| `monitor` | Run a shell command N times on an interval; only iterations where output changed are returned. Bounded (max 30 iters, max 60s apart). |\n| `event_log` | Recent system events (Windows: `Get-WinEvent`; Linux: `journalctl`). Filter by level / source / time window. |\n| `registry_read` | Windows registry inspection. Path must start with `HKLM`/`HKCU`/`HKCR`/`HKU`/`HKCC`. Reads values + immediate subkeys (or recursive). |\n| `firewall_check` | Inspect host firewall state. Windows: `Get-NetFirewallProfile` + optional `Get-NetFirewallRule`. Linux: ufw → firewalld → iptables. macOS: `socketfilterfw`. Default returns just profile state; pass `rules=true` for the rule list (capped at 200). |\n| `ssh_exec` | Run a command on a remote host via the system `ssh` binary. Honors `~/.ssh/config` aliases, agent keys, ProxyJump. `BatchMode=yes` (no password prompts). Same destructive-pattern + confirmation as local `shell`. |\n| `scp_get` | Pull a remote file to a local temp path via `scp`, then return the local path so you can `read_file` / `grep` it without another round-trip. |\n| `ssh_hosts` | List ssh hosts configured in `~/.ssh/config` (and `/etc/ssh/ssh_config` on non-Windows). Read-only — the model uses this to discover what aliases are available. |\n| `subagent` | Spawn a focused Haiku-backed read-only investigation. Delegate enumeration / summarization to keep the main loop cheap. |\n| `web_search` | Server-side web search for KB articles, vendor docs, error string lookups. |\n\n### Cross-session memory\n\nMemory files are loaded into the system prompt at startup. Arnie checks three locations, in order, and merges them:\n\n- `~/.arnie/memory.md` — global, all projects\n- `.arnie/memory.md` — project-scoped (current cwd)\n- `ARNIE.md` — project-scoped, top-level alias if you don't want a hidden `.arnie/` dir\n\nUse it for stable, cross-session context — *\"this network uses 10.0.0.0/8, AD DC is at 10.0.0.5, all servers run Server 2022\"*. Cheaper than re-explaining it every session.\n\nAppend new facts on the fly with `/remember \u003cfact\u003e` — appends a dated line to `.arnie/memory.md`. Or run `/init` and let the model probe the machine and write one for you.\n\n### Skills\n\nDrop scoped expertise into `.arnie/skills/\u003cname\u003e/SKILL.md` (project) or `~/.arnie/skills/\u003cname\u003e/SKILL.md` (global). Each `SKILL.md` should start with frontmatter:\n\n```yaml\n---\nname: active-directory\ndescription: AD replication, group policy, FSMO roles. Use when the issue involves domain controllers or AD authentication.\n---\n\n# Active Directory playbook\n\n...\n```\n\nThe skill name and description are loaded into the system prompt at startup; the body is loaded on demand when the model decides it's relevant (it calls `read_file` with the skill path). This keeps the base system prompt small while making specialized knowledge discoverable.\n\nReady-made skills ship in [`skills/`](skills/) at the repo root — copy whichever ones you want into `~/.arnie/skills/` and they'll load on startup. Current pack:\n\n- `active-directory` — DC replication, GPO, Kerberos, secure-channel breaks\n- `windows-update` — stuck installs, `0x80...` error codes, WSUS misconfig\n- `systemd` — failed units, restart loops, dependency cycles, timers\n- `kubernetes-pod-triage` — CrashLoopBackOff, ImagePullBackOff, OOMKilled\n- `smb-shares` — UNC failures, NTLM/Kerberos, SMB negotiation\n- `ssh-remote-triage` — investigating a server you're not sitting at; pairs with the ssh_exec / scp_get / ssh_hosts tools\n\nSee [skills/README.md](skills/README.md) for install + customization notes.\n\n### Permissions config\n\n`.arnie/permissions.json` lets you pre-approve safe commands or block dangerous ones. Patterns are JS regexes matched against the full command string.\n\n```json\n{\n  \"allow\": [\n    { \"pattern\": \"^Get-Service\\\\b\", \"reason\": \"read-only PS\" }\n  ],\n  \"deny\": [\n    { \"pattern\": \"\\\\bformat\\\\s+[a-zA-Z]:\", \"reason\": \"no formatting drives, ever\" }\n  ]\n}\n```\n\nDeny is checked first and refuses outright. Allow takes effect *after* the destructive-pattern detector triggers — it lets you skip the `[y/N]` for commands you trust.\n\n### Resume a previous conversation\n\n```sh\narnie --resume printer-issue   # picks up where /save printer-issue left off\n```\n\n### Initialize a workspace\n\n```sh\narnie --init    # scaffolds .arnie/ with memory.md, permissions.json, an example skill\n```\n\n### Non-interactive single turn\n\n```sh\narnie --print \"diagnose disk i/o\"     # one turn, prints response, exits\n```\n\nUseful for scripts, cron, or piping into other tools. All flags work the same — disable usage display, transcripts, etc., as needed.\n\n### Settings file\n\n`~/.arnie/settings.json` provides defaults that CLI flags override:\n\n```json\n{\n  \"model\": \"claude-opus-4-7\",\n  \"effort\": \"xhigh\",\n  \"maxTokens\": 64000,\n  \"compact\": true,\n  \"subagent\": true,\n  \"memory\": true,\n  \"skills\": true,\n  \"permissions\": true,\n  \"statusLine\": true,\n  \"markdown\": true\n}\n```\n\n### MCP servers\n\nConnect remote MCP servers via `~/.arnie/mcp.json` (or `.arnie/mcp.json` per project):\n\n```json\n{\n  \"servers\": [\n    {\n      \"type\": \"url\",\n      \"name\": \"github\",\n      \"url\": \"https://api.githubcopilot.com/mcp/\",\n      \"authorization_token\": \"ghp_...\"\n    }\n  ]\n}\n```\n\nServers are passed through to the API's `mcp_servers` parameter; tool discovery, auth, and execution happen on Anthropic's side.\n\n### Image and file attachments\n\nInside a user message, you can attach files four ways:\n\n- `@path/to/file` — bare-token reference, like Claude Code. Auto-attaches if the file exists.\n- `@path/with/*.glob` — auto-attach every file matching the glob (e.g. `@src/**/*.ts`).\n- `attach \u003cpath\u003e` — explicit form, useful if the path contains spaces or unusual characters.\n- `@\u003curl\u003e` — fetch a `http://` or `https://` URL and attach the body. Image content-types become image blocks; everything else is treated as text. Capped at 2MB and 15s.\n\nSupported images: jpg/png/gif/webp (max 8MB). Other files are read as text (max 200KB).\n\n```\nyou\u003e what's this dialog box telling me? @C:\\Users\\me\\Desktop\\error.png\nyou\u003e review @src/auth.ts and look for issues\nyou\u003e any obvious smells in @src/**/*.ts ?\n```\n\n### Output redactors\n\nSecrets in shell output get scrubbed before the model ever sees them. Defaults catch Anthropic API keys, AWS keys, GitHub PATs, Bearer tokens, password/api_key assignments. Add your own in `~/.arnie/redactors.json`:\n\n```json\n{\n  \"defaults\": true,\n  \"rules\": [\n    { \"pattern\": \"internal-prod-token-[A-Z0-9]+\", \"replacement\": \"[REDACTED:internal]\" },\n    { \"pattern\": \"(?i)pin\\\\s*[:=]\\\\s*\\\\d+\", \"replacement\": \"pin=[REDACTED]\" }\n  ]\n}\n```\n\nSet `\"defaults\": false` to use only your custom rules. Patterns are JS regexes.\n\n### Persona override\n\n`~/.arnie/persona.md` (or `.arnie/persona.md` per project) appends to the system prompt. Use this to flavor or specialize arnie — e.g., make it a database admin assistant for one project, a Windows-server SME for another.\n\n### Sandbox\n\n`.arnie/sandbox.json` constrains which paths the file tools can touch. Empty or missing config = no restrictions.\n\n```json\n{\n  \"allowed_read_paths\": [\"~/projects/foo\", \"/var/log\"],\n  \"allowed_write_paths\": [\"~/projects/foo\"]\n}\n```\n\n`read_file`, `list_dir`, `write_file`, and `edit_file` all consult this. Paths outside the allowed dirs return a `sandbox denied` error to the model so it can adapt.\n\n### Dry-run mode\n\n`--dry-run` flips the harness into investigation-only mode: read tools (read_file, list_dir, grep, network_check, service_check, tail_log, process_check, disk_check, web_search, subagent) work normally, but mutating tools (shell, shell_background, write_file, edit_file, apply_patch) refuse and return a message telling the model what they'd have done. The model then reports back to you in plain English instead of acting. The status line shows `[dry-run]`.\n\n```sh\narnie --dry-run\n```\n\n### Cost budget\n\n`--budget 5.00` halts the session when the running cost exceeds $5.00. Useful for unattended runs.\n\nIn `--print` mode (one-shot), the request has already executed by the time the budget is checked, so it can't pre-empt the spend. Instead arnie warns to stderr and exits with a non-zero status, so cron/script wrappers can react:\n\n```sh\narnie --budget 0.05 --print \"diagnose disk i/o\" || echo \"spent more than 5¢\"\n```\n\n### Auto-checkpoint\n\n`--auto-checkpoint 10` saves the session every 10 user turns under a name like `checkpoint-2026-04-27T21-25-13`. Resume the most recent with `arnie --resume`.\n\n### Background-job notifications\n\nWhen a `shell_background` job finishes between turns, the next user message is automatically prefixed with a `\u003csystem-reminder\u003e` listing the finished jobs (id, command, exit code, elapsed). The model can then call `shell_status` to read the output.\n\n### Replay \u0026 feedback\n\n- `/replay \u003ctranscript.jsonl\u003e` reconstructs the conversation from a transcript file (handy for resuming a debugging session that wasn't `/save`d).\n- `/feedback \"note\"` appends a dated note to `~/.arnie/feedback.md`. On the next session start, that file's contents get loaded into the system prompt — durable lessons across runs. `/feedback --clear` empties it.\n\n### Remote sessions\n\n`--remote \u003chost\u003e` scopes the whole session at a remote box. `shell`, `shell_background`, and `shell_kill` all execute via ssh on `\u003chost\u003e`; file tools and the local-introspection tools (`process_check`, `disk_check`, etc.) keep operating on the workstation. The status line shows `[remote: \u003chost\u003e]` so the scope stays obvious.\n\n```sh\narnie --remote prod-web\narnie --remote deploy@10.0.0.5:2222\n```\n\n`\u003chost\u003e` accepts the same forms as `ssh_exec`: an `~/.ssh/config` alias, `user@host`, `host:port`, or `user@host:port`. ssh-config aliases, agent keys, ProxyJump, and `known_hosts` all \"just work\" because arnie shells out to the system `ssh` binary with `BatchMode=yes` (no password prompts) and `ConnectTimeout=10`.\n\nIf a shell call returns exit 255 it's an ssh-itself failure (auth, host-key change, host unreachable) — the model is told to surface that to you rather than retry with a different command. To target *another* host mid-session without leaving remote mode, the model can still call `ssh_exec`.\n\n### Use with dario (Claude Max subscription / multi-provider)\n\n[dario](https://github.com/askalf/dario) is a local LLM router that exposes one Anthropic-compatible endpoint at `http://localhost:3456` and routes requests to your Claude Max subscription (via OAuth, no per-token API billing) or to any of OpenAI / Groq / OpenRouter / Ollama / LiteLLM as a backend.\n\narnie speaks to it directly — set the base URL and you're done:\n\n```sh\n# install + log in once\nnpm install -g @askalf/dario\ndario login\ndario proxy \u0026\n\n# point arnie at it\narnie --dario        # short form: sets http://localhost:3456 + dummy key\n# or\narnie --base-url http://localhost:3456\n# or\nANTHROPIC_BASE_URL=http://localhost:3456 ANTHROPIC_API_KEY=dario arnie\n```\n\nWhen `--dario` is on, the banner shows `base url: http://localhost:3456 (via --dario)`. Everything else — tools, slash commands, sessions, memory — is unchanged. Switch backends in dario by changing the model name passed via `--model`.\n\n### Spillover output\n\nWhen a shell command produces more than 100KB of output, the truncated portion goes to disk under the OS temp dir, and the path is returned in `stdout_full_path`/`stderr_full_path`. The model can read it back via `read_file` to inspect specific portions without flooding the context.\n\n### Hooks\n\n`~/.arnie/hooks.json` (or `.arnie/hooks.json` in the project) runs shell commands when tools execute. Each hook list runs in parallel; per-command 5s timeout; failures are silent (best-effort).\n\n```json\n{\n  \"before_tool\": [\n    \"echo \\\"$ARNIE_TOOL_NAME starting at $(date -Iseconds)\\\" \u003e\u003e /tmp/arnie-tools.log\"\n  ],\n  \"after_tool\": [\n    \"echo \\\"$ARNIE_TOOL_NAME finished\\\" \u003e\u003e /tmp/arnie-tools.log\"\n  ],\n  \"on_error\": [\n    \"logger -t arnie \\\"$ARNIE_TOOL_NAME failed: $ARNIE_TOOL_ERROR\\\"\"\n  ]\n}\n```\n\nAvailable env vars in hook commands: `ARNIE_TOOL_NAME`, `ARNIE_TOOL_INPUT` (JSON, capped at 4KB), `ARNIE_TOOL_RESULT` (JSON, capped at 4KB), `ARNIE_TOOL_ERROR`.\n\n## Flags\n\n```\n--model \u003cid\u003e            Claude model (default: claude-opus-4-7)\n--effort \u003clevel\u003e        low | medium | high | xhigh | max  (default: xhigh)\n--max-tokens \u003cn\u003e        Max output tokens per turn (default: 64000)\n--no-thinking           Disable adaptive thinking\n--no-compact            Disable server-side context compaction\n--no-context-edit       Disable automatic clearing of stale tool outputs\n--no-web-search         Don't expose web_search tool\n--no-subagent           Don't expose subagent tool\n--no-skills             Don't load .arnie/skills/*\n--no-memory             Don't load .arnie/memory.md or ARNIE.md\n--no-permissions        Ignore .arnie/permissions.json\n--no-hooks              Ignore .arnie/hooks.json\n--no-mcp                Ignore .arnie/mcp.json (skip remote MCP servers)\n--no-sandbox            Ignore .arnie/sandbox.json path restrictions\n--no-status-line        Don't render the status line\n--no-markdown           Don't render markdown (raw output)\n--no-transcript         Don't write a session transcript\n--transcript-dir \u003cdir\u003e  Transcript directory (default: ~/.arnie/transcripts)\n--no-usage              Hide per-turn token/cost display\n-q, --quiet             Suppress tool execution chatter; only show responses\n--voice                 Speak assistant responses (espeak / `say` / PowerShell SAPI)\n--system-extra \u003ctext\u003e   Append text to the system prompt\n--dry-run               Investigation only — mutating tools refuse\n--budget \u003cusd\u003e          Halt the session after exceeding $N in tokens\n                        (in --print mode: warn + exit non-zero, can't pre-empt)\n--auto-checkpoint \u003cn\u003e   Auto-save the session every N user turns\n--base-url \u003curl\u003e        Anthropic-compat endpoint (overrides ANTHROPIC_BASE_URL)\n--dario                 Route through a local dario proxy at http://localhost:3456\n                        (sets base URL + dummy API key if not already set)\n--remote \u003chost\u003e         Scope the session at a remote host: shell,\n                        shell_background, and shell_kill route via ssh on\n                        \u003chost\u003e. File tools and local-introspection tools\n                        stay local. host can be an ssh-config alias,\n                        user@host, host:port, or user@host:port.\n--resume [name]         Resume a saved session (most recent if no name)\n-p, --print \u003cmsg\u003e       Run a single non-interactive turn and exit\n--init                  Scaffold .arnie/ in current cwd and exit\n--version               Print version and exit\n-h, --help              Show help\n```\n\n## What gets written to disk\n\n| What | Where | Why |\n| --- | --- | --- |\n| Session transcripts | `~/.arnie/transcripts/\u003ctimestamp\u003e.jsonl` | Debugging, audit trail, cost analysis |\n| Saved conversations | `~/.arnie/sessions/\u003cname\u003e.json` | `/save` and `--resume` |\n| Memory file | `.arnie/memory.md` (cwd) or `~/.arnie/memory.md` | Cross-session context loaded into the system prompt |\n\nThe `.arnie/` directory in cwd is gitignored by default if you check this repo out fresh.\n\n## Safety\n\n- Destructive shell commands (`rm -rf`, `Remove-Item`, `format`, `Stop-Service`, `shutdown`, registry edits, package removals, etc.) require explicit `[y/N]` confirmation before running. The same gating applies to background jobs.\n- `write_file` always shows a preview and asks before overwriting.\n- The model is told to call out risk before destructive steps and to ask for elevation when needed.\n- First Ctrl+C cancels the in-flight model request; second Ctrl+C exits.\n\n## Notes\n\n### Paths on Windows under MSYS / Git Bash\n\nIf you're running arnie from MSYS bash, Cygwin, or Git Bash on Windows, paste **Windows-shaped paths** into prompts (`C:/Users/you/...` or `C:\\Users\\you\\...`), not Unix-shaped ones. Bash's `/tmp` aliases to `%LOCALAPPDATA%\\Temp` for the shell, but arnie runs as a Node process and resolves the literal string `/tmp` to `C:\\tmp` — which doesn't exist. PowerShell, cmd.exe, and WSL are unaffected.\n\n## Development\n\n```sh\nnpm run dev               # tsx watch\nnpm run typecheck         # tsc --noEmit\nnpm run build             # tsc → dist/\nnpm test                  # offline tool unit tests (no API key needed)\nnpm run test:integration  # full end-to-end against dario (skips if no backend)\n```\n\n`npm run test:integration` exercises the real arnie binary through every major tool, both file-mutation paths, mode flags, and the `--budget` regression. It looks for a dario proxy at `http://localhost:3456` by default; pass `--direct` to use `ANTHROPIC_API_KEY` instead. If neither backend is reachable, it exits 0 with `[SKIP]` so it's safe in CI.\n\n## License\n\nMIT.\n\n---\n\n## Also by askalf\n\n| Project | What it does |\n|---------|-------------|\n| [brio](https://github.com/askalf/brio) | Capability layer for AI workloads — semantic cache, cost tiering, policy. Sits in front of any Anthropic-compat endpoint. |\n| [browser-bridge](https://github.com/askalf/browser-bridge) | Stealth headless Chromium in a container. CDP on 9222 — Playwright/Puppeteer/MCP-compatible. |\n| [claude-bridge](https://github.com/askalf/claude-bridge) | Bridge Claude Code sessions to Discord. |\n| [dario](https://github.com/askalf/dario) | Local LLM router. Use your Claude Max/Pro subscription as an API. |\n| [deepdive](https://github.com/askalf/deepdive) | Local research agent. Plan → search → fetch → extract → synthesize. Cited answers. |\n| [git-providers](https://github.com/askalf/git-providers) | Unified GitHub + GitLab + Bitbucket Cloud REST clients behind one GitProvider interface. Plus a 44-entry api-key-provider taxonomy. |\n| [hands](https://github.com/askalf/hands) | Cross-platform computer-use agent. Mouse, keyboard, screen. |\n| [install-kit](https://github.com/askalf/install-kit) | curl-pipe-bash template for self-hosted Docker apps. |\n| [pgflex](https://github.com/askalf/pgflex) | One Postgres API. Two modes (real PG ↔ PGlite WASM). |\n| [redisflex](https://github.com/askalf/redisflex) | One Redis API. Two modes (ioredis ↔ in-process). |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faskalf%2Farnie","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faskalf%2Farnie","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faskalf%2Farnie/lists"}