{"slug": "show-hn-halis-code-agent-coding", "title": "Show HN: Halis Code – Agent Coding", "summary": "Halis Code, a new coding agent released by developer binhdzs1tg on GitHub, ships as both a terminal tool (installed via `npm install -g halis-code`, requiring Node 20 or newer) and a desktop app with installers for macOS arm64 and x64, Linux (.deb/.AppImage) and Windows (NSIS .exe), the desktop build currently unsigned. The agent targets long-session failures with compaction at safe cut points that never split a tool call from its result, a repeat guard that escalates reminders at 3, 5 and 8 identical canonicalized calls and hard-stops at 12, self-explaining approvals before risky shell commands, and oversized tool output spilled to a file with a preview rather than truncated. The tool adds slash commands including `/compact`, `/diff`, `/usage`, `/yolo` to toggle command approvals off, and `/init` to write an `AGENTS.md` for the current repo.", "body_md": "**A coding agent with guardrails — one agent, two faces: your terminal and your desktop.**\n\nHalis Code streams an agent that reads, edits and runs code in your project — and keeps its own context honest while it does: compaction before the window fills, approvals before anything destructive runs, a repeat guard against loops, and nothing ever lost to silent truncation.\n\n[Install](#install) · [Terminal ui](#the-terminal-ui) · [Desktop app](#the-desktop-app) · [Docs](#documentation)\n\nBecause most of them are either a terminal tool or a desktop app, and\nthe interesting failures happen in the long sessions: context that\nfills up and quietly degrades, the same failing tool call repeated\neleven times, a `docker compose` output eating the whole window. Halis\nCode treats those as the product:\n\n- **Compaction with safe cut points** — when the transcript crosses the\ntoken budget, older history folds into a model-written summary. The\ncut never splits a tool call from its result, and a verbatim tail\nkeeps the current task intact.\n- **A repeat guard** — identical calls (canonicalized, so argument\norder cannot hide a repeat) earn escalating reminders at 3, 5 and 8,\nand a hard stop at 12.\n- **Approvals that explain themselves** — every risky shell command\nasks first, with the reason on the card: \"it deletes files\nrecursively or by force\", \"it pipes command output into a shell\", …\n- **Spill, not truncation** — oversized tool output lands in a\nreadable file with a preview and a pointer, so nothing disappears\nand nothing bloats the context.\n\n**Terminal** (node 20 or newer):\n\n```\nnpm install -g halis-code\nhalis\n```\n\n**Desktop** — grab the installer for your platform from the\n[releases page](https://github.com/binhdzs1tg/halis-code/releases):\n`.dmg` (macOS arm64 + x64), `.deb` / `.AppImage` (Linux), or the NSIS\n`.exe` setup (Windows). The desktop app is unsigned for now — on macOS\nthat means the usual right-click → open on first launch.\n\n**From source**:\n\n```\ngit clone https://github.com/binhdzs1tg/halis-code.git\ncd halis-code\nnpm install\nnpm run dev:cli        # terminal ui, watch mode\nnpm run dev:desktop    # build + launch the desktop app\n```\n\n`halis` opens a session that behaves like a terminal-first pair\nprogrammer: a bordered composer with a command palette, a live spinner\nwhile the model thinks, tool cards with durations and output previews,\nbash approvals before anything destructive runs, and a status line\nwith model, context usage and session cost straight from the catalog.\nThe mascot — the Halis penguin — sits on the welcome screen, redrawn\npixel by pixel in truecolor half-blocks.\n\nA few ways in:\n\n```\nhalis                                       # interactive session\nhalis \"fix the failing build\"               # start with a prompt\nhalis -p \"summarize this repo\"              # answer once, then exit\nhalis -p --json \"run the tests\"             # one event per line, for scripts\nhalis -c                                    # continue the last session here\nhalis sessions                              # list stored sessions\nhalis mascot                                # the penguin, full size\n```\n\nSlash commands inside a session:\n\n| command | what it does | \n|---|---|\n| `/help` | list every command | \n| `/model` | pick a model from the catalog (search + variants) | \n| `/models` | the same picker, alias | \n| `/provider` | switch provider preset (zai, deepseek, groq, …) | \n| `/diff` | git diff of the working tree | \n| `/compact` | compact the transcript now | \n| `/resume` | pick an earlier session to load | \n| `/title` | rename this session (auto-titled after turn one) | \n| `/export` | write the transcript to markdown | \n| `/usage` | token totals and estimated cost | \n| `/skills` | list installed skills | \n| `/yolo` | toggle command approvals off (careful) | \n| `/doctor` | check config, key, catalog and endpoint | \n| `/init` | write an `AGENTS.md` for the current repo | \n| `/status` | config, key and session info | \n| `/mascot` | say hi to the penguin | \n| `/clear` | drop the conversation context | \n| `/exit` | quit (or ctrl+c twice) | \n\nType `!command` to run something in your own shell, without the model\nin the middle.\n\nThe whole [models.dev](https://models.dev) catalog ships in the box:\n200+ providers and 8,000+ models, bundled as a snapshot (so model\npicking works offline) and refreshed in the background with ETag-cached\nrevalidation. Both wire protocols are supported — OpenAI-style chat\ncompletions for most providers, Anthropic messages with thinking blocks\nfor the Anthropic family — chosen from catalog data instead of a\nhand-listed table.\n\n```\nhalis -m anthropic/claude-sonnet-4-5#high    # provider/model plus reasoning variant\nhalis -m glm-4.7-flash                       # bare ids search the favorites first\nhalis --yolo \"run the whole migration\"       # no approval prompts\n```\n\nKeys come from each provider's documented environment variable\n(`ANTHROPIC_API_KEY`, `DEEPSEEK_API_KEY`, `ZAI_API_KEY`, …) or plain\n`HALIS_API_KEY`; `HALIS_BASE_URL` + `HALIS_MODEL` reach anything\nself-hosted, and the classic presets (`zai`, `deepseek`, `moonshot`,\n`groq`, `openai`, `openrouter`, `ollama`) work through `/provider`.\nWithout a key the cli runs in a clearly labeled demo mode, so the\ninterface stays explorable.\n\nThe agent's toolkit: `ls`, `read`, `write`, `edit`, `glob`, `grep`,\n`bash` (with `run_in_background` and timeout promotion to background\njobs), `job_output` / `job_kill`, `web_fetch` (refuses private\naddresses), `web_search` (keyless, DuckDuckGo-backed), `todo_write`\n(the plan card), `skill` (progressive-disclosure skills from\n`.halis/skills/*/SKILL.md`), `ask_user` and `task` (a subagent that\nexplores with its own context and reports back).\n\nDeveloping without a key works too — a scripted OpenAI-compatible provider ships with the cli, and the ci pipeline runs the whole agent loop against it for every push:\n\n```\nnpm run mock -w halis-code                                     # listens on :8787\nHALIS_BASE_URL=http://localhost:8787/v1 HALIS_API_KEY=mock \\\n  node packages/cli/bin/halis.js\n```\n\nThe Electron app pairs a session-list sidebar and a centered\nconversation with a workspace rail — files, search, editor, terminal.\nThe same guardrails ride along, plus desktop-only machinery: the mcp\nclient, subagents, skill loading, patch application, and a provider\nkey vault behind Electron `safeStorage`.\n\n- **Streaming agent** with live tool cards, plan todos and a message\nqueue while a run is in flight.\n- **Workspace rail** — explorer (create, rename, delete), editor with\ntabs and save, terminal panel, and search across the workspace.\n- **Model catalog** with variants, a key dialog, settings, focus mode,\ndark theme, auto-titled sessions with history.\n\nAll twenty screenshots live in\n[`apps/desktop/docs/screenshots`](https://github.com/binhdzs1tg/halis-code/blob/main/apps/desktop/docs/screenshots).\n\nThe same code runs on macOS, Linux and Windows, and the ci matrix tests all three on every push:\n\n- **Shell** — commands go through the user's login shell on unix\n(`$SHELL` , falling back to the account shell, then`/bin/bash` ) and\nthrough`cmd.exe` on Windows. Set`HALIS_SHELL` to force one — a\nposix-style`bash.exe` (git bash) is invoked with`-c` ,`pwsh.exe` with`-NoProfile -NonInteractive -Command` , anything else must speak\ncmd. The system prompt tells the model which shell it has, so on\nWindows it writes`dir` and`%VAR%` instead of`ls` and`$VAR` .\n- **Process trees** — timeouts and cancels kill the whole tree\n(process groups with SIGTERM-to-SIGKILL escalation on unix,`taskkill /T` on Windows), and a foreground command that outlives\nits timeout is promoted to a background job on every platform.\n- **Files** —`read` shows CRLF files without the carriage returns,`edit` folds replacements into the line endings the file already\nuses, and glob matching follows the filesystem: case-insensitive on\nWindows and macOS, strict on Linux.\n\n| doc | what it covers | \n|---|---|\n| [docs/architecture.md](https://github.com/binhdzs1tg/halis-code/blob/main/docs/architecture.md) | how the pieces fit, and why | \n| [docs/development.md](https://github.com/binhdzs1tg/halis-code/blob/main/docs/development.md) | commands, smoke suites, adding tools, env vars | \n| [docs/releases.md](https://github.com/binhdzs1tg/halis-code/blob/main/docs/releases.md) | how a tag becomes installers and an npm package | \n| [docs/security.md](https://github.com/binhdzs1tg/halis-code/blob/main/docs/security.md) | the guardrails as a system — trust boundaries and all | \n| [CHANGELOG.md](https://github.com/binhdzs1tg/halis-code/blob/main/CHANGELOG.md) | what shipped, when | \n| [CONTRIBUTING.md](https://github.com/binhdzs1tg/halis-code/blob/main/CONTRIBUTING.md) | the short path to a merged pull request | \n| [SECURITY.md](https://github.com/binhdzs1tg/halis-code/blob/main/SECURITY.md) | reporting a vulnerability, scope | \n\nTypeScript 7 everywhere, strict. From the root:\n\n```\nnpm run typecheck      # all workspaces\nnpm run build          # cli (bundles core from source), then desktop\nnpm run dev:cli        # watch mode for the terminal ui\nnpm run dev:desktop    # build + launch the desktop app\nnpm run smoke -w @halis/core      # the terminal-side loop against a scripted provider\nnpm run smoke -w @halis/desktop   # algorithm smoke tests\nnpm run lint:md        # markdownlint over every md file\n```\n\nThe everyday details — smoke suite internals, the mock provider, every\nenvironment variable — are in\n[docs/development.md](https://github.com/binhdzs1tg/halis-code/blob/main/docs/development.md). Conventions for humans and\ncoding agents live in [AGENTS.md](https://github.com/binhdzs1tg/halis-code/blob/main/AGENTS.md).\n\nCutting a release is one step: push a semver tag (`v0.3.0`). The\nrelease assembles itself — notes grouped from the commit log, installers\nbuilt on all three platforms, the npm package published with provenance.\nThe full pipeline is in [docs/releases.md](https://github.com/binhdzs1tg/halis-code/blob/main/docs/releases.md).\n\nGuardrails are the product, so they are documented like one:\n[docs/security.md](https://github.com/binhdzs1tg/halis-code/blob/main/docs/security.md) explains the trust boundaries\n(approvals, the fetch guard, the hostile-renderer discipline, process\ntrees), and [SECURITY.md](https://github.com/binhdzs1tg/halis-code/blob/main/SECURITY.md) explains how to report a hole in\nany of them — privately, please.\n\nPull requests are welcome — [CONTRIBUTING.md](https://github.com/binhdzs1tg/halis-code/blob/main/CONTRIBUTING.md) is the\nshort path, and the ci matrix will keep you honest on all three\nplatforms. MIT licensed; see [LICENSE](https://github.com/binhdzs1tg/halis-code/blob/main/LICENSE).\n\nThe model catalog comes from [models.dev](https://models.dev) — this\nrepo just ships the snapshot and the picker around it. The terminal ui\nis built on [Ink](https://github.com/vadimdemedes/ink-react) and React,\nthe desktop app on Electron, and everything compiles with TypeScript 7\nin strict mode.", "url": "https://wpnews.pro/news/show-hn-halis-code-agent-coding", "canonical_source": "https://github.com/binhdzs1tg/halis-code", "published_at": "2026-10-20 12:05:03+00:00", "updated_at": "2026-10-20 12:16:54.818656+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "artificial-intelligence"], "entities": ["Halis Code", "binhdzs1tg", "GitHub", "Node.js"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-halis-code-agent-coding", "markdown": "https://wpnews.pro/news/show-hn-halis-code-agent-coding.md", "text": "https://wpnews.pro/news/show-hn-halis-code-agent-coding.txt", "jsonld": "https://wpnews.pro/news/show-hn-halis-code-agent-coding.jsonld"}}