Agentic AI Atlasby a5c.ai
OverviewWikiGraphFor AgentsEdgesSearchWorkspace
/
GitHubDocsDiscord
i.4Wiki
Agentic AI Atlas · Beginner Tutorial: Build a Simple REST API with TDD
docs/user-guide/tutorials/beginner-rest-apia5c.ai
Search the atlas/
Wiki · linked records

Article and nearby pages

I.Current articlepp. 1 - 1
Advanced Tutorial: Multi-Phase Feature DevelopmentIntermediate Tutorial: Custom Process Definition
I.
Wiki article

docs/user-guide/tutorials/beginner-rest-api

Reading · 14 min

Beginner Tutorial: Build a Simple REST API with TDD reference

By the end of this tutorial, you will be able to:

Page nodewiki/docs/user-guide/tutorials/beginner-rest-api.mdNearby pages · 2Documents · 0

Continue reading

Nearby pages in the same section.

Advanced Tutorial: Multi-Phase Feature DevelopmentIntermediate Tutorial: Custom Process Definition

Beginner Tutorial: Build a Simple REST API with TDD

**Version:** 1.0 **Date:** 2026-01-25 **Category:** Tutorial **Level:** Beginner **Estimated Time:** 45-60 minutes **Primary Personas:** James Park (Curious Newcomer), Sarah Chen (onboarding)

---

Learning Objectives

By the end of this tutorial, you will be able to:

1. **Start a Babysitter workflow** using natural language commands 2. **Understand the TDD (Test-Driven Development) process** as orchestrated by Babysitter 3. **Observe quality convergence** as Babysitter iterates toward your quality target 4. **Interpret run output** including the journal, artifacts, and quality scores 5. **Resume an interrupted workflow** if your session ends unexpectedly

---

Prerequisites

Before starting this tutorial, please ensure you have:

  • [ ] **Node.js v20+** installed (download here)
  • [ ] **Claude Code** installed and configured (setup guide)
  • [ ] **Babysitter SDK and plugin** installed (see Installation Guide)
  • [ ] A **new empty project directory** for this tutorial
  • [ ] Basic familiarity with **JavaScript** and **REST APIs**

Verify Your Installation

Before we begin, let's verify everything is set up correctly. Open your terminal and run these commands:

bash
# Check Node.js version (should be 20+)
node --version

# Check if Babysitter SDK is installed
babysitter --version

**What you should see:**

For the Node.js check:

Code
v20.x.x or higher

About Breakpoints

Babysitter has two modes for handling breakpoints (approval prompts):

1. **Interactive Mode (Claude Code)**: When running in Claude Code, breakpoints are handled directly in the chat - Claude asks you questions and you respond. **No setup required!**

2. **Non-Interactive Mode**: For CI/CD or headless automation, breakpoints are disabled.

**For this tutorial, we'll use interactive mode** - just respond to Claude's questions in the chat. No additional service needed!

---

What We're Building

In this tutorial, we will build a simple **Task Manager REST API** with the following features:

  • **GET /tasks** - Retrieve all tasks
  • **POST /tasks** - Create a new task
  • **GET /tasks/:id** - Retrieve a specific task
  • **PUT /tasks/:id** - Update a task
  • **DELETE /tasks/:id** - Delete a task

We will use **Express.js** as our web framework and **in-memory storage** (no database needed for this tutorial). Babysitter will guide us through a TDD approach, writing tests first and then implementing the code to pass those tests.

Why TDD with Babysitter?

Test-Driven Development ensures your code works correctly from the start. Babysitter makes TDD easier by:

1. **Writing tests first** based on your requirements 2. **Implementing code** to pass those tests 3. **Iterating automatically** until quality targets are met 4. **Tracking everything** in an auditable journal

This means you get high-quality, well-tested code without manually managing the iteration cycle.

---

Step 1: Set Up Your Project Directory

Let's start by creating a fresh project for our API. We will do this manually to ensure we understand the foundation.

Open your terminal and run:

bash
# Create and navigate to your project directory
mkdir task-api-tutorial
cd task-api-tutorial

# Initialize a new Node.js project
npm init -y

# Install Express.js and testing dependencies
npm install express
npm install --save-dev jest supertest

**What you should see:**

After npm init -y:

json
{
  "name": "task-api-tutorial",
  "version": "1.0.0",
  ...
}

After installing dependencies:

Code
added X packages in Ys

Now let's configure Jest for testing. Open package.json and update the "scripts" section:

json
{
  "scripts": {
    "test": "jest",
    "test:watch": "jest --watch"
  }
}

**Checkpoint 1:** Your project directory should now contain:

  • package.json (with Express, Jest, and Supertest listed)
  • node_modules/ directory
  • package-lock.json

---

Step 2: Start Claude Code in Your Project

Now we're ready to use Babysitter. Open Claude Code in your project directory:

bash
claude

**What you should see:**

Claude Code will start and show you its prompt. You're now ready to interact with Claude and use the Babysitter skill.

**Note:** Make sure you're in your task-api-tutorial directory when you start Claude Code. Babysitter will create its workflow files relative to your current directory.

---

Step 3: Start Your First Babysitter Run

Now comes the exciting part! We will ask Claude to use the Babysitter skill to build our REST API with TDD.

In Claude Code, type:

Code
/babysitter:call Build a REST API for task management with Express.js. Include:
- GET /tasks to list all tasks
- POST /tasks to create a task (with title and completed status)
- GET /tasks/:id to get a specific task
- PUT /tasks/:id to update a task
- DELETE /tasks/:id to delete a task
Use TDD with 80% quality target and max 5 iterations.

Alternatively, you can use natural language:

Code
Use the babysitter skill to build a REST API for task management with Express.js.
Include CRUD operations for tasks (title and completed status).
Use TDD methodology with an 80% quality target and maximum 5 iterations.

**What you should see:**

Babysitter will acknowledge your request and create a new run:

Code
Creating new babysitter run: task-api-20260125-143012

Process Definition: TDD Quality Convergence
Target Quality: 80%
Max Iterations: 5

Run ID: 01KFFTSF8TK8C9GT3YM9QYQ6WG
Run Directory: .a5c/runs/01KFFTSF8TK8C9GT3YM9QYQ6WG/

**Understanding the Output:**

- **Run ID**: A unique identifier for this workflow run

- **Run Directory**: Where Babysitter stores all artifacts and logs

- **Target Quality**: The minimum quality score to achieve (80/100)

- **Max Iterations**: How many times Babysitter will try to improve

---

Step 4: Observe the Research Phase

After starting the run, Babysitter enters the **Research Phase**. During this phase, it analyzes your project and requirements to understand the context.

**What you should see:**

Code
[Iteration 1/5] Starting research phase...

Task: Research Codebase Patterns
- Analyzing project structure... Done
- Checking for existing Express patterns... Done
- Reviewing package.json dependencies... Done
- Identifying test framework (Jest)... Done

Research Summary:
- Fresh Express.js project
- Jest configured for testing
- No existing routes or models
- Supertest available for API testing

This phase is important because it helps Babysitter understand your project's context and make appropriate decisions about how to structure the code.

**Checkpoint 2:** You should see the research phase complete with a summary of your project.

---

Step 5: Review the Specifications Phase

Next, Babysitter generates detailed **Specifications** based on your requirements and research.

**What you should see:**

Code
Task: Generate Specifications
Creating detailed specs for task management API...

Specifications:
- Endpoints: GET /tasks, POST /tasks, GET /tasks/:id, PUT /tasks/:id, DELETE /tasks/:id
- Data Model: Task { id: string, title: string, completed: boolean, createdAt: Date }
- Storage: In-memory array (no database)
- Validation: Title required, completed defaults to false
- Error Handling: 404 for not found, 400 for validation errors

Test Plan:
- Unit tests for task validation
- Integration tests for each endpoint
- Edge case tests (empty list, invalid ID, missing fields)

At this point, you might see a **breakpoint** requesting your approval of the specifications.

---

Step 6: Approve the Specifications (Breakpoint)

Babysitter uses **breakpoints** to get human approval at critical decision points. This ensures you stay in control of important decisions.

Interactive Mode (Claude Code) - What You'll See:

Since you're running in Claude Code, Claude will ask you directly in the chat:

Code
Claude: The specification phase is complete. Here's what I've planned:

        Specifications:
        - 5 CRUD endpoints defined
        - In-memory storage (no database setup)
        - Jest + Supertest for testing
        - Basic validation rules

        Do you approve these specifications to proceed with implementation?

        [Approve] [Reject] [Request Changes]

You: [Click Approve or type "yes"]

