Build a Task Tracker CLI with Claude Code

Build a CLI task tracker app by directing an AI coding agent with natural language.

Introduction

30 Second Summary

Imagine having a coding partner that builds entire applications from your plain English descriptions. That's what AI coding agents do, and they're changing how developers work every day.

In this project, you will use Claude Code to build a task tracker CLI app without writing a single line of code yourself. You'll learn how to direct an AI agent to scaffold, debug, and iterate on a real project using only natural language prompts.

What You'll Build

A command-line task tracker application built entirely by giving Claude Code natural-language instructions.

By the end of this project, you'll have:

  • A functional CLI task tracker that can add, list, complete, and delete tasks, stored in a local JSON file.
  • A CLAUDE.md file that gives Claude persistent memory of your project's conventions across sessions.
  • A custom Skill that automates a reusable workflow with a single slash command.
  • Secret Mission: Create a custom "/changelog" Skill that auto-generates a changelog from your Git history.

Are there any prerequisites?

You need basic familiarity with using a terminal or command prompt. You also need a Claude subscription (Pro, Max, Team, or Enterprise) or a Claude Console account with pre-paid API credits.

Claude Code does not have a free tier. Make sure your account is set up before starting.

Install and Authenticate Claude Code

Claude Code is an AI coding agent that lives in your terminal. You give it instructions in plain English, and it writes, edits, and runs code for you.

In this step, you'll install Claude Code on your Windows machine, authenticate with your Claude account, and learn the essential commands you'll use throughout this project.

In this step, get ready to:
  • Install Claude Code on Windows.
  • Authenticate with your Claude account.
  • Learn the essential Claude Code commands.
Install Claude Code on your Windows machine

Claude Code is a CLI tool that runs inside your terminal. You install it with a single command in PowerShell.

  • Press the Windows key to open your search bar.
  • Type PowerShell and press Enter to open it.

How do I know I'm in PowerShell?

Your prompt starts with PS C:\ when you're in PowerShell. If you see just C:\ without the PS, you're in CMD instead.

  • Install Claude Code by running one of the commands below. Choose the method that suits you:

PowerShell installer (recommended)

  • Run this command in PowerShell:
irm https://claude.ai/install.ps1 | iex

What does this command do?

This downloads the official Claude Code installer script from Anthropic's servers and executes it. You do not need to run as Administrator.

Native installations automatically update in the background to keep you on the latest version.

WinGet

  • Run this command in PowerShell:
winget install Anthropic.ClaudeCode

What does this command do?

This uses the Windows Package Manager to install Claude Code from its official registry entry.

WinGet installations do not auto-update. Run winget upgrade Anthropic.ClaudeCode periodically to get the latest features and security fixes.

  • Close PowerShell and open a brand new PowerShell window. This ensures your system picks up the newly installed claude command.
  • Verify the installation succeeded by running:
claude --version

✔️ I see a version number

Claude Code is installed and ready. Move on to the next substep to authenticate.

ⓧ Command not found

The claude command is not on your system PATH yet. Try these fixes:

  • Make sure you opened a completely new PowerShell window after running the installer. The old window does not know about the new command.
  • If you used the PowerShell installer and saw an error mentioning 'irm' is not recognized, you were actually in CMD, not PowerShell. Check that your prompt starts with PS C:\.
  • Try running the installer again in a fresh PowerShell window.

If issues persist, visit the Claude Code troubleshooting guide.

Optional: Install Git for Windows

Git for Windows is recommended on native Windows so Claude Code can use the Bash tool. If Git for Windows is not installed, Claude Code uses PowerShell as the shell tool instead.

You can download it from git-scm.com. Both options work fine for this project.

Start your first session and authenticate

Now that Claude Code is installed, you need to log in so it can connect to your Claude account.

  • Start Claude Code by running this command in PowerShell:
claude
  • Claude Code opens a browser window for authentication. Follow the prompts to log in with your Claude account (Pro, Max, Team, or Enterprise subscription).
  • After approving access in the browser, switch back to your terminal.

You'll see the Claude Code prompt with the version, current model, and working directory shown above it.

