Write code, not tests

Write code, not tests

Write code, not tests

Celp generates contextually relevant unit tests for Typescript node.js projects, saving you hours

RUN ↓ TO GENERATE YOUR FIRST TESTS

Quick Start:
1. Stage your changes
2. Install celp: npm install -g @celp/celp-cli
3. (Optional) Enhance tests: celp-cli onboard
4

Quick Start:
1. Stage your changes
2. Install celp: npm install -g @celp/celp-cli
3. (Optional) Enhance tests: celp-cli onboard
4

read me

Built withBuilt with
Built withBuilt with
Built withBuilt with
Built withBuilt with
Built withBuilt with
agentic design,agentic design,
agentic design,agentic design,
agentic design,agentic design,
agentic design,agentic design,
agentic design,agentic design,
CelpCelp
CelpCelp
CelpCelp
CelpCelp
deeply understandsdeeply understands
deeply understands your codedeeply understands your code
deeply understands your codedeeply understands your code
Celp deeply understandsCelp deeply understands
deeply understandsdeeply understands
your codeyour code
your codeyour code
saving you timesaving you time
saving you timesaving you time
saving you timesaving you time
your codeyour code
saving you time saving you time
and ensuringand ensuring
and ensuringand ensuring
and ensuringand ensuring
saving you timesaving you time
and ensuringand ensuring
code stability.code stability.
code stability.code stability.
code stability.code stability.
and ensuring and ensuring
code stability.code stability.
code stabilitycode stability
drivendriven

