Jobs Skill

Direct access:

3,891 stars

Best use case

Jobs Skill is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Direct access:

Teams using Jobs Skill should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/irecruiter-skill/SKILL.md --create-dirs "https://raw.githubusercontent.com/openclaw/skills/main/skills/agitalent/irecruiter-skill/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/irecruiter-skill/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How Jobs Skill Compares

Feature / AgentJobs SkillStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Direct access:

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

Related Guides

SKILL.md Source

# Jobs Skill

Direct access:
- https://agitalent.github.io/irecruiter-skill.md
- https://github.com/agitalent/agitalent.github.io

## Purpose

`jobs` is a hub router skill for bots and agents.

It connects:
- candidate profiles
- recruiter / hiring-manager job needs
- hub events
- live push delivery to the bot inbox

## What the Bot Must Do Locally

A user should not hand-run extra repository scripts. The published skill bundle is intentionally self-contained.

Do not look for:
- `scripts/`
- `launchd/`
- `supabase-schema.sql`

The bot should use its own runtime and only these install steps:
1. Install or update the skill.
2. Ask for or read the configured runtime credentials.
3. Use runtime env vars or the platform secret store. Do not write credentials to disk unless the user explicitly asks for that behavior.
4. Start or resume watch mode.
5. Do not install, upgrade, or mention a Supabase SDK unless the user explicitly asks for SDK work.

Minimal install command:
```bash
npx -y clawhub install jobs
```

If runtime credentials already exist, the bot should refresh the skill and continue watch mode without asking for extra files.
If any env value is a placeholder, treat it as missing and ask for a real value.

## Connection Gate

If `supabase_connected` is `false`, treat the skill as not configured.

Rules:
- do not search jobs
- do not report `job_descriptions: 0`
- do not inspect `data_directory`
- do not switch to local JSON or hub storage
- ask for valid `SUPABASE_URL` and a public key
- resume only after the real Supabase connection is available

## What Must Be Installed

For the bot to receive push and to see posts / profiles, install all of these on the bot machine:

1. Node.js 18+.
2. Supabase access credentials with least privilege:
   - `SUPABASE_URL`
   - `SUPABASE_ANON_KEY` or `SUPABASE_PUBLISHABLE_KEY` only if the project is intentionally public/test-only
   - otherwise use a restricted runtime credential path provided by the host platform
3. The jobs hub schema in the same Supabase project:
   - `profiles`
   - `needs`
   - `matches`
   - `events`
4. ClawHub / OpenClaw skill sync on the bot side so the bot loads the latest skill markdown again after publication.
5. No local JSON database, no `hub.json`, no `HUB_STORAGE_PATH`, and no filesystem fallback store.
6. Do not require broad public read on production data. Use authenticated, scoped, least-privilege access for `profiles`, `needs`, `matches`, and `events`.

## Bot Flow

Use this exact flow:
- `register profile` writes a candidate into Supabase `profiles`
- `register profile` also writes `NEW_PROFILE` into Supabase `events`
- `post job` writes a JD into Supabase `needs`
- `post job` also writes `NEW_NEED` into Supabase `events`
- immediately after `post job`, search Supabase `profiles` and return ranked profile results to the job poster
- a job poster must be able to use the posted need as a live profile-search query without leaving the skill flow
- immediately after `register profile`, search Supabase `needs` and return ranked jobs to the candidate
- if a match is created, write `MATCH_CREATED` into Supabase `events`
- `watch inbox` reads new hub `events` rows and emits push events
- watch mode must handle both directions: new `need` -> job seeker agents, new `profile` -> recruiter agents
- handle candidate and recruiter personal data as sensitive; do not widen read access beyond what is required
- only show new posts or new fits since the last checkpoint
- when asked `有哪些job posts` or `search --mode=pull`, query Supabase `needs` directly and list the rows
- when asked `any job posts` or `show job posts`, also query Supabase `needs` directly; do not start a repair step
- if the user asks about Supabase SDK installation, say it is not required for job-post lookup and stay on the skill/runtime flow
- do not use a local hub summary as the source of truth for job inventory
- if `needs` cannot be reached, say the database is unavailable, not that it is empty
- never answer `job_descriptions: 0` unless the `needs` query truly returned zero rows
- do not infer emptiness from watch checkpoint, local caches, or previous summaries
- do not generate suggested JDs unless the user explicitly asks for examples
- do not write, print, or suggest new scripts when answering a job-post query

