git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/agitalent/irecruiter-skill" ~/.claude/skills/clawdbot-skills-irecruiter-skill && rm -rf "$T"
skills/agitalent/irecruiter-skill/SKILL.mdJobs Skill
Direct access:
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:
- Install or update the skill.
- Ask for or read the configured runtime credentials.
- Use runtime env vars or the platform secret store. Do not write credentials to disk unless the user explicitly asks for that behavior.
- Start or resume watch mode.
- Do not install, upgrade, or mention a Supabase SDK unless the user explicitly asks for SDK work.
Minimal install command:
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
and a public keySUPABASE_URL - 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:
- Node.js 18+.
- Supabase access credentials with least privilege:
SUPABASE_URL
orSUPABASE_ANON_KEY
only if the project is intentionally public/test-onlySUPABASE_PUBLISHABLE_KEY- otherwise use a restricted runtime credential path provided by the host platform
- The jobs hub schema in the same Supabase project:
profilesneedsmatchesevents
- ClawHub / OpenClaw skill sync on the bot side so the bot loads the latest skill markdown again after publication.
- No local JSON database, no
, nohub.json
, and no filesystem fallback store.HUB_STORAGE_PATH - Do not require broad public read on production data. Use authenticated, scoped, least-privilege access for
,profiles
,needs
, andmatches
.events
Bot Flow
Use this exact flow:
writes a candidate into Supabaseregister profileprofiles
also writesregister profile
into SupabaseNEW_PROFILEevents
writes a JD into Supabasepost jobneeds
also writespost job
into SupabaseNEW_NEEDevents- immediately after
, search Supabasepost job
and return ranked profile results to the job posterprofiles - a job poster must be able to use the posted need as a live profile-search query without leaving the skill flow
- immediately after
, search Supabaseregister profile
and return ranked jobs to the candidateneeds - if a match is created, write
into SupabaseMATCH_CREATEDevents
reads new hubwatch inbox
rows and emits push eventsevents- watch mode must handle both directions: new
-> job seeker agents, newneed
-> recruiter agentsprofile - 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
or有哪些job posts
, query Supabasesearch --mode=pull
directly and list the rowsneeds - when asked
orany job posts
, also query Supabaseshow job posts
directly; do not start a repair stepneeds - 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
cannot be reached, say the database is unavailable, not that it is emptyneeds - never answer
unless thejob_descriptions: 0
query truly returned zero rowsneeds - 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
nameageemailbio_linkcurrent_locationhighest_education_backgroundschool_graduategraduation_datecurrent_companycurrent_positionprevious_companiesskillspreferred_location
Job Need Fields
role_recruiter_nameemailcompany_namepost_linklocationpositionteamresponsibility_keywordstarget_companieseducation_degreepreferred_schoolpreferred_majorqualification_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:
profilesneedsmatchesevents
Rules:
- write
before searchingprofiles - write
before searchingneeds - create
only when the score is meaningfulmatches - write an
row for every new profile, new need, and new matchevents - keep a checkpoint so the bot only shows new items later
Bot Output
When a candidate is registered:
- return the record ID
- emit a
eventNEW_PROFILE - search open
immediately and return the best matching jobsneeds - return watch status
When a job is posted:
- return the record ID
- emit a
eventNEW_NEED - push it to the inbox
- search
immediately and return the best matching profiles to the job posterprofiles - include profile ids and full available profile fields in that response
- create a
row if the score passes the thresholdmatches - emit
when a match row is writtenMATCH_CREATED
Latest job-post fetch rule:
- always read the full
row before rendering or answeringneeds - 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
sorted byneedscreated_at desc - return the actual rows from Supabase
- include the row id for every result
- include the raw fields as returned by Supabase
- include
for profiles andbio_link
for needs when presentpost_link - show every available field from the row when profiles or needs are present
- in any listing summary, include
andcompany_name
when presentpost_link - when listing job posts, each item summary must show
andcompany_name
inline if either field existspost_link - map title from
first, thenrole_title
, thenpositionjob_title - map company from
first, thencontact_name
, thenrole_recruiter_namecompany_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
and stopSupabase needs is unavailable - if
is false, say the skill is not configured and stopsupabase_connected - if any returned row has a real
,role_title
,position
,job_title
,contact_name
, orrole_recruiter_name
, never call the table placeholder datacompany_name - never say the
table still contains placeholder entries unless every returned row literally uses placeholder valuesneeds - never label a row as
whenUntitled
,role_title
,position
,job_title
,contact_name
, orrole_recruiter_name
existscompany_name - never replace missing fields with
; useN/A
or leave the field blankmissing - 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:
TitleCompanyPostLocationCreatedRaw 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:
@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
@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
@agitalent jobs search profiles for this job
Expected behavior:
- use the current job need as the search query
- query Supabase
directlyprofiles - 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:
- Reinstall or resync the skill from ClawHub.
- Confirm the bot has
and the required least-privilege credential available in its runtime config.SUPABASE_URL - Resume watch mode.
- Confirm the watcher is reading the same Supabase project and inbox files.
Example local commands:
# 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