✔️ I see the Claude Code prompt

You're authenticated and ready to go. Claude Code is waiting for your instructions.

ⓧ Authentication failed or timed out

  • Make sure you have an active Claude subscription (Pro, Max, Team, or Enterprise) or a Claude Console account with pre-paid API credits.
  • Check that your browser allowed the authentication popup. Some browsers block new windows by default.
  • Try running claude again to restart the authentication flow.

If you need to switch accounts later, use the /login command inside a running session.

Explore the help system

Before you start building, take a moment to learn the commands that control Claude Code. These will help you navigate sessions efficiently.

  • Inside your Claude Code session, type the following and press Enter:
/help

You'll see a list of available slash commands and keyboard shortcuts.

Key commands to remember

  • /clear resets the conversation context. Useful when Claude is confused or you want a fresh start.
  • Shift+Tab cycles through permission modes (Auto-accept, Normal, Plan). You'll use Plan mode in a later step.
  • Esc stops Claude mid-action. Context is preserved so you can redirect.
  • exit or Ctrl+D quits the session and returns you to your normal terminal.
  • Try asking Claude a simple question like "What directory am I in?" to confirm it responds.
  • Leave the session running for now. You'll use it in the next step.

Not getting a response?

  • Make sure you pressed Enter after typing your question. Claude waits for you to submit before responding.
  • If the session seems frozen, press Esc to interrupt, then try again.
  • If you accidentally exited, run claude again to start a new session.

Ask for help: Why isn't Claude Code responding to my input?

Your development tool is installed and authenticated. Next up, you'll put Claude Code to work by having it build an entire task tracker application from scratch.

Scaffold the Project with Claude Code

Claude Code is installed, authenticated, and ready to take instructions. Now it's time to put it to work building something real.

In this step, you'll create a project directory, start a Claude Code session inside it, and give Claude a natural language prompt that builds an entire task tracker app. You won't write any code yourself.

In this step, get ready to:
  • Create a task-tracker project directory with Git initialized.
  • Have Claude Code scaffold a Node.js CLI app from a single natural language prompt.
  • Test the app by asking Claude to run it and verify output.
Create the project directory and start Claude Code

Every project needs a home folder. You'll create one on your Desktop, initialize a Git repository so Claude Code can track changes, then start a Claude Code session inside it.

  • Move to your Desktop by running this command:
cd ~/Desktop
  • Create your project folder, initialize a Git repository inside it, and move into it by running these commands:
mkdir task-tracker
cd task-tracker
git init

What do these commands do?

  • mkdir task-tracker creates a new folder called task-tracker on your Desktop.
  • cd task-tracker moves your terminal into that folder.
  • git init turns the folder into a Git repository so Claude Code can make commits later.
  • Start a Claude Code session inside your project by running:
claude

You should see the Claude Code prompt appear with the version, model, and working directory displayed above it.

  • Confirm Claude sees an empty project by typing this prompt:
what does this project contain?

Claude should respond saying the directory is empty (aside from the hidden .git folder). This confirms Claude Code is reading your project directory correctly.

Don't see the Claude Code prompt?

  • Make sure you ran claude from inside the task-tracker folder, not from your Desktop.
  • If you see an authentication error, run /login inside the session to re-authenticate.
  • help me troubleshoot starting a Claude Code session
Give Claude your build instruction

This is the core of agentic coding. Instead of writing code yourself, you describe what you want and Claude builds it. The more specific your prompt, the better the result.

  • Type this prompt into Claude Code to instruct it to build the task tracker:
Create a Node.js CLI task tracker app. It should support these commands: add, list, complete, and delete. Store tasks in a tasks.json file. Use no external dependencies. Include a package.json with a bin entry so it can be run as `task-tracker`.

What will Claude do with this prompt?

Claude will analyze your requirements and propose creating multiple files. It will ask for permission before writing each file to your project directory.

  • index.js is the main entry point with all the CLI logic (add, list, complete, delete commands).
  • package.json defines the project metadata and the bin entry that maps the task-tracker command to index.js.
  • tasks.json stores task data as a simple JSON array.
  • Review the files Claude proposes to create.
  • Approve the file changes when Claude asks for permission.