industry leaders.industry leaders.
describe("Company Routes", function () {
  let authToken: string | null = null;
  let sampleData: Awaited<ReturnType<typeof prepareSampleData>> | null = null;

  beforeEach(async () => {
    await prepareTestDatabase();
    sampleData = await prepareSampleData();
    authToken = sampleData?.user && generateTestUserToken(sampleData.user);
  });

  it("should successfully upload a logo for a company", async function () {
    const logo = Buffer.from("test-logo-content");
    const awsServiceStub = sinon
      .stub(awsService, "saveImage")
      .resolves("test/path/to/logo.png");


    const res = await request(app)
      .post(`/companies/${sampleData?.company.id}/upload/logo`)
      .set("Authorization", `Bearer ${authToken}`)
      .attach("logo", logo, "logo.png");

    expect(res.status).to.equal(200);
    expect(res.body)
      .to.have.property("logo")
      .that.equals("test/path/to/logo.png");

describe("Company Routes", function () {
  let authToken: string | null = null;
  let sampleData: Awaited<ReturnType<typeof prepareSampleData>> | null = null;

  beforeEach(async () => {
    await prepareTestDatabase();
    sampleData = await prepareSampleData();
    authToken = sampleData?.user && generateTestUserToken(sampleData.user);
  });

  it("should successfully upload a logo for a company", async function () {
    const logo = Buffer.from("test-logo-content");
    const awsServiceStub = sinon
      .stub(awsService, "saveImage")
      .resolves("test/path/to/logo.png");


    const res = await request(app)
      .post(`/companies/${sampleData?.company.id}/upload/logo`)
      .set("Authorization", `Bearer ${authToken}`)
      .attach("logo", logo, "logo.png");

    expect(res.status).to.equal(200);
    expect(res.body)
      .to.have.property("logo")
      .that.equals("test/path/to/logo.png");

describe("Company Routes", function () {
  let authToken: string | null = null;
  let sampleData: Awaited<ReturnType<typeof prepareSampleData>> | null = null;

  beforeEach(async () => {
    await prepareTestDatabase();
    sampleData = await prepareSampleData();
    authToken = sampleData?.user && generateTestUserToken(sampleData.user);
  });

  it("should successfully upload a logo for a company", async function () {
    const logo = Buffer.from("test-logo-content");
    const awsServiceStub = sinon
      .stub(awsService, "saveImage")
      .resolves("test/path/to/logo.png");


    const res = await request(app)
      .post(`/companies/${sampleData?.company.id}/upload/logo`)
      .set("Authorization", `Bearer ${authToken}`)
      .attach("logo", logo, "logo.png");

    expect(res.status).to.equal(200);
    expect(res.body)
      .to.have.property("logo")
      .that.equals("test/path/to/logo.png");

describe("Company Routes", function () {
  let authToken: string | null = null;
  let sampleData: Awaited<ReturnType<typeof prepareSampleData>> | null = null;

  beforeEach(async () => {
    await prepareTestDatabase();
    sampleData = await prepareSampleData();
    authToken = sampleData?.user && generateTestUserToken(sampleData.user);
  });

  it("should successfully upload a logo for a company", async function () {
    const logo = Buffer.from("test-logo-content");
    const awsServiceStub = sinon
      .stub(awsService, "saveImage")
      .resolves("test/path/to/logo.png");


    const res = await request(app)
      .post(`/companies/${sampleData?.company.id}/upload/logo`)
      .set("Authorization", `Bearer ${authToken}`)
      .attach("logo", logo, "logo.png");

    expect(res.status).to.equal(200);
    expect(res.body)
      .to.have.property("logo")
      .that.equals("test/path/to/logo.png");

Agentic pattern: Tool use

Intelligently parses all your code

Intelligently builds context of your codebase through parsing with Abstract Syntax Trees and intermediary AI prompting, efficiently gathering only the essential information

  • 
    
    
  • describe("Company Routes", function () {
      let authToken: string | null = null;
      let sampleData: Awaited<ReturnType<typeof prepareSampleData>
    
    
  • const timestamp = new Date().toISOString();
      const email = req.user.email;
      const message = `Welcome to our service, ${email}!`;
    
      await prisma.users.update({
        data: { updatedAt: new Date() },
        where: { id: req.user.id },
      });
    
      return res.json({
        message,
        timestamp,
        email,
      });
  • 
    
    
  • 
    
    
  • describe("Company Routes", function () {
      let authToken: string | null = null;
      let sampleData: Awaited<ReturnType<typeof prepareSampleData>
    
    
  • const timestamp = new Date().toISOString();
      const email = req.user.email;
      const message = `Welcome to our service, ${email}!`;
    
      await prisma.users.update({
        data: { updatedAt: new Date() },
        where: { id: req.user.id },
      });
    
      return res.json({
        message,
        timestamp,
        email,
      });
  • 
    
    
  • 
    
    
  • describe("Company Routes", function () {
      let authToken: string | null = null;
      let sampleData: Awaited<ReturnType<typeof prepareSampleData>
    
    
  • const timestamp = new Date().toISOString();
      const email = req.user.email;
      const message = `Welcome to our service, ${email}!`;
    
      await prisma.users.update({
        data: { updatedAt: new Date() },
        where: { id: req.user.id },
      });
    
      return res.json({
        message,
        timestamp,
        email,
      });
  • 
    
    
  • 
    
    
  • describe("Company Routes", function () {
      let authToken: string | null = null;
      let sampleData: Awaited<ReturnType<typeof prepareSampleData>
    
    
  • const timestamp = new Date().toISOString();
      const email = req.user.email;
      const message = `Welcome to our service, ${email}!`;
    
      await prisma.users.update({
        data: { updatedAt: new Date() },
        where: { id: req.user.id },
      });
    
      return res.json({
        message,
        timestamp,
        email,
      });
  • 
    
    
  • const timestamp = new Date().toISOString();
      const email = req.user.email;
      const message = `Welcome to our service, ${email}!`;
    
      await prisma.users.update({
        data: { updatedAt: new Date() },
        where: { id: req.user.id },
      });
    
      return res.json({
        message,
        timestamp,
        email,
      });
  • describe("Company Routes", function () {
      let authToken: string | null = null;
      let sampleData: Awaited<ReturnType<typeof prepareSampleData>
    
    
  • 
    
    
  • 
    
    
  • const timestamp = new Date().toISOString();
      const email = req.user.email;
      const message = `Welcome to our service, ${email}!`;
    
      await prisma.users.update({
        data: { updatedAt: new Date() },
        where: { id: req.user.id },
      });
    
      return res.json({
        message,
        timestamp,
        email,
      });
  • describe("Company Routes", function () {
      let authToken: string | null = null;
      let sampleData: Awaited<ReturnType<typeof prepareSampleData>
    
    
  • 
    
    
  • 
    
    
  • const timestamp = new Date().toISOString();
      const email = req.user.email;
      const message = `Welcome to our service, ${email}!`;
    
      await prisma.users.update({
        data: { updatedAt: new Date() },
        where: { id: req.user.id },
      });
    
      return res.json({
        message,
        timestamp,
        email,
      });
  • describe("Company Routes", function () {
      let authToken: string | null = null;
      let sampleData: Awaited<ReturnType<typeof prepareSampleData>
    
    
  • 
    
    
  • 
    
    
  • const timestamp = new Date().toISOString();
      const email = req.user.email;
      const message = `Welcome to our service, ${email}!`;
    
      await prisma.users.update({
        data: { updatedAt: new Date() },
        where: { id: req.user.id },
      });
    
      return res.json({
        message,
        timestamp,
        email,
      });
  • describe("Company Routes", function () {
      let authToken: string | null = null;
      let sampleData: Awaited<ReturnType<typeof prepareSampleData>
    
    
  • 
    
    
  • 
    
    

Agentic Pattern: Planning

Focusing on the
essential context

After analyzing the context, celp formulates a detailed and strategic plan to ensure that only the most relevant and useful tests are generated

3 passing (7s)
2 failing

1) Company Routes
    should return 400 when logo file is not provided:

yarn test

5 passing (6s)

Company Routes
    should successfully upload a logo for a company (76ms)
    should return 400 when logo file is not provided
    should return 400 when companyId is not provided
    should return 404 when company does not exist

3 passing (7s)
2 failing

1) Company Routes
    should return 400 when logo file is not provided:

yarn test

5 passing (6s)

Company Routes
    should successfully upload a logo for a company (76ms)
    should return 400 when logo file is not provided
    should return 400 when companyId is not provided
    should return 404 when company does not exist

3 passing (7s)
2 failing

1) Company Routes
    should return 400 when logo file is not provided:

yarn test

5 passing (6s)

Company Routes
    should successfully upload a logo for a company (76ms)
    should return 400 when logo file is not provided
    should return 400 when companyId is not provided
    should return 404 when company does not exist

3 passing (7s)
2 failing

1) Company Routes
    should return 400 when logo file is not provided:

yarn test

5 passing (6s)

Company Routes
    should successfully upload a logo for a company (76ms)
    should return 400 when logo file is not provided
    should return 400 when companyId is not provided
    should return 404 when company does not exist

Agentic Pattern: Reflection

Automatically runs and resolves tests

Iteratively runs your unit tests locally, automatically diagnosing and resolving any errors or failures

describe("Company Routes", function () {
  let authToken: string | null = null;
  let sampleData: Awaited<ReturnType<typeof prepareSampleData>> | null = null;

  beforeEach(async () => {
    await prepareTestDatabase();
    sampleData = await prepareSampleData();
    authToken = sampleData?.user && generateTestUserToken(sampleData.user);
  });

  it("should successfully upload a logo for a company", async function () {
    const logo = Buffer.from("test-logo-content");
    const awsServiceStub = sinon
      .stub(awsService, "saveImage")
      .resolves("test/path/to/logo.png");


    const res = await request(app)
      .post(`/companies/${sampleData?.company.id}/upload/logo`)
      .set("Authorization", `Bearer ${authToken}`)
      .attach("logo", logo, "logo.png");

    expect(res.status).to.equal(200);
    expect(res.body)
      .to.have.property("logo")
      .that.equals("test/path/to/logo.png");

Agentic pattern: Tool use

Intelligently parses all your code

Intelligently builds context of your codebase through parsing with Abstract Syntax Trees and intermediary AI prompting, efficiently gathering only the essential information

  • 
    
    
  • describe("Company Routes", function () {
      let authToken: string | null = null;
      let sampleData: Awaited<ReturnType<typeof prepareSampleData>
    
    
  • const timestamp = new Date().toISOString();
      const email = req.user.email;
      const message = `Welcome to our service, ${email}!`;
    
      await prisma.users.update({
        data: { updatedAt: new Date() },
        where: { id: req.user.id },
      });
    
      return res.json({
        message,
        timestamp,
        email,
      });
  • 
    
    
  • const timestamp = new Date().toISOString();
      const email = req.user.email;
      const message = `Welcome to our service, ${email}!`;
    
      await prisma.users.update({
        data: { updatedAt: new Date() },
        where: { id: req.user.id },
      });
    
      return res.json({
        message,
        timestamp,
        email,
      });
  • describe("Company Routes", function () {
      let authToken: string | null = null;
      let sampleData: Awaited<ReturnType<typeof prepareSampleData>
    
    
  • 
    
    
  • 
    
    

Agentic Pattern: Planning

Focusing on the
essential context

After analyzing the context, celp formulates a detailed and strategic plan to ensure that only the most relevant and useful tests are generated

3 passing (7s)
2 failing

1) Company Routes
    should return 400 when logo file is not provided:

yarn test

5 passing (6s)

Company Routes
    should successfully upload a logo for a company (76ms)
    should return 400 when logo file is not provided
    should return 400 when companyId is not provided
    should return 404 when company does not exist

Agentic Pattern: Reflection

Automatically runs and resolves tests

Iteratively runs your unit tests locally, automatically diagnosing and resolving any errors or failures

Celp vs Copilot

Celp vs Copilot

Celp vs Copilot

let's take a look at how we stack up against the top unit testing tools.

Celp vs Copilot

let's take a look at how we stack up against the top unit testing tools.

Celp

Celp

Celp

understands code structure using abstract syntax trees

Writes type-safe code

Generates unit tests from selection

Generates unit tests from diff

tests pass without much intervention

Reuses existing code and helper methods

automatically runs and fixes tests

Learns as you use it (without training a model)

Celp

understands code structure using abstract syntax trees

Writes type-safe code

Generates unit tests from selection

Generates unit tests from diff

tests pass without much intervention

Reuses existing code and helper methods

automatically runs and fixes tests

Learns as you use it (without training a model)

Github Copilot

understands code structure using abstract syntax trees

writes type-safe code

Generates unit tests from selection

Generates unit tests from diff

Tests pass without much intervention

Reuses existing code and helper methods

Automatically runs and fixes tests

Learns as you use it

Github Copilot

understands code structure using abstract syntax trees

writes type-safe code

Generates unit tests from selection

Generates unit tests from diff

Tests pass without much intervention

Reuses existing code and helper methods

Automatically runs and fixes tests

Learns as you use it

Info

What's unique about Celp?

How much does it cost?

What types of projects does Celp support?

Does Celp keep any code that it uses for context?

What's unique about Celp?

How much does it cost?

What types of projects does Celp support?

Does Celp keep any code that it uses for context?

Celp vs Copilot

Celp

understands code structure using abstract syntax trees

Writes type-safe code

Generates unit tests from selection

Generates unit tests from diff

tests pass without much intervention

Reuses existing code and helper methods

automatically runs and fixes tests

Learns as you use it (without training a model)

Github Copilot

understands code structure using abstract syntax trees

writes type-safe code

Generates unit tests from selection

Generates unit tests from diff

Tests pass without much intervention

Reuses existing code and helper methods

Automatically runs and fixes tests

Learns as you use it

Be the first to know about our latest releases and updates.