Write & build
Where you write code — and the agents that write it with you.
This setup has two families of tool: editors, where you type code yourself, and AI agents, which read your project and make changes for you. Knowing what each one is — and when to reach for it — is most of the skill.
#Two families
An editor is where code lives on screen: you open files, type, and save. An agent is a program you give a task to in plain English — it reads the project, proposes changes, and applies them once you approve. You'll use both, often at the same time: an agent drafts, you refine by hand in the editor.
The agent is expected to work inside the same repo you do: read AGENTS.md, inspect files, run commands, produce a diff, and explain how it verified the result. That makes the terminal and Git part of the AI workflow, not separate old-school tools.
#The editors
| Neovim | A fast, keyboard-only editor that runs in the terminal. The one at the center of this setup — see its own page. Steeper to learn, hard to give up. |
| VS Code | The familiar graphical editor. Huge extension library; hosts the Claude Code extension here. The safe default if Neovim feels like a lot. |
| Cursor | A fork of VS Code built around AI — inline completion and a built-in agent that edits across files. Looks like VS Code, thinks with an AI. |
| Zed | A newer native editor built for speed, with collaboration and an AI assistant baked in. |
VS Code prefers JetBrainsMono Nerd Font, the same coding font used in Ghostty. That keeps screenshots, reviews, and terminal/editor handoffs readable: ambiguous code characters stay distinct, and prompt/status icons have the glyphs they need.
Most people keep a graphical editor and a terminal editor and switch by task — Neovim for quick edits inside tmux, VS Code or Cursor for big visual work. Try them; settle into what fits.
#The agents, and the loop they share
The terminal agents all work the same way once you start them in a project folder. You describe a task; for anything sizeable they show a plan first; they make edits; and they show you a diff to approve before anything is kept. Learning this loop once means you can use any of them.
claude | Claude Code — Anthropic's terminal agent and the primary one here. Reads project instructions, with CLAUDE.md acting as a thin adapter to AGENTS.md in this setup. |
codex | Codex — OpenAI's coding agent across CLI, app, IDE, and cloud workflows. Use it for repo-aware changes, reviews, and verified diffs. |
grok | Grok Build — SpaceXAI's terminal agent, with a plan-first mode. Free trial, then a SuperGrok / X Premium+ plan or API credits; see Grok & Grok Build. |
opencode | OpenCode — open-source and model-agnostic; works with whichever model you point it at. Has a desktop app too. |
aider | aider — a lightweight, git-aware AI pair programmer that commits as it goes. |
To start any of them, change into a project folder and run its command:
$ cd ~/code/my-project
$ claude
# then just describe what you want, in plain English
#Give agents a concrete target
The single highest-leverage change in how you direct an agent: replace a description of what you want with an artifact the agent can check itself against. An agent with a checkable target can verify its own work and iterate; an agent with only prose has to guess what you meant and wait for you to notice. Every round-trip you save compounds.
| A failing test | The gold standard for behavior. Write one (or have the agent write it) that fails for exactly the bug or missing feature, then ask for the code that makes it pass. It turns "I think it's fixed" into "the test passes." |
| A screenshot or mock | For UI work, an image of the desired result beats paragraphs. Paste a screenshot, sketch a mock, or have the agent generate an image of the design first and then implement it — it can compare its output against the picture and self-correct. |
| A desired diff shape | "The change should touch only these two files and add a flag here" bounds the blast radius before work starts. |
| A sample of the output | For generators, transformations, and reports: show one correct example. |
This is spec design and eval design in miniature, and on real teams the habit hardens into repo machinery — for example, a rule that every bug fix starts with a red test before any fix is written. Groundwork teaches the habit; a well-governed repo enforces it.
#The desktop AI apps
Not everything needs the terminal. These graphical apps are installed (on personal machines — work machines skip AI apps) for chat, quick questions, and supervising agents:
| Claude app | Anthropic's desktop app: general chat plus a Code tab for running and reviewing Claude Code sessions, when juggling threads outgrows the terminal. |
| ChatGPT | OpenAI's chat app for questions, tutoring, writing, images, and voice. Good for thinking out loud, drafting specs, and learning away from a codebase. |
| Codex app | A desktop home for OpenAI's coding agents: run several in parallel, watch their diffs, and manage long-running tasks. |
| OpenCode Desktop | The graphical companion to the OpenCode CLI, for the same run-and-review loop in a window. |
#Copy context for review
Sometimes the best reviewer is outside the tool that can read your repo. In that case, send a small, deliberate context bundle: the files that explain the question, each with its path attached. VS Code has built-in commands for the Command Palette and copying the active file path, but open-tab contents need an extension.
| VS Code open tabs | Press ⇧⌘P, then run Copy Opened Files to Clipboard. Groundwork installs the Copy Opened Files For AI/LLM extension for VS Code only. |
| Terminal / tmux | Run copy-context AGENTS.md src tests to copy selected files or folders with path headers and contents. Add --stdout when you want to inspect the payload before pasting. |
| Cursor | Use Cursor's built-in project context for agent work, or use copy-context from the terminal. The VS Code tab-copy extension is not published on Open VSX, so Cursor does not try to install it. |
Do not copy an entire repo by reflex, and never paste secrets, tokens, private keys, or local-only credentials into a chat app. A good context bundle is small enough for you to read before you send it.
#Editor extensions stay lean
Groundwork keeps VS Code and Cursor extensions focused on the agent loop: collect context, review changes, inspect CI, run UI tests, and enforce project-local language rules. It avoids duplicate snippet packs, overlapping formatters, and helper extensions that mostly replace built-in editor behavior.
| Context | Claude Code plus the VS Code-only open-tabs copier. |
| Review and verification | GitLens, GitHub Pull Requests, GitHub Actions, Playwright, Error Lens, and Pretty TypeScript Errors. |
| Project rules | Prettier, ESLint, EditorConfig, markdownlint, ShellCheck, YAML, TOML, Tailwind, GraphQL, CSV, JSON sorting, and Mermaid preview support. |
#The shared language: AGENTS.md
The agents look for plain-text project instructions and follow them. In this setup, AGENTS.md is the canonical file: it says how to run the tests, what style to use, what never to touch, and what verification means. Tool-specific files like CLAUDE.md should point back to it instead of repeating the same rules.
You've already seen this idea in action: the knowledge base uses AGENTS.md as its schema. Same mechanism — a file that turns a general agent into one that follows your rules.
#When to reach for which
| Quick question, writing, or tutoring | The ChatGPT app |
| A coding task inside a repo | A terminal agent — Claude Code is the default here |
| Editing a file by hand | Neovim (in tmux) or VS Code / Cursor |
| Several agent tasks at once | The Codex app |
| Building a knowledge wiki | Claude Code in the wiki folder — see Knowledge base |
#TODOs without another extension
VS Code already gives you the useful parts of a TODO list. Use Search across the workspace for TODO|FIXME|HACK|NOTE, or use ripgrep in the terminal:
$ rg -n "TODO|FIXME|HACK|NOTE"
The old Todo Tree extension is not part of this setup anymore. It duplicated built-in search and could fail when its bundled ripgrep dependency was missing.
#Good habits
For anything non-trivial, start with "inspect the repo and tell me the plan before changing files." It slows the first minute down and usually saves the next thirty.
An agent's changes aren't real until you accept them. Actually read what it's about to do — this is how you stay in control and how you learn. Approving blindly is the one habit to avoid.
Make a Git commit before handing a big task to an agent. If you don't like the result, one command puts everything back. (That's what the Git page set you up for.)
Don't put passwords, API keys, or private tokens into a prompt. If a tool needs a key, it has a proper place to store it — ask before pasting anything sensitive into a chat.
In a terminal full of vim and tmux, fingers hit Esc constantly, and in Claude Code Esc is the Chat-context cancel key. Groundwork ships ~/.claude/keybindings.json with that one binding removed, so a reflexive Esc no longer triggers a cancel you didn't mean. Stopping running work stays one deliberate key — CtrlC, Claude Code's hardcoded interrupt, which can't be rebound or lost — and /rewind restores code and conversation if a run goes sideways. The file is chezmoi-managed like the rest of the setup: to change or remove bindings, use chezmoi edit --apply ~/.claude/keybindings.json (see Customizing), not Claude Code's /keybindings shortcut, which edits the applied copy that the next apply overwrites.
Every agent session spawns its own builds, tests, and file watchers on the same CPU and memory you're using. One agent is rarely noticeable; three running test suites at once will make a fast machine crawl. When things feel slow, don't guess — run btop in a pane and look at what's actually eating the machine, then pause or narrow one of the tasks. For work that must stay bounded, run it in a container: docker run --cpus 2 --memory 2g … is where hard limits live.
#Know your AI budget
Every serious AI tool runs inside limits — a context window, plan or rate limits, sometimes a spend budget — and long or complex work fails in confusing ways when you hit them blind. The habit and where each tool's gauge lives now have their own page: Know your AI budget. Why it counts as fundamentals: you are the senior partner, and knowing the machine's limits before assigning it work is the same judgment you'd apply to any teammate. Token budgets are one half of that awareness; the machine's own CPU and memory (the callout above) are the other.
#Practice
Ask the chat app something
Open the ChatGPT app and ask it to explain a concept you're learning. Notice it's great for questions, but it can't see your project — that's what the agents are for.
Point an agent at a real project
In the knowledge wiki from new-wiki, run claude and ask: "Explain what this project is and how it's organized." Watch it read the files and answer from them — that's the difference between an agent and a chatbot.
Run the loop end to end
Give it a small task: "Add a short Getting Started section to the README." Read the plan, let it make the change, then read the diff before approving. Commit it afterward. You just did the whole loop.
Compare two agents
Give the same small task to claude and to codex. Notice how they plan and explain differently. There's no single "best" — you'll develop a feel for which fits which job.
#Going deeper
- Claude Code — Quickstart — install to first change; the best entry point for the primary agent here.
- Claude Code — Best Practices — Anthropic's patterns for working well with an agent (explore, plan, verify, scale).
- AGENTS.md — the open convention for project instructions, shared across coding agents.
- Claude Code — memory — Claude-specific behavior for project memory and file references.
- Anthropic's interactive prompt tutorial — a hands-on course on prompting well.
- OpenAI Codex docs & Grok Build — the other agents installed here.