juicebox-core-workflow-a

jeremylongshore's avatarfrom jeremylongshore

Execute Juicebox people search workflow.Use when building candidate sourcing pipelines, searching for professionals,or implementing talent discovery features.Trigger with phrases like "juicebox people search", "find candidates juicebox","juicebox talent search", "search professionals juicebox".

939stars🔀114forks📁View on GitHub🕐Updated Jan 11, 2026

When & Why to Use This Skill

This Claude skill automates the Juicebox people search workflow, empowering recruitment teams to build sophisticated candidate sourcing pipelines. By integrating Juicebox AI, it facilitates advanced talent discovery through structured search queries, automated candidate scoring, and paginated result handling, significantly streamlining the initial stages of the hiring process and improving recruiter productivity.

Use Cases

  • Candidate Sourcing: Automatically generate and execute complex search queries to find top-tier talent for specific roles such as 'Senior Software Engineer' or 'Product Manager'.
  • Talent Discovery: Build a comprehensive database of professionals by filtering through specific skills, geographic locations, and years of experience using the Juicebox AI engine.
  • Automated Candidate Ranking: Implement a custom scoring system to rank candidates based on how well their profiles match required technical skills and experience levels, ensuring the best fits are prioritized.
  • Recruitment Pipeline Integration: Utilize the provided TypeScript workflows to integrate professional search and talent discovery capabilities directly into internal HR platforms or Applicant Tracking Systems (ATS).
namejuicebox-core-workflow-a
description|
allowed-toolsRead, Write, Edit, Bash(npm:*), Bash(pip:*), Grep
version1.0.0
licenseMIT
authorJeremy Longshore <jeremy@intentsolutions.io>

Juicebox People Search Workflow

Overview

Implement a complete people search workflow using Juicebox AI for candidate sourcing and talent discovery.

Prerequisites

  • Juicebox SDK configured
  • Understanding of search query syntax
  • Knowledge of result filtering

Instructions

Step 1: Define Search Parameters

// types/search.ts
export interface CandidateSearch {
  role: string;
  skills: string[];
  location?: string;
  experienceYears?: { min?: number; max?: number };
  companies?: string[];
  education?: string[];
}

export function buildSearchQuery(params: CandidateSearch): string {
  const parts = [params.role];

  if (params.skills.length > 0) {
    parts.push(`skills:(${params.skills.join(' OR ')})`);
  }

  if (params.location) {
    parts.push(`location:"${params.location}"`);
  }

  return parts.join(' AND ');
}

Step 2: Implement Search Pipeline

// workflows/candidate-search.ts
import { JuiceboxService } from '../lib/juicebox-client';

export class CandidateSearchPipeline {
  constructor(private juicebox: JuiceboxService) {}

  async searchCandidates(criteria: CandidateSearch) {
    const query = buildSearchQuery(criteria);

    // Initial broad search
    const results = await this.juicebox.searchPeople(query, {
      limit: 100,
      fields: ['name', 'title', 'company', 'location', 'skills', 'experience']
    });

    // Score and rank candidates
    const scored = results.profiles.map(profile => ({
      ...profile,
      score: this.calculateFitScore(profile, criteria)
    }));

    // Sort by fit score
    return scored.sort((a, b) => b.score - a.score);
  }

  private calculateFitScore(profile: Profile, criteria: CandidateSearch): number {
    let score = 0;

    // Skills match
    const matchedSkills = profile.skills.filter(s =>
      criteria.skills.includes(s.toLowerCase())
    );
    score += matchedSkills.length * 10;

    // Experience match
    if (criteria.experienceYears) {
      const years = profile.experienceYears || 0;
      if (years >= (criteria.experienceYears.min || 0)) {
        score += 20;
      }
    }

    return score;
  }
}

Step 3: Handle Pagination

async function* searchAllCandidates(
  juicebox: JuiceboxService,
  query: string
): AsyncGenerator<Profile> {
  let cursor: string | undefined;

  do {
    const results = await juicebox.searchPeople(query, {
      limit: 50,
      cursor
    });

    for (const profile of results.profiles) {
      yield profile;
    }

    cursor = results.nextCursor;
  } while (cursor);
}

Output

  • Search query builder
  • Candidate scoring system
  • Paginated result handling
  • Ranked candidate list

Error Handling

Error Cause Solution
No Results Query too restrictive Broaden criteria
Slow Response Large dataset Use pagination
Score Issues Missing data Handle null values

Examples

Full Pipeline Usage

const pipeline = new CandidateSearchPipeline(juiceboxService);

const candidates = await pipeline.searchCandidates({
  role: 'Senior Software Engineer',
  skills: ['typescript', 'react', 'node.js'],
  location: 'San Francisco Bay Area',
  experienceYears: { min: 5 }
});

console.log(`Found ${candidates.length} matching candidates`);
candidates.slice(0, 10).forEach(c => {
  console.log(`${c.name} (Score: ${c.score}) - ${c.title} at ${c.company}`);
});

Resources

Next Steps

After implementing search, explore juicebox-core-workflow-b for candidate enrichment.