Approving file changes

Claude Code asks permission before creating or modifying files. You can press y to approve individual changes or allow all changes at once.

Claude generated something different?

Claude's output varies slightly between sessions. As long as the app supports add, list, complete, and delete commands with no external dependencies, you're on the right track.

help me check if Claude generated the right files for my task tracker

Test the app through Claude Code

The best way to verify the app works is to ask Claude to run it. Claude can execute commands directly and show you the output.

  • Ask Claude to run and test the app by typing this prompt:
run the task tracker to add a task called 'Learn Claude Code', then list all tasks to verify it works
  • Approve any commands Claude asks to run.
  • Review the output to confirm the task was added and listed.

You should see output showing a task called "Learn Claude Code" was added successfully, followed by a list displaying that task.

What if Claude suggests fixes?

If the first run surfaces a bug, Claude will often diagnose and fix it automatically. Approve any fixes it proposes. This is normal in agentic coding. The AI iterates until the code works.

Seeing errors when Claude runs the app?

  • If Claude reports a "permission denied" error, it may need to make index.js executable. Approve any chmod commands Claude suggests.
  • If the app crashes on run, let Claude fix it. Type: "fix the error and try again" to have Claude debug and re-run.
  • help me debug my task tracker app that Claude built

✔️ Awesome, I've got everything!

Great. Double check that your task-tracker folder contains index.js, package.json, and tasks.json.

ⓧ I'd like to double check the full code

Since Claude generates the code, your files will look slightly different from anyone else's. Here's what to verify:

Your package.json should have this structure:

{
  "name": "task-tracker",
  "version": "1.0.0",
  "type": "module",
  "bin": {
    "task-tracker": "./index.js"
  },
  "scripts": {}
}

Your tasks.json should be an empty array after testing (or contain the task you added):

[]

