Productivity
    cliclaudecodingworkflow

    Terminal-First AI Coding: Building a Fast CLI Workflow with Claude Code

    Copy-pasting file contents into a browser tab doesn't scale past a few hundred lines of code. Here's how to build a fast, terminal-first workflow around Claude Code's shell access instead.

    Editor: Paul RadfordJun 5, 20267 min read
    Terminal-First AI Coding: Building a Fast CLI Workflow with Claude Code

    A terminal-first workflow with Claude Code means driving code generation, refactors, and debugging directly from your shell instead of a chat window or IDE panel, using file access, git integration, and shell command execution as first-class primitives. It works best when your codebase already lives in text files and your review process is comfortable with diffs, not screenshots.

    Why the terminal beats the chat window for real engineering work

    Most AI coding assistants started as chat interfaces bolted onto an editor. That model works for small snippets, but it breaks down once you need the model to read fifteen files, run your test suite, and iterate on a failing assertion. Copy-pasting file contents into a browser tab does not scale past a few hundred lines, and it strips away the context an agent needs to understand your project layout, your build system, and your git history.

    Claude Code, Anthropic's command-line agent, runs in your terminal with direct filesystem and shell access. It can read a directory tree, grep for usages, run pytest or go test, inspect the output, and make another edit, all without you relaying text back and forth. That loop, read, act, observe, repeat, is the actual unit of work in software engineering. A terminal-first setup lets the model participate in that loop instead of standing outside it.

    The trade-off is trust. Once a tool can execute shell commands, you are exposed to a wider blast radius than a suggestion-only autocomplete. Anthropic's docs are explicit that Claude Code will ask for permission before running commands or editing files unless you've pre-approved them, and you can configure allowed and disallowed tools per project.

    Setting up a working session

    Installation is a single npm package:

    bash
    1npm install -g @anthropic-ai/claude-code

    Once installed, running claude in a project directory starts an interactive session scoped to that directory. The first thing worth doing is not asking it to write code, it's asking it to read. A prompt like:

    text
    1Read through this repo's package.json, tsconfig.json, and the src/ directory structure.
    2Summarize the architecture in five bullet points before we do anything else.

    This costs you maybe 30 to 60 seconds and a modest number of input tokens, but it front-loads context the model would otherwise reconstruct piecemeal across a dozen follow-up prompts. Skipping this step is the single most common reason terminal agents make confidently wrong changes early in a session, they pattern-match on a partial view of the codebase.

    What does a fast CLI workflow actually look like day to day?

    In practice, a terminal-first day breaks into three repeating modes:

    Scoped task execution. You give a specific, bounded instruction: "add input validation to the createUser handler in api/users.go, matching the pattern used in api/orders.go." This is where Claude Code is strongest, because the task has a clear success condition and a nearby example to anchor style.

    Investigation loops. Something is broken and you don't know where. You point the agent at a failing test or a stack trace and let it search the repo, form a hypothesis, and test it by running commands. This is slower and token-heavier than scoped execution, sometimes taking several minutes and tens of thousands of tokens for a gnarly bug, because the agent may need multiple rounds of "run this, check that" before it converges.

    Review and commit. You do not let the agent commit unreviewed. A workflow that works well:

    bash
    1git checkout -b claude/add-rate-limiting
    2claude "Implement rate limiting on the /api/upload endpoint using the existing
    3redis client in lib/cache.ts. Follow the pattern in middleware/auth.ts."
    4git diff
    5git add -p
    6git commit -m "Add rate limiting to upload endpoint"

    The git diff step is not optional. Treat every terminal-agent change like a pull request from a junior engineer who is fast, occasionally brilliant, and occasionally confidently wrong about your intent.

    Configuring permissions so you're not babysitting every command

    Claude Code supports a project-level configuration file (.claude/settings.json in recent versions) where you can pre-authorize specific tool actions, such as running npm test or reading files, without a permission prompt each time, while still requiring confirmation for destructive actions like rm or git push --force. Anthropic documents this permission model in their settings reference. A reasonable starting configuration allows read operations and test runs freely but keeps write-to-disk and any network-affecting shell commands behind confirmation:

    json
    1{
    2 "permissions": {
    3 "allow": [
    4 "Bash(npm test)",
    5 "Bash(npm run lint)",
    6 "Read(*)"
    7 ],
    8 "deny": [
    9 "Bash(rm -rf *)",
    10 "Bash(git push --force*)"
    11 ]
    12 }
    13}

    Getting this wrong in the permissive direction is how you end up with an agent that quietly force-pushes over a colleague's branch because it decided that was the fastest way to "fix" a merge conflict. Getting it wrong in the restrictive direction means you're clicking "allow" fifty times an hour and the tool stops feeling faster than doing it yourself.

    Cost and latency: what to actually expect

    Terminal agents are not free, and they are not instant. A scoped, well-specified task, edit this function, add this test, typically resolves in 20 to 90 seconds depending on how much file reading is required. Investigation-heavy sessions, where the model is running commands and re-reading output repeatedly, can run several minutes and consume proportionally more tokens because every command's stdout gets fed back into context.

    On cost, Claude Code uses the standard Anthropic API pricing for whichever Claude model you've configured (Claude Opus or Sonnet models, priced per input and output token as listed on Anthropic's pricing page), and a single multi-file refactor session can run from a few cents to a few dollars depending on context size and how many tool-call round trips happen. If you're running this against a monorepo where every read pulls in a 2,000-line file, costs climb fast, not because any individual token is expensive, but because agent loops re-send accumulated context on every turn. Keeping sessions scoped to a subdirectory, or using .claude/CLAUDE.md files to give persistent project context instead of re-explaining it every session, cuts this meaningfully.

    When the terminal is the wrong interface

    Terminal-first is not the right default for every task, and pretending otherwise is how teams end up frustrated with AI coding tools generally.

    If you're doing exploratory, visual work, tweaking a React component and eyeballing the rendered result, an IDE-integrated tool like Cursor or GitHub Copilot's inline suggestions in VS Code gives tighter feedback because you see the result without a context switch. Terminal agents have no eyes on your running application unless you wire up a screenshot or a browser automation step, which is extra setup for a task that a visual tool handles natively.

    If your task is a single-line change or a well-understood boilerplate pattern, invoking a full agent session is overkill. Autocomplete-style completion is faster and cheaper for that. Reach for the terminal agent when the task spans multiple files, requires reading before writing, or involves running and interpreting command output, not for typing out a getter and setter.

    If you're in a regulated environment where shell execution by an AI tool needs an audit trail beyond what the tool provides, or where you cannot risk any autonomous command execution regardless of permission settings, a suggestion-only tool is the safer choice even if it's slower. Claude Code's permission system reduces risk, it does not eliminate the possibility that a misinterpreted instruction leads to an unwanted file deletion or an unintended network call inside a sandboxed test run.

    Making it part of a real team workflow

    The engineers who get the most out of this setup treat Claude Code sessions the way they'd treat delegating to a contractor working async: give a clear, bounded brief, let the loop run, then review the diff with the same scrutiny you'd apply to any other pull request. Teams that skip the review step because "the tests passed" get burned eventually, usually by a change that's technically correct but architecturally wrong, adding a caching layer in the wrong place, or duplicating logic that already existed three files away.

    A pattern worth adopting: keep a .claude/CLAUDE.md file at your repo root with project conventions, the testing command, and known gotchas (Anthropic documents this convention in their Claude Code memory docs). This turns institutional knowledge that used to live in a senior engineer's head into something the agent reads on every session, which cuts the "explain the codebase again" tax that otherwise eats your first five minutes every time.

    Start narrow. Pick one repeatable task, updating test fixtures, writing changelog entries from git log, adding type annotations to untyped functions, and run it through the terminal workflow for two weeks before expanding scope. You'll learn where the model needs more guardrails and where it's trustworthy enough to run unattended, and that calibration is worth more than any amount of reading about other people's workflows.

    Advertisement

    728 × 90 — Leaderboard — Google AdSense

    Related Articles