dongshuyan/user-profile-keeper
Local user-profile maintenance skill for Codex, Claude Code, OpenClaw, OpenCode, and other agent harnesses. Use only when the user explicitly invokes this skill or asks to create, initialize, update, query, correct, delete, export, or audit a local persistent user profile. Also use to extract durable collaboration preferences, requirement-expression habits, capability boundaries, recurring omissions, risk preferences, privacy boundaries, and typical events from the current session into auditable, confirmable, retractable local profile data. Do not auto-invoke, upload profile data, or replace task-clarifier's normal clarification flow.
npx skills add https://github.com/dongshuyan/compass-skills --skill user-profile-keeper
All output directed at the user — profile summaries, proposals, exports, questions, and confirmations — must be written in the user's language. Detect the user's language from their message. Default to Chinese when unknown. Skill instructions are written in English; that does not affect the language of user-facing output.
Maintain a local-only user profile. The default user is default. Create or switch to another user only when the user explicitly names another identity.
This skill is agent-agnostic. Resolve paths from the directory that contains this SKILL.md. Use the available Python command on the host (python3, python, or py -3). The scripts are intended for macOS, Windows, and Linux with Python 3 and the standard library.
$user-profile-keeper or asks to maintain a profile..compass-skills/user-profiles/v1 by default. Use COMPASS_USER_PROFILE_HOME to set another local directory.--auto-apply-safe; the script decides whether they become active. Inferred, private, sensitive, high-impact, or conflicting facts must become pending proposals.private by default unless the user explicitly asks for a low-sensitivity summary. Keep it out of cross-skill summaries by default.clarification_summary.scripts/onboarding_webui.py --user <id>.Use one gate:
Do not decide that the current session is "enough" by counting covered questionnaire modules. Do not initialize an active profile from operational instructions.
source_type=inferred always becomes a pending proposal. It never becomes active through --auto-apply-safe.sensitivity=private.default unless the user explicitly names another identity. Initialize with scripts/profile_store.py init --user <id> when needed.scripts/profile_store.py read --user <id> --view clarification_summary.scripts/onboarding_webui.py --user <id>.update-from-session --auto-apply-safe. The script applies only candidates that pass safety checks and sends the rest to proposals.proposal-create or update-from-session without relying on auto-apply.Read references/update-policy.md for auto-apply, pending, conflict, correction, and first-run rules. Read references/privacy-boundary.md for sensitivity boundaries.
The main store is managed by scripts/profile_store.py:
init: create registry, user directory, and SQLite database.read: read clarification_summary, profile_overview, full, or pending.update-from-session: update from agent-extracted candidate JSON or create proposals.proposal-list / proposal-apply / proposal-reject: review and apply pending updates.assertion-add / correct / delete / search / export: manual CRUD and export.validate: check schema, permissions, WAL mode, orphan evidence, and pending conflicts.Key usage examples:
# Initialize (macOS / Linux)
python3 <skill-dir>/scripts/profile_store.py init --user default
# Windows
py -3 <skill-dir>\scripts\profile_store.py init --user default
# Read low-sensitivity summary for task-clarifier
python3 <skill-dir>/scripts/profile_store.py read --user default --view clarification_summary
# Submit a self-reported low-sensitivity candidate (auto-apply-safe path)
python3 <skill-dir>/scripts/profile_store.py update-from-session \
--user default \
--session-summary "User requires confirmation before high-impact actions." \
--candidate-json '[{"category":"risk_boundary","claim":"confirm_high_impact_actions","value":{"summary":"Confirm before delete, overwrite, publish, or install."},"scope":"global","source_type":"self_report","confidence":0.95,"sensitivity":"low","evidence":{"summary":"User explicitly stated this.","context":"current session"}}]' \
--auto-apply-safe
# Submit a private background or inferred candidate as proposal
python3 <skill-dir>/scripts/profile_store.py update-from-session \
--user default \
--session-summary "User filled background in onboarding." \
--candidate-json '[{"category":"education_background","claim":"major_or_specialty","value":{"summary":"User self-reported a field or research direction."},"scope":"global","source_type":"self_report","confidence":0.9,"sensitivity":"private","evidence":{"summary":"Onboarding questionnaire.","context":"local onboarding"}}]' \
--propose
# Review and apply proposals
python3 <skill-dir>/scripts/profile_store.py proposal-list --user default
python3 <skill-dir>/scripts/profile_store.py proposal-apply --user default --proposal-id <id>
# Start onboarding WebUI
python3 <skill-dir>/scripts/onboarding_webui.py --user default
Read references/profile-schema.md for data structure and JSON input format. Read references/questionnaire.md when onboarding is needed.
clarification_summary: low-sensitivity, active, need-alignment-related summary for optional use by skills such as $task-clarifier.profile_overview: low/private active overview for this skill; excludes sensitive, intimate, secret, and raw evidence text.full: full profile, only when the user explicitly invokes this skill for profile work.pending: pending proposals; never treat them as stable profile facts.Read references/task-clarifier-integration.md for the $task-clarifier boundary. Read references/examples.md for typical usage.
Take dongshuyan/user-profile-keeper from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.