Building a CLI coding gym

learning, ai, rationality

I attended a coding event this Wednesday, with participants hacking away on vibe coding projects and demoing their results by the end of the evening. My project was a CLI tool for developing tacit programming knowledge: Terminal Tutor. Code and docs are publicly available here, though this post is the real README.

I view Terminal Tutor as a coding gym – a way to keep your programming muscles from atrophying in the age of autonomous coding agents. And the programming muscles you’re maintaining aren’t about syntax ("plt.set_title or plt.title"?); instead, you’re maintaining, or even growing, precisely the muscles that matter in the age of vibe coding.

Defining tacit programming knowledge #

Specifically, Terminal Tutor aims to develop tacit knowledge, knowledge that’s hard to articulate in verbal instruction. To me it seems like tacit programming knowledge falls into two categories: consistently making the right design choices and terminal fluency. By terminal fluency, I mean instantly knowing which shell commands to execute, and with the correct syntax.

The best way to develop tacit knowledge is by working alongside an expert explaining their reasoning, i.e. through apprenticeship. Teaching skills matter a lot here, perhaps more than subject knowledge. But perhaps you don’t have the capacity to do a coding internship – the natural kind of coding apprenticeship – and in this case, LLMs might be useful. LLMs are both excellent tutors and excellent programmers, so it’s natural to ask whether one can use LLMs to develop tacit programming knowledge.

Developing a programmer’s eye for design is genuinely hard, even with LLMs. Developing terminal fluency – is also hard – the right bash commands are unknown unknowns. But LLMs can help develop terminal fluency, so this is why I choose to focus on terminal fluency.

Why terminal fluency still matters #

And to be clear, I believe you have good reason to develop terminal fluency, even in the age of autonomous coding agents.

There’s still a significant gap between a senior dev and a rookie with Claude Code Max – it’s not just a matter of coding the right thing rather than the wrong thing – experts also code the right thing the five times faster. And without being a senior dev myself, I think terminal skills play a crucial role here: terminal skills speed up whatever happens between LLM inference calls.

Also, knowing your terminal matters for safety: I’m more worried about someone mindlessly accepting a rm -rf / than about coding agents like Claude Code or Codex inserting backdoors in the code, like hard-coded solutions.

Last but not least, vibe coding is more fun when you can follow the commands executed; otherwise, it’s like watching a game of chess without knowing about common strategies. You want to vibe with the coding agent rather than being its sudo slave.

How Terminal Tutor works #

Terminal Tutor is a wrapper around Claude Code which has Claude explain all commands in detail – I like it when programming teachers explain every line of code, Karpathy-style – and log commands we’ve covered, so I can revisit them later. Under the hood, Terminal Tutor is just a CLAUDE.md file and some Python scripts to have Terminal Tutor remember mastered commands across repos.

Here’s the package; feel free to play around. I have ideas for future extensions (e.g. Anki integration via AnkiConnect), though more experienced programmers may have a better sense of what’s missing.

I’ve tested Terminal Tutor for my research projects over the last week, and it works surprisingly well: Terminal Tutor appears to be as good a coding agent as normal Claude. Though commands take slightly longer to run and I have to exert more effort, I learn more while coding. Ultimately, however, using Terminal Tutor is more fun – it feels good doing one’s programming reps.