Claude: Specifications approved. Proceeding with TDD implementation...

Simply respond to Claude's question to continue!

Non-Interactive Mode (Alternative):

If you were running in non-interactive mode (CI/CD, scripts), you would instead see:

Code
Waiting for breakpoint approval...
Visit http://localhost:3184 to approve or reject.

And you'd approve via the web UI at http://localhost:3184.

**Why Breakpoints Matter:**

Breakpoints create a human-in-the-loop workflow. This means:

- You maintain control over important decisions

- Every approval is logged for audit trails

- You can reject and provide feedback if something isn't right

**Checkpoint 3:** You should have successfully approved the specifications breakpoint (via chat or web UI).

---

Step 7: Watch the TDD Implementation Loop

Now Babysitter enters the core **TDD Implementation Loop**. This is where the magic happens!

Iteration 1: First Pass

**What you should see:**

Code
[Iteration 1/5] Starting TDD implementation...

Task: Write Tests First
- Writing endpoint integration tests... Done (12 test cases)
- Writing validation tests... Done (5 test cases)
- Writing edge case tests... Done (4 test cases)

Task: Implement Code
- Creating task model... Done
- Implementing routes... Done
- Adding validation middleware... Done
- Setting up Express app... Done

Running Quality Checks...
- Coverage: 68% (target: 80%)
- ESLint: 2 warnings
- Tests: 19/21 passing (2 failures)

Agent Quality Score: 62/100 (below target)
Issues identified:
- Coverage below threshold (68% < 80%)
- 2 failing tests in edge cases
- Minor ESLint warnings

Continuing to next iteration...

Don't worry that the first iteration didn't meet the target - this is expected! Babysitter will now iterate to fix the issues.

Iteration 2: Refinement

**What you should see:**

Code
[Iteration 2/5] Refining implementation...

Task: Fix Failing Tests
- Fixed test for empty task title... Done
- Fixed test for invalid task ID format... Done

Task: Improve Coverage
- Added tests for error handling paths... Done
- Added tests for edge cases in DELETE... Done

Task: Fix ESLint Issues
- Fixed unused variable warning... Done
- Applied consistent code style... Done

Running Quality Checks...
- Coverage: 84% (target: 80%)
- ESLint: 0 warnings
- Tests: 21/21 passing

Agent Quality Score: 88/100 (target met!)

Quality target achieved in 2 iterations!

**Checkpoint 4:** The workflow should achieve the quality target (likely in 2-3 iterations).

---

Step 8: Review the Created Files

Now let's examine what Babysitter created. Your project should have new files:

bash
# List the created files
ls -la

**Expected file structure:**

Code
task-api-tutorial/
  node_modules/
  .a5c/
    runs/
      01KFFTSF8TK8C9GT3YM9QYQ6WG/
        journal/
          journal.jsonl
        state.json
        tasks/
  src/
    app.js           # Express application setup
    routes/
      tasks.js       # Task routes
    models/
      task.js        # Task model and storage
    middleware/
      validation.js  # Input validation
  tests/
    tasks.test.js    # Integration tests
  package.json

Let's look at some of the created code:

The Task Model (`src/models/task.js`)

javascript
// This is an example of what Babysitter might generate
const tasks = [];

const Task = {
  findAll: () => tasks,
  findById: (id) => tasks.find(t => t.id === id),
  create: (data) => {
    const task = {
      id: Date.now().toString(),
      title: data.title,
      completed: data.completed || false,
      createdAt: new Date()
    };
    tasks.push(task);
    return task;
  },
  update: (id, data) => {
    const index = tasks.findIndex(t => t.id === id);
    if (index === -1) return null;
    tasks[index] = { ...tasks[index], ...data };
    return tasks[index];
  },
  delete: (id) => {
    const index = tasks.findIndex(t => t.id === id);
    if (index === -1) return false;
    tasks.splice(index, 1);
    return true;
  }
};

module.exports = Task;

A Test File (`tests/tasks.test.js`)

javascript
// Example of generated test structure
const request = require('supertest');
const app = require('../src/app');