## Candidate Profile Fields

- `name`
- `age`
- `email`
- `bio_link`
- `current_location`
- `highest_education_background`
- `school_graduate`
- `graduation_date`
- `current_company`
- `current_position`
- `previous_companies`
- `skills`
- `preferred_location`

## Job Need Fields

- `role_recruiter_name`
- `email`
- `company_name`
- `post_link`
- `location`
- `position`
- `team`
- `responsibility_keywords`
- `target_companies`
- `education_degree`
- `preferred_school`
- `preferred_major`
- `qualification_keywords`

The `needs` table no longer uses `level` or `urgency`; use `company_name` and `post_link` as the replacement fields in the job brief.

## Storage

Store all records in the same Supabase project.

Tables:
- `profiles`
- `needs`
- `matches`
- `events`

Rules:
- write `profiles` before searching
- write `needs` before searching
- create `matches` only when the score is meaningful
- write an `events` row for every new profile, new need, and new match
- keep a checkpoint so the bot only shows new items later

## Bot Output

When a candidate is registered:
- return the record ID
- emit a `NEW_PROFILE` event
- search open `needs` immediately and return the best matching jobs
- return watch status

When a job is posted:
- return the record ID
- emit a `NEW_NEED` event
- push it to the inbox
- search `profiles` immediately and return the best matching profiles to the job poster
- include profile ids and full available profile fields in that response
- create a `matches` row if the score passes the threshold
- emit `MATCH_CREATED` when a match row is written

Latest job-post fetch rule:
- always read the full `needs` row before rendering or answering
- do not project a partial column list that can hide real fields
- prefer raw Supabase values over cached summaries

When a user asks for current job posts:
- query `needs` sorted by `created_at desc`
- return the actual rows from Supabase
- include the row id for every result
- include the raw fields as returned by Supabase
- include `bio_link` for profiles and `post_link` for needs when present
- show every available field from the row when profiles or needs are present
- in any listing summary, include `company_name` and `post_link` when present
- when listing job posts, each item summary must show `company_name` and `post_link` inline if either field exists
- map title from `role_title` first, then `position`, then `job_title`
- map company from `contact_name` first, then `role_recruiter_name`, then `company_name`
- include title, company, location, and created time
- if the query returns zero rows, say `No job posts found in Supabase needs`
- if the query fails, say `Supabase needs is unavailable` and stop
- if `supabase_connected` is false, say the skill is not configured and stop
- if any returned row has a real `role_title`, `position`, `job_title`, `contact_name`, `role_recruiter_name`, or `company_name`, never call the table placeholder data
- never say the `needs` table still contains placeholder entries unless every returned row literally uses placeholder values
- never label a row as `Untitled` when `role_title`, `position`, `job_title`, `contact_name`, `role_recruiter_name`, or `company_name` exists
- never replace missing fields with `N/A`; use `missing` or leave the field blank
- never summarize row existence as "no real job data" if the query returned actual rows
- when profiles or job rows are present, provide every available field rather than a shortened summary

Required job listing summary template:
- `Title`
- `Company`
- `Post`
- `Location`
- `Created`
- `Raw row`

The summary must render `company_name` and `post_link` inline whenever they exist. If either field is missing, print `missing`; do not omit the field entirely.

When watching:
- poll or subscribe to new `events`
- append job push events and profile push events to `~/.openclaw/irecruiter-inbox.jsonl`
- read from the same inbox on the next run

## Command Examples

The bot should support direct commands like these:

```text
@agitalent jobs post a job
```

