feat(skills): add openclaw-user-profiler skill#841
Conversation
Add user profiling and skill recommendation skill for OpenClaw AI Agents. Conversational intake builds a user.md profile, then recommends relevant Claude Code Skills based on the user's role from a 42-role catalog with three-level inheritance model. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
📝 WalkthroughWalkthroughA new skill specification file for Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~8 minutes Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryThis PR adds a new Key issues found:
Confidence Score: 1/5
Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A([User Message]) --> B{Trigger Detection}
B -->|Profile trigger| C[Profile Mode]
B -->|Recommend trigger| D[Recommend Mode]
B -->|Both triggers| C
C --> C1{user.md exists?}
C1 -->|Yes| C2[Read & summarise existing profile]
C1 -->|No| C3[Conversational intake\nrefs/user-profile-fields.md ❌ MISSING]
C2 --> C3
C3 --> C4[Assemble preview\nrefs/user-md-template.md ❌ MISSING]
C4 --> C5{User confirms?}
C5 -->|Yes| C6[Write user.md]
C5 -->|No| C3
C6 --> C7{Recommend skills?}
C7 -->|Yes| D
D --> D1{user.md available?}
D1 -->|Yes| D2[Read Role field]
D1 -->|No| D3[Ask user for role]
D2 --> D4[Match against catalog\nrefs/role-skill-catalog.md ❌ MISSING]
D3 --> D4
D4 --> D5[Merge inheritance chain\nLevel 0 + Level 1 + role-specific]
D5 --> D6[Scan ~/.claude/skills/\n⚠️ N/A on claude-ai platform]
D6 --> D7[Split: Installed vs Recommended]
D7 --> D8([Present recommendations])
Reviews (1): Last reviewed commit: "feat(skills): add openclaw-user-profiler..." | Re-trigger Greptile |
| **Fields and intake order**: see [references/user-profile-fields.md](references/user-profile-fields.md) | ||
|
|
||
| ### Step 3: Generate user.md | ||
|
|
||
| **Template and format**: see [references/user-md-template.md](references/user-md-template.md) |
There was a problem hiding this comment.
Missing reference files block skill from functioning
The SKILL.md delegates three critical pieces of logic to external reference files that are not included in this PR:
references/user-profile-fields.md(line 82) — defines the intake fields and their orderreferences/user-md-template.md(line 86) — defines the output template and formatreferences/role-skill-catalog.md(line 112) — contains the entire 42-role × skill mapping
Without these files the skill is functionally incomplete: an agent executing this SKILL.md will follow the instructions to consult those files but find nothing, falling back to improvised behavior with no defined structure. The directory currently contains only SKILL.md:
skills/openclaw-user-profiler/
└── SKILL.md ← only file present
All three reference files need to be added to skills/openclaw-user-profiler/references/ for the skill to work as documented.
| **Agent Execution**: | ||
| 1. Determine this SKILL.md file's directory path as `SKILL_DIR` | ||
| 2. Replace all `${SKILL_DIR}` in this document with the actual path | ||
|
|
There was a problem hiding this comment.
${SKILL_DIR} variable declared but never used
The "Skill Directory Convention" section instructs the agent to determine SKILL_DIR and replace all ${SKILL_DIR} occurrences — but there are zero ${SKILL_DIR} placeholders anywhere else in the document. The three reference file links use bare relative paths (references/user-profile-fields.md, etc.) with no ${SKILL_DIR} prefix.
Either:
- The relative links should be prefixed with
${SKILL_DIR}/so the agent resolves them correctly (e.g.,${SKILL_DIR}/references/user-profile-fields.md), or - The "Skill Directory Convention" block should be removed if relative resolution is sufficient.
As written, the agent is given instructions to perform a substitution that has no effect, which is confusing and may lead to unexpected behaviour when the references are actually present.
| --- | ||
| name: openclaw-user-profiler | ||
| origin: ECC | ||
| description: |- | ||
| Two things: (1) Build a user.md through conversation so your OpenClaw lobster | ||
| knows who it's working with. (2) Recommend Claude Code Skills based on the | ||
| user's role — 42 roles across 11 categories, three-level inheritance model. | ||
| Profile mode: chat → user.md. Recommend mode: role → curated skill list. | ||
| Use when a user wants their lobster to learn about them, update their profile, | ||
| or discover which Skills fit their role. | ||
| Not for: editing SOUL.md (use the forge) or general-purpose Q&A. | ||
| Triggers: know me, get to know me, write user.md, update my profile, | ||
| profile me, recommend skills, skills for my role, what skills should I use, | ||
| I'm an engineer, I'm a PM, 了解我, 认识我, 推荐 skill, 用户画像。 | ||
| license: MIT | ||
| homepage: https://github.com/eamanc-lab/openclaw-persona-forge | ||
| metadata: | ||
| author: eamanc | ||
| version: 2.3.0 | ||
| compatibility: | ||
| platforms: | ||
| - claude-code | ||
| - claude-ai | ||
| --- |
There was a problem hiding this comment.
origin: ECC is incorrect for a community-authored skill
The origin field is set to ECC (Everything Claude Code), but this skill was authored by eamanc at https://github.com/eamanc-lab/openclaw-persona-forge — an external, community project. Looking at other curated skills in this repo, origin: ECC is reserved for skills that originate from this repository's own team.
Using ECC here misattributes the skill's provenance, which can mislead users about its maintenance ownership and support expectations.
| --- | |
| name: openclaw-user-profiler | |
| origin: ECC | |
| description: |- | |
| Two things: (1) Build a user.md through conversation so your OpenClaw lobster | |
| knows who it's working with. (2) Recommend Claude Code Skills based on the | |
| user's role — 42 roles across 11 categories, three-level inheritance model. | |
| Profile mode: chat → user.md. Recommend mode: role → curated skill list. | |
| Use when a user wants their lobster to learn about them, update their profile, | |
| or discover which Skills fit their role. | |
| Not for: editing SOUL.md (use the forge) or general-purpose Q&A. | |
| Triggers: know me, get to know me, write user.md, update my profile, | |
| profile me, recommend skills, skills for my role, what skills should I use, | |
| I'm an engineer, I'm a PM, 了解我, 认识我, 推荐 skill, 用户画像。 | |
| license: MIT | |
| homepage: https://github.com/eamanc-lab/openclaw-persona-forge | |
| metadata: | |
| author: eamanc | |
| version: 2.3.0 | |
| compatibility: | |
| platforms: | |
| - claude-code | |
| - claude-ai | |
| --- | |
| --- | |
| name: openclaw-user-profiler | |
| origin: community | |
| description: |- |
| 1. Match the user's role to the closest entry in the catalog | ||
| 2. Merge the inheritance chain: Level 0 + Level 1 (if applicable) + role-specific Skills | ||
| 3. Scan `~/.claude/skills/` to check which Skills are already installed | ||
| 4. Split into "Already installed" and "Recommended" groups |
There was a problem hiding this comment.
Hardcoded
~/.claude/skills/ path incompatible with claude-ai platform
The skill scans ~/.claude/skills/ at runtime to detect installed skills, but the frontmatter lists claude-ai as a supported platform. claude.ai runs in a sandboxed browser context with no access to the local filesystem, so this scan will always fail silently and fall back to showing all skills as "Recommended" rather than splitting into "Already Installed" vs. "Recommended".
If claude-ai support is genuinely intended, the skill should document that the installed-skills check is skipped on that platform (falling back to the degraded behavior in the error table), or remove claude-ai from the compatibility list.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@skills/openclaw-user-profiler/SKILL.md`:
- Line 176: The sentence "Based on what a [role] deals with every day, here are
some Skills that could be worth your time. I've flagged the ones you already
have installed." needs a small wording tweak for readability: update the second
sentence to "I've flagged the ones you have already installed." Locate the exact
sentence in SKILL.md (the string "I've flagged the ones you already have
installed.") and replace it with the suggested phrasing while preserving
punctuation and surrounding text.
- Around line 46-148: Add the required top-level headings "When to Use", "How It
Works", and "Examples" to SKILL.md and reorganize the existing content under
them: move the current "When Not to Use" list and any brief positive use-cases
under "When to Use"; put the "Workflow", "Profile Mode", "Recommend Mode", and
step-by-step procedures under "How It Works"; and add at least one concrete
usage scenario or sample interaction under "Examples" (you can reuse the Trigger
Detection table and Mode flows as example snippets). Ensure the exact headings
"When to Use", "How It Works", and "Examples" appear as top-level sections so
the file meets repository guidelines.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 3bf274f6-659e-4aa3-9249-1cb86e9134fd
📒 Files selected for processing (1)
skills/openclaw-user-profiler/SKILL.md
| ## When Not to Use This Skill | ||
|
|
||
| - Editing the lobster's soul or personality → use openclaw-persona-forge or openclaw-soul-forge | ||
| - General conversation unrelated to user profiling → this Skill isn't needed | ||
|
|
||
| --- | ||
|
|
||
| ## Workflow | ||
|
|
||
| ### Trigger Detection | ||
|
|
||
| | User says | Mode | | ||
| |-----------|------| | ||
| | "Get to know me" / "Write user.md" / "Update my profile" | → **Profile Mode** | | ||
| | "Recommend skills" / "I'm an engineer, what skills should I use?" | → **Recommend Mode** | | ||
| | "Get to know me, then recommend skills" | → **Profile Mode**, then automatically enters **Recommend Mode** | | ||
|
|
||
| --- | ||
|
|
||
| ## Profile Mode | ||
|
|
||
| ### Step 1: Check for an existing user.md | ||
|
|
||
| 1. Ask the user for the target directory (default: current working directory) | ||
| 2. Check whether `user.md` already exists there | ||
| 3. **Exists** → read it, show a brief summary, ask what they'd like to update | ||
| 4. **Doesn't exist** → move to Step 2 | ||
|
|
||
| ### Step 2: Conversational intake | ||
|
|
||
| **Guiding principles**: | ||
| - **Don't list every question at once** — keep it conversational, one or two related questions at a time | ||
| - **Lead with role, then branch out** — the role determines where follow-up questions go | ||
| - **Skipping is fine** — if the user says "skip" or "I'd rather not say," move on without pressing | ||
| - **Infer before asking** — if something can be deduced from context, confirm it instead of re-asking | ||
|
|
||
| **Fields and intake order**: see [references/user-profile-fields.md](references/user-profile-fields.md) | ||
|
|
||
| ### Step 3: Generate user.md | ||
|
|
||
| **Template and format**: see [references/user-md-template.md](references/user-md-template.md) | ||
|
|
||
| 1. Assemble the collected info into a user.md preview | ||
| 2. Show the preview to the user for confirmation | ||
| 3. Once confirmed, write it to the target directory using the Write tool | ||
| 4. **After writing, proactively offer Skill recommendations**: since you now know the user's role, ask if they'd like to see Skills suited to their profile — if yes, transition into Recommend Mode | ||
|
|
||
| ### Update Mode | ||
|
|
||
| When the user asks to update an existing user.md: | ||
| 1. Read the current file | ||
| 2. Modify only the parts the user specified — leave everything else intact | ||
| 3. Overwrite with the Write tool | ||
|
|
||
| --- | ||
|
|
||
| ## Recommend Mode | ||
|
|
||
| ### Step 1: Determine the user's role | ||
|
|
||
| 1. Check the target directory for `user.md` → if present, read the Role field | ||
| 2. No user.md → ask the user directly | ||
| 3. The user may also state their role in the trigger itself ("I'm a frontend engineer") | ||
|
|
||
| ### Step 2: Match against the catalog | ||
|
|
||
| **Role × Skill mapping**: see [references/role-skill-catalog.md](references/role-skill-catalog.md) | ||
|
|
||
| The catalog uses a **three-level inheritance model**: | ||
| - **Level 0 (Universal)**: inherited by every role automatically | ||
| - **Level 1 (Category-wide)**: e.g. "Engineering Common" — inherited by all engineering roles | ||
| - **Role-specific Skills**: recommended for that role only | ||
|
|
||
| Covers 11 categories and 42 professional roles, each recommendation tagged with its source (🅰️ Official / 📦 Community) and install method. | ||
|
|
||
| ### Step 3: Assemble the recommendation list | ||
|
|
||
| 1. Match the user's role to the closest entry in the catalog | ||
| 2. Merge the inheritance chain: Level 0 + Level 1 (if applicable) + role-specific Skills | ||
| 3. Scan `~/.claude/skills/` to check which Skills are already installed | ||
| 4. Split into "Already installed" and "Recommended" groups | ||
|
|
||
| ### Step 4: Present recommendations | ||
|
|
||
| Output format: | ||
|
|
||
| ```markdown | ||
| ## Recommended Skills for You | ||
|
|
||
| **Your role**: [role] | ||
| **Inherits**: Level 0 (Universal) + [category-wide] + [role-specific] | ||
|
|
||
| ### Already Installed | ||
| - **[skill-name]**: [one sentence on why it's a fit for you] | ||
|
|
||
| ### Recommended | ||
| - **[skill-name]** (📦 [source]): [one sentence] | ||
| Install: `npx skills add <package>` | ||
| ``` | ||
|
|
||
| After the user picks, provide concrete install instructions. | ||
|
|
||
| --- |
There was a problem hiding this comment.
Add the required top-level sections (When to Use, How It Works, Examples).
This skill is missing the exact required section headings from repository guidelines. Please add those headings explicitly (you can reuse current content under them).
Suggested structure patch
+## When to Use
+
+- User wants to create/update `user.md`
+- User asks for role-based skill recommendations
+- User wants profile + recommendations in one flow
+
## When Not to Use This Skill
- Editing the lobster's soul or personality → use openclaw-persona-forge or openclaw-soul-forge
- General conversation unrelated to user profiling → this Skill isn't needed
---
-## Workflow
+## How It Works
### Trigger Detection
...
---
+## Examples
+
+### Example: Profile Mode
+User: "Get to know me"
+Assistant: (conversational intake → preview `user.md` → confirm → write)
+
+### Example: Recommend Mode
+User: "I'm a frontend engineer, what skills should I use?"
+Assistant: (role match → inheritance merge → installed vs recommended list)
+
+### Example: Combined Flow
+User: "Get to know me, then recommend skills"
+Assistant: (Profile Mode first, then Recommend Mode)
+
+---
+
## Error HandlingAs per coding guidelines, skills/**/*.md files must include clear sections: When to Use, How It Works, and Examples.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@skills/openclaw-user-profiler/SKILL.md` around lines 46 - 148, Add the
required top-level headings "When to Use", "How It Works", and "Examples" to
SKILL.md and reorganize the existing content under them: move the current "When
Not to Use" list and any brief positive use-cases under "When to Use"; put the
"Workflow", "Profile Mode", "Recommend Mode", and step-by-step procedures under
"How It Works"; and add at least one concrete usage scenario or sample
interaction under "Examples" (you can reuse the Trigger Detection table and Mode
flows as example snippets). Ensure the exact headings "When to Use", "How It
Works", and "Examples" appear as top-level sections so the file meets repository
guidelines.
| > Your lobster knows who you are now. Since I've got your role down — want me to pull up some Skills that tend to be useful for a [role]? | ||
|
|
||
| **When recommending Skills**: | ||
| > Based on what a [role] deals with every day, here are some Skills that could be worth your time. I've flagged the ones you already have installed. |
There was a problem hiding this comment.
Small wording polish for readability.
Consider: “I’ve flagged the ones you have already installed.”
🧰 Tools
🪛 LanguageTool
[style] ~176-~176: To make your writing flow more naturally, try moving the adverb ‘already’ closer to the verb ‘installed’.
Context: ...th your time. I've flagged the ones you already have installed. ### Language Adaptation Detect the u...
(PERF_TENS_ADV_PLACEMENT)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@skills/openclaw-user-profiler/SKILL.md` at line 176, The sentence "Based on
what a [role] deals with every day, here are some Skills that could be worth
your time. I've flagged the ones you already have installed." needs a small
wording tweak for readability: update the second sentence to "I've flagged the
ones you have already installed." Locate the exact sentence in SKILL.md (the
string "I've flagged the ones you already have installed.") and replace it with
the suggested phrasing while preserving punctuation and surrounding text.
There was a problem hiding this comment.
3 issues found across 1 file
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="skills/openclaw-user-profiler/SKILL.md">
<violation number="1" location="skills/openclaw-user-profiler/SKILL.md:16">
P2: Skill metadata links to an external GitHub repository, which is flagged by team guidance as a supply-chain risk unless the repo is vetted/owned. Remove or replace with an approved internal link.</violation>
<violation number="2" location="skills/openclaw-user-profiler/SKILL.md:34">
P3: This substitution instruction is currently dead because the document contains no `${SKILL_DIR}` tokens to replace. Remove or rewrite this step to avoid giving the agent a no-op directive.</violation>
<violation number="3" location="skills/openclaw-user-profiler/SKILL.md:82">
P2: SKILL.md links to references/*.md files that are not present in the new skill directory, so core field/template/catalog content will be missing at runtime.</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
| profile me, recommend skills, skills for my role, what skills should I use, | ||
| I'm an engineer, I'm a PM, 了解我, 认识我, 推荐 skill, 用户画像。 | ||
| license: MIT | ||
| homepage: https://github.com/eamanc-lab/openclaw-persona-forge |
There was a problem hiding this comment.
P2: Skill metadata links to an external GitHub repository, which is flagged by team guidance as a supply-chain risk unless the repo is vetted/owned. Remove or replace with an approved internal link.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At skills/openclaw-user-profiler/SKILL.md, line 16:
<comment>Skill metadata links to an external GitHub repository, which is flagged by team guidance as a supply-chain risk unless the repo is vetted/owned. Remove or replace with an approved internal link.</comment>
<file context>
@@ -0,0 +1,234 @@
+ profile me, recommend skills, skills for my role, what skills should I use,
+ I'm an engineer, I'm a PM, 了解我, 认识我, 推荐 skill, 用户画像。
+license: MIT
+homepage: https://github.com/eamanc-lab/openclaw-persona-forge
+metadata:
+ author: eamanc
</file context>
| - **Skipping is fine** — if the user says "skip" or "I'd rather not say," move on without pressing | ||
| - **Infer before asking** — if something can be deduced from context, confirm it instead of re-asking | ||
|
|
||
| **Fields and intake order**: see [references/user-profile-fields.md](references/user-profile-fields.md) |
There was a problem hiding this comment.
P2: SKILL.md links to references/*.md files that are not present in the new skill directory, so core field/template/catalog content will be missing at runtime.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At skills/openclaw-user-profiler/SKILL.md, line 82:
<comment>SKILL.md links to references/*.md files that are not present in the new skill directory, so core field/template/catalog content will be missing at runtime.</comment>
<file context>
@@ -0,0 +1,234 @@
+- **Skipping is fine** — if the user says "skip" or "I'd rather not say," move on without pressing
+- **Infer before asking** — if something can be deduced from context, confirm it instead of re-asking
+
+**Fields and intake order**: see [references/user-profile-fields.md](references/user-profile-fields.md)
+
+### Step 3: Generate user.md
</file context>
|
|
||
| **Agent Execution**: | ||
| 1. Determine this SKILL.md file's directory path as `SKILL_DIR` | ||
| 2. Replace all `${SKILL_DIR}` in this document with the actual path |
There was a problem hiding this comment.
P3: This substitution instruction is currently dead because the document contains no ${SKILL_DIR} tokens to replace. Remove or rewrite this step to avoid giving the agent a no-op directive.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At skills/openclaw-user-profiler/SKILL.md, line 34:
<comment>This substitution instruction is currently dead because the document contains no `${SKILL_DIR}` tokens to replace. Remove or rewrite this step to avoid giving the agent a no-op directive.</comment>
<file context>
@@ -0,0 +1,234 @@
+
+**Agent Execution**:
+1. Determine this SKILL.md file's directory path as `SKILL_DIR`
+2. Replace all `${SKILL_DIR}` in this document with the actual path
+
+## Core Philosophy
</file context>
|
thanks. queued for review. |
|
Closing as not merge-ready for the ECC 2.0 ship window. The submission is add-only, references missing local support files/scripts, and reads as a promotional import rather than an integrated ECC contribution. Please reopen with the full referenced assets and a tighter integration path if you want it reconsidered after ship. |
What Changed
Add the
openclaw-user-profilerskill — a dual-mode skill that (1) builds auser.mdprofile through natural conversation so your OpenClaw lobster knows who it's working with, and (2) recommends Claude Code Skills based on the user's role using a 42-role catalog across 11 categories with a three-level inheritance model (Universal → Category-wide → Role-specific).Why This Change
Personalized AI agent interactions require knowing the user. This skill bridges the gap between generic agent behavior and personalized assistance by creating structured user profiles and matching users to relevant skills based on their professional role.
Testing Done
Type of Change
feat:New featureSecurity & Quality Checklist
Documentation
Source: https://github.com/eamanc-lab/openclaw-persona-forge
Summary by cubic
Adds the
openclaw-user-profilerskill to build auser.mdthrough conversation and recommend Claude Code Skills by role, improving personalization and skill discovery for OpenClaw users.user.md) and Recommend Mode (role-based catalog with 3-level inheritance).claude-code,claude-ai, and OpenClaw; no network calls.Written for commit db3be9a. Summary will update on new commits.
Summary by CodeRabbit
openclaw-user-profilerskill with two operational modes: Profile Mode for gathering user information through conversational intake, and Recommend Mode for suggesting skills based on role matching and local installation status. Compatible with Claude Code and Claude AI platforms.