Your index.js should:

  • Use ES modules (import statements, not require).
  • Have a shebang line at the top (#!/usr/bin/env node).
  • Support four commands: add, list, complete, and delete.
  • Read from and write to tasks.json for persistence.
  • Have zero external dependencies (no node_modules folder).

Your task tracker is alive and working. Next up, you'll teach Claude to remember your project's conventions across sessions using a CLAUDE.md file.

Set Up CLAUDE.md for Project Memory

Your task tracker is working. You can add tasks, list them, complete them, and delete them. But there is a catch.

Every time you start a new Claude Code session, Claude has no memory of your project's rules or conventions. You would have to re-explain "no external dependencies" and "use ES modules" every single time. CLAUDE.md solves this. It is a special file that Claude reads at the start of every conversation, giving it persistent context about your project.

In this step, get ready to:
  • Create a CLAUDE.md file that teaches Claude your project's conventions.
  • Verify Claude reads CLAUDE.md automatically in a fresh session.
  • Test that Claude follows your conventions when making real code changes.
Ask Claude to generate a CLAUDE.md file

CLAUDE.md is a special file that Claude reads at the start of every conversation. It gives Claude persistent context it cannot infer from code alone. You will ask Claude to create one for your project.

  • In your Claude Code session (still running inside task-tracker), type this prompt:
Create a CLAUDE.md file for this project. Include: the project purpose, how to run it, the file structure, coding conventions (no external dependencies, use ES modules), and the testing approach.
  • Review the file Claude proposes. It should describe your task tracker, list the files, and spell out the two key conventions: no external dependencies and ES modules.
  • Approve the file changes when you are satisfied with the content.

What is CLAUDE.md doing for you?

Without CLAUDE.md, you would need to remind Claude of your project's rules in every session. With it, Claude loads your conventions automatically before you even type your first prompt.

Think of it as a README for your AI collaborator. The better the instructions, the more consistently Claude follows your standards.

  • Confirm the file exists by asking Claude:
show me the contents of CLAUDE.md

You should see a markdown file with sections covering the project purpose, file structure, how to run it, coding conventions, and testing approach.

Claude created something unexpected?

If Claude skipped a section or added external dependencies to the conventions, tell it directly what to fix. For example: "Update CLAUDE.md to explicitly state no external dependencies are allowed."

help me fix my CLAUDE.md file

Verify CLAUDE.md works across sessions

The real test of CLAUDE.md is whether Claude remembers your project rules in a brand new session. You will exit your current session and start a fresh one to confirm.

  • Exit your current Claude Code session by typing:
exit
  • Start a new Claude Code session in the same directory by running:
claude
  • Once the new session loads, ask Claude this question:
what are the conventions for this project?

Claude should mention your two key conventions (no external dependencies, ES modules) without you having explained them in this session. This confirms it read CLAUDE.md on startup.

Claude does not know the conventions?

Make sure CLAUDE.md is in the root of your task-tracker directory (not inside a subfolder). Also confirm you started the new claude session from inside the task-tracker folder.

Claude isn't reading my CLAUDE.md file

Test the memory in action

Knowing the conventions is one thing. Following them while writing code is the real proof. You will ask Claude to add a new feature and check that it respects your project rules without any reminders.

  • Ask Claude to add a priority feature by typing this prompt:
add a priority field to tasks (high, medium, low) and update all commands to display it
  • Review the changes Claude proposes. Check that Claude did NOT add any npm install commands or import external packages.
  • Confirm the code uses import statements (ES modules) rather than require() (CommonJS).
  • Approve the changes once both conventions are followed.

What to look for in Claude's changes

Claude should modify index.js to accept a priority argument on the add command and display it when listing tasks. The key thing is HOW it made the changes. No new packages, ES module syntax throughout.

This is CLAUDE.md working behind the scenes. Claude followed your rules without you having to repeat them.

  • Test the updated app by asking Claude to run it:
run the task tracker to add a task called 'Write documentation' with high priority, then list all tasks

You should see the new task listed with its priority level displayed alongside the task name.

Priority not showing up?

If the list command does not display priority, tell Claude directly: "the list command should show the priority for each task." Claude will update the formatting.

If Claude added external dependencies, say: "remove external dependencies and follow the conventions in CLAUDE.md." This reinforces the file's authority.

my task tracker priority feature isn't working correctly

Your project now has persistent memory. Claude will follow your conventions in every future session without any reminders. Next up, you will use Git integration and plan mode to manage your code changes like a professional workflow.

Use Git Integration and Plan Mode

Your task tracker works and CLAUDE.md gives Claude persistent memory across sessions. But so far, nothing is saved to version control. If something breaks, there is no way to roll back.

In this step, you will let Claude Code manage your entire Git workflow. You will also learn plan mode, which lets Claude think through a feature before writing any code.

In this step, get ready to:
  • Commit all existing work through Claude Code.
  • Use plan mode to design a new search feature before implementing it.
  • Implement and commit the search command.
Commit your work with Claude Code

Your project has a Git repository initialized, but no commits have been made yet. Everything you have built so far is untracked.

  • In your Claude Code session, ask Claude to commit all current changes by typing this prompt:
commit all current changes with a descriptive message

What happens when you ask Claude to commit?

Claude Code will stage all your files with git add, compose a descriptive commit message, and run git commit. You will see a permission prompt asking you to approve the Git commands before they run.

  • Approve the commit when Claude shows you the proposed command.
  • Verify the commit succeeded by asking Claude:
show me the git log

You should see at least one commit in the log with a descriptive message summarizing the initial project scaffold and priority feature.

Don't see any commits in the log?

Make sure you approved the permission prompt when Claude ran the Git commands. If you accidentally declined, ask Claude to commit again and approve this time.

help me debug why my git commit did not go through

Switch to plan mode and plan the search command

Before building a new feature, it helps to have Claude think through the approach first. Plan mode lets Claude read your code and propose a plan without making any edits to your files.

  • Press Shift+Tab to cycle permission modes until you see "Plan" displayed in your Claude Code session.

What is plan mode?

Claude Code has several permission modes that control what it can do. In plan mode, Claude reads files and answers questions without making changes. This follows the best practice of "explore first, then plan, then code."

You cycle through modes by pressing Shift+Tab repeatedly. The modes cycle through default, acceptEdits, plan, and any others you have enabled.

  • Once you see plan mode active, ask Claude to design the search feature:
plan how you would add a 'search' command that filters tasks by keyword

Claude will outline how it would implement the search command, including which files to change and what logic to add. Review the plan to make sure the approach makes sense.

Edit the plan before proceeding

Press Ctrl+G to open the plan in your text editor for direct editing. You can adjust Claude's approach before it writes any code.

Implement the plan and commit the search command

Now that you have a plan you are happy with, switch back to normal mode so Claude can actually write code.

  • Press Shift+Tab until you are back in the default permission mode.
  • Tell Claude to build the feature by typing:
implement the search plan you just created
  • Approve the file changes Claude proposes.
  • Once the search command is implemented, ask Claude to commit:
commit these changes with a meaningful message
  • Approve the commit.
  • Verify your full commit history by asking:
show me the git log

You should see multiple commits in the log with descriptive messages covering the initial scaffold and the new search feature.

  • Test the search command by asking Claude:
run the task tracker to add a task called 'Fix login bug', then search for 'login' to verify the search command works

You should see the search results return only the task containing the keyword "login".

Search command not working?

If the search returns no results or throws an error, ask Claude to debug it. Claude can read the error output and fix the issue in place.

my search command is not returning the expected results, help me fix it

Your project now has clean version control managed entirely through Claude Code. Next up, you will create a custom Skill that automates a reusable workflow.

Create a Custom Skill

Your task tracker is fully functional, version-controlled, and even has its own project memory in CLAUDE.md. The next step is to make Claude Code even smarter by teaching it reusable workflows.

Claude Code supports Skills that package repeatable instructions into slash commands you can invoke anytime. You will create a custom Skill that runs your task tracker through a full integration test cycle with a single command.

In this step, get ready to:
  • Create a custom Skill that runs a full integration test cycle.
  • Invoke the Skill in a fresh session and verify it works.
  • Confirm the Skill is discoverable and catches regressions.
Ask Claude to create the test-all Skill

A Skill is a directory inside .claude/skills/ containing a SKILL.md file. The directory name becomes the slash command you type to invoke it.

  • In your Claude Code session, give Claude this instruction:
Create a skill at .claude/skills/test-all/SKILL.md that runs the task tracker through a full test cycle: adds a task, lists tasks, completes it, deletes it, and reports whether all operations succeeded. Use the description: 'Runs a full integration test cycle for the task tracker.'
  • Review the file Claude proposes. It should contain YAML frontmatter with a description field, followed by markdown instructions for the test steps.
  • Approve the file creation when you are satisfied with the content.

What is a Skill file?

Every Skill needs a SKILL.md file with two parts: YAML frontmatter between --- markers that tells Claude when to use the Skill, and markdown content with the instructions Claude follows when the Skill runs.

The description field helps Claude decide when to apply the Skill automatically. You can also invoke it directly by typing /test-all in any session within this project.

Claude not creating the file?

Make sure you are still inside the task-tracker directory. Claude creates the .claude/skills/test-all/ directory structure relative to your current working directory.

If Claude asks for permission to create directories or write files, approve it.

Help me create a custom Skill file in my project

Invoke the Skill in a fresh session

Skills are loaded when Claude starts a session. To pick up a newly created Skill, you need to restart.

  • Exit your current Claude Code session by typing:
exit
  • Start a fresh Claude Code session by running:
claude
  • Invoke your new Skill by typing:
/test-all
  • Watch Claude run through the full test cycle: adding a task, listing it, completing it, deleting it, and reporting whether all operations succeeded.

What should I see?

Claude should execute each step of the test cycle in sequence. At the end, it reports whether all operations passed or if any failed. This gives you a one-command integration test for your entire app.

Skill not found?

Make sure you fully exited the previous session before starting a new one. Claude only discovers new Skills at session startup.

Confirm the file exists at .claude/skills/test-all/SKILL.md inside your task-tracker directory. The directory name test-all is what becomes the /test-all command.

Help me figure out why my /test-all Skill isn't being found

Verify Skill discoverability and regression detection

A good Skill should be discoverable by Claude and reliable enough to catch problems after code changes.

  • Ask Claude what Skills are available by typing:
what skills are available?
  • Verify that your test-all Skill appears in the list with its description.
  • Now ask Claude to make a small change to confirm the Skill catches regressions:
add a "stats" command that shows total tasks, completed count, and pending count
  • Approve the changes Claude proposes.
  • Run the Skill one more time to verify everything still works:
/test-all
  • Review the output. The Skill should report that all operations (add, list, complete, delete) still pass after the new stats command was added.

Why is this useful?

Every time you add a feature, you can run /test-all to confirm nothing broke. This is the same principle as automated testing in professional software development, but invoked through a single slash command.

Test cycle reporting a failure?

If the Skill reports a failure after adding the stats command, ask Claude to investigate. The new command may have introduced a bug. Tell Claude: "the /test-all skill is failing after adding the stats command, please fix it."

Help me debug why my test-all Skill is reporting failures

You now have a reusable automated test that lives right inside your project. Next up, you will tackle the Secret Mission and build an even more advanced Skill that pulls live data from your Git history.

Secret mission

Build a /changelog Skill

You have built a custom Skill that runs tests. Now, create something more powerful: a /changelog Skill that uses dynamic context injection to pull live Git data into the prompt. This Skill will auto-generate a formatted changelog from your commit history every time you invoke it.

Clean Up Your Resources

Clean Up Your Resources

This project runs entirely on your local machine, so there are no ongoing cloud costs or subscriptions to worry about. Decide whether to keep your resources as they are, or delete them entirely.

Resources you used:

  • The task-tracker project directory (Node.js code, CLAUDE.md, .claude/skills/, tasks.json, Git history).
  • Claude Code CLI tool installed on your system.

Keep everything running

No action needed. Choose this if you want to keep using your task tracker or continue experimenting with Claude Code on other projects.

  • Your task-tracker project remains on your Desktop, ready to extend.
  • Claude Code stays installed and ready to use in any directory. Run claude in any project folder to start a new session.
  • Your custom Skills and CLAUDE.md persist inside the project for future sessions.

Pause - I'll come back to this later

There are no running processes to stop. Everything is stored as files on disk, so your project is already paused by default.

  • Your task-tracker folder and Git history stay in place until you return.
  • When you're ready to pick up where you left off, open a terminal in the task-tracker directory and run claude to start a fresh session.
  • Claude Code reads your CLAUDE.md automatically, so it will remember your project conventions.

Delete - I don't want to use this again

Remove all project files and optionally uninstall Claude Code from your system.

  • Delete the project directory by running this command in PowerShell:
cd ~\Desktop
Remove-Item -Path "task-tracker" -Recurse -Force
  • To uninstall Claude Code (if you installed using the native PowerShell installer), run:
Remove-Item -Path "$env:USERPROFILE\.local\bin\claude.exe" -Force
Remove-Item -Path "$env:USERPROFILE\.local\share\claude" -Recurse -Force
  • If you installed using WinGet instead, run:
winget uninstall Anthropic.ClaudeCode
  • To also remove Claude Code settings and session history, run:
Remove-Item -Path "$env:USERPROFILE\.claude" -Recurse -Force
Remove-Item -Path "$env:USERPROFILE\.claude.json" -Force

What do these commands remove?

The first set removes the Claude Code binary and version files. The second removes your personal settings, allowed tools, MCP server configurations, and session history.

If you only want to remove this project but keep Claude Code for future use, just run the first command to delete the task-tracker directory.

That's a Wrap!

That's a Wrap!

Nice work! You just built a fully functional CLI application without writing a single line of code yourself.

You've learned how to:

  • Built a complete CLI task tracker by directing Claude Code with natural language prompts, proving you can ship software without writing code yourself.
  • Configured CLAUDE.md for persistent project memory that survives across sessions, so Claude always knows your conventions.
  • Created custom Skills with dynamic context injection to automate reusable workflows and used plan mode to review changes before implementing them.
  • Secret Mission: Built a /changelog Skill that generates formatted changelogs from Git history using live repository data.

Ready to quiz yourself?