describe('Tasks API', () => {
  describe('GET /tasks', () => {
    it('should return an empty array initially', async () => {
      const res = await request(app).get('/tasks');
      expect(res.status).toBe(200);
      expect(res.body).toEqual([]);
    });
  });

  describe('POST /tasks', () => {
    it('should create a new task', async () => {
      const res = await request(app)
        .post('/tasks')
        .send({ title: 'Test Task' });
      expect(res.status).toBe(201);
      expect(res.body).toHaveProperty('id');
      expect(res.body.title).toBe('Test Task');
    });

    it('should return 400 if title is missing', async () => {
      const res = await request(app)
        .post('/tasks')
        .send({});
      expect(res.status).toBe(400);
    });
  });

  // More tests...
});

---

Step 9: Run the Tests Yourself

Let's verify that everything works by running the tests manually:

bash
npm test

**What you should see:**

Code
PASS  tests/tasks.test.js
  Tasks API
    GET /tasks
      - should return an empty array initially (23 ms)
      - should return all tasks after creation (18 ms)
    POST /tasks
      - should create a new task (15 ms)
      - should return 400 if title is missing (12 ms)
    GET /tasks/:id
      - should return a specific task (14 ms)
      - should return 404 for non-existent task (11 ms)
    PUT /tasks/:id
      - should update a task (16 ms)
      - should return 404 for non-existent task (10 ms)
    DELETE /tasks/:id
      - should delete a task (13 ms)
      - should return 404 for non-existent task (9 ms)

Test Suites: 1 passed, 1 total
Tests:       21 passed, 21 total

**Checkpoint 5:** All tests should pass when you run npm test.

---

Step 10: Explore the Journal

One of Babysitter's most powerful features is its **event-sourced journal**. This provides a complete audit trail of everything that happened during the run.

Let's examine it:

bash
# View the journal (replace with your actual run ID)
cat .a5c/runs/01KFFTSF8TK8C9GT3YM9QYQ6WG/journal/journal.jsonl | head -20

**What you should see:**

json
{"type":"RUN_STARTED","timestamp":"2026-01-25T14:30:12.445Z","runId":"01KFFTSF8TK8C9GT3YM9QYQ6WG","inputs":{...}}
{"type":"ITERATION_STARTED","timestamp":"2026-01-25T14:30:12.567Z","iteration":1}
{"type":"TASK_STARTED","timestamp":"2026-01-25T14:30:13.123Z","taskId":"research-001","taskType":"agent"}
{"type":"TASK_COMPLETED","timestamp":"2026-01-25T14:30:45.789Z","taskId":"research-001","result":{"status":"success"}}
{"type":"TASK_STARTED","timestamp":"2026-01-25T14:30:46.001Z","taskId":"specs-001","taskType":"agent"}
...
{"type":"BREAKPOINT_REQUESTED","timestamp":"2026-01-25T14:31:12.234Z","breakpointId":"bp-001","question":"Review and approve specifications?"}
{"type":"BREAKPOINT_APPROVED","timestamp":"2026-01-25T14:31:45.123Z","breakpointId":"bp-001"}
...
{"type":"QUALITY_SCORE","timestamp":"2026-01-25T14:33:23.456Z","iteration":1,"score":62}
{"type":"QUALITY_SCORE","timestamp":"2026-01-25T14:34:44.789Z","iteration":2,"score":88}
{"type":"RUN_COMPLETED","timestamp":"2026-01-25T14:34:44.890Z","status":"success"}

**Why the Journal Matters:**

- **Audit Trail:** Complete record of all decisions and actions

- **Debugging:** Understand exactly what happened if something goes wrong

- **Resumability:** Babysitter can resume from any point using this journal

- **Compliance:** Proof of human approvals and quality checks

---

Step 11: Start the API Server (Optional)

Let's verify our API works by starting the server:

bash
# Start the server (you may need to add a start script)
node src/app.js

Or add a start script to package.json:

json
{
  "scripts": {
    "start": "node src/app.js",
    "test": "jest"
  }
}

Then run:

bash
npm start

**What you should see:**

Code
Task API server running on port 3000

Now you can test the API with curl:

bash
# Create a task
curl -X POST http://localhost:3000/tasks \
  -H "Content-Type: application/json" \
  -d '{"title": "Learn Babysitter"}'

# List all tasks
curl http://localhost:3000/tasks

---

Step 12: Simulate Session Interruption and Resume

Let's learn how to handle session interruptions. This is crucial for real-world use where you might close your laptop, lose network connection, or need to continue work the next day.

Simulating Interruption

