Tools
Tools: Quest: Epic CLI tutor (Learn Code by Actually Building)
2026-02-06
0 views
admin
What I Built ## The Loop ## Quest Templates ## Starting a quest ## Checking your work ## AI code review with quest check -a ## Progressive hints with quest explain ## My Experience with GitHub Copilot CLI ## Hints that actually know your code ## A code reviewer that knows your assignment ## Generating entire quest plans ## What it changed for me GitHub Copilot CLI Challenge Submission This is a submission for the GitHub Copilot CLI Challenge I built Quest.
A CLI tool that teaches you Code by making you actually write code, not just read about it. I used to work in big tech and most of my responsibilities are maintaining repos, building mini features. I don't really get a chance for that 0 to 1 development. So last summer I started messing around with personal projects on the side. Let me tell you...the learning curve is real. I spent most of my time asking GPT, reading docs, doing tutorials. I kept thinking: why can't I just learn this stuff while I code? Like, inside my IDE, while I'm actually building? That's Quest. You pick a project (or have one generated for you), and it walks you through building it step by step — with automated checks for your code and AI hints when you're stuck. No browser tabs, no tutorial rabbit holes. Just your editor and your terminal. Here's what a typical session looks like: This is the core workflow. It's dead simple on purpose: There are 7 built-in templates ranging from 3-task quickies to 20-task deep dives: Or you can skip templates entirely. Describe what you want to build, pick a difficulty, and Copilot CLI generates a custom quest plan: chapters, tasks, validation rules, everything. Repo: github.com/jovanpet/quest The -a flag sends your code through Copilot CLI and you get inline comments injected right into your source files: The hint system adapts based on how bad you are: Copilot CLI was a great deal of help when refactoring code, especially when I would add a field and have to change all the templates...also, low key, it powers three core features that would've been a pain to build otherwise. When you run quest explain, Quest grabs your current tas and pipes it to Copilot CLI. What comes back is structured comments tied to specific lines in your code. The automated checks (quest check) handle the basics...does the file exist? Does it contain the right patterns? Adding the -a flag let's Copilot CLI do the real review. It reads your actual code, and writes comments like: These go directly into your source files as inline comments, right above the relevant lines. This is kinda epic. Instead of picking a template, you describe what you want ("I want to build a princess fairy scheduler worker"), choose quick/normal/deep difficulty, and Copilot CLI generates a full teaching plan in JSON. And yes it's epic because I made an isekai server template you can check out: go-isekai-server where you finish quests like...player skill endpoints... The big realization was that Copilot CLI isn't just an autocomplete tool, it's basically a programmable AI interface. I can pipe structured prompts to it and get structured output back. No API keys, no cloud hosting, no billing dashboards. Just a binary that takes stdin and returns useful output. Templates let you quickly answer FAQs or store snippets for re-use. Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse CODE_BLOCK:
quest begin → Pick a quest (templates or AI-generated)
quest next → See your current task → Write your code
quest check → Auto-validate your implementation
quest check -a → AI code review with inline comments
quest explain → Get hints (they get more direct each time)
quest complete → Move on
quest summary → See where you're at Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
quest begin → Pick a quest (templates or AI-generated)
quest next → See your current task → Write your code
quest check → Auto-validate your implementation
quest check -a → AI code review with inline comments
quest explain → Get hints (they get more direct each time)
quest complete → Move on
quest summary → See where you're at CODE_BLOCK:
quest begin → Pick a quest (templates or AI-generated)
quest next → See your current task → Write your code
quest check → Auto-validate your implementation
quest check -a → AI code review with inline comments
quest explain → Get hints (they get more direct each time)
quest complete → Move on
quest summary → See where you're at CODE_BLOCK:
go install github.com/jovanpet/quest@latest Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
go install github.com/jovanpet/quest@latest CODE_BLOCK:
go install github.com/jovanpet/quest@latest COMMAND_BLOCK:
🧭 Quest Choose your path: > 🗡️ Pick a Legendary Path 🔨 Forge Your Own Quest 🎲 Seek a Mystery Quest Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
🧭 Quest Choose your path: > 🗡️ Pick a Legendary Path 🔨 Forge Your Own Quest 🎲 Seek a Mystery Quest COMMAND_BLOCK:
🧭 Quest Choose your path: > 🗡️ Pick a Legendary Path 🔨 Forge Your Own Quest 🎲 Seek a Mystery Quest CODE_BLOCK:
🔍 Checking Task 1: Create a Hello World endpoint ✓ File exists main.go found ✓ Contains HTTP server code http.HandleFunc detected 🎉 All 2 checks passed! → Next step: quest complete Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
🔍 Checking Task 1: Create a Hello World endpoint ✓ File exists main.go found ✓ Contains HTTP server code http.HandleFunc detected 🎉 All 2 checks passed! → Next step: quest complete CODE_BLOCK:
🔍 Checking Task 1: Create a Hello World endpoint ✓ File exists main.go found ✓ Contains HTTP server code http.HandleFunc detected 🎉 All 2 checks passed! → Next step: quest complete CODE_BLOCK:
// ✓ GOOD: Correct imports for HTTP server functionality
import ( "fmt" "net/http"
) func main() { // TODO: What content type should the client expect from a JSON endpoint? handler := func(w http.ResponseWriter, r *http.Request) { // HINT: Plain text isn't structured JSON — what Go package helps encode structs? fmt.Fprint(w, "Hello, World!") // ✓ GOOD: Handler properly uses ResponseWriter to send response }
} Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
// ✓ GOOD: Correct imports for HTTP server functionality
import ( "fmt" "net/http"
) func main() { // TODO: What content type should the client expect from a JSON endpoint? handler := func(w http.ResponseWriter, r *http.Request) { // HINT: Plain text isn't structured JSON — what Go package helps encode structs? fmt.Fprint(w, "Hello, World!") // ✓ GOOD: Handler properly uses ResponseWriter to send response }
} CODE_BLOCK:
// ✓ GOOD: Correct imports for HTTP server functionality
import ( "fmt" "net/http"
) func main() { // TODO: What content type should the client expect from a JSON endpoint? handler := func(w http.ResponseWriter, r *http.Request) { // HINT: Plain text isn't structured JSON — what Go package helps encode structs? fmt.Fprint(w, "Hello, World!") // ✓ GOOD: Handler properly uses ResponseWriter to send response }
} CODE_BLOCK:
Attempt 1 → Minimal hints ("Consider what happens if input is empty")
Attempt 2 → More specific ("Look into http.Error for error responses")
Attempt 3 → Direct code (partial code examples, since you're clearly stuck) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
Attempt 1 → Minimal hints ("Consider what happens if input is empty")
Attempt 2 → More specific ("Look into http.Error for error responses")
Attempt 3 → Direct code (partial code examples, since you're clearly stuck) CODE_BLOCK:
Attempt 1 → Minimal hints ("Consider what happens if input is empty")
Attempt 2 → More specific ("Look into http.Error for error responses")
Attempt 3 → Direct code (partial code examples, since you're clearly stuck) - ✓ GOOD: Using http.HandleFunc correctly
- ✗ ERROR: Missing error handling on ListenAndServe
- ⚠ WARNING: Consider adding Content-Type header
how-totutorialguidedev.toaigptservergitgithub