Expected behavior:
- ask for the job fields if they were not provided yet
- write the completed record into Supabase `needs`
- immediately search Supabase `profiles`
- return ranked matching profiles with profile ids and full available fields

```text
@agitalent jobs register profile
```

Expected behavior:
- ask for the candidate profile fields if they were not provided yet
- write the completed record into Supabase `profiles`
- immediately search Supabase `needs`
- return ranked matching jobs with job ids and full available fields

```text
@agitalent jobs search profiles for this job
```

Expected behavior:
- use the current job need as the search query
- query Supabase `profiles` directly
- return matching profiles without switching to a generic summary or advice mode

## Reinstall / Sync on the Bot Side

After publishing a new skill version, the bot machine must reload it.

Recommended sequence:
1. Reinstall or resync the skill from ClawHub.
2. Confirm the bot has `SUPABASE_URL` and the required least-privilege credential available in its runtime config.
3. Resume watch mode.
4. Confirm the watcher is reading the same Supabase project and inbox files.

Example local commands:
```bash
# refresh the skill on the bot machine
npx -y clawhub install jobs

# resume the bot's own watch mode
watch inbox
```

## Runtime State

Credentials:
- prefer runtime env vars or the platform secret store
- only write a local env file if the user explicitly requests that setup

Runtime state:
- watch checkpoint: `~/.openclaw/irecruiter-watch-state.json`
- bot inbox: `~/.openclaw/irecruiter-inbox.jsonl`

Related Skills

karpathy-jobs-bls-visualizer

3819
from openclaw/skills

Research tool for visually exploring BLS Occupational Outlook Handbook data with an interactive treemap, LLM-powered scoring pipeline, and data scraping/parsing utilities.

---

3891
from openclaw/skills

name: article-factory-wechat

Content & Documentation

humanizer

3891
from openclaw/skills

Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's comprehensive "Signs of AI writing" guide. Detects and fixes patterns including: inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, negative parallelisms, and excessive conjunctive phrases.

Content & Documentation

find-skills

3891
from openclaw/skills

Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.

General Utilities

tavily-search

3891
from openclaw/skills

Use Tavily API for real-time web search and content extraction. Use when: user needs real-time web search results, research, or current information from the web. Requires Tavily API key.

Data & Research

baidu-search

3891
from openclaw/skills

Search the web using Baidu AI Search Engine (BDSE). Use for live information, documentation, or research topics.

Data & Research

agent-autonomy-kit

3891
from openclaw/skills

Stop waiting for prompts. Keep working.

Workflow & Productivity

Meeting Prep

3891
from openclaw/skills

Never walk into a meeting unprepared again. Your agent researches all attendees before calendar events—pulling LinkedIn profiles, recent company news, mutual connections, and conversation starters. Generates a briefing doc with talking points, icebreakers, and context so you show up informed and confident. Triggered automatically before meetings or on-demand. Configure research depth, advance timing, and output format. Walking into meetings blind is amateur hour—missed connections, generic small talk, zero leverage. Use when setting up meeting intelligence, researching specific attendees, generating pre-meeting briefs, or automating your prep workflow.

Workflow & Productivity

self-improvement

3891
from openclaw/skills

Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.

Agent Intelligence & Learning

botlearn-healthcheck

3891
from openclaw/skills

botlearn-healthcheck — BotLearn autonomous health inspector for OpenClaw instances across 5 domains (hardware, config, security, skills, autonomy); triggers on system check, health report, diagnostics, or scheduled heartbeat inspection.

DevOps & Infrastructure

linkedin-cli

3891
from openclaw/skills

A bird-like LinkedIn CLI for searching profiles, checking messages, and summarizing your feed using session cookies.

Content & Documentation

notebooklm

3891
from openclaw/skills

Google NotebookLM 非官方 Python API 的 OpenClaw Skill。支持内容生成(播客、视频、幻灯片、测验、思维导图等)、文档管理和研究自动化。当用户需要使用 NotebookLM 生成音频概述、视频、学习材料或管理知识库时触发。

Data & Research