If you were to close Claude Code mid-run (please don't do this for a completed run), you could resume it later.

Resuming a Run

To resume a previously interrupted run, you would use:

Code
/babysitter:call resume --run-id 01KFFTSF8TK8C9GT3YM9QYQ6WG

Or in natural language:

Code
Resume the babysitter run 01KFFTSF8TK8C9GT3YM9QYQ6WG

**What would happen:**

Code
Resuming run: 01KFFTSF8TK8C9GT3YM9QYQ6WG

Replaying journal...
- Found 47 events
- Last completed task: implement-002
- Resuming from iteration 2

Continuing workflow...

**Key Insight:** Because Babysitter uses event sourcing, all progress is preserved. You never lose work due to session interruptions.

---

Summary

Congratulations! You have successfully completed your first Babysitter tutorial. Let's review what you accomplished:

What You Built

  • A fully functional REST API with 5 endpoints
  • Comprehensive test suite with 21 tests
  • 80%+ code coverage
  • Clean, well-structured code

What You Learned

1. **Starting a Babysitter workflow** with the /babysit command 2. **Understanding the phases**: Research, Specifications, TDD Implementation 3. **Using breakpoints** for human-in-the-loop approval 4. **Observing quality convergence** as Babysitter iterates to meet targets 5. **Reading the journal** to understand what happened 6. **Resuming interrupted runs** to continue work later

Key Concepts

ConceptWhat It Means
**TDD Quality Convergence**Writing tests first, then implementing code, iterating until quality target is met
**Breakpoints**Human approval gates for critical decisions
**Journal**Event-sourced audit trail of all actions
**Quality Score**Automated assessment of code quality (tests, coverage, linting)
**Iteration**One pass through the implementation and quality check cycle

---

Next Steps

Now that you've completed the beginner tutorial, here are some paths to continue your learning:

Continue Learning

  • **Intermediate Tutorial: Custom Process Definition** - Learn to create custom workflows with parallel execution and approval gates
  • **Advanced Tutorial: Multi-Phase Feature Development** - Master complex team workflows with quality convergence

Go Deeper

  • **Event Sourcing Explained** - Understand the architecture behind Babysitter
  • **Quality Convergence Explained** - Learn how quality scoring works

Apply Your Knowledge

  • **Quality Convergence** - Fine-tune quality settings for your projects
  • **Breakpoints** - Customize approval workflows

---

Troubleshooting

Issue: "Plugin not found: babysitter@a5c.ai"

**Symptom:** Claude Code doesn't recognize the babysitter command.

**Solution:**

bash
# Reinstall the plugin
claude plugin marketplace add a5c-ai/babysitter-claude
claude plugin install --scope user babysitter@a5c.ai
claude plugin enable --scope user babysitter@a5c.ai

# Restart Claude Code

Issue: "Breakpoint not resolving"

**Symptom:** Workflow is waiting for breakpoint approval but nothing happens.

**Solution (Interactive Mode - Claude Code):** 1. Look for Claude's question in the chat - scroll up if needed 2. Respond to the question to continue 3. If the session timed out, resume with /babysitter:call resume

**Solution (Non-Interactive Mode):** 1. Breakpoints are disabled in non-interactive mode

Issue: "Quality target never reached"

**Symptom:** Babysitter keeps iterating but the quality score doesn't improve.

**Solution:** 1. Check the iteration logs for specific issues 2. Consider lowering your quality target (e.g., 75% instead of 80%) 3. Review failing tests manually and provide feedback to Claude

Issue: "Tests failing after run completion"

**Symptom:** Running npm test shows failures even though Babysitter reported success.

**Solution:** 1. This can happen if there are environmental differences 2. Check if all dependencies are installed: npm install 3. Ensure you're in the correct directory 4. Review the test files for any environment-specific configurations

---

See Also

  • Glossary - Definitions of all Babysitter terms
  • CLI Reference - Complete command reference
  • Getting Started - Conceptual overview

---

**Document Status:** Complete **Last Updated:** 2026-01-25 **Feedback:** Found an issue? Report it on GitHub

Trail

Wiki
Babysitter Docs
Babysitter User Guide
Tutorials

Beginner Tutorial: Build a Simple REST API with TDD

Continue reading

Advanced Tutorial: Multi-Phase Feature Development
Intermediate Tutorial: Custom Process Definition

Page record

Open node ledger

wiki/docs/user-guide/tutorials/beginner-rest-api.md

Documents

No documented graph